From ddaedab835fa7ea3457f21a772d636921defdc46 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Fri, 12 Dec 2008 14:02:27 +0100 Subject: [PATCH] version 0.7.2 --- .bzrignore | 5 +- config/nimdoc.cfg | 293 ++ copying.txt | 18 + deinstall.sh | 38 + doc/endb.txt | 2 +- doc/grammar.txt | 65 +- doc/manual.txt | 160 +- doc/theindex.txt | 101 +- gpl.html | 493 +++ ide/config.nim | 93 + ide/main.nim | 21 +- ide/nimide.glade | 416 +- ide/nimide.nim | 118 + install.sh | 126 + install.txt | 3 +- koch.py | 20 +- lib/alloc.nim | 394 ++ lib/arithm.nim | 2 +- lib/atomic.h | 2716 ++++++++++++ lib/base/cgi.html | 486 +++ lib/base/cgi.nim | 305 ++ lib/base/devel/FGInt.pas | 2199 ---------- lib/base/devel/bignums.nim | 1712 -------- lib/base/devel/diff.nim | 460 -- lib/base/devel/lex.nim | 73 - lib/base/devel/nregex.nim | 124 - lib/base/devel/python.nim | 1877 -------- lib/base/devel/python.pas | 2205 ---------- lib/base/gtk/atk.nim | 6 +- lib/base/gtk/gdk2.nim | 80 +- lib/base/gtk/gdk2pixbuf.nim | 4 +- lib/base/gtk/gtk2.nim | 383 +- lib/base/gtk/gtkhtml.nim | 4 +- lib/base/gtk/pango.nim | 54 +- lib/base/x11/xcms.nim | 18 +- lib/base/x11/xi.nim | 2 +- lib/cycle.h | 514 +++ lib/gc.nim | 28 +- lib/macros.nim | 106 +- lib/os.nim | 4 +- lib/osproc.nim | 395 ++ lib/profiler.nim | 61 + lib/streams.nim | 244 ++ lib/sysio.nim | 20 +- lib/target.h | 12 + lib/tlsf.c | 1005 +++++ lib/tlsf.h | 39 + lib/ucmaps/8859-1.txt | 303 ++ lib/ucmaps/8859-10.txt | 303 ++ lib/ucmaps/8859-13.txt | 299 ++ lib/ucmaps/8859-14.txt | 301 ++ lib/ucmaps/8859-15.txt | 303 ++ lib/ucmaps/8859-2.txt | 303 ++ lib/ucmaps/8859-3.txt | 296 ++ lib/ucmaps/8859-4.txt | 303 ++ lib/ucmaps/8859-5.txt | 303 ++ lib/ucmaps/8859-6.txt | 260 ++ lib/ucmaps/8859-7.txt | 302 ++ lib/ucmaps/8859-8.txt | 270 ++ lib/ucmaps/8859-9.txt | 307 ++ lib/ucmaps/cp1250.txt | 274 ++ lib/ucmaps/cp1251.txt | 274 ++ lib/ucmaps/cp1252.txt | 274 ++ lib/ucmaps/cp1253.txt | 274 ++ lib/ucmaps/cp1254.txt | 274 ++ lib/ucmaps/cp1255.txt | 274 ++ lib/ucmaps/cp1256.txt | 274 ++ lib/ucmaps/cp1257.txt | 274 ++ lib/ucmaps/cp1258.txt | 274 ++ lib/ucmaps/cp437.txt | 273 ++ lib/ucmaps/cp737.txt | 273 ++ lib/ucmaps/cp775.txt | 274 ++ lib/ucmaps/cp850.txt | 273 ++ lib/ucmaps/cp852.txt | 273 ++ lib/ucmaps/cp855.txt | 274 ++ lib/ucmaps/cp856.txt | 303 ++ lib/ucmaps/cp857.txt | 274 ++ lib/ucmaps/cp860.txt | 274 ++ lib/ucmaps/cp861.txt | 274 ++ lib/ucmaps/cp862.txt | 274 ++ lib/ucmaps/cp863.txt | 274 ++ lib/ucmaps/cp864.txt | 274 ++ lib/ucmaps/cp865.txt | 274 ++ lib/ucmaps/cp866.txt | 274 ++ lib/ucmaps/cp869.txt | 274 ++ lib/ucmaps/cp874.txt | 274 ++ lib/ucmaps/cp932.txt | 7998 +++++++++++++++++++++++++++++++++++ lib/unicode.nim | 74 +- lib/windows/windows.nim | 2 - nim/ast.pas | 549 ++- nim/astalgo.pas | 5 +- nim/ccgexprs.pas | 324 +- nim/ccgstmts.pas | 47 +- nim/ccgtypes.pas | 14 +- nim/ccgutils.pas | 20 +- nim/cgen.pas | 8 +- nim/condsyms.pas | 1 + nim/crc.pas | 3 +- nim/debugids.pas | 129 + nim/depends.pas | 97 + nim/docgen.pas | 15 +- nim/evals.pas | 1308 ++++++ nim/hashes.pas | 15 +- nim/hashtest.pas | 10 + nim/interact.pas | 22 + nim/lists.pas | 2 +- nim/llstream.pas | 250 ++ nim/lookups.pas | 289 ++ nim/main.pas | 2 +- nim/nsystem.pas | 40 +- nim/nversion.pas | 4 +- nim/paslex.pas | 8 +- nim/passaux.pas | 74 + nim/passes.pas | 216 + nim/pragmas.pas | 4 +- nim/ptmplsyn.pas | 270 ++ nim/rodread.pas | 1134 +++++ nim/rodwrite.pas | 609 +++ nim/rst.pas | 24 +- nim/scanner.pas | 33 +- nim/semdata.pas | 254 ++ nim/semexprs.pas | 2 +- nim/semfold.pas | 26 +- nim/seminst.pas | 278 ++ nim/semtypes.pas | 2 +- nim/sigmatch.pas | 3 +- nim/transf.pas | 16 +- nim/types.pas | 14 +- objdata.txt | 8 + rod/nimrod.cfg | 11 + rod/nimrod.dot | 532 +++ rod/nimrod.ini | 90 + tests/cairotest.nim | 14 + tests/cgitest.nim | 15 + tests/stckovfl.nim | 8 + tests/sunset.tmpl | 67 + tests/tambsym2.nim | 18 + tests/tambsym3.nim | 8 + tests/tester.nim | 161 + tests/tints.nim | 41 + tests/tisopr.nim | 20 + tests/tlibs.nim | 19 + tests/topenlen.nim | 12 + tests/tos.nim | 12 + tests/trectype.nim | 2 + tests/tsets.nim | 8 +- tests/tstreams.nim | 7 + tests/ttempl.nim | 27 + tests/tvarnums.nim | 8 +- tests/typalias.nim | 15 + tests/x11test.nim | 71 + todo.txt | 39 +- tools/inno.tmpl | 180 + tools/install.tmpl | 97 + tools/niminst | Bin 0 -> 354714 bytes tools/niminst.nim | 346 ++ tools/nimweb.nim | 203 + tools/sunset.tmpl | 72 + 158 files changed, 34811 insertions(+), 10001 deletions(-) create mode 100644 config/nimdoc.cfg create mode 100644 copying.txt create mode 100644 deinstall.sh create mode 100644 gpl.html create mode 100644 ide/config.nim create mode 100644 ide/nimide.nim create mode 100644 install.sh create mode 100644 lib/alloc.nim create mode 100644 lib/atomic.h create mode 100644 lib/base/cgi.html create mode 100644 lib/base/cgi.nim delete mode 100644 lib/base/devel/FGInt.pas delete mode 100644 lib/base/devel/bignums.nim delete mode 100644 lib/base/devel/diff.nim delete mode 100644 lib/base/devel/lex.nim delete mode 100644 lib/base/devel/nregex.nim delete mode 100644 lib/base/devel/python.nim delete mode 100644 lib/base/devel/python.pas create mode 100644 lib/cycle.h create mode 100644 lib/osproc.nim create mode 100644 lib/profiler.nim create mode 100644 lib/streams.nim create mode 100644 lib/target.h create mode 100644 lib/tlsf.c create mode 100644 lib/tlsf.h create mode 100644 lib/ucmaps/8859-1.txt create mode 100644 lib/ucmaps/8859-10.txt create mode 100644 lib/ucmaps/8859-13.txt create mode 100644 lib/ucmaps/8859-14.txt create mode 100644 lib/ucmaps/8859-15.txt create mode 100644 lib/ucmaps/8859-2.txt create mode 100644 lib/ucmaps/8859-3.txt create mode 100644 lib/ucmaps/8859-4.txt create mode 100644 lib/ucmaps/8859-5.txt create mode 100644 lib/ucmaps/8859-6.txt create mode 100644 lib/ucmaps/8859-7.txt create mode 100644 lib/ucmaps/8859-8.txt create mode 100644 lib/ucmaps/8859-9.txt create mode 100644 lib/ucmaps/cp1250.txt create mode 100644 lib/ucmaps/cp1251.txt create mode 100644 lib/ucmaps/cp1252.txt create mode 100644 lib/ucmaps/cp1253.txt create mode 100644 lib/ucmaps/cp1254.txt create mode 100644 lib/ucmaps/cp1255.txt create mode 100644 lib/ucmaps/cp1256.txt create mode 100644 lib/ucmaps/cp1257.txt create mode 100644 lib/ucmaps/cp1258.txt create mode 100644 lib/ucmaps/cp437.txt create mode 100644 lib/ucmaps/cp737.txt create mode 100644 lib/ucmaps/cp775.txt create mode 100644 lib/ucmaps/cp850.txt create mode 100644 lib/ucmaps/cp852.txt create mode 100644 lib/ucmaps/cp855.txt create mode 100644 lib/ucmaps/cp856.txt create mode 100644 lib/ucmaps/cp857.txt create mode 100644 lib/ucmaps/cp860.txt create mode 100644 lib/ucmaps/cp861.txt create mode 100644 lib/ucmaps/cp862.txt create mode 100644 lib/ucmaps/cp863.txt create mode 100644 lib/ucmaps/cp864.txt create mode 100644 lib/ucmaps/cp865.txt create mode 100644 lib/ucmaps/cp866.txt create mode 100644 lib/ucmaps/cp869.txt create mode 100644 lib/ucmaps/cp874.txt create mode 100644 lib/ucmaps/cp932.txt create mode 100644 nim/debugids.pas create mode 100644 nim/depends.pas create mode 100644 nim/evals.pas create mode 100644 nim/hashtest.pas create mode 100644 nim/interact.pas create mode 100644 nim/llstream.pas create mode 100644 nim/lookups.pas create mode 100644 nim/passaux.pas create mode 100644 nim/passes.pas create mode 100644 nim/ptmplsyn.pas create mode 100644 nim/rodread.pas create mode 100644 nim/rodwrite.pas create mode 100644 nim/semdata.pas create mode 100644 nim/seminst.pas create mode 100644 objdata.txt create mode 100644 rod/nimrod.cfg create mode 100644 rod/nimrod.dot create mode 100644 rod/nimrod.ini create mode 100644 tests/cairotest.nim create mode 100644 tests/cgitest.nim create mode 100644 tests/stckovfl.nim create mode 100644 tests/sunset.tmpl create mode 100644 tests/tambsym2.nim create mode 100644 tests/tambsym3.nim create mode 100644 tests/tester.nim create mode 100644 tests/tints.nim create mode 100644 tests/tisopr.nim create mode 100644 tests/tlibs.nim create mode 100644 tests/topenlen.nim create mode 100644 tests/tos.nim create mode 100644 tests/tstreams.nim create mode 100644 tests/ttempl.nim create mode 100644 tests/typalias.nim create mode 100644 tests/x11test.nim create mode 100644 tools/inno.tmpl create mode 100644 tools/install.tmpl create mode 100644 tools/niminst create mode 100644 tools/niminst.nim create mode 100644 tools/nimweb.nim create mode 100644 tools/sunset.tmpl diff --git a/.bzrignore b/.bzrignore index 72d60500a3..0fbaa34442 100644 --- a/.bzrignore +++ b/.bzrignore @@ -10,4 +10,7 @@ doc/*.html *.zip *.tar.gz dist -dist +web +lib/base/devel +lib/base/devel/* + diff --git a/config/nimdoc.cfg b/config/nimdoc.cfg new file mode 100644 index 0000000000..a2a638a891 --- /dev/null +++ b/config/nimdoc.cfg @@ -0,0 +1,293 @@ +# This is the config file for the documentation generator. +# (c) 2008 Andreas Rumpf +# Feel free to edit the templates as you need. + +split.item.toc = "20" +# too long entries in the table of contents get truncated +# after this number of characters + +doc.section = """ +
+

$sectionTitle

+
+$content +
+""" + +doc.section.toc = """ +
  • + $sectionTitle + +
  • +""" + +doc.item = """ +
    $header
    +
    +$desc +
    +""" + +doc.item.toc = """ +
  • $name
  • +""" + +doc.toc = """ +""" + +doc.body_toc = """ +$tableofcontents +
    +$moduledesc +$content +
    +""" + +doc.body_no_toc = """ +$moduledesc +$content +""" + +doc.file = """ + + + + + +$title + + + + + +
    +

    $title

    +$content +Generated: $date $time UTC +
    + + +""" + diff --git a/copying.txt b/copying.txt new file mode 100644 index 0000000000..65b743e4ab --- /dev/null +++ b/copying.txt @@ -0,0 +1,18 @@ +======================================================= + The Nimrod Compiler + Copyright (C) 2004-2008 Andreas Rumpf +======================================================= + +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; version 2 +of the License. + +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. diff --git a/deinstall.sh b/deinstall.sh new file mode 100644 index 0000000000..818b276dcf --- /dev/null +++ b/deinstall.sh @@ -0,0 +1,38 @@ +#! /bin/sh +# +# Nimrod deinstallation script +# (c) 2008 Andreas Rumpf +# + +if [ $# -eq 1 ] ; then + case $1 in + "/usr/bin") + rm -rf /usr/lib/nimrod + rm -rf /usr/share/nimrod/doc + rm -f /usr/bin/nimrod + rm -f /etc/nimrod.cfg + rm -f /etc/nimdoc.cfg || exit 1 + ;; + "/usr/local/bin") + rm -rf /usr/local/lib/nimrod + rm -rf /usr/local/share/nimrod/doc + rm -f /usr/local/bin/nimrod + rm -f /etc/nimrod.cfg + rm -f /etc/nimdoc.cfg || exit 1 + ;; + *) + rm -rf $1/nimrod || exit 1 + ;; + esac + echo "deinstallation successful" +else + echo "Nimrod deinstallation script" + echo "Usage: [sudo] sh deinstall.sh DIR" + echo "Where DIR may be:" + echo " /usr/bin" + echo " /usr/local/bin" + echo " /opt" + echo " (treated like '/opt')" + exit 1 +fi + diff --git a/doc/endb.txt b/doc/endb.txt index b69a6ec6d4..63e3828593 100644 --- a/doc/endb.txt +++ b/doc/endb.txt @@ -14,7 +14,7 @@ compiled with the ``--debugger:on`` command line option. This also defines the conditional symbol ``ENDB`` for you. Note: You must not compile your program with the ``--app:gui`` -command line option because then there is no console +command line option because then there would be no console available for the debugger. If you start your program the debugger will immediately show diff --git a/doc/grammar.txt b/doc/grammar.txt index d8387670b9..ee46cd63a5 100644 --- a/doc/grammar.txt +++ b/doc/grammar.txt @@ -1,6 +1,6 @@ module ::= ([COMMENT] [SAD] stmt)* -optComma ::= [ ',' ] [COMMENT] [IND] +comma ::= ',' [COMMENT] [IND] operator ::= OP0 | OR | XOR | AND | OP3 | OP4 | OP5 | IS | ISNOT | IN | NOTIN | OP6 | DIV | MOD | SHL | SHR | OP7 | NOT @@ -34,11 +34,9 @@ primary ::= ( prefixOperator optInd )* ( symbol | constructor | | castExpr | addrExpr ) ( DOT optInd symbol #| CURLY_LE namedTypeDescList CURLY_RI - | PAR_LE optInd - namedExprList - PAR_RI + | PAR_LE optInd namedExprList PAR_RI | BRACKET_LE optInd - (namedTypeOrExpr optComma)* + [ namedTypeOrExpr (comma namedTypeOrExpr)* [comma] ] BRACKET_RI | CIRCUM | pragma )* @@ -50,17 +48,20 @@ literal ::= INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT | NIL constructor ::= literal - | BRACKET_LE optInd (expr [COLON expr] optComma )* BRACKET_RI # []-Constructor - | CURLY_LE optInd (expr [DOTDOT expr] optComma )* CURLY_RI # {}-Constructor - | PAR_LE optInd (expr [COLON expr] optComma )* PAR_RI # ()-Constructor + | BRACKET_LE optInd colonExprList BRACKET_RI # []-Constructor + | CURLY_LE optInd sliceExprList CURLY_RI # {}-Constructor + | PAR_LE optInd colonExprList PAR_RI # ()-Constructor -exprList ::= ( expr optComma )* +exprList ::= [ expr (comma expr)* [comma] ] + +colonExpr ::= expr [COLON expr] +colonExprList ::= [ colonExpr (comma colonExpr)* [comma] ] namedExpr ::= expr [EQUALS expr] # actually this is symbol EQUALS expr|expr -namedExprList ::= ( namedExpr optComma )* +namedExprList ::= [ namedExpr (comma namedExpr)* [comma] ] -exprOrSlice ::= expr [ DOTDOT expr ] -sliceList ::= ( exprOrSlice optComma )+ +sliceExpr ::= expr [ DOTDOT expr ] +sliceExprList ::= [ sliceExpr (comma sliceExpr)* [comma] ] anonymousProc ::= LAMBDA paramList [pragma] EQUALS stmt expr ::= lowestExpr @@ -70,7 +71,7 @@ expr ::= lowestExpr ELSE COLON expr namedTypeDesc ::= typeDescK | expr [EQUALS (typeDescK | expr)] -namedTypeDescList ::= ( namedTypeDesc optComma )* +namedTypeDescList ::= [ namedTypeDesc (comma namedTypeDesc)* [comma] ] qualifiedIdent ::= symbol [ DOT symbol ] @@ -85,7 +86,7 @@ typeDesc ::= typeDescK | primary optSemicolon ::= [SEMICOLON] -macroStmt ::= COLON [stmt] (OF [sliceList] COLON stmt +macroStmt ::= COLON [stmt] (OF [sliceExprList] COLON stmt | ELIF expr COLON stmt | EXCEPT exceptList COLON stmt )* [ELSE COLON stmt] @@ -112,7 +113,7 @@ stmt ::= simpleStmt [SAD] ([SAD] (complexStmt | simpleStmt) )* DED -exprStmt ::= lowestExpr [EQUALS expr | (expr optComma)* [macroStmt]] +exprStmt ::= lowestExpr [EQUALS expr | [expr (comma expr)* [comma]] [macroStmt]] returnStmt ::= RETURN [expr] yieldStmt ::= YIELD expr discardStmt ::= DISCARD expr @@ -121,25 +122,27 @@ breakStmt ::= BREAK [symbol] continueStmt ::= CONTINUE ifStmt ::= IF expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt] whenStmt ::= WHEN expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt] -caseStmt ::= CASE expr (OF sliceList COLON stmt)* +caseStmt ::= CASE expr (OF sliceExprList COLON stmt)* (ELIF expr COLON stmt)* [ELSE COLON stmt] whileStmt ::= WHILE expr COLON stmt -forStmt ::= FOR (symbol optComma)+ IN expr [DOTDOT expr] COLON stmt -exceptList ::= (qualifiedIdent optComma)* +forStmt ::= FOR symbol (comma symbol)* [comma] IN expr [DOTDOT expr] COLON stmt +exceptList ::= [qualifiedIdent (comma qualifiedIdent)* [comma]] tryStmt ::= TRY COLON stmt (EXCEPT exceptList COLON stmt)* [FINALLY COLON stmt] asmStmt ::= ASM [pragma] (STR_LIT | RSTR_LIT | TRIPLESTR_LIT) blockStmt ::= BLOCK [symbol] COLON stmt -importStmt ::= IMPORT ((symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT) [AS symbol] optComma)+ -includeStmt ::= INCLUDE ((symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT) optComma)+ -fromStmt ::= FROM (symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT) IMPORT (symbol optComma)+ +filename ::= symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT +importStmt ::= IMPORT filename (comma filename)* [comma] +includeStmt ::= INCLUDE filename (comma filename)* [comma] +fromStmt ::= FROM filename IMPORT symbol (comma symbol)* [comma] -pragma ::= CURLYDOT_LE (expr [COLON expr] optComma)+ (CURLYDOT_RI | CURLY_RI) +pragma ::= CURLYDOT_LE colonExprList (CURLYDOT_RI | CURLY_RI) -paramList ::= [PAR_LE ((symbol optComma)+ COLON typeDesc optComma)* PAR_RI] [COLON typeDesc] +param ::= symbol (comma symbol)* [comma] COLON typeDesc +paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc] genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI @@ -160,22 +163,24 @@ constDecl ::= symbol ["*"] [pragma] colonAndEquals [COMMENT | IND COMMENT] constSection ::= CONST indPush constDecl (SAD constDecl)* DED typeDef ::= typeDesc | objectDef | enumDef +objectField ::= symbol ["*"] [pragma] objectIdentPart ::= - (symbol ["*" | "-"] [pragma] optComma)+ COLON typeDesc [COMMENT | IND COMMENT] + objectField (comma objectField)* [comma] COLON typeDesc [COMMENT|IND COMMENT] objectWhen ::= WHEN expr COLON [COMMENT] objectPart (ELIF expr COLON [COMMENT] objectPart)* [ELSE COLON [COMMENT] objectPart] objectCase ::= CASE expr COLON typeDesc [COMMENT] - (OF sliceList COLON [COMMENT] objectPart)* + (OF sliceExprList COLON [COMMENT] objectPart)* [ELSE COLON [COMMENT] objectPart] objectPart ::= objectWhen | objectCase | objectIdentPart | NIL | indPush objectPart (SAD objectPart)* DED -tupleDesc ::= BRACKET_LE optInd ((symbol optComma)+ COLON typeDesc optComma)* BRACKET_RI +tupleDesc ::= BRACKET_LE optInd [param (comma param)* [comma]] BRACKET_RI objectDef ::= OBJECT [pragma] [OF typeDesc] objectPart -enumDef ::= ENUM [OF typeDesc] (symbol [EQUALS expr] optComma [COMMENT | IND COMMENT])+ +enumField ::= symbol [EQUALS expr] +enumDef ::= ENUM [OF typeDesc] (enumField [comma | COMMENT | IND COMMENT])+ typeDecl ::= COMMENT | symbol ["*"] [genericParams] [EQUALS typeDef] [COMMENT | IND COMMENT] @@ -183,5 +188,7 @@ typeDecl ::= COMMENT typeSection ::= TYPE indPush typeDecl (SAD typeDecl)* DED colonOrEquals ::= COLON typeDesc [EQUALS expr] | EQUALS expr -varPart ::= (symbol ["*" | "-"] [pragma] optComma)+ colonOrEquals [COMMENT | IND COMMENT] -varSection ::= VAR (varPart | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED) +varField ::= symbol ["*"] [pragma] +varPart ::= symbol (comma symbol)* [comma] colonOrEquals [COMMENT | IND COMMENT] +varSection ::= VAR (varPart + | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED) diff --git a/doc/manual.txt b/doc/manual.txt index 1c8faf4ac0..cd982302fb 100644 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -223,7 +223,7 @@ A character is not an Unicode character but a single byte. The reason for this is efficiency: For the overwhelming majority of use-cases, the resulting programs will still handle UTF-8 properly as UTF-8 was specially designed for this. -Another reason is that Nimrod should support ``array[char, int]`` or +Another reason is that Nimrod can thus support ``array[char, int]`` or ``set[char]`` efficiently as many algorithms rely on this feature. @@ -363,9 +363,9 @@ constant declaration at compile time. Types ----- -All expressions have a `type`:idx: which is known at compile time. Thus Nimrod -is statically typed. One can declare new types, which is in -essence defining an identifier that can be used to denote this custom type. +All expressions have a `type`:idx: which is known at compile time. Nimrod +is statically typed. One can declare new types, which is in essence defining +an identifier that can be used to denote this custom type. These are the major type classes: @@ -386,9 +386,9 @@ Ordinal types - Ordinal types are countable and ordered. This property allows the operation of functions as ``Inc``, ``Ord``, ``Dec`` on ordinal types to be defined. -- Ordinal values have a smallest possible value. Trying to count farther +- Ordinal values have a smallest possible value. Trying to count further down than the smallest value gives a checked runtime or static error. -- Ordinal values have a largest possible value. Trying to count farther +- Ordinal values have a largest possible value. Trying to count further than the largest value gives a checked runtime or static error. Integers, bool, characters and enumeration types (and subrange of these @@ -453,16 +453,16 @@ floatXX implementation supports ``float32`` and ``float64``. Literals of these types have the suffix 'fXX. -`Automatic type conversion`:idx: in expressions where different kinds -of integer types are used is performed. However, if the type conversion -loses information, the `EInvalidValue`:idx: exception is raised. Certain cases -of the convert error are detected at compile time. +`Automatic type conversion`:idx: is performed in expressions where different +kinds of integer types are used. However, if the type conversion +loses information, the `EOutOfRange`:idx: exception is raised (if the error +cannot be detected at compile time). Automatic type conversion in expressions with different kinds of floating point types is performed: The smaller type is converted to the larger. Arithmetic performed on floating point types -follows the IEEE standard. Only the ``int`` type is converted to a floating -point type automatically, other integer types are not. +follows the IEEE standard. Integer types are not converted to floating point +types automatically and vice versa. Boolean type @@ -475,7 +475,7 @@ This condition holds:: ord(false) == 0 and ord(true) == 1 -The operators ``not, and, or, xor, implies, <, <=, >, >=, !=, ==`` are defined +The operators ``not, and, or, xor, <, <=, >, >=, !=, ==`` are defined for the bool type. The ``and`` and ``or`` operators perform short-cut evaluation. Example: @@ -633,6 +633,8 @@ The lower bound of an array or sequence may be received by the built-in proc received by ``len()``. ``low()`` for a sequence or an open array always returns 0, as this is the first valid index. +The notation ``x[i]`` can be used to access the i-th element of ``x``. + Arrays are always bounds checked (at compile-time or at runtime). These checks can be disabled via pragmas or invoking the compiler with the ``--bound_checks:off`` command line switch. @@ -642,8 +644,8 @@ Tuples and object types ~~~~~~~~~~~~~~~~~~~~~~~ A variable of a `tuple`:idx: or `object`:idx: type is a heterogenous storage container. -A tuple or object defines various named *fields* of a type. A tuple defines an -*order* of the fields additionally. Tuples are meant for heterogenous storage +A tuple or object defines various named *fields* of a type. A tuple also +defines an *order* of the fields. Tuples are meant for heterogenous storage types with no overhead and few abstraction possibilities. The constructor ``()`` can be used to construct tuples. The order of the fields in the constructor must match the order of the tuple's definition. Different tuple-types are @@ -651,8 +653,9 @@ must match the order of the tuple's definition. Different tuple-types are order. The assignment operator for tuples copies each component. -The default assignment operator for objects is not defined. The programmer may -provide one, however. +The default assignment operator for objects copies each component. Overloading +of the assignment operator for objects is not possible, but this may change in +future versions of the compiler. .. code-block:: nimrod @@ -667,7 +670,7 @@ provide one, however. person = ("Peter", 30) The implementation aligns the fields for best access performance. The alignment -is done in a way that is compatible the way the C compiler does it. +is compatible with the way the C compiler does it. Objects provide many features that tuples do not. Object provide inheritance and information hiding. Objects have access to their type at runtime, so that @@ -677,7 +680,7 @@ the ``is`` operator can be used to determine the object's type. type TPerson = object - name*: string # the * means that `name` is accessible from the outside + name*: string # the * means that `name` is accessible from other modules age: int # no * means that the field is hidden TStudent = object of TPerson # a student is a person @@ -692,6 +695,7 @@ Object fields that should be visible outside from the defining module, have to marked by ``*``. In contrast to tuples, different object types are never *equivalent*. + Object variants ~~~~~~~~~~~~~~~ Often an object hierarchy is overkill in certain situations where simple @@ -726,6 +730,7 @@ An example: new(n) # creates a new node n.kind = nkFloat n.floatVal = 0.0 # valid, because ``n.kind==nkFloat``, so that it fits + # the following statement raises an `EInvalidField` exception, because # n.kind's value does not fit: n.strVal = "" @@ -739,9 +744,7 @@ Set type ~~~~~~~~ The `set type`:idx: models the mathematical notion of a set. The set's basetype can only be an ordinal type. The reason is that sets are implemented -as bit vectors. Sets are designed for high performance computing. - -Note: The sets module can be used for sets of other types. +as high performance bit vectors. Sets can be constructed via the set constructor: ``{}`` is the empty set. The empty set is type combatible with any special set type. The constructor @@ -767,22 +770,23 @@ operation meaning ``e in A`` set membership (A contains element e) ``A -+- B`` symmetric set difference (= (A - B) + (B - A)) ``card(A)`` the cardinality of A (number of elements in A) -``incl(A, elem)`` same as A = A + {elem}, but may be faster -``excl(A, elem)`` same as A = A - {elem}, but may be faster +``incl(A, elem)`` same as A = A + {elem} +``excl(A, elem)`` same as A = A - {elem} ================== ======================================================== -Reference type -~~~~~~~~~~~~~~ + +Reference and pointer types +~~~~~~~~~~~~~~~~~~~~~~~~~~~ References (similiar to `pointers`:idx: in other programming languages) are a way to introduce many-to-one relationships. This means different references can -point to and modify the same location in memory. References should be used -sparingly in a program. They are only needed for constructing graphs. +point to and modify the same location in memory. Nimrod distinguishes between `traced`:idx: and `untraced`:idx: references. -Untraced references are also called *pointers*. The difference between them is -that traced references are garbage collected, untraced are not. Thus untraced -references are *unsafe*. However for certain low-level operations (accessing -the hardware) untraced references are unavoidable. +Untraced references are also called *pointers*. Traced references point to +objects of a garbage collected heap, untraced references point to +manually allocated objects or to objects somewhere else in memory. Thus +untraced references are *unsafe*. However for certain low-level operations +(accessing the hardware) untraced references are unavoidable. Traced references are declared with the **ref** keyword, untraced references are declared with the **ptr** keyword. @@ -806,13 +810,15 @@ dereferencing operations for reference types: var n: PNode new(n) - n.data = 9 # no need to write n^.data + n.data = 9 # no need to write n^ .data To allocate a new traced object, the built-in procedure ``new`` has to be used. To deal with untraced memory, the procedures ``alloc``, ``dealloc`` and ``realloc`` can be used. The documentation of the system module contains further information. +If a reference points to *nothing*, it has the value ``nil``. + Special care has to be taken if an untraced object contains traced objects like traced references, strings or sequences: In order to free everything properly, the built-in procedure ``GCunref`` has to be called before freeing the @@ -822,7 +828,7 @@ untraced memory manually! Procedural type ~~~~~~~~~~~~~~~ -A `procedural type`:idx: is internally a pointer to procedure. ``nil`` is +A `procedural type`:idx: is internally a pointer to a procedure. ``nil`` is an allowed value for variables of a procedural type. Nimrod uses procedural types to achieve `functional`:idx: programming techniques. Dynamic dispatch for OOP constructs can also be implemented with procedural types. @@ -928,7 +934,7 @@ statements always have to be intended:: complexStmt ::= ifStmt | whileStmt | caseStmt | tryStmt | forStmt | blockStmt | asmStmt | procDecl | iteratorDecl | macroDecl | templateDecl - | constDecl | typeDecl | whenStmt | varStmt + | constSection | typeSection | whenStmt | varSection @@ -957,8 +963,10 @@ Var statement Syntax:: colonOrEquals ::= COLON typeDesc [EQUALS expr] | EQUALS expr - varPart ::= (symbol ["*" | "-"] [pragma] optComma)+ colonOrEquals [COMMENT] - varStmt ::= VAR (varPart | indPush varPart (SAD varPart)* DED) + varField ::= symbol ["*"] [pragma] + varPart ::= symbol (comma symbol)* [comma] colonOrEquals [COMMENT | IND COMMENT] + varSection ::= VAR (varPart + | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED) `Var`:idx: statements declare new local and global variables and initialize them. A comma seperated list of variables can be used to specify @@ -1126,14 +1134,12 @@ Syntax:: Example: .. code-block:: nimrod - raise EOS("operating system failed") + raise newEOS("operating system failed") Apart from built-in operations like array indexing, memory allocation, etc. -the ``raise`` statement is the only way to raise an exception. The -identifier has to be the name of a previously declared exception. A -comma followed by an expression may follow; the expression must be of type -``string`` or ``cstring``; this is an error message that can be extracted -with the `getCurrentExceptionMsg`:idx: procedure in the module ``system``. +the ``raise`` statement is the only way to raise an exception. + +.. XXX document this better! If no exception name is given, the current exception is `re-raised`:idx:. The `ENoExceptionToReraise`:idx: exception is raised if there is no exception to @@ -1146,10 +1152,11 @@ Try statement Syntax:: - exceptList ::= (qualifiedIdent optComma)* + exceptList ::= [qualifiedIdent (comma qualifiedIdent)* [comma]] tryStmt ::= TRY COLON stmt - (EXCEPT exceptList COLON stmt)* - [FINALLY COLON stmt] + (EXCEPT exceptList COLON stmt)* + [FINALLY COLON stmt] + Example: @@ -1209,10 +1216,15 @@ sugar for: .. code-block:: nimrod result = expr - return + return result -The `result`:idx: variable is always the return value of the procedure. It is -automatically declared by the compiler. +``return`` without an expression is a short notation for ``return result`` if +the proc has a return type. The `result`:idx: variable is always the return +value of the procedure. It is automatically declared by the compiler. As all +variables, ``result`` is initialized to (binary) zero:: + +.. code-block:: nimrod + proc returnZero(): int = nil # implicitely returns 0 Yield statement @@ -1274,7 +1286,7 @@ Example: The `break`:idx: statement is used to leave a block immediately. If ``symbol`` is given, it is the name of the enclosing block that is to leave. If it is -absent, the innermost block is leaved. +absent, the innermost block is left. While statement @@ -1343,14 +1355,16 @@ called `procedures`:idx: in Nimrod (which is the correct terminology). A procedure declaration defines an identifier and associates it with a block of code. A procedure may call itself recursively. The syntax is:: - paramList ::= [PAR_LE ((symbol optComma)+ COLON typeDesc optComma)* PAR_RI] - [COLON typeDesc] + param ::= symbol (comma symbol)* [comma] COLON typeDesc + paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc] + genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI - - procDecl ::= PROC symbol ["*"] [genericParams] paramList [pragma] + + procDecl ::= PROC symbol ["*"] [genericParams] + paramList [pragma] [EQUALS stmt] - -If the ``EQUALS stms`` part is missing, it is a `forward`:idx: declaration. If + +If the ``EQUALS stmt`` part is missing, it is a `forward`:idx: declaration. If the proc returns a value, the procedure body can access an implicit declared variable named `result`:idx: that represents the return value. Procs can be overloaded. The overloading resolution algorithm tries to find the proc that is @@ -1388,8 +1402,8 @@ Calling a procedure can be done in many different ways: callme(y=1, x=0, "abd", '\t') # (x=0, y=1, s="abd", c='\t', b=false) # call with named arguments (order is not relevant): callme(c='\t', y=1, x=0) # (x=0, y=1, s="", c='\t', b=false) - # call as a command statement: no () or , needed: - callme 0 1 "abc" '\t' + # call as a command statement: no () needed: + callme 0, 1, "abc", '\t' Iterators and the for statement @@ -1397,12 +1411,13 @@ Iterators and the for statement Syntax:: - forStmt ::= FOR (symbol optComma)+ IN expr [DOTDOT expr] COLON stmt + forStmt ::= FOR symbol (comma symbol)* [comma] IN expr [DOTDOT expr] COLON stmt - paramList ::= [PAR_LE ((symbol optComma)+ COLON typeDesc optComma)* PAR_RI] - [COLON typeDesc] + param ::= symbol (comma symbol)* [comma] COLON typeDesc + paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc] + genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI - + iteratorDecl ::= ITERATOR symbol ["*"] [genericParams] paramList [pragma] [EQUALS stmt] @@ -1482,7 +1497,7 @@ Example: A `type`:idx: section begins with the ``type`` keyword. It contains multiple type definitions. A type definition binds a type to a name. Type definitions -can be recursive or even mutually recursive. Mutually Recursive types are only +can be recursive or even mutually recursive. Mutually recursive types are only possible within a single ``type`` section. @@ -1579,17 +1594,16 @@ macros. Modules ------- Nimrod supports splitting a program into pieces by a `module`:idx: concept. -Modules make separate compilation possible. Each module needs to be in its -own file. Modules enable `information hiding`:idx: and -`separate compilation`:idx:. A module may gain access to symbols of another -module by the `import`:idx: statement. `Recursive module dependancies`:idx: are -allowed, but slightly subtle. Only top-level symbols that are marked with an -asterisk (``*``) are exported. +Each module needs to be in its own file. Modules enable +`information hiding`:idx: and `separate compilation`:idx:. A module may gain +access to symbols of another module by the `import`:idx: statement. +`Recursive module dependancies`:idx: are allowed, but slightly subtle. Only +top-level symbols that are marked with an asterisk (``*``) are exported. The algorithm for compiling modules is: - Compile the whole module as usual, following import statements recursively -- if we have a cycle only import the already parsed symbols (that are +- if there is a cycle only import the already parsed symbols (that are exported); if an unknown identifier occurs then abort This is best illustrated by an example: @@ -1684,7 +1698,10 @@ Pragmas Syntax:: - pragma ::= CURLYDOT_LE (expr [COLON expr] optComma)+ (CURLYDOT_RI | CURLY_RI) + colonExpr ::= expr [COLON expr] + colonExprList ::= [ colonExpr (comma colonExpr)* [comma] ] + + pragma ::= CURLYDOT_LE colonExprList (CURLYDOT_RI | CURLY_RI) Pragmas are Nimrod's method to give the compiler additional information/ commands without introducing a massive number of new keywords. Pragmas are @@ -1770,7 +1787,6 @@ hints on|off Turns the hint messages of the compiler optimization none|speed|size Optimize the code for speed or size, or disable optimization. For non-optimizing compilers this option has no effect. - Neverless they must parse it properly. callconv cdecl|... Specifies the default calling convention for all procedures (and procedure types) that follow. diff --git a/doc/theindex.txt b/doc/theindex.txt index 9973292423..f60e85d285 100644 --- a/doc/theindex.txt +++ b/doc/theindex.txt @@ -400,7 +400,7 @@ Index `posix.html#1093 `_ `assembler`:idx: - `manual.html#198 `_ + `manual.html#197 `_ `assert`:idx: `system.html#416 `_ @@ -425,7 +425,7 @@ Index `system.html#373 `_ `block`:idx: - `manual.html#194 `_ + `manual.html#193 `_ `bool`:idx: `system.html#109 `_ @@ -434,7 +434,7 @@ Index `manual.html#147 `_ `break`:idx: - `manual.html#195 `_ + `manual.html#194 `_ `breakpoint`:idx: `endb.html#103 `_ @@ -702,7 +702,7 @@ Index `libzip.html#169 `_ `continue`:idx: - `manual.html#197 `_ + `manual.html#196 `_ `copy`:idx: * `system.html#403 `_ @@ -857,7 +857,7 @@ Index `system.html#157 `_ `define`:idx: - `manual.html#224 `_ + `manual.html#223 `_ `defined`:idx: `system.html#114 `_ @@ -933,7 +933,7 @@ Index `nimrodc.html#120 `_ `domain specific languages`:idx: - `manual.html#213 `_ + `manual.html#212 `_ `D_T_FMT`:idx: `posix.html#390 `_ @@ -1083,8 +1083,7 @@ Index `regexprs.html#104 `_ `EInvalidValue`:idx: - * `manual.html#146 `_ - * `system.html#143 `_ + `system.html#143 `_ `EIO`:idx: * `system.html#134 `_ @@ -1161,7 +1160,7 @@ Index `posix.html#264 `_ `ENoExceptionToReraise`:idx: - * `manual.html#186 `_ + * `manual.html#185 `_ * `system.html#149 `_ `ENOEXEC`:idx: @@ -1228,7 +1227,8 @@ Index `system.html#144 `_ `EOutOfRange`:idx: - `system.html#147 `_ + * `manual.html#146 `_ + * `system.html#147 `_ `EOVERFLOW`:idx: `posix.html#283 `_ @@ -1279,8 +1279,8 @@ Index `posix.html#219 `_ `error`:idx: - * `manual.html#223 `_ - * `manual.html#226 `_ + * `manual.html#222 `_ + * `manual.html#225 `_ * `dialogs.html#104 `_ `errorStr`:idx: @@ -1324,10 +1324,10 @@ Index `posix.html#297 `_ `except`:idx: - `manual.html#189 `_ + `manual.html#188 `_ `exception handlers`:idx: - `manual.html#188 `_ + `manual.html#187 `_ `excl`:idx: `system.html#165 `_ @@ -1396,7 +1396,7 @@ Index `manual.html#169 `_ `fatal`:idx: - `manual.html#227 `_ + `manual.html#226 `_ `fchdir`:idx: `posix.html#984 `_ @@ -1522,7 +1522,7 @@ Index `os.html#106 `_ `finally`:idx: - `manual.html#190 `_ + `manual.html#189 `_ `find`:idx: * `system.html#456 `_ @@ -1573,7 +1573,7 @@ Index `posix.html#478 `_ `for`:idx: - `manual.html#205 `_ + `manual.html#204 `_ `fork`:idx: `posix.html#986 `_ @@ -1582,7 +1582,7 @@ Index `manual.html#124 `_ `forward`:idx: - `manual.html#202 `_ + `manual.html#201 `_ `fpathconf`:idx: `posix.html#987 `_ @@ -1678,7 +1678,7 @@ Index `posix.html#311 `_ `funtions`:idx: - `manual.html#200 `_ + `manual.html#199 `_ `F_WRLCK`:idx: `posix.html#312 `_ @@ -1718,7 +1718,7 @@ Index `regexprs.html#102 `_ `Generics`:idx: - `manual.html#209 `_ + `manual.html#208 `_ `getApplicationDir`:idx: `os.html#110 `_ @@ -1748,8 +1748,7 @@ Index `os.html#112 `_ `getCurrentExceptionMsg`:idx: - * `manual.html#184 `_ - * `system.html#428 `_ + `system.html#428 `_ `getCurrentLine`:idx: `lexbase.html#106 `_ @@ -2027,8 +2026,8 @@ Index `system.html#118 `_ `hint`:idx: - * `manual.html#221 `_ - * `manual.html#229 `_ + * `manual.html#220 `_ + * `manual.html#228 `_ `htonl`:idx: `posix.html#792 `_ @@ -2058,10 +2057,10 @@ Index `manual.html#181 `_ `implicit block`:idx: - `manual.html#207 `_ + `manual.html#206 `_ `import`:idx: - `manual.html#217 `_ + `manual.html#216 `_ `importc`:idx: `nimrodc.html#101 `_ @@ -2127,7 +2126,7 @@ Index `dialogs.html#102 `_ `information hiding`:idx: - `manual.html#215 `_ + `manual.html#214 `_ `init`:idx: `parseopt.html#103 `_ @@ -2213,7 +2212,7 @@ Index * `system.html#443 `_ `iterator`:idx: - `manual.html#206 `_ + `manual.html#205 `_ `iterOverEnvironment`:idx: `os.html#152 `_ @@ -2339,7 +2338,7 @@ Index `posix.html#1061 `_ `Macros`:idx: - `manual.html#212 `_ + `manual.html#211 `_ `makecontext`:idx: `posix.html#1189 `_ @@ -2384,7 +2383,7 @@ Index `posix.html#685 `_ `methods`:idx: - `manual.html#199 `_ + `manual.html#198 `_ `min`:idx: * `system.html#263 `_ @@ -2501,7 +2500,7 @@ Index * `system.html#217 `_ `module`:idx: - `manual.html#214 `_ + `manual.html#213 `_ `MON_1`:idx: `posix.html#410 `_ @@ -2775,7 +2774,7 @@ Index `manual.html#139 `_ `Operators`:idx: - `manual.html#204 `_ + `manual.html#203 `_ `or`:idx: * `system.html#233 `_ @@ -3122,7 +3121,7 @@ Index `manual.html#162 `_ `procedures`:idx: - `manual.html#201 `_ + `manual.html#200 `_ `PROT_EXEC`:idx: `posix.html#676 `_ @@ -3563,7 +3562,7 @@ Index `zlib.html#104 `_ `push/pop`:idx: - `manual.html#230 `_ + `manual.html#229 `_ `putEnv`:idx: `os.html#142 `_ @@ -3624,7 +3623,7 @@ Index `system.html#120 `_ `re-raised`:idx: - `manual.html#185 `_ + `manual.html#184 `_ `read`:idx: `posix.html#1018 `_ @@ -3686,7 +3685,7 @@ Index `system.html#413 `_ `Recursive module dependancies`:idx: - `manual.html#218 `_ + `manual.html#217 `_ `register`:idx: `nimrodc.html#113 `_ @@ -3708,11 +3707,11 @@ Index `system.html#371 `_ `result`:idx: - * `manual.html#192 `_ - * `manual.html#203 `_ + * `manual.html#191 `_ + * `manual.html#202 `_ `return`:idx: - `manual.html#191 `_ + `manual.html#190 `_ `rewinddir`:idx: `posix.html#804 `_ @@ -3965,7 +3964,7 @@ Index `scope`:idx: * `manual.html#106 `_ - * `manual.html#219 `_ + * `manual.html#218 `_ `SC_OPEN_MAX`:idx: `posix.html#571 `_ @@ -4229,7 +4228,7 @@ Index `posix.html#1054 `_ `separate compilation`:idx: - `manual.html#216 `_ + `manual.html#215 `_ `seq`:idx: `system.html#123 `_ @@ -6355,7 +6354,7 @@ Index `posix.html#1034 `_ `system`:idx: - `manual.html#220 `_ + `manual.html#219 `_ `tabulator`:idx: `manual.html#125 `_ @@ -6427,7 +6426,7 @@ Index `posix.html#806 `_ `template`:idx: - `manual.html#211 `_ + `manual.html#210 `_ `TEndian`:idx: `system.html#385 `_ @@ -6696,7 +6695,7 @@ Index `posix.html#1037 `_ `try`:idx: - `manual.html#187 `_ + `manual.html#186 `_ `Tsched_param`:idx: `posix.html#199 `_ @@ -6854,10 +6853,10 @@ Index `type`:idx: * `manual.html#102 `_ * `manual.html#141 `_ - * `manual.html#208 `_ + * `manual.html#207 `_ `type parameters`:idx: - `manual.html#210 `_ + `manual.html#209 `_ `type suffix`:idx: `manual.html#138 `_ @@ -6908,7 +6907,7 @@ Index `zlib.html#156 `_ `undef`:idx: - `manual.html#225 `_ + `manual.html#224 `_ `UnixToNativePath`:idx: `os.html#124 `_ @@ -6963,8 +6962,8 @@ Index * `zipfiles.html#110 `_ `warning`:idx: - * `manual.html#222 `_ - * `manual.html#228 `_ + * `manual.html#221 `_ + * `manual.html#227 `_ * `dialogs.html#103 `_ `WCONTINUED`:idx: @@ -6980,7 +6979,7 @@ Index `manual.html#183 `_ `while`:idx: - `manual.html#196 `_ + `manual.html#195 `_ `Whitespace`:idx: `strutils.html#102 `_ @@ -7058,7 +7057,7 @@ Index `posix.html#441 `_ `yield`:idx: - `manual.html#193 `_ + `manual.html#192 `_ `Z_ASCII`:idx: `zlib.html#138 `_ diff --git a/gpl.html b/gpl.html new file mode 100644 index 0000000000..0aec9fff0d --- /dev/null +++ b/gpl.html @@ -0,0 +1,493 @@ + + + +GNU General Public License - GNU Project - Free Software Foundation (FSF) + + +

    GNU General Public License

    +
    +

    Table of Contents

    + + +

    + +


    + +

    + + + +

    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. + +

    + + +

    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. + +

    + +
    +one line to give the program's name and an idea of what it does.
    +Copyright (C) yyyy  name of author
    +
    +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.
    +
    +signature of Ty Coon, 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/ide/config.nim b/ide/config.nim new file mode 100644 index 0000000000..448a67bda2 --- /dev/null +++ b/ide/config.nim @@ -0,0 +1,93 @@ +# Does the config parsing for us + +import + parsecfg, strtabs, strutils + +type + TTokenClass* = enum + gtBackground, + gtNone, + gtWhitespace, + gtDecNumber, + gtBinNumber, + gtHexNumber, + gtOctNumber, + gtFloatNumber, + gtIdentifier, + gtKeyword, + gtStringLit, + gtLongStringLit, + gtCharLit, + gtEscapeSequence, + gtOperator, + gtPunctation, + gtComment, + gtLongComment, + gtRegularExpression, + gtTagStart, + gtTagEnd, + gtKey, + gtValue, + gtRawData, + gtAssembler, + gtPreprocessor, + gtDirective, + gtCommand, + gtRule, + gtHyperlink, + gtLabel, + gtReference, + gtOther, + gtCursor + + TColor* = colKeywords, colIdentifiers, colComments + TConfiguration* = object of TObject ## the configuration object + colors*: array [TTokenClass] of TColor ## the colors to use + filelist*: seq[string] ## the filelist + +const + colWhite = 0x00ffffff # rgb + colBlack = 0x00000000 + colYellow = + +proc readConfig(filename: string): TConfiguration = + # fill with reasonable defaults: + result.filelist = [] + result.colors[gtBackground] = colWhite + gtNone: + gtWhitespace, + gtDecNumber, + gtBinNumber, + gtHexNumber, + gtOctNumber, + gtFloatNumber, + gtIdentifier, + gtKeyword, + gtStringLit, + gtLongStringLit, + gtCharLit, + gtEscapeSequence, + gtOperator, + gtPunctation, + gtComment, + gtLongComment, + gtRegularExpression, + gtTagStart, + gtTagEnd, + gtKey, + gtValue, + gtRawData, + gtAssembler, + gtPreprocessor, + gtDirective, + gtCommand, + gtRule, + gtHyperlink, + gtLabel, + gtReference, + gtOther + gtCursor + var + p: TCfgParser + if open(p, filename): + diff --git a/ide/main.nim b/ide/main.nim index 22ab88d676..a7e9bb642e 100644 --- a/ide/main.nim +++ b/ide/main.nim @@ -1,13 +1,13 @@ # The beginning of an IDE for Nimrod # (c) 2008 Andreas Rumpf -import glib2, gtk2, libglade2, dialogs, parseopt +import os, glib2, gtk2, libglade2, dialogs, parseopt proc on_window_destroy(obj: PGtkObject, data: pointer) {.cdecl.} = gtk_main_quit() const - GuiTemplate = "/media/hda4/nimrod/ide/nimide.glade" + GuiTemplate = "/media/hda1/Eigenes/nimrod/ide/nimide.glade" type TTab = object of TObject @@ -35,19 +35,19 @@ proc on_about_menu_item_activate(menuItem: PGtkMenuItem, proc load_file(e: var TMyTextEditor, filename: string) = var - err: ptr GError + err: pointer status: cstring text: cstring result: bool buffer: PGtkTextBuffer - gtk_statusbar_push(e.statusbar, e.statusbar_context_id, "Loading...") - while gtk_events_pending(): gtk_main_iteration() + discard gtk_statusbar_push(e.statusbar, e.statusbar_context_id, "Loading...") + while gtk_events_pending() != 0: discard gtk_main_iteration() # get the file contents result = g_file_get_contents(filename, addr(text), nil, addr(err)) if not result: - error_message("Cannot load file") - g_error_free(err) + error(e.window, "Cannot load file") + #g_error_free(err) # disable the text view while loading the buffer with the text gtk_widget_set_sensitive(e.text_view, false) @@ -103,7 +103,8 @@ proc check_for_save(e: var TMyTextEditor): bool = GtkWidget *dialog; const gchar *msg = "Do you want to save the changes you have made?"; dialog = gtk_message_dialog_new (nil, - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_DIALOG_MODAL or + GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, msg); @@ -146,15 +147,13 @@ proc main() = var editor: TMyTextEditor - gtk_nimrod_init() initApp(editor) gtk_widget_show(editor.window) gtk_main() +gtk_nimrod_init() main() - - proc on_window_delete_event(widget: PGtkWidget, event: PGdkEvent, e: TMyTextEditor): bool {.cdecl.} = if check_for_save(editor): diff --git a/ide/nimide.glade b/ide/nimide.glade index 0bd5f11f1c..ce24683b2e 100644 --- a/ide/nimide.glade +++ b/ide/nimide.glade @@ -1,224 +1,192 @@ - - - - - - - GDK_EXTENSION_EVENTS_ALL - - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - 600 - 400 - True - False - 0 - - - - True - GTK_PACK_DIRECTION_LTR - GTK_PACK_DIRECTION_LTR - - - - True - _Datei - True - - - - True - - - - True - gtk-new - True - - - - - - True - gtk-open - True - - - - - - True - gtk-save - True - - - - - - True - gtk-save-as - True - - - - - - True - - - - - - True - gtk-quit - True - - - - - - - - - - True - _Bearbeiten - True - - - - True - - - - True - gtk-cut - True - - - - - - True - gtk-copy - True - - - - - - True - gtk-paste - True - - - - - - True - gtk-delete - True - - - - - - - - - - True - _Hilfe - True - - - - True - - - - True - gtk-about - True - - - - - - - - - 0 - False - True - - - - - - 1 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_ETCHED_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_NONE - True - 0 - 0 - 0 - 2 - 2 - 0 - - - - - - 0 - True - True - - - - - - True - True - - - 0 - False - True - - - - - - - + + + + + + GDK_EXTENSION_EVENTS_ALL + + + + 600 + 400 + True + + + True + + + True + _Datei + True + + + True + + + True + gtk-new + True + True + + + + + True + gtk-open + True + True + + + + + True + gtk-save + True + True + + + + + True + gtk-save-as + True + True + + + + + True + + + + + True + gtk-quit + True + True + + + + + + + + + True + _Bearbeiten + True + + + True + + + True + gtk-cut + True + True + + + + + True + gtk-copy + True + True + + + + + True + gtk-paste + True + True + + + + + True + gtk-delete + True + True + + + + + + + + + True + _Hilfe + True + + + True + + + True + gtk-about + True + True + + + + + + + + + False + + + + + True + True + 10 + 0 + + + + + + + tab + + + + + + + + + tab + + + + + + + + + tab + + + + + 1 + + + + + True + + + False + 2 + + + + + + diff --git a/ide/nimide.nim b/ide/nimide.nim new file mode 100644 index 0000000000..c5abc3bbf0 --- /dev/null +++ b/ide/nimide.nim @@ -0,0 +1,118 @@ +# The beginning of an IDE for Nimrod +# (c) 2008 Andreas Rumpf + +import os, glib2, gdk2, gtk2, libglade2, pango, dialogs, parseopt + +const + GuiTemplate = "nimide.glade" + dummyConst = "" + +type + TTab {.pure, final.} = object + textview: PGtkTextView + filename: string + untitled: bool + hbox: PGtkHBox + e: PEditor + PTab = ptr TTab + + TEditor = object of TObject + window: PGtkWindow + statusbar: PGtkStatusBar + menu: PGtkMenuBar + notebook: PGtkNotebook + tabname: int # used for generating tab names + PEditor = ptr TEditor + +proc on_window_destroy(obj: PGtkObject, event: PGdkEvent, + data: pointer): gboolean {.cdecl.} = + gtk_main_quit() + +proc on_about_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} = + gtk_show_about_dialog(e.window, + "comments", "A fast and leight-weight IDE for Nimrod", + "copyright", "Copyright \xc2\xa9 2008 Andreas Rumpf", + "version", "0.1", + "website", "http://nimrod.ethexor.com", + "program-name", "Nimrod IDE", + nil) + +proc getTabIndex(e: PEditor, tab: PTab): int = + var i = 0 + while true: + var w = gtk_notebook_get_nth_page(e.notebook, i) + if w == nil: return -1 + var v = gtk_notebook_get_tab_label(e.notebook, w) + if tab.hbox == v: return i + inc(i) + +proc OnCloseTab(button: PGtkButton, tab: PTab) {.cdecl.} = + var idx = getTabIndex(tab.e, tab) + if idx >= 0: gtk_notebook_remove_page(tab.e.notebook, idx) + +proc createTab(e: PEditor, filename: string, untitled: bool) = + var t = cast[PTab](alloc0(sizeof(TTab))) + t.textview = gtk_text_view_new_with_buffer(gtk_text_buffer_new(nil)) + var font_desc = pango_font_description_from_string("monospace 10") + gtk_widget_modify_font(t.textview, font_desc) + pango_font_description_free(font_desc) + t.filename = filename + t.untitled = untitled + gtk_widget_show(t.textview) + var scroll = gtk_scrolled_window_new(nil, nil) + gtk_container_add(scroll, t.textview) + gtk_widget_show(scroll) + + t.e = e + t.hbox = gtk_hbox_new(false, 0) + var image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU) + var button = gtk_button_new() + var lab = gtk_label_new(filename) + gtk_button_set_image(button, image) + gtk_button_set_relief(button, GTK_RELIEF_NONE) + gtk_box_pack_start(t.hbox, lab, false, false, 2) + gtk_box_pack_end(t.hbox, button, false, false, 0) + + discard g_signal_connect(button, "clicked", G_Callback(onCloseTab), t) + gtk_widget_show(button) + gtk_widget_show(lab) + + var idx = gtk_notebook_append_page(e.notebook, scroll, t.hbox) + gtk_notebook_set_current_page(e.notebook, idx) + +proc on_new_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} = + inc(e.tabname) + createTab(e, "untitled-" & $e.tabname, true) + +proc main(e: PEditor) = + var builder = glade_xml_new(getApplicationDir() / GuiTemplate, nil, nil) + if builder == nil: quit("cannot open: " & GuiTemplate) + # get the components: + e.window = GTK_WINDOW(glade_xml_get_widget(builder, "window")) + e.statusbar = GTK_STATUSBAR(glade_xml_get_widget(builder, "statusbar")) + e.notebook = GTK_NOTEBOOK(glade_xml_get_widget(builder, "notebook")) + setHomogeneous(e.notebook^, 1) + + # connect the signal handlers: + glade_xml_signal_connect(builder, "on_window_destroy", + GCallback(on_window_destroy)) + var about = GTK_MENU_ITEM(glade_xml_get_widget(builder, "about_menu_item")) + discard g_signal_connect(about, "activate", + G_CALLBACK(on_about_menu_item_activate), e) + + var newItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "new_menu_item")) + discard g_signal_connect(newItem, "activate", + G_CALLBACK(on_new_menu_item_activate), e) + + var quitItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "quit_menu_item")) + discard g_signal_connect(quitItem, "activate", + G_CALLBACK(on_window_destroy), e) + + gtk_window_set_default_icon_name(GTK_STOCK_EDIT) + gtk_widget_show(e.window) + gtk_main() + + +gtk_nimrod_init() +var e = cast[PEditor](alloc0(sizeof(TEditor))) +main(e) diff --git a/install.sh b/install.sh new file mode 100644 index 0000000000..eb592da843 --- /dev/null +++ b/install.sh @@ -0,0 +1,126 @@ +#! /bin/sh +# +# Nimrod installation script +# (c) 2008 Andreas Rumpf +# + +if [ $# -eq 1 ] ; then + + if test -f bin/nimrod + then + echo "Nimrod already built -- skipping this phase" + else + echo "building Nimrod..." + sh ./build.sh || exit 1 + echo "...done" + fi + + case $1 in + "/usr/bin") + configdir=/etc + libdir=/usr/lib/nimrod + mkdir -p /usr/lib/nimrod + mkdir -p /usr/share/nimrod/doc + + cp bin/nimrod /usr/bin/nimrod + cp config/nimdoc.cfg /etc/nimdoc.cfg + cp -r -p lib /usr/lib/nimrod + cp -r -p doc /usr/share/nimrod/doc + ;; + "/usr/local/bin") + configdir=/etc + libdir=/usr/local/lib/nimrod + mkdir -p /usr/local/lib/nimrod + mkdir -p /usr/local/share/nimrod/doc + + cp bin/nimrod /usr/local/bin/nimrod + cp config/nimdoc.cfg /etc/nimdoc.cfg + cp -r -p lib /usr/local/lib/nimrod + cp -r -p doc /usr/local/share/nimrod/doc + ;; + *) + configdir="$1/nimrod/config" + libdir="$1/nimrod/lib" + mkdir -p $1/nimrod + mkdir -p $1/nimrod/bin + mkdir -p $1/nimrod/config + mkdir -p $1/nimrod/lib + mkdir -p $1/nimrod/doc + + cp bin/nimrod $1/nimrod/bin/nimrod + cp config/nimdoc.cfg $1/nimrod/config/nimdoc.cfg + cp -r -p lib $1/nimrod + cp -r -p doc $1/nimrod + ;; + esac + # write the configuration file + cat >$configdir/nimrod.cfg < (treated like '/opt')" + echo "To deinstall, use the command:" + echo "sh deinstall.sh DIR" + exit 1 +fi diff --git a/install.txt b/install.txt index 60d52e2285..c6059882a1 100644 --- a/install.txt +++ b/install.txt @@ -61,5 +61,6 @@ Currently, the following C compilers are supported under Windows: - | Digital Mars C++ | http://www.digitalmars.com/download/freecompiler.html -For faster compile times I recommend Digital Mars C++ -- it is easy to install +For better compile times I recommend Digital Mars C++ -- it is easy to install and a small package. + diff --git a/koch.py b/koch.py index d8d42a02b3..1f5ae0d2ce 100644 --- a/koch.py +++ b/koch.py @@ -18,7 +18,7 @@ False = 0 == 1 # --------------------- constants ---------------------------------------- -NIMROD_VERSION = '0.7.0' +NIMROD_VERSION = '0.7.2' # This string contains Nimrod's version. It is the only place # where the version needs to be updated. The rest is done by # the build process automatically. It is replaced **everywhere** @@ -405,8 +405,10 @@ Possible Commands: clean cleans Nimrod project; removes generated files boot [options] bootstraps with given command line options rodsrc generates Nimrod version from Pascal version - web generates the website (requires Cheetah) + web generates the website profile profile the Nimrod compiler + zip build the installation ZIP package + inno build the Inno Setup installer """ % (NIMROD_VERSION + ' ' * (44-len(NIMROD_VERSION)), sys.version) def main(args): @@ -440,8 +442,20 @@ def main(args): elif cmd == "rodsrc": cmd_rodsrc() elif cmd == "web": cmd_web() elif cmd == "profile": cmd_profile() + elif cmd == "zip": cmd_zip() + elif cmd == "inno": cmd_inno() else: Error("illegal command: " + cmd) +def cmd_zip(): + Exec("nimrod cc -r tools/niminst --var:version=%s csource rod/nimrod" % + NIMROD_VERSION) + Exec("nimrod cc -r tools/niminst --var:version=%s zip rod/nimrod" % + NIMROD_VERSION) + +def cmd_inno(): + Exec("nimrod cc -r tools/niminst --var:version=%s inno rod/nimrod" % + NIMROD_VERSION) + # -------------------------- bootstrap ---------------------------------------- def readCFiles(): @@ -678,6 +692,8 @@ def getOSandProcessor(): else: processor = os.uname()[4] if lower(processor) in ("i686", "i586", "i468", "i386"): processor = "i386" + if lower(processor) in ("x86_64", "x86-64", "amd64"): + processor = "amd64" if find(lower(processor), "sparc") >= 0: processor = "sparc" return (host, processor) diff --git a/lib/alloc.nim b/lib/alloc.nim new file mode 100644 index 0000000000..504453699a --- /dev/null +++ b/lib/alloc.nim @@ -0,0 +1,394 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +# Low level allocator for Nimrod. + +# ------------ platform specific chunk allocation code ----------------------- + +when defined(posix): + const # XXX: make these variables for portability? + PROT_READ = 1 # page can be read + PROT_WRITE = 2 # page can be written + PROT_EXEC = 4 # page can be executed + PROT_NONE = 0 # page can not be accessed + + MAP_SHARED = 1 # Share changes + MAP_PRIVATE = 2 # Changes are private + MAP_TYPE = 0xf # Mask for type of mapping + MAP_FIXED = 0x10 # Interpret addr exactly + MAP_ANONYMOUS = 0x20 # don't use a file + + MAP_GROWSDOWN = 0x100 # stack-like segment + MAP_DENYWRITE = 0x800 # ETXTBSY + MAP_EXECUTABLE = 0x1000 # mark it as an executable + MAP_LOCKED = 0x2000 # pages are locked + MAP_NORESERVE = 0x4000 # don't check for reservations + + proc mmap(adr: pointer, len: int, prot, flags, fildes: cint, + off: int): pointer {.header: "".} + + proc munmap(adr: pointer, len: int) {.header: "".} + + proc osAllocPages(size: int): pointer {.inline.} = + result = mmap(nil, size, PROT_READ or PROT_WRITE, + MAP_PRIVATE or MAP_ANONYMOUS, -1, 0) + if result == nil or result == cast[pointer](-1): + raiseOutOfMem() + + proc osDeallocPages(p: pointer, size: int) {.inline} = + munmap(p, len) + +elif defined(windows): + const + MEM_RESERVE = 0x2000 + MEM_COMMIT = 0x1000 + MEM_TOP_DOWN = 0x100000 + PAGE_READWRITE = 0x04 + + proc VirtualAlloc(lpAddress: pointer, dwSize: int, flAllocationType, + flProtect: int32): pointer {. + header: "", stdcall.} + + proc osAllocPages(size: int): pointer {.inline.} = + result = VirtualAlloc(nil, size, MEM_RESERVE or MEM_COMMIT, + PAGE_READWRITE) + if result == nil: raiseOutOfMem() + + proc osDeallocPages(p: pointer, size: int) {.inline.} = + nil + +else: + {.error: "Port GC to your platform".} + +# --------------------- end of non-portable code ----------------------------- + +# We manage *chunks* of memory. Each chunk is a multiple of the page size. +# The page size may or may not the operating system's page size. Each chunk +# starts at an address that is divisible by the page size. Chunks that are +# bigger than ``ChunkOsReturn`` are returned back to the operating system +# immediately. + + +# Guess the page size of the system; if it is the +# wrong value, performance may be worse (this is not +# for sure though), but GC still works; must be a power of two! +const + PageShift = if sizeof(pointer) == 4: 12 else: 13 + PageSize = 1 shl PageShift # on 32 bit systems 4096 + + MemAlignment = sizeof(pointer)*2 # minimal memory block that can be allocated + BitsPerUnit = sizeof(int)*8 + # a "unit" is a word, i.e. 4 bytes + # on a 32 bit system; I do not use the term "word" because under 32-bit + # Windows it is sometimes only 16 bits + + BitsPerPage = PageSize div MemAlignment + UnitsPerPage = BitsPerPage div BitsPerUnit + # how many units do we need to describe a page: + # on 32 bit systems this is only 16 (!) + + smallRequest = PageSize div 4 + ChunkOsReturn = 1024 # in pages + InitialMemoryRequest = ChunkOsReturn div 2 # < ChunkOsReturn! + debugMemMan = true # we wish to debug the memory manager... + +type + PChunkDesc = ptr TChunkDesc + TChunkDesc {.final, pure.} = object + key: TAddress # address at bit 0 + next: PChunkDesc + bits: array[0..127, int] # a bit vector + + PChunkDescArray = ptr array[0..1000_000, PChunkDesc] + TChunkSet {.final, pure.} = object + counter, max: int + head: PChunkDesc + data: PChunkDescArray + +when sizeof(int) == 4: + type THalfWord = int16 +else: + type THalfWord = int32 + +type + TFreeCell {.final, pure.} = object + zeroField: pointer # type info nil means cell is not used + next: ptr TFreeCell # next free cell in chunk + + PChunk = ptr TChunk + TChunk {.final, pure.} = object + size: int # lowest two bits are used for merging: + # bit 0: chunk to the left is accessible and free + # bit 1: chunk to the right is accessible and free + len: int # for small object allocation + prev, next: PChunk # chunks of the same (or bigger) size + #len, used: THalfWord # index of next to allocate cell + freeList: ptr TFreeCell + data: float # a float for alignment purposes + +proc roundup(x, v: int): int {.inline.} = return ((-x) and (v-1)) +% x + +assert(roundup(14, PageSize) == PageSize) +assert(roundup(15, 8) == 16) + +# ------------- chunk table --------------------------------------------------- +# We use a PtrSet of chunk starts and a table[Page, chunksize] for chunk +# endings of big chunks. This is needed by the merging operation. The only +# remaining operation is best-fit for big chunks. Since there is a size-limit +# for big chunks (because greater than the limit means they are returned back +# to the OS), a fixed size array can be used. + +type + PLLChunk = ptr TLLChunk + TLLChunk {.pure.} = object ## *low-level* chunk + size: int + when sizeof(int) == 4: + align: int + + TAllocator {.final, pure.} = object + llmem: PLLChunk + UsedPagesCount, FreePagesCount, maxPagesCount: int + freeSmallChunks: array[0..smallRequest div MemAlign-1, PChunk] + freeBigChunks: array[0..ChunkOsReturn-1, PChunk] + + +proc llAlloc(a: var TAllocator, size: int): pointer = + # *low-level* alloc for the memory managers data structures. Deallocation + # is never done. + assert(size <= PageSize-8) + if a.llmem.size + size > PageSize: + a.llmem = osGetPages(PageSize) + inc(a.gUsedPages) + a.llmem.size = 8 + result = cast[pointer](cast[TAddress](a.llmem) + a.llmem.size) + inc(llmem.size, size) + zeroMem(result, size) + + +const + InitChunkSetSize = 1024 # must be a power of two! + +proc ChunkSetInit(s: var TChunkSet) = + s.data = cast[PChunkDescArray](llAlloc(InitChunkSetSize * sizeof(PChunkDesc))) + s.max = InitChunkSetSize-1 + s.counter = 0 + s.head = nil + +proc ChunkSetGet(t: TChunkSet, key: TAddress): PChunkDesc = + var h = cast[int](key) and t.max + while t.data[h] != nil: + if t.data[h].key == key: return t.data[h] + h = nextTry(h, t.max) + return nil + +proc ChunkSetRawInsert(t: TChunkSet, data: PChunkDescArray, + desc: PChunkDesc) = + var h = cast[int](desc.key) and t.max + while data[h] != nil: + assert(data[h] != desc) + h = nextTry(h, t.max) + assert(data[h] == nil) + data[h] = desc + +proc ChunkSetEnlarge(t: var TChunkSet) = + var oldMax = t.max + t.max = ((t.max+1)*2)-1 + var n = cast[PChunkDescArray](llAlloc((t.max + 1) * sizeof(PChunkDescArray))) + for i in 0 .. oldmax: + if t.data[i] != nil: + ChunkSetRawInsert(t, n, t.data[i]) + tlsf_free(t.data) + t.data = n + +proc ChunkSetPut(t: var TChunkSet, key: TAddress): PChunkDesc = + var h = cast[int](key) and t.max + while true: + var x = t.data[h] + if x == nil: break + if x.key == key: return x + h = nextTry(h, t.max) + + if ((t.max+1)*2 < t.counter*3) or ((t.max+1)-t.counter < 4): + ChunkSetEnlarge(t) + inc(t.counter) + h = cast[int](key) and t.max + while t.data[h] != nil: h = nextTry(h, t.max) + assert(t.data[h] == nil) + # the new page descriptor goes into result + result = cast[PChunkDesc](llAlloc(sizeof(TChunkDesc))) + result.next = t.head + result.key = key + t.head = result + t.data[h] = result + +# ---------- slightly higher level procs -------------------------------------- + +proc in_Operator(s: TChunkSet, cell: PChunk): bool = + var u = cast[TAddress](cell) + var t = ChunkSetGet(s, u shr PageShift) + if t != nil: + u = (u %% PageSize) /% MemAlignment + result = (t.bits[u /% BitsPerUnit] and (1 shl (u %% BitsPerUnit))) != 0 + else: + result = false + +proc incl(s: var TCellSet, cell: PCell) = + var u = cast[TAddress](cell) + var t = ChunkSetPut(s, u shr PageShift) + u = (u %% PageSize) /% MemAlignment + t.bits[u /% BitsPerUnit] = t.bits[u /% BitsPerUnit] or + (1 shl (u %% BitsPerUnit)) + +proc excl(s: var TCellSet, cell: PCell) = + var u = cast[TAddress](cell) + var t = ChunkSetGet(s, u shr PageShift) + if t != nil: + u = (u %% PageSize) /% MemAlignment + t.bits[u /% BitsPerUnit] = (t.bits[u /% BitsPerUnit] and + not (1 shl (u %% BitsPerUnit))) + +iterator elements(t: TChunkSet): PChunk {.inline.} = + # while traversing it is forbidden to add pointers to the tree! + var r = t.head + while r != nil: + var i = 0 + while i <= high(r.bits): + var w = r.bits[i] # taking a copy of r.bits[i] here is correct, because + # modifying operations are not allowed during traversation + var j = 0 + while w != 0: # test all remaining bits for zero + if (w and 1) != 0: # the bit is set! + yield cast[PCell]((r.key shl PageShift) or # +% + (i*%BitsPerUnit+%j) *% MemAlignment) + inc(j) + w = w shr 1 + inc(i) + r = r.next + + +# ------------- chunk management ---------------------------------------------- +proc removeChunk(a: var TAllocator, c: PChunk) {.inline.} = + if c.prev != nil: c.prev.next = c.next + if c.next != nil: c.next.prev = c.prev + if a.freeChunks[c.size div PageSize] == c: + a.freeChunks[c.size div PageSize] = c.next + +proc addChunk(a: var TAllocator, c: PChunk) {.inline.} = + var s = abs(c.size) div PageSize + c.prev = nil + c.next = a.freeChunks[s] + a.freeChunks[s] = c + +proc freeChunk(a: var TAllocator, c: PChunk) = + assert(c.size > 0) + if c.size < PageSize: c.size = PageSize + var le = cast[PChunk](cast[TAddress](p) and not PageMask -% PageSize) + var ri = cast[PChunk](cast[TAddress](p) and not PageMask +% + c.size +% PageSize) + if isStartOfAChunk(ri) and ri.size < 0: + removeChunk(a, ri) + inc(c.size, -ri.size) + if isEndOfAChunk(le): + le = cast[PChunk](cast[TAddress](p) and not PageMask -% + le.chunkStart+PageSize) + if le.size < 0: + removeChunk(a, le) + inc(le.size, c.size) + addChunk(a, le) + return + c.size = -c.size + addChunk(a, c) + +proc splitChunk(a: var TAllocator, c: PChunk, size: int) = + var rest = cast[PChunk](cast[TAddress](p) + size) + rest.size = size - c.size # results in negative number, because rest is free + addChunk(a, rest) + # mark pages as accessible: + ChunkTablePut(a, rest, bitAccessible) + c.size = size + +proc getChunkOfSize(a: var TAllocator, size: int): PChunk = + for i in size..high(a.freeChunks): + result = a.freeChunks[i] + if result != nil: + if i != size: splitChunk(a, result, size) + else: removeChunk(a, result) + result.prev = nil + result.next = nil + break + +# ----------------------------------------------------------------------------- + +proc getChunk(p: pointer): PChunk {.inline.} = + result = cast[PChunk](cast[TAddress](p) and not PageMask) + +proc getCellSize(p: pointer): int {.inline.} = + var c = getChunk(p) + result = abs(c.size) + +proc alloc(a: var TAllocator, size: int): pointer = + if size <= smallRequest: + # allocate a small block + var s = size div MemAlign + var c = a.freeSmallChunks[s] + if c == nil: + c = getChunkOfSize(0) + c.freeList = nil + c.size = size + a.freeSmallChunks[s] = c + c.len = 1 + c.used = 1 + c.chunkStart = 0 + result = addr(c.data[0]) + elif c.freeList != nil: + result = c.freeList + assert(c.freeList.zeroField == nil) + c.freeList = c.freeList.next + inc(c.used) + if c.freeList == nil: removeChunk(a, c) + else: + assert(c.len*size <= high(c.data)) + result = addr(c.data[c.len*size]) + inc(c.len) + inc(c.used) + if c.len*size > high(c.data): removeChunk(a, c) + else: + # allocate a large block + var c = getChunkOfSize(size shr PageShift) + result = addr(c.data[0]) + c.freeList = nil + c.size = size + c.len = 0 + c.used = 0 + c.chunkStart = 0 + +proc dealloc(a: var TAllocator, p: pointer) = + var c = getChunk(p) + if c.size <= smallRequest: + # free small block: + var f = cast[ptr TFreeCell](p) + f.zeroField = nil + f.next = c.freeList + c.freeList = p + dec(c.used) + if c.used == 0: freeChunk(c) + else: + # free big chunk + freeChunk(c) + +proc realloc(a: var TAllocator, p: pointer, size: int): pointer = + # could be made faster, but this is unnecessary, the GC does not use it anyway + result = alloc(a, size) + copyMem(result, p, getCellSize(p)) + dealloc(a, p) + +proc isAllocatedPtr(a: TAllocator, p: pointer): bool = + var c = getChunk(p) + if c in a.accessibleChunks and c.size > 0: + result = cast[ptr TFreeCell](p).zeroField != nil diff --git a/lib/arithm.nim b/lib/arithm.nim index 91a2232c95..5c8b5726c3 100644 --- a/lib/arithm.nim +++ b/lib/arithm.nim @@ -14,7 +14,7 @@ proc raiseOverflow {.compilerproc, noinline.} = # a single proc to reduce code size to a minimum raise newException(EOverflow, "over- or underflow") -proc raiseDivByZero {.exportc: "raiseDivByZero", noinline.} = +proc raiseDivByZero {.compilerproc, noinline.} = raise newException(EDivByZero, "divison by zero") proc addInt64(a, b: int64): int64 {.compilerProc, inline.} = diff --git a/lib/atomic.h b/lib/atomic.h new file mode 100644 index 0000000000..afab4843f0 --- /dev/null +++ b/lib/atomic.h @@ -0,0 +1,2716 @@ +/* Atomic operations for Nimrod */ + +#if defined(_MSCVER) +__declspec(naked) int __fastcall Xadd (volatile int* pNum, int val) +{ + __asm + { + lock xadd dword ptr [ECX], EDX + mov EAX, EDX + ret + } +} + + + +#endif + + +#define ATOMIC_ASM(type,op) \ + __asm __volatile ("lock; " op : "=m" (*(type *)p) : "ir" (v), "0" (*(type *)p)) + +#define ATOMIC_ASM_NOLOCK(type,op) \ + __asm __volatile (op : "=m" (*(type *)p) : "ir" (v), "0" (*(type *)p)) + +static __inline void +atomic_add_int(void *p, u_int v) +{ + ATOMIC_ASM(int, "addl %1,%0"); +} + +static __inline void +atomic_add_int_nolock(void *p, u_int v) +{ + ATOMIC_ASM_NOLOCK(int, "addl %1,%0"); +} + + + +/* +Atomic.h + +Joshua Scholar +May 26, 2003 + +This header contains: + +a multiprocessor nonblocking FIFO, + +a multiprocessor nonblocking LIFO + +multiprocessor nonblocking reference counting (including volatile pointers +that can be safely shared between processors) + +nonblocking memory allocation routines + +template types that encapsulate variables meant to be shared between +processors - all changes to these variables are atomic and globally visible + +All kinds of atomic operations that are useful in a multiprocessor context. + +The philosophy behind this code is that I created templates that encapsulate +atomic access so that while the templates themselves may not be the easiest +code to read, code that uses these templates can be simple, abstract and +reliable. + +I also created regular C style functions, overloaded by type for some of +the more basic operations. If you have regular variables or memory +locations that you want to use in a globally visible way you have two +choices. + +If the operation you want is one of the basic building blocks you can +call one of the overloaded functions like InterlockedSetIfEqual(). + +Otherwise it's perfectly safe to cast a pointer to your data to be a pointer +to one of the atomic types so that you can use their methods. For instance: +if (((AtomicInt *)foo)->CompareSomeBitsAndExchangeSomeOtherBits(exchange, + bitsToExchange, + comperand, + bitsToCompare)) + ... +or even + +//atomically allocate n bytes out of the pool + data = ((*(AtomicPtr *)curPool)+= n) - n; + + + +State of code: + +Unlike other libraries of similar routines that I wrote in the past, this +has not been thoroughly tested. In fact I don't remember how much of it has +been tested at this point. + +It would take an 8 way machine for me to really pound on the routines. + + + +Overview + +Some basic types are: +typedef Atomic AtomicInt; +typedef Atomic AtomicUInt; +typedef Atomic<__int64> AtomicInt64; +typedef Atomic AtomicUInt64; + +Fancier types include +template struct AtomicPtr; +This is a pointer that has the same semantics as the above integer types + +template struct AtomicPtrWithCount; + +AtomicPtrWithCount is a very important type. It has 32 bits of pointer +and 32 bits of counter. There are a number of algorithms that are possible +when a pointer and a counter can be changed atomically together including a +lock free pushdown stack and reference counted garbage collection where +multiple processors can share pointers as well as sharing the data that's +pointed at. + +template struct AtomicPtrWithMark; + +This is similar to AtomicPtrWithCount but the extra 32 bits are accessed +as individual bits instead of being accessed as a counter. It's not as +important. I was playing with algorithms before I realized that the +important ones I was afraid of using had been published independently of my +former employer. + + + +The atomic number types act as integer variables, but all changes to these +variable happen through interlocked atomic instructions. +All changes are therefor "globally visible" in Intel's parlance. + +Note that incrementing (or decrementing or adding to) one of these uses +InterlockedExchangeAdd, which for 64 bit numbers ends up relying on "lock +CMPXCHG8B" + +There's an Exchange method. + +There are also special methods that use compare exchange in some forms that +I've found useful: + +T CompareExchange(T exchange, T comperand) +bool SetIfEqual(T exchange, T comperand) + +and fancier ones I found some uses for + + inline bool SetIfSomeBitsAreEqual(T exchange, T comperand, T bitsToCompare) + inline bool SetSomeBitsIfThoseBitsAreEqual(T exchange, + T comperand, + T bitsToCompare) + inline bool SetSomeBitsIfSomeOtherBitsAreEqual(T exchange, + T bitsToExchange, + T comperand, + T bitsToCompare + ) + + inline T CompareSomeBitsAndExchange(T exchange, + T comperand, + T bitsToCompare) + inline T CompareSomeBitsAndExchangeThoseBits(T exchange, + T comperand, + T bitsToCompare) + inline T CompareSomeBitsAndExchangeSomeOtherBits(T exchange, + T bitsToExchange, + T comperand, + T bitsToCompare + ) + +There are also atomic bit test, bit test and set etc. methods: + + inline bool BTS(int bit) + inline bool BTC(int bit) + inline bool BTR(int bit) + inline bool BT(int bit) + +ALGORITHMS and their classes: + +The important ones are: + +struct Counted +Use this as the base type for any object you want to be reference counted + +template class CountedPtr; +Safely acts as pointer to a reference counted type. This pointer can not be +shared between threads safely. + +template class AtomicCountedPtr; +Like CountedPtr but this pointer CAN be shared between threads/processors +safely. + +template class MPQueue; +Multiprocessor queue. This is the nonblocking shared FIFO. + +Note, for the sake of convenience there is a Fifo that has the same +semantics but can only be used single threaded: +template class Queue ; + +class MPCountStack; +This is the multiprocessor nonblocking LIFO stack. Note that what gets +pushed on the stack are pointers to MPStackElement. Your data must be +objects derived from MPStackElements. Note that it is not legal to push a +NULL onto the stack - NULL is used to signal an empty stack. + +Note that for the sake of convienience there is, once again, a single +threaded version of the stack: +class SimpleStack. + +There are also classes for allocators that use the MPCountStack as a +freelist. +template +struct MPCountFreeListAllocator; + +This template is recursive in the sense that each allocator gets new blocks +from a shared allocatorn passed in the constructor (of type +BLOCK_ALLOCATOR). You can build a tree of allocators this way. The root of +the tree should be of type SimpleAllocator which just calls new and +delete. + +Once again, for the sake of simplicity, there is a single threaded version +of the block allocator called +template struct SimpleBlockAllocator + +*/ +#ifndef ATOMIC_H +#define ATOMIC_H +#include +#include +#include +using namespace std; +/* + windows defines the following interlocked routines + we need to define the equivalent for volatiles (which + they should have been in the first place, and the following + types voltatile long, volatile int, volatile unsigned long, + volatile unsigned int, volatile T*, volatile __int64, + volatile unsigned __int64. + + Note: I use the platform SDK which has different header files + for interlocked instructions than the Windows includes in Visual + C + + If you have the platform SDK and the code doesn't compile then + you need to make sure that + "C:\Program Files\Microsoft Platform SDK\include" + is the first directory listed under menus "Tools" -> menu item + "Options" -> tab "Directories" (of course if you installed the + platform SDK in a different directory than + "C:\Program Files\Microsoft Platform SDK" then you should use + YOUR path. + + If you don't have the plaform SDK then InterlockedCompareExchange + is defined for void * instead of being defined for longs... and + there is no InterlockedCompareExchangePointer + + The whole point of Microsoft having different headers was an update + to support 64 bit platforms which doesn't matter here at all (some + of the code here relies on CMPXCHG8B swaping out both a pointer AND + a counter - a trick that won't work on the current 64 bit platforms). + + In any case, if you don't have the platform SDK then just + appropriate casts to make the code compile. Keep in mind that + casting from 64 bit types to 32 bit types is wrong - where there's + a 64 bit type I meant it to call one of my assembly language + routines that uses CMPXCHG8B. + + LONG + InterlockedIncrement( + LPLONG lpAddend + ); + + LONG + InterlockedDecrement( + LPLONG lpAddend + ); + + LONG + InterlockedExchange( + LPLONG Target, + LONG Value + ); + + LONG + InterlockedExchangeAdd( + LPLONG Addend, + LONG Value + ); + + LONG + InterlockedCompareExchange ( + PLONG Destination, + LONG ExChange, + LONG Comperand + ); + + PVOID + InterlockedExchangePointer ( + PVOID *Target, + PVOID Value + ); + + PVOID + InterlockedCompareExchangePointer ( + PVOID *Destination, + PVOID ExChange, + PVOID Comperand + ); +*/ + +//we'll need a special cases for volatile __int64 and +//volatile unsigned __int64 + +template +inline T InterlockedIncrement(volatile T * ptr) +{ + return (T)InterlockedIncrement((LPLONG)ptr); +} + +template +inline T InterlockedDecrement(volatile T * ptr) +{ + return (T)InterlockedDecrement((LPLONG)ptr); +} + +template +inline T InterlockedExchange(volatile T * target,T value) +{ + return (T)InterlockedExchange((LPLONG)target,(LONG)value); +} + +template +inline T InterlockedExchangeAdd(volatile T *addend,T value) +{ + return (T)InterlockedExchangeAdd((LPLONG)addend,(LONG)value); +} + +template +T InterlockedCompareExchange (volatile T * dest,T exchange,T comperand) +{ + return (T)InterlockedCompareExchange ((LPLONG)dest, + (LONG)exchange, + (LONG)comperand); +} +//most common use of InterlockedCompareExchange +template +bool InterlockedSetIfEqual (volatile T * dest,T exchange,T comperand) +{ + return comperand==InterlockedCompareExchange(dest,exchange,comperand); +} + +//disable the no return value warning, because the assembly language +//routines load the appropriate registers directly +#pragma warning(disable:4035) + +inline unsigned __int64 +InterlockedCompareExchange(volatile unsigned __int64 *dest + ,unsigned __int64 exchange + ,unsigned __int64 comperand) +{ + //value returned in eax::edx + __asm { + lea esi,comperand; + lea edi,exchange; + + mov eax,[esi]; + mov edx,4[esi]; + mov ebx,[edi]; + mov ecx,4[edi]; + mov esi,dest; + //lock CMPXCHG8B [esi] is equivalent to the following except + //that it's atomic: + //ZeroFlag = (edx:eax == *esi); + //if (ZeroFlag) *esi = ecx:ebx; + //else edx:eax = *esi; + lock CMPXCHG8B [esi]; + } +} + +//most common use of InterlockedCompareExchange +//It's more efficient to use the z flag than to do another compare +inline bool +InterlockedSetIfEqual(volatile unsigned __int64 *dest + ,unsigned __int64 exchange + ,unsigned __int64 comperand) +{ + //value returned in eax + __asm { + lea esi,comperand; + lea edi,exchange; + + mov eax,[esi]; + mov edx,4[esi]; + mov ebx,[edi]; + mov ecx,4[edi]; + mov esi,dest; + //lock CMPXCHG8B [esi] is equivalent to the following except + //that it's atomic: + //ZeroFlag = (edx:eax == *esi); + //if (ZeroFlag) *esi = ecx:ebx; + //else edx:eax = *esi; + lock CMPXCHG8B [esi]; + mov eax,0; + setz al; + } +} +#pragma warning(default:4035) + +inline unsigned __int64 InterlockedIncrement(volatile unsigned __int64 * ptr) +{ + unsigned __int64 comperand; + unsigned __int64 exchange; + do { + comperand = *ptr; + exchange = comperand+1; + }while(!InterlockedSetIfEqual(ptr,exchange,comperand)); + return exchange; +} + +inline unsigned __int64 InterlockedDecrement(volatile unsigned __int64 * ptr) +{ + unsigned __int64 comperand; + unsigned __int64 exchange; + do { + comperand = *ptr; + exchange = comperand-1; + }while(!InterlockedSetIfEqual(ptr,exchange,comperand)); + return exchange; +} + +inline unsigned __int64 InterlockedExchange(volatile unsigned __int64 * target, + unsigned __int64 value) +{ + unsigned __int64 comperand; + do { + comperand = *target; + }while(!InterlockedSetIfEqual(target,value,comperand)); + return comperand; +} + +inline unsigned __int64 InterlockedExchangeAdd(volatile unsigned __int64 *addend, + unsigned __int64 value) +{ + unsigned __int64 comperand; + do { + comperand = *addend; + }while(!InterlockedSetIfEqual(addend,comperand+value,comperand)); + return comperand; +} + +#pragma warning(disable:4035) +inline __int64 +InterlockedCompareExchange(volatile __int64 *dest + ,__int64 exchange + ,__int64 comperand) +{ + //value returned in eax::edx + __asm { + lea esi,comperand; + lea edi,exchange; + + mov eax,[esi]; + mov edx,4[esi]; + mov ebx,[edi]; + mov ecx,4[edi]; + mov esi,dest; + //lock CMPXCHG8B [esi] is equivalent to the following except + //that it's atomic: + //ZeroFlag = (edx:eax == *esi); + //if (ZeroFlag) *esi = ecx:ebx; + //else edx:eax = *esi; + lock CMPXCHG8B [esi]; + } +} + +//most common use of InterlockedCompareExchange +//It's more efficient to use the z flag than to do another compare +inline bool +InterlockedSetIfEqual(volatile __int64 *dest + ,__int64 exchange + ,__int64 comperand) +{ + //value returned in eax + __asm { + lea esi,comperand; + lea edi,exchange; + + mov eax,[esi]; + mov edx,4[esi]; + mov ebx,[edi]; + mov ecx,4[edi]; + mov esi,dest; + //lock CMPXCHG8B [esi] is equivalent to the following except + //that it's atomic: + //ZeroFlag = (edx:eax == *esi); + //if (ZeroFlag) *esi = ecx:ebx; + //else edx:eax = *esi; + lock CMPXCHG8B [esi]; + mov eax,0; + setz al; + } +} +#pragma warning(default:4035) + +inline __int64 InterlockedIncrement(volatile __int64 * dest) +{ + __int64 comperand; + __int64 exchange; + do { + comperand = *dest; + exchange = comperand+1; + }while(!InterlockedSetIfEqual(dest,exchange,comperand)); + return exchange; +} + +inline __int64 InterlockedDecrement(volatile __int64 * dest) +{ + __int64 comperand; + __int64 exchange; + do { + comperand = *dest; + exchange = comperand-1; + }while(!InterlockedSetIfEqual(dest,exchange,comperand)); + return exchange; +} + +inline __int64 InterlockedExchange(volatile __int64 * target,__int64 value) +{ + __int64 comperand; + do { + comperand = *target; + }while(!InterlockedSetIfEqual(target,value,comperand)); + return comperand; +} + +inline __int64 InterlockedExchangeAdd(volatile __int64 *addend, + __int64 value) +{ + __int64 comperand; + do { + comperand = *addend; + }while(!InterlockedSetIfEqual(addend,comperand+value,comperand)); + return comperand; +} + +#pragma warning(disable:4035) +//I've just thought of some algorithms that use BTS and all so I'm including them +inline bool InterlockedBTS(volatile int *dest, int bit) +{ + //value returned in eax + __asm{ + mov eax,bit; + mov ebx,dest; + lock bts [ebx],eax; + mov eax,0; + setc al; + } +} +inline bool InterlockedBTC(volatile int *dest, int bit) +{ + //value returned in eax + __asm{ + mov eax,bit; + mov ebx,dest; + lock btc [ebx],eax; + mov eax,0; + setc al; + } +} +inline bool InterlockedBTR(volatile int *dest, int bit) +{ + //value returned in eax + __asm{ + mov eax,bit; + mov ebx,dest; + lock btr [ebx],eax; + mov eax,0; + setc al; + } +} +//you can lock BT but since it doesn't change memory there isn't really any point +inline bool BT(volatile int *dest, int bit) +{ + //value returned in eax + __asm{ + mov eax,bit; + mov ebx,dest; + bt [ebx],eax; + mov eax,0; + setc al; + } +} +#pragma warning(default:4035) + +inline bool InterlockedBTS(volatile unsigned *dest, int bit) +{ + return InterlockedBTS((volatile int *)dest,bit); +} +inline bool InterlockedBTC(volatile unsigned *dest, int bit) +{ + return InterlockedBTC((volatile int *)dest,bit); +} +inline bool InterlockedBTR(volatile unsigned *dest, int bit) +{ + return InterlockedBTR((volatile int *)dest,bit); +} +inline bool BT(volatile unsigned *dest, int bit) +{ + return BT((volatile int *)dest,bit); +} + +inline bool InterlockedBTS(volatile unsigned long *dest, int bit) +{ + return InterlockedBTS((volatile int *)dest,bit); +} +inline bool InterlockedBTC(volatile unsigned long *dest, int bit) +{ + return InterlockedBTC((volatile int *)dest,bit); +} +inline bool InterlockedBTR(volatile unsigned long *dest, int bit) +{ + return InterlockedBTR((volatile int *)dest,bit); +} +inline bool BT(volatile unsigned long *dest, int bit) +{ + return BT((volatile int *)dest,bit); +} + +inline bool InterlockedBTS(volatile long *dest, int bit) +{ + return InterlockedBTS((volatile int *)dest,bit); +} +inline bool InterlockedBTC(volatile long *dest, int bit) +{ + return InterlockedBTC((volatile int *)dest,bit); +} +inline bool InterlockedBTR(volatile long *dest, int bit) +{ + return InterlockedBTR((volatile int *)dest,bit); +} +inline bool BT(volatile long *dest, int bit) +{ + return BT((volatile int *)dest,bit); +} + +inline bool InterlockedBTS(volatile __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTS((volatile int *)&dest,bit); + return InterlockedBTS(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTC(volatile __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTC((volatile int *)&dest,bit); + return InterlockedBTC(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTR(volatile __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTR((volatile int *)&dest,bit); + return InterlockedBTR(1+(volatile int *)&dest,bit-32); +} +inline bool BT(volatile __int64 *dest, int bit) +{ + if (bit<32) return BT((volatile int *)&dest,bit); + return BT(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTS(volatile unsigned __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTS((volatile int *)&dest,bit); + return InterlockedBTS(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTC(volatile unsigned __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTC((volatile int *)&dest,bit); + return InterlockedBTC(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTR(volatile unsigned __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTR((volatile int *)&dest,bit); + return InterlockedBTR(1+(volatile int *)&dest,bit-32); +} +inline bool BT(volatile unsigned __int64 *dest, int bit) +{ + if (bit<32) return BT((volatile int *)&dest,bit); + return BT(1+(volatile int *)&dest,bit-32); +} + +//T can be int, unsigned int, long, unsigned long +//__int64 or unsigned __int64 +template +struct Atomic +{ + volatile T value; + + inline Atomic(){} + + explicit inline Atomic(T n) + { //so that it's globally visible (to use intel's terminology) + InterlockedExchange(&value,n); + } + + //if you need an atomic load then use (*this += 0) + //but I haven't found any algorithms that + //require an atomic load + inline operator T() const + { + return value; + } + + inline T CompareExchange(T exchange, T comperand) + { + return InterlockedCompareExchange(&value,exchange,comperand); + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare + inline T CompareSomeBitsAndExchange(T exchange, T comperand, T bitsToCompare) + { + T returned; + T bitsToIgnore = ~bitsToCompare; + for (;;){ + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return returned; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and in the set + inline T CompareSomeBitsAndExchangeThoseBits(T exchange, T comperand, T bitsToCompare) + { + T returned = comperand; + T bitsToIgnore = ~bitsToCompare; + for (;;){ + exchange = (exchange&bitsToCompare) | (bitsToIgnore&returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return returned; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and others in the set + inline T CompareSomeBitsAndExchangeSomeOtherBits(T exchange, + T bitsToExchange, + T comperand, + T bitsToCompare + ) + { + T returned = value; + T bitsToIgnore = ~bitsToCompare; + T bitsToLeave = ~bitsToExchange; + for (;;){ + exchange = (exchange&bitsToExchange) | (bitsToLeave&returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return returned; + } + + inline T Exchange(T exchange) + { + return InterlockedExchange(&value,exchange); + } + + inline bool SetIfEqual(T exchange, T comperand) + { + return InterlockedSetIfEqual(&value,exchange,comperand); + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare + inline bool SetIfSomeBitsAreEqual(T exchange, T comperand, T bitsToCompare) + { + T returned; + T bitsToIgnore = ~bitsToCompare; + for (;;){ + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return false; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and in the set + inline bool SetSomeBitsIfThoseBitsAreEqual(T exchange, T comperand, T bitsToCompare) + { + T returned = comperand; + T bitsToIgnore = ~bitsToCompare; + for (;;){ + exchange = (exchange&bitsToCompare) | (bitsToIgnore&returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comperand = (comperand&bitsToCompare) | (bitsToIgnore&returned); + } + return false; + } + //useful - simulates having a compareexchange that ignores some bits in + //the compare and others in the set + inline bool SetSomeBitsIfSomeOtherBitsAreEqual(T exchange, + T bitsToExchange, + T comperand, + T bitsToCompare + ) + { + T returned = value; + T bitsToIgnore = ~bitsToCompare; + T bitsToLeave = ~bitsToExchange; + for (;;){ + exchange = (exchange&bitsToExchange) | (bitsToLeave&returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comperand = (comperand&bitsToCompare) | (bitsToIgnore&returned); + } + return false; + } + + inline T operator =(T exchange) + { + Exchange(exchange); + return exchange; + } + + inline T operator +=(T n) + { + return n + InterlockedExchangeAdd(&value, n); + } + + inline T operator -=(T n) + { + return InterlockedExchangeAdd(&value, -n) - n; + } + inline T operator ++() + { + return (*this += 1); + } + + inline T operator --() + { + return (*this -= 1); + } + + inline T operator ++(int) + { + return InterlockedExchangeAdd(&value, (T)1); + } + + inline T operator --(int) + { + return InterlockedExchangeAdd(&value, (T)-1); + } + + inline T operator &=(T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand & n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator |= (T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand | n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + //yes this isn't standard, but it's useful + inline T Mask(T bitsToKeep, T bitsToSet) + { + T comperand; + T exchange; + do { + comperand = value ; + exchange = ((comperand & bitsToKeep) | bitsToSet); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator ^= (T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand ^ n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + inline T operator *= (T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand * n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator /= (T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand / n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator >>= (unsigned n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand >> n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator <<= (unsigned n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand << n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + inline bool BTS(int bit) + { + return InterlockedBTS(&value,bit); + } + inline bool BTC(int bit) + { + return InterlockedBTC(&value,bit); + } + inline bool BTR(int bit) + { + return InterlockedBTR(&value,bit); + } + inline bool BT(int bit) + { + return BT(&value,bit); + } +}; + +template +T * InterlockedCompareExchangePointer ( + T *volatile *dest, + T * exchange, + T * comperand + ) +{ + return (T*)InterlockedCompareExchangePointer((PVOID *)dest,(PVOID)exchange,(PVOID)comperand); +} + +template +struct AtomicPtr +{ + T * volatile value; + + inline AtomicPtr(){} + + explicit inline AtomicPtr(T *n) + { //so that it's globally visible (to use intel's terminology) + InterlockedExchange(&value,n); + } + explicit inline AtomicPtr(const T *n) + { //so that it's globally visible (to use intel's terminology) + InterlockedExchange(&value,(T *)n); + } + + inline operator T *() const + { + return value; + } + + inline operator const T *() const + { + return value; + } + + inline T *CompareExchange(T *exchange, T *comperand) + { + return InterlockedCompareExchangePointer(&value,exchange,comperand); + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare + inline T * CompareSomeBitsAndExchange(T * exchange, T * comperand, int bitsToCompare) + { + T *returned; + int bitsToIgnore = ~bitsToCompare; + for (;;){ + returned = InterlockedCompareExchangePointer(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return returned; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and in the set + inline T * CompareSomeBitsAndExchangeThoseBits(T * exchange, T * comperand, int bitsToCompare) + { + T *returned = comperand; + int bitsToIgnore = ~bitsToCompare; + for (;;){ + exchange = (T*)((int)exchange&bitsToCompare) | (bitsToIgnore&(int)returned); + returned = InterlockedCompareExchangePointer(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned); + } + return returned; + } + //useful - simulates having a compareexchange that ignores some bits in + //the compare and others in the set + inline T* CompareSomeBitsAndExchangeSomeOtherBits(T *exchange, + int bitsToExchange, + T * comperand, + int bitsToCompare + ) + { + T * returned = value; + int bitsToIgnore = ~bitsToCompare; + int bitsToLeave = ~bitsToExchange; + for (;;){ + exchange = (T*)((int)exchange&bitsToExchange) | (bitsToLeave&(int)returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned); + } + return returned; + } + + inline T * operator ->() const + { + assert (value != NULL); + return value; + } + + inline T *Exchange(T *exchange) + { + return InterlockedExchange(&value,exchange); + } + + inline bool SetIfEqual(T *exchange, T *comperand) + { + return comperand==InterlockedCompareExchangePointer(&value,exchange,comperand); + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare + inline bool SetIfSomeBitsAreEqual(T * exchange, T * comperand, int bitsToCompare) + { + T *returned; + int bitsToIgnore = ~bitsToCompare; + for (;;){ + returned = InterlockedCompareExchangePointer(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return false; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and in the set + inline bool SetSomeBitsIfThoseBitsAreEqual(T * exchange, T * comperand, int bitsToCompare) + { + T *returned = comperand; + int bitsToIgnore = ~bitsToCompare; + for (;;){ + exchange = (T*)((int)exchange&bitsToCompare) | (bitsToIgnore&(int)returned); + returned = InterlockedCompareExchangePointer(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned); + } + return false; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and others in the set + inline bool SetSomeBitsIfSomeOtherBitsAreEqual(T *exchange, + int bitsToExchange, + T * comperand, + int bitsToCompare + ) + { + T * returned = value; + int bitsToIgnore = ~bitsToCompare; + int bitsToLeave = ~bitsToExchange; + for (;;){ + exchange = (T*)((int)exchange&bitsToExchange) | (bitsToLeave&(int)returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned); + } + return false; + } + + inline T *operator =(T *exchange) + { + Exchange(exchange); + return exchange; + } + + template + inline T *operator +=(INT_TYPE n) + { + return n + (T *)InterlockedExchangeAdd((LPLONG)&value, (LONG)(n * (LONG)sizeof(T))); + } + + template + inline T *operator -=(INT_TYPE n) + { + return (T *)InterlockedExchangeAdd((LPLONG)&value, (LONG)(-n * (LONG)sizeof(T))) - n; + } + inline T *operator ++() + { + return (T *)InterlockedExchangeAdd((LPLONG)&value, (LONG)(sizeof(T))) + 1; + } + + inline T *operator --() + { + return (T *)InterlockedExchangeAdd((LPLONG)&value, -(LONG)(sizeof(T))) - 1; + } + + inline T *operator ++(int) + { + return (T*)InterlockedExchangeAdd((LPLONG)&value, (LONG)sizeof(T)); + } + + inline T *operator --(int) + { + return (T*)InterlockedExchangeAdd((LPLONG)&value, -(LONG)sizeof(T)); + } + + //yes this isn't standard, but it's useful + template + inline T *operator &=(INT_TYPE n) + { + T * comperand; + T * exchange; + do { + comperand = value; + exchange = (T *)((LONG)comperand & n); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + //yes this isn't standard, but it's useful + template + inline T *operator |= (INT_TYPE n) + { + T * comperand; + T * exchange; + do { + comperand = value; + exchange = (T *)((LONG)comperand | n); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + //yes this isn't standard, but it's useful + template + inline T operator ^= (INT_TYPE n) + { + T * comperand; + T * exchange; + do { + comperand = value; + exchange = (T *)((LONG)comperand ^ n); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + //yes this isn't standard, but it's useful + template + inline T * Mask(INT_TYPE_A bitsToKeep, INT_TYPE_B bitsToSet) + { + T * comperand; + T * exchange; + do { + comperand = value ; + exchange = (T *)(((LONG)comperand & bitsToKeep) | bitsToSet); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + + inline bool BTS(int bit) + { + return InterlockedBTS((volatile int *)&value,bit); + } + inline bool BTC(int bit) + { + return InterlockedBTC((volatile int *)&value,bit); + } + inline bool BTR(int bit) + { + return InterlockedBTR((volatile int *)&value,bit); + } + inline bool BT(int bit) + { + return BT((volatile int *)&value,bit); + } +}; + +typedef Atomic AtomicInt; +typedef Atomic AtomicUInt; +typedef Atomic<__int64> AtomicInt64; +typedef Atomic AtomicUInt64; + +template + +struct AtomicUnion +{ + A whole; + + AtomicUnion() + { + assert(sizeof(T)<=sizeof(A)); + new((void *)&whole) T();//in place new + + } + + ~AtomicUnion() + { + ((T *)&whole)->~T(); + } + + T &Value() + { + return *(T *)&whole; + } + const T &Value() const + { + return *(const T *)&whole; + } +}; + + +template +struct AtomicPtrWithCountStruct +{ + AtomicPtr ptr; + AtomicInt count; +}; + + +template +struct PtrWithCountStruct +{ + T* ptr; + int count; +}; + +template +struct BitMarkedAtomicPtr : public AtomicPtr +{ + const int MarkMask() const + { + return (1< +struct AtomicPtrWithCount : public AtomicUnion< AtomicPtrWithCountStruct > +{ + typedef AtomicUnion< PtrWithCountStruct, unsigned __int64 > SimpleUnionType; + AtomicPtrWithCount() + { + whole = 0; + } + AtomicPtrWithCount(unsigned __int64 o) + { + whole = o.whole; + } + AtomicPtrWithCount(T *ptr) + { + SimpleUnionType o; + o.Value().ptr = ptr; + o.Value().count = 0; + whole = o.whole; + } + + operator unsigned __int64() const + { + return whole; + } + T *Ptr() const + { + return Value().ptr; + } + int Count() const + { + return Value().count; + } + unsigned __int64 Whole() const + { + return whole; + } + + AtomicPtr & Ptr() + { + return Value().ptr; + } + AtomicInt & Count() + { + return Value().count; + } + AtomicUInt64 & Whole() + { + return whole; + } + unsigned __int64 SetPtrAndIncCount(T *ptr) + { + SimpleUnionType was; + SimpleUnionType to; + to.Value().ptr = ptr; + do { + was.whole = whole; + to.Value().count = was.Value().count+1; + }while(!whole.SetIfEqual(to.whole,was.whole)); + return to.whole; + } + bool SetIfPtrEqualAndIncCount(T *exchange, T *comperand) + { + SimpleUnionType was; + SimpleUnionType to; + to.ptr = exchange; + do { + was.whole = whole; + if (was.Value().ptr != comperand) return false; + to.Value().count = was.Value().count+1; + }while(!whole.SetIfEqual(to.whole,was.whole)); + return true; + } + unsigned __int64 ExchangeIfPtrEqualAndIncCount(T *exchange, T *comperand) + { + SimpleUnionType was; + SimpleUnionType to; + to.ptr = exchange; + do { + was.whole = whole; + if (was.Value().ptr != comperand) return was.whole; + to.Value().count = was.Value().count+1; + }while(!whole.SetIfEqual(to.whole,was.whole)); + return was.whole; + } + inline T *operator =(T *exchange) + { + SetPtrAndIncCount(exchange); + return exchange; + } + + template + inline T *operator +=(INT_TYPE n) + { + T *was; + T *to; + do { + was = Ptr(); + to = was + n; + }while (!SetIfPtrEqualAndIncCount(to,was)); + return to; + } + + template + inline T *operator -=(INT_TYPE n) + { + T *was; + T *to; + do { + was = Ptr(); + to = was - n; + }while (!SetIfPtrEqualAndIncCount(to,was)); + return to; + } + inline T *operator ++() + { + return (*this += 1); + } + + inline T *operator --() + { + return (*this -= 1); + } + + inline T *operator ++(int) + { + return (++ *this) - 1; + } + + inline T *operator --(int) + { + return (-- *this) + 1; + } +}; + +template +struct AtomicPtrWithMarkStruct +{ + AtomicPtr ptr; + AtomicUInt mark; +}; + + +template +struct PtrWithMarkStruct +{ + T* ptr; + unsigned int mark; +}; + +template +struct AtomicPtrWithMark : public AtomicUnion< AtomicPtrWithMarkStruct > +{ + typedef AtomicUnion< PtrWithMarkStruct, unsigned __int64 > SimpleUnionType; + AtomicPtrWithMark() + { + whole = 0; + } + AtomicPtrWithMark(unsigned __int64 o) + { + whole = o.whole; + } + AtomicPtrWithMark(T *ptr) + { + SimpleUnionType o; + o.Value().ptr = ptr; + o.Value().mark = 0; + whole = o.whole; + } + + operator unsigned __int64() const + { + return whole; + } + T *Ptr() const + { + return Value().ptr; + } + int Mark() const + { + return Value().mark; + } + unsigned __int64 Whole() const + { + return whole; + } + + AtomicPtr & Ptr() + { + return Value().ptr; + } + AtomicInt & Mark() + { + return Value().mark; + } + AtomicUInt64 & Whole() + { + return whole; + } + + inline bool SetAndClearOtherMarksIfMarked(T *exchange, int bit) + { + assert(bit<32); + SimpleUnionType compareMask; + compareMask.Value().ptr = NULL; + compareMask.Value().mark = 1u< tos; + AtomicUInt availableThreadBits; + AtomicInt lastReserved; + +public: + + MPStackElement* ExchangeStack(MPStackElement *newStack = NULL) + { + AtomicPtrWithMark::SimpleUnionType newWhole, ret; + newWhole.Value().mark = 0; + newWhole.Value().ptr = newStack; + ret.whole = tos.whole.Exchange(newWhole.whole); + return ret.Value().ptr; + } + + MPMarkStack() + { + lastReserved = 0; + tos.whole = 0; + availableThreadBits = (unsigned)-1; + } + + //expensive - call once per thread to reserve a bit + int ReserveThreadBit() + { + int offset = lastReserved; + //since locked operations are slow we only do + //bit tests on bits that look acceptable because + //of a nonlocked read. + unsigned readOnce = availableThreadBits; + for (int i=0; i< 32;++i){ + const int bit = (31&(i+offset)); + const unsigned mask = 1u<next = tos.Value().ptr; + }while(!tos.SetAndClearMarksIfPtrEqual(element,next)); + } + + void PushList(MPStackElement *top, MPStackElement *bottom) + { + MPStackElement * next; + do { + next = tos.Value().ptr; + bottom->next = tos.Value().ptr; + }while(!tos.SetAndClearMarksIfPtrEqual(top,next)); + } + + MPStackElement* PopElement(int i) + { + for(;;) { + tos.Value().mark.BTS(i-1); + MPStackElement * was = tos.Value().ptr; + if (was == NULL) return NULL; + if (tos.SetAndClearMarksIfMarked(was->next,i-1)) return was; + } + } + MPStackElement* PopElement() + { + int id = BlockingReserveThreadBit(); + MPStackElement * ret = PopElement(id); + ReturnThreadBit(id); + return ret; + } +}; +class MPCountStack +{ +protected: + AtomicPtrWithCount tos; + +public: + + MPStackElement* ExchangeStack(MPStackElement *newStack = NULL) + { + return tos.Value().ptr.Exchange(newStack); + } + + MPCountStack() + { + tos = 0; + } + + + void PushElement(MPStackElement *element) + { + MPStackElement * next; + do { + next = tos.Value().ptr; + element->next = tos.Value().ptr; + }while(!tos.Value().ptr.SetIfEqual(element,next)); + } + + void PushList(MPStackElement *top, MPStackElement *bottom) + { + MPStackElement * next; + do { + next = tos.Value().ptr; + bottom->next = tos.Value().ptr; + }while(!tos.Value().ptr.SetIfEqual(top,next)); + } + + MPStackElement* PopElement() + { + AtomicPtrWithCount::SimpleUnionType was; + AtomicPtrWithCount::SimpleUnionType to; + do { + was.whole = tos.whole; + if (was.Value().ptr == NULL) return NULL; + to.Value().count = was.Value().count + 1; + to.Value().ptr = was.Value().ptr->next; + }while(!tos.whole.SetIfEqual(was.whole,to.whole)); + return was.Value().ptr; + } +}; + +class SimpleStack +{ +protected: + MPStackElement * tos; + +public: + + MPStackElement* ExchangeStack(MPStackElement *newStack = NULL) + { + MPStackElement* was = tos; + tos = newStack; + return was; + } + + SimpleStack() + { + tos = 0; + } + + + void PushElement(MPStackElement *element) + { + element->next = tos; + tos = element; + } + + void PushList(MPStackElement *top, MPStackElement *bottom) + { + bottom->next = tos; + tos = top; + } + + MPStackElement* PopElement() + { + MPStackElement* was = tos; + if (was) tos = was->next; + return was; + } +}; + +template +struct MPMemBlock : public MPStackElement +{ + T data; + char bottomOfBlock; +}; + +#define OFFSET_OF_MEMBER(type,member) ((int)&(((type *)0)->member)) + +//put one of these in each thread object +//and you have thread local allocation +template +struct SimpleBlockAllocator +{ + SimpleStack data; + + typedef SimpleBlockAllocator AllocatorType; + + BLOCK_ALLOCATOR & MyAllocator; + + SimpleBlockAllocator(BLOCK_ALLOCATOR &source) + :MyAllocator(source) + {} + + int ReserveThreadBit(){return 1;} + int BlockingReserveThreadBit(){return 1;} + void ReturnThreadBit(int){ } + + int Size() const { return sizeof(T); } + void AddBlock() + { + int blockSize = MyAllocator.Size(); + int elementSize = sizeof(MPMemBlock); + assert( MyAllocator.Size() >= elementSize); + MPMemBlock *bottom = (MPMemBlock *)MyAllocator.Allocate(); + void *prev = 0; + MPMemBlock *top = bottom; + do { + top->bottomOfBlock = 0; + top->next = prev; + prev = (void *)top; + ++top; + }while( (blockSize-=elementSize) >= elementSize); + bottom->bottomOfBlock = 1; + data.PushList(top-1,bottom); + } + void *Allocate(int) + { + return Allocate(); + } + void *Allocate() + { + MPMemBlock *ret; + for(;;) { + ret = (MPMemBlock *)data.PopElement(); + if (ret!=NULL) return &ret->data; + AddBlock(); + } + } + void Deallocate(void *ob) + { + if (!ob) return; + MPMemBlock *ret = (MPMemBlock *) + ((char *)data - OFFSET_OF_MEMBER(MPMemBlock,ob)); + data.PushElement(ret); + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + void Clear() + { + MPMemBlock *stackWas = (MPMemBlock *)data.ExchangeStack(NULL); + MPMemBlock *blocks = NULL; + while(stackWas){ + if (stackWas->bottomOfBlock){ + if (blocks) { + blocks->next = stackWas; + } + blocks = stackWas; + } + stackWas = (MPMemBlock *)(stackWas->next); + } + while(blocks) + { + stackWas = (MPMemBlock *)blocks->next; + MyAllocator.Deallocate(blocks); + blocks = stackWas; + } + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + ~SimpleBlockAllocator() + { + Clear(); + } +}; + +template +struct SimpleAllocator +{ + void *Allocate() { return (void *)new char[sizeof(T)]; } + void *Allocate(int) { return Allocate(); } + + int ReserveThreadBit(){return 1;} + int BlockingReserveThreadBit(){return 1;} + void ReturnThreadBit(int){} + + void Deallocate(void *data) { delete[] (char[])data; } + int Size() const { return sizeof(T); } + typedef SimpleAllocator AllocatorType; +}; + +enum DontReserve{ DONT_RESERVE }; + +template +struct ThreadMarkedAllocator +{ + T& allocator; + int bit; + + ThreadMarkedAllocator(T &sourceAllocator) + :allocator(sourceAllocator) + ,bit(sourceAllocator.BlockingReserveThreadBit()) + {} + + ThreadMarkedAllocator(T &sourceAllocator,DontReserve) + :allocator(sourceAllocator) + ,bit(0) + {} + + ~ThreadMarkedAllocator() + { + allocator.ReturnThreadBit(bit); + } + + bool ReserveThreadBit() + { + if (bit==0) bit=sourceAllocator.ReserveThreadBit(); + return bit!=0; + } + void BlockingReserveThreadBit() + { + if (bit==0) bit=sourceAllocator.BlockingReserveThreadBit(); + } + void ReturnThreadBit() + { + int was = bit; + bit = 0; + sourceAllocator.ReturnThreadBit(was); + } + + void *Allocate() + { + assert(bit!=0); + return allocator.Allocate(bit); + } + + void Deallocate(void *data) { allocator.Deallocate(data); } + int Size() const { return Allocator.Size(); } + typedef ThreadMarkedAllocator AllocatorType; +}; + +template +struct MPMarkFreeListAllocator +{ + MPMarkStack data; + + typedef MPMarkFreeListAllocator AllocatorType; + + BLOCK_ALLOCATOR &MyAllocator; + + MPMarkFreeListAllocator(BLOCK_ALLOCATOR &source) + :MyAllocator(source) + {} + + int ReserveThreadBit(){return data.ReserveThreadBit();} + int BlockingReserveThreadBit(){return data.BlockingReserveThreadBit();} + void ReturnThreadBit(int bit){ data.ReturnThreadBit(bit); } + + int Size() const { return sizeof(T); } + void AddBlock() + { + int blockSize = MyAllocator.Size(); + int elementSize = sizeof(MPMemBlock); + assert( MyAllocator.Size() >= elementSize); + MPMemBlock *bottom = (MPMemBlock *)MyAllocator.Allocate(); + void *prev = 0; + MPMemBlock *top = bottom; + do { + top->bottomOfBlock = 0; + top->next = prev; + prev = (void *)top; + ++top; + }while( (blockSize-=elementSize) >= elementSize); + bottom->bottomOfBlock = 1; + data.PushList(top-1,bottom); + } + void *Allocate(int mark) + { + MPMemBlock *ret; + for(;;) { + ret = (MPMemBlock *)data.PopElement(mark); + if (ret!=NULL) return ret; + AddBlock(); + } + } + void *Allocate() + { + MPMemBlock *ret; + for(;;) { + ret = (MPMemBlock *)data.PopElement(); + if (ret!=NULL) return &ret->data; + AddBlock(); + } + } + void Deallocate(void *ob) + { + if (!ob) return; + MPMemBlock *ret = (MPMemBlock *) + ((char *)data - OFFSET_OF_MEMBER(MPMemBlock,ob)); + data.PushElement(ret); + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + void Clear() + { + MPMemBlock *stackWas = (MPMemBlock *)data.ExchangeStack(NULL); + MPMemBlock *blocks = NULL; + while(stackWas){ + if (stackWas->bottomOfBlock){ + if (blocks) { + blocks->next = stackWas; + } + blocks = stackWas; + } + stackWas = (MPMemBlock *)(stackWas->next); + } + while(blocks) + { + stackWas = (MPMemBlock *)blocks->next; + MyAllocator.Deallocate(blocks); + blocks = stackWas; + } + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + ~MPMarkFreeListAllocator() + { + Clear(); + } +}; +template +struct MPCountFreeListAllocator +{ + MPCountStack data; + + typedef MPCountFreeListAllocator AllocatorType; + + BLOCK_ALLOCATOR & MyAllocator; + + MPCountFreeListAllocator(BLOCK_ALLOCATOR &source) + :MyAllocator(source) + {} + + int ReserveThreadBit(){return 1;} + int BlockingReserveThreadBit(){return 1;} + void ReturnThreadBit(int){ } + + int Size() const { return sizeof(T); } + void AddBlock() + { + int blockSize = MyAllocator.Size(); + int elementSize = sizeof(MPMemBlock); + assert( MyAllocator.Size() >= elementSize); + MPMemBlock *bottom = (MPMemBlock *)MyAllocator.Allocate(); + void *prev = 0; + MPMemBlock *top = bottom; + do { + top->bottomOfBlock = 0; + top->next = prev; + prev = (void *)top; + ++top; + }while( (blockSize-=elementSize) >= elementSize); + bottom->bottomOfBlock = 1; + data.PushList(top-1,bottom); + } + void *Allocate(int) + { + return Allocate(); + } + void *Allocate() + { + MPMemBlock *ret; + for(;;) { + ret = (MPMemBlock *)data.PopElement(); + if (ret!=NULL) return &ret->data; + AddBlock(); + } + } + void Deallocate(void *ob) + { + if (!ob) return; + MPMemBlock *ret = (MPMemBlock *) + ((char *)data - OFFSET_OF_MEMBER(MPMemBlock,ob)); + data.PushElement(ret); + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + void Clear() + { + MPMemBlock *stackWas = (MPMemBlock *)data.ExchangeStack(NULL); + MPMemBlock *blocks = NULL; + while(stackWas){ + if (stackWas->bottomOfBlock){ + if (blocks) { + blocks->next = stackWas; + } + blocks = stackWas; + } + stackWas = (MPMemBlock *)(stackWas->next); + } + while(blocks) + { + stackWas = (MPMemBlock *)blocks->next; + MyAllocator.Deallocate(blocks); + blocks = stackWas; + } + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + ~MPCountFreeListAllocator() + { + Clear(); + } +}; + +struct Counted +{ + mutable AtomicInt refCount; + Counted():refCount(0){} +}; + +//it is NOT safe to read or write from more than one thread at a time +template +class CountedPtr +{ + +protected: + T *value; + void decRefCount() + { + decRefCount(value); + } +public: + static void decRefCount(T *ptr) + { + if (ptr && 0 == --ptr->refCount){ + delete ptr; + } + } + void SetValueIgnoringRefCounts(T *ptr) + { + value = ptr; + } + CountedPtr():letter(NULL){} + + CountedPtr(T *ptr) + { + value = ptr; + if (value) ++value->refCount; + } + + operator const T *() const { return value; } + operator T *() { return value; } + + CountedPtr & operator=(const T *ptr) + { + if (ptr) ++ptr->refCount; + decRefCount(); + value = ptr; + return *this; + } + + operator bool() const + { return value!=NULL; } + + bool operator !() const + { return value==NULL; } + + + const T & operator*() const + { return *value; } + + T & operator*() + { return *value; } + + T * operator->() + { assert(value); return value; } + const T * operator->()const + { assert(value); return value; } + + ~CountedPtr() + { + decRefCount(); + } +}; + +template +class AtomicCountedPtr +{ +protected: + mutable AtomicPtrWithCount value; +public: + + + CountedPtr & LoadValue(CountedPtr &dest) const + { +retry: + AtomicPtrWithCount::SimpleUnionType inc; + inc.Value().ptr = 0; + inc.Value().count = 1; + AtomicPtrWithCount::SimpleUnionType ret; + ret.whole = (value.whole+=inc.whole); //increment in ptr + dest = ret.Value().ptr ; //increment in object + AtomicPtrWithCount::SimpleUnionType update; + update.Value().ptr = ret.Value().ptr; + for(;;){ + update.Value().count = ret.Value().count-1; + AtomicPtrWithCount::SimpleUnionType current; + current.whole = value.whole.SetIfEqual(update.whole,ret.whole); + if (current.whole == ret.whole) break; //successfully decremented in ptr + if (current.Value().ptr != ret.Value().ptr) || current.Value().count < 1){ + //because of the line "dest = ret.Value().ptr" above + //the old value will decrement in the prev object as the next object is loaded + goto retry; + } + ret.Value().count = current.Value().count; + } + return dest; + } + + CountedPtr & LoadValue(CountedPtr &dest, int &count) const + { +retry: + AtomicPtrWithCount::SimpleUnionType inc; + inc.Value().ptr = 0; + inc.Value().count = 1; + AtomicPtrWithCount::SimpleUnionType ret; + ret.whole = (value.whole+=inc.whole); //increment in ptr + dest = ret.Value().ptr ; //increment in object + AtomicPtrWithCount::SimpleUnionType update; + update.Value().ptr = ret.Value().ptr; + for(;;){ + update.Value().count = ret.Value().count-1; + AtomicPtrWithCount::SimpleUnionType current; + current.whole = value.whole.SetIfEqual(update.whole,ret.whole); + if (current.whole == ret.whole) break; //successfully decremented in ptr + if (current.Value().ptr != ret.Value().ptr) || current.Value().count < 1){ + //because of the line "dest = ret.Value().ptr" above + //the old value will decrement in the prev object as the next object is loaded + goto retry; + } + ret.Value().count = current.Value().count; + } + count = ret.Value().count; + return dest; + } + + CountedPtr & ExchangeInPlace(CountedPtr &dest) + { + AtomicPtrWithCount::SimpleUnionType destWhole; + destWhole.Value().ptr = dest; + destWhole.Value().count = 0; + destWhole.whole = value.whole.Exchange(destWhole.whole); + if (destWhole.Value().ptr != NULL && destWhole.Value().count != 0) + destWhole.Value().ptr->refCount += destWhole.Value().count; + dest.SetValueIgnoringRefCounts(destWhole.Value().ptr); + return dest; + } + + CountedPtr & Exchange(CountedPtr &dest, T *source) + { + dest = source; + return ExchangeInPlace(dest); + } + + bool CompareExchange(CountedPtr &dest, T *exchange, T * comparend) + { + CountedPtr holdExchange(exchange); +retry: + AtomicPtrWithCount::SimpleUnionType comp; + if (LoadValue(dest,comp.Value().count) != comparend) return false; + comp.Value().ptr = dest; + AtomicPtrWithCount::SimpleUnionType exch; + exch.Value().ptr=exchange; + exch.Value().count = 0; + AtomicPtrWithCount::SimpleUnionType ret; + for (;;){ + ret.whole = value.whole.CompareExchange(exch.whole,comp.whole); + if (ret.whole == comp.whole) { + //transfer increment from holdExchange to this + holdExchange.SetValueIgnoringRefCounts(NULL); + //had inc from Load and the one from this + if (dest) { + const int dec = 1-comp.Value().count; + if (dec!=0) dest->refCount -= dec; + } + return true; + } + if (ret.Value().ptr != comp.Value().ptr) { + //cant return the new pointer because there's no + //reason to think it hasn't been collected already + goto retry; + } + comp.Value().count = ret.Value().count; + } + } + + bool SetIfEqual(T *exchange, T * comparend) + { + CountedPtr holdExchange(exchange); +retry: + AtomicPtrWithCount::SimpleUnionType comp; + comp.whole = value.whole; + if (comp.Value().ptr != comparend) return false; + AtomicPtrWithCount::SimpleUnionType exch; + exch.Value().ptr=exchange; + exch.Value().count = 0; + AtomicPtrWithCount::SimpleUnionType ret; + for (;;){ + ret.whole = value.whole.CompareExchange(exch.whole,comp.whole); + if (ret.whole == comp.whole) { + if (comp.Value().ptr) { + const int dec = 1-comp.Value().count; + if (dec!=0 && 0==(comp.Value().ptr->refCount -= dec)){ + delete comp.Value().ptr; + }; + } + //transfer increment from holdExchange to this + holdExchange.SetValueIgnoringRefCounts(NULL); + return true; + } + if (ret.Value().ptr != comp.Value().ptr) { + return false; + } + comp.Value().count = ret.Value().count; + } + } + + void operator = (const T *ptr) + { + CountedPtr dest(ptr); + ExchangeInPlace(dest); + } + + //not recommended because value won't be consistant throughout + //a given expression + operator bool() const + { return value.Value().ptr!=NULL; } + + //not recommended because value won't be consistant throughout + //a given expression + bool operator !() const + { return value.Value().ptr==NULL; } + + + AtomicCountedPtr() + {} + + ~AtomicCountedPtr() + { + *this = (T*)NULL; + } +}; + +class MPQueueBase +{ + AtomicUInt * data; + int len; + + struct AtomicHeadAndTail{ + AtomicInt head; + AtomicInt tail; + }; + + AtomicUnion headAndTail; + + struct HeadAndTailStruct{ + int head; + int tail; + }; + union HeadAndTailUnion + { + HeadAndTailStruct value; + unsigned __int64 whole; + }; + + AtomicUInt & Index(int i) + { + return data[i & (len-1)]; + } + bool IsNil(int i) + { + return (i & 1) != 0; + } + + public: + + int Used() const + { + HeadAndTailUnion ht; + ht.whole = headAndTail.whole; + return ht.value.head-ht.value.tail; + + } + bool Empty() const + { + HeadAndTailUnion ht; + ht.whole = headAndTail.whole; + return ht.value.head==ht.value.tail; + } + int Available() const + { + return MaxLen()-Used(); + + } + int MaxLen() const + { + return len; + } + + MPQueueBase(int lenLn2) + :len(1<= len) return false; + + int wasThere = Index(ht.value.head); + + if (IsNil(wasThere)){ + if (Index(ht.value.head).SetIfEqual(v,wasThere)){ + headAndTail.Value().head.SetIfEqual(1+ht.value.head,ht.value.head); + return true; + } + } + headAndTail.Value().head.SetIfEqual(1+ht.value.head,ht.value.head); + } + } + int Get() + { + for(;;){ + HeadAndTailUnion ht; + ht.whole = headAndTail.whole; + if (ht.value.head-ht.value.tail < 1) return 0; + + int wasThere = Index(ht.value.tail); + int newNil = (ht.value.tail|1); + + if (!IsNil(wasThere)){ + if (Index(ht.value.tail).SetIfEqual(newNil,wasThere)){ + headAndTail.Value().tail.SetIfEqual(1+ht.value.tail,ht.value.tail); + return wasThere; + } + } + headAndTail.Value().tail.SetIfEqual(1+ht.value.tail,ht.value.tail); + } + } +}; + +template +class MPQueue +{ + MPQueueBase queue; +public: + MPQueue(int lenLn2) + :queue(lenLn2) + {} + T *Get() + { + return (T*)queue.Get(); + } + bool Put(T * v) + { + return queue.Put((int)v); + } + bool Empty() const + { + return queue.Empty(); + } + int Used() const + { + return queue.Used(); + + } + int Available() const + { + return queue.Available(); + + } + int MaxLen() const + { + return queue.MaxLen(); + } +}; + +class QueueBase +{ + unsigned * data; + int len; + + int head; + int tail; + + unsigned & Index(int i) + { + return data[i & (len-1)]; + } + +public: + + int Used() const + { + return head-tail; + + } + bool Empty() const + { + return head==tail; + + } + + int Available() const + { + return MaxLen()-Used(); + + } + int MaxLen() const + { + return len; + } + + QueueBase(int lenLn2) + :len(1< +class Queue +{ + QueueBase queue; +public: + Queue(int lenLn2) + :queue(lenLn2) + {} + T *Get() + { + return (T*)queue.Get(); + } + bool Put(T * v) + { + return queue.Put((int)v); + } + bool Empty() const + { + return queue.Empty(); + } + int Used() const + { + return queue.Used(); + + } + int Available() const + { + return queue.Available(); + + } + int MaxLen() const + { + return queue.MaxLen(); + } +}; + + +#endif diff --git a/lib/base/cgi.html b/lib/base/cgi.html new file mode 100644 index 0000000000..dded002bc8 --- /dev/null +++ b/lib/base/cgi.html @@ -0,0 +1,486 @@ + + + + + + +Module cgi + + + + + +

    +

    Module cgi

    + +
    +This module implements helper procs for CGI applictions. Example:
    +import strtabs, cgi
    +
    +# Fill the values when debugging:
    +when debug:
    +  setTestData("name", "Klaus", "password", "123456")
    +# read the data into `myData`
    +var myData = readData()
    +# check that the data's variable names are "name" or "passwort"
    +validateData(myData, "name", "password")
    +# start generating content:
    +writeContentType()
    +# generate content:
    +write(stdout, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n")
    +write(stdout, "<html><head><title>Test</title></head><body>\n")
    +writeln(stdout, "your name: " & myData["name"])
    +writeln(stdout, "your password: " & myData["password"])
    +writeln(stdout, "</body></html>")
    +
    +

    Types

    +
    +
    ECgi* = object of EIO
    +
    +the exception that is raised, if a CGI error occurs +
    +
    TRequestMethod* = enum 
    +  methodPost,                 ## query uses the POST method
    +  methodGet                   ## query uses the GET method
    +
    +the used request method +
    + +
    +
    +

    Procs

    +
    +
    proc URLencode*(s: string): string
    +
    +Encodes a value to be HTTP safe: This means that characters in the set {'A'..'Z', 'a'..'z', '0'..'9', '_'} are carried over to the result, a space is converted to '+' and every other character is encoded as '%xx' where xx denotes its hexadecimal value. +
    +
    proc URLdecode*(s: string): string
    +
    +Decodes a value from its HTTP representation: This means that a '+' is converted to a space, '%xx' (where xx denotes a hexadecimal value) is converted to the character with ordinal number xx, and and every other character is carried over. +
    +
    proc readData*(allowedMethods: set[TRequestMethod] = {methodPost, methodGet}): PStringTable
    +
    +Read CGI data. If the client does not use a method listed in the allowedMethods set, an ECgi exception is raised. +
    +
    proc validateData*(data: PStringTable, validKeys: openarray[string])
    +
    +validates data; raises ECgi if this fails. This checks that each variable name of the CGI data occurs in the validKeys array. +
    +
    proc getContentLength*(): string
    +
    +returns contents of the CONTENT_LENGTH environment variable +
    +
    proc getContentType*(): string
    +
    +returns contents of the CONTENT_TYPE environment variable +
    +
    proc getDocumentRoot*(): string
    +
    +returns contents of the DOCUMENT_ROOT environment variable +
    +
    proc getGatewayInterface*(): string
    +
    +returns contents of the GATEWAY_INTERFACE environment variable +
    +
    proc getHttpAccept*(): string
    +
    +returns contents of the HTTP_ACCEPT environment variable +
    +
    proc getHttpAcceptCharset*(): string
    +
    +returns contents of the HTTP_ACCEPT_CHARSET environment variable +
    +
    proc getHttpAcceptEncoding*(): string
    +
    +returns contents of the HTTP_ACCEPT_ENCODING environment variable +
    +
    proc getHttpAcceptLanguage*(): string
    +
    +returns contents of the HTTP_ACCEPT_LANGUAGE environment variable +
    +
    proc getHttpConnection*(): string
    +
    +returns contents of the HTTP_CONNECTION environment variable +
    +
    proc getHttpCookie*(): string
    +
    +returns contents of the HTTP_COOKIE environment variable +
    +
    proc getHttpHost*(): string
    +
    +returns contents of the HTTP_HOST environment variable +
    +
    proc getHttpReferer*(): string
    +
    +returns contents of the HTTP_REFERER environment variable +
    +
    proc getHttpUserAgent*(): string
    +
    +returns contents of the HTTP_USER_AGENT environment variable +
    +
    proc getPathInfo*(): string
    +
    +returns contents of the PATH_INFO environment variable +
    +
    proc getPathTranslated*(): string
    +
    +returns contents of the PATH_TRANSLATED environment variable +
    +
    proc getQueryString*(): string
    +
    +returns contents of the QUERY_STRING environment variable +
    +
    proc getRemoteAddr*(): string
    +
    +returns contents of the REMOTE_ADDR environment variable +
    +
    proc getRemoteHost*(): string
    +
    +returns contents of the REMOTE_HOST environment variable +
    +
    proc getRemoteIdent*(): string
    +
    +returns contents of the REMOTE_IDENT environment variable +
    +
    proc getRemotePort*(): string
    +
    +returns contents of the REMOTE_PORT environment variable +
    +
    proc getRemoteUser*(): string
    +
    +returns contents of the REMOTE_USER environment variable +
    +
    proc getRequestMethod*(): string
    +
    +returns contents of the REQUEST_METHOD environment variable +
    +
    proc getRequestURI*(): string
    +
    +returns contents of the REQUEST_URI environment variable +
    +
    proc getScriptFilename*(): string
    +
    +returns contents of the SCRIPT_FILENAME environment variable +
    +
    proc getScriptName*(): string
    +
    +returns contents of the SCRIPT_NAME environment variable +
    +
    proc getServerAddr*(): string
    +
    +returns contents of the SERVER_ADDR environment variable +
    +
    proc getServerAdmin*(): string
    +
    +returns contents of the SERVER_ADMIN environment variable +
    +
    proc getServerName*(): string
    +
    +returns contents of the SERVER_NAME environment variable +
    +
    proc getServerPort*(): string
    +
    +returns contents of the SERVER_PORT environment variable +
    +
    proc getServerProtocol*(): string
    +
    +returns contents of the SERVER_PROTOCOL environment variable +
    +
    proc getServerSignature*(): string
    +
    +returns contents of the SERVER_SIGNATURE environment variable +
    +
    proc getServerSoftware*(): string
    +
    +returns contents of the SERVER_SOFTWARE environment variable +
    +
    proc setTestData*(keysvalues: openarray[string])
    +
    +fills the appropriate environment variables to test your CGI application. This can only simulate the 'GET' 'REQUEST_METHOD'. keysvalues should provide embedded (name, value)-pairs. Example:
    setTestData("name", "Hanz", "password", "12345")
    +
    +
    proc writeContentType*()
    +
    +call this before starting to send your HTML data to stdout. This is just a shorthand for: .. code-block:: Nimrod
    write(stdout, "Content-type: text/htmlnn")
    + +
    + +
    + +
    + +Generated: 2008-12-08 20:29:49 UTC +
    + + diff --git a/lib/base/cgi.nim b/lib/base/cgi.nim new file mode 100644 index 0000000000..3ed94c9b7c --- /dev/null +++ b/lib/base/cgi.nim @@ -0,0 +1,305 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This module implements helper procs for CGI applictions. Example: +## +## .. code-block:: Nimrod +## +## import strtabs, cgi +## +## # Fill the values when debugging: +## when debug: +## setTestData("name", "Klaus", "password", "123456") +## # read the data into `myData` +## var myData = readData() +## # check that the data's variable names are "name" or "passwort" +## validateData(myData, "name", "password") +## # start generating content: +## writeContentType() +## # generate content: +## write(stdout, "\n") +## write(stdout, "Test\n") +## writeln(stdout, "your name: " & myData["name"]) +## writeln(stdout, "your password: " & myData["password"]) +## writeln(stdout, "") + +import strutils, os, strtabs + +proc URLencode*(s: string): string = + ## Encodes a value to be HTTP safe: This means that characters in the set + ## ``{'A'..'Z', 'a'..'z', '0'..'9', '_'}`` are carried over to the result, + ## a space is converted to ``'+'`` and every other character is encoded as + ## ``'%xx'`` where ``xx`` denotes its hexadecimal value. + result = "" + for i in 0..s.len-1: + case s[i] + of 'a'..'z', 'A'..'Z', '0'..'9', '_': add(result, s[i]) + of ' ': add(result, '+') + else: + add(result, '%') + add(result, toHex(ord(s[i]), 2)) + +proc handleHexChar(c: char, x: var int) {.inline.} = + case c + of '0'..'9': x = (x shl 4) or (ord(c) - ord('0')) + of 'a'..'f': x = (x shl 4) or (ord(c) - ord('a') + 10) + of 'A'..'F': x = (x shl 4) or (ord(c) - ord('A') + 10) + else: assert(false) + +proc URLdecode*(s: string): string = + ## Decodes a value from its HTTP representation: This means that a ``'+'`` + ## is converted to a space, ``'%xx'`` (where ``xx`` denotes a hexadecimal + ## value) is converted to the character with ordinal number ``xx``, and + ## and every other character is carried over. + result = "" + var i = 0 + while i < s.len: + case s[i] + of '%': + var x = 0 + handleHexChar(s[i+1], x) + handleHexChar(s[i+2], x) + inc(i, 2) + add(result, chr(x)) + of '+': add(result, ' ') + else: add(result, s[i]) + inc(i) + +type + ECgi* = object of EIO ## the exception that is raised, if a CGI error occurs + TRequestMethod* = enum ## the used request method + methodPost, ## query uses the POST method + methodGet ## query uses the GET method + +proc cgiError(msg: string) {.noreturn.} = + var e: ref ECgi + new(e) + e.msg = msg + raise e + +proc readData*(allowedMethods: set[TRequestMethod] = + {methodPost, methodGet}): PStringTable = + ## Read CGI data. If the client does not use a method listed in the + ## `allowedMethods` set, an `ECgi` exception is raised. + result = newStringTable() + var enc: string # encoded data + case getenv("REQUEST_METHOD") + of "POST": + if methodPost notin allowedMethods: + cgiError("'REQUEST_METHOD' 'POST' is not supported") + # read from stdin: + var L = parseInt(getenv("CONTENT_LENGTH")) + enc = newString(L) + if readBuffer(stdin, addr(enc[0]), L) != L: + cgiError("cannot read from stdin") + of "GET": + if methodGet notin allowedMethods: + cgiError("'REQUEST_METHOD' 'GET' is not supported") + # read from the QUERY_STRING environment variable: + enc = getenv("QUERY_STRING") + else: cgiError("'REQUEST_METHOD' must be 'POST' or 'GET'") + + # decode everything in one pass: + var i = 0 + var name = "" + var value = "" + while true: + setLen(name, 0) # reuse memory + while true: + case enc[i] + of '\0': return + of '%': + var x = 0 + handleHexChar(enc[i+1], x) + handleHexChar(enc[i+2], x) + inc(i, 2) + add(name, chr(x)) + of '+': add(name, ' ') + of '=', '&': break + else: add(name, enc[i]) + inc(i) + if enc[i] != '=': cgiError("'=' expected") + inc(i) # skip '=' + setLen(value, 0) # reuse memory + while true: + case enc[i] + of '\0': return + of '%': + var x = 0 + handleHexChar(enc[i+1], x) + handleHexChar(enc[i+2], x) + inc(i, 2) + add(value, chr(x)) + of '+': add(value, ' ') + of '=', '&': break + else: add(value, enc[i]) + inc(i) + if enc[i] != '&': cgiError("'&' expected") + inc(i) # skip '=' + result[name] = value + +proc validateData*(data: PStringTable, validKeys: openarray[string]) = + ## validates data; raises `ECgi` if this fails. This checks that each variable + ## name of the CGI `data` occurs in the `validKeys` array. + for key, val in pairs(data): + if find(validKeys, key) < 0: + cgiError("unknown variable name: " & key) + +proc getContentLength*(): string = + ## returns contents of the ``CONTENT_LENGTH`` environment variable + return getenv("CONTENT_LENGTH") + +proc getContentType*(): string = + ## returns contents of the ``CONTENT_TYPE`` environment variable + return getenv("CONTENT_Type") + +proc getDocumentRoot*(): string = + ## returns contents of the ``DOCUMENT_ROOT`` environment variable + return getenv("DOCUMENT_ROOT") + +proc getGatewayInterface*(): string = + ## returns contents of the ``GATEWAY_INTERFACE`` environment variable + return getenv("GATEWAY_INTERFACE") + +proc getHttpAccept*(): string = + ## returns contents of the ``HTTP_ACCEPT`` environment variable + return getenv("HTTP_ACCEPT") + +proc getHttpAcceptCharset*(): string = + ## returns contents of the ``HTTP_ACCEPT_CHARSET`` environment variable + return getenv("HTTP_ACCEPT_CHARSET") + +proc getHttpAcceptEncoding*(): string = + ## returns contents of the ``HTTP_ACCEPT_ENCODING`` environment variable + return getenv("HTTP_ACCEPT_ENCODING") + +proc getHttpAcceptLanguage*(): string = + ## returns contents of the ``HTTP_ACCEPT_LANGUAGE`` environment variable + return getenv("HTTP_ACCEPT_LANGUAGE") + +proc getHttpConnection*(): string = + ## returns contents of the ``HTTP_CONNECTION`` environment variable + return getenv("HTTP_CONNECTION") + +proc getHttpCookie*(): string = + ## returns contents of the ``HTTP_COOKIE`` environment variable + return getenv("HTTP_COOKIE") + +proc getHttpHost*(): string = + ## returns contents of the ``HTTP_HOST`` environment variable + return getenv("HTTP_HOST") + +proc getHttpReferer*(): string = + ## returns contents of the ``HTTP_REFERER`` environment variable + return getenv("HTTP_REFERER") + +proc getHttpUserAgent*(): string = + ## returns contents of the ``HTTP_USER_AGENT`` environment variable + return getenv("HTTP_USER_AGENT") + +proc getPathInfo*(): string = + ## returns contents of the ``PATH_INFO`` environment variable + return getenv("PATH_INFO") + +proc getPathTranslated*(): string = + ## returns contents of the ``PATH_TRANSLATED`` environment variable + return getenv("PATH_TRANSLATED") + +proc getQueryString*(): string = + ## returns contents of the ``QUERY_STRING`` environment variable + return getenv("QUERY_STRING") + +proc getRemoteAddr*(): string = + ## returns contents of the ``REMOTE_ADDR`` environment variable + return getenv("REMOTE_ADDR") + +proc getRemoteHost*(): string = + ## returns contents of the ``REMOTE_HOST`` environment variable + return getenv("REMOTE_HOST") + +proc getRemoteIdent*(): string = + ## returns contents of the ``REMOTE_IDENT`` environment variable + return getenv("REMOTE_IDENT") + +proc getRemotePort*(): string = + ## returns contents of the ``REMOTE_PORT`` environment variable + return getenv("REMOTE_PORT") + +proc getRemoteUser*(): string = + ## returns contents of the ``REMOTE_USER`` environment variable + return getenv("REMOTE_USER") + +proc getRequestMethod*(): string = + ## returns contents of the ``REQUEST_METHOD`` environment variable + return getenv("REQUEST_METHOD") + +proc getRequestURI*(): string = + ## returns contents of the ``REQUEST_URI`` environment variable + return getenv("REQUEST_URI") + +proc getScriptFilename*(): string = + ## returns contents of the ``SCRIPT_FILENAME`` environment variable + return getenv("SCRIPT_FILENAME") + +proc getScriptName*(): string = + ## returns contents of the ``SCRIPT_NAME`` environment variable + return getenv("SCRIPT_NAME") + +proc getServerAddr*(): string = + ## returns contents of the ``SERVER_ADDR`` environment variable + return getenv("SERVER_ADDR") + +proc getServerAdmin*(): string = + ## returns contents of the ``SERVER_ADMIN`` environment variable + return getenv("SERVER_ADMIN") + +proc getServerName*(): string = + ## returns contents of the ``SERVER_NAME`` environment variable + return getenv("SERVER_NAME") + +proc getServerPort*(): string = + ## returns contents of the ``SERVER_PORT`` environment variable + return getenv("SERVER_PORT") + +proc getServerProtocol*(): string = + ## returns contents of the ``SERVER_PROTOCOL`` environment variable + return getenv("SERVER_PROTOCOL") + +proc getServerSignature*(): string = + ## returns contents of the ``SERVER_SIGNATURE`` environment variable + return getenv("SERVER_SIGNATURE") + +proc getServerSoftware*(): string = + ## returns contents of the ``SERVER_SOFTWARE`` environment variable + return getenv("SERVER_SOFTWARE") + +proc setTestData*(keysvalues: openarray[string]) = + ## fills the appropriate environment variables to test your CGI application. + ## This can only simulate the 'GET' 'REQUEST_METHOD'. `keysvalues` should + ## provide embedded (name, value)-pairs. Example: + ## + ## .. code-block:: Nimrod + ## setTestData("name", "Hanz", "password", "12345") + putenv("REQUEST_METHOD", "GET") + var i = 0 + var query = "" + while i < keysvalues.len: + add(query, URLencode(keysvalues[i])) + add(query, '=') + add(query, URLencode(keysvalues[i+1])) + add(query, '&') + inc(i, 2) + putenv("QUERY_STRING", query) + +proc writeContentType*() = + ## call this before starting to send your HTML data to `stdout`. This + ## is just a shorthand for: + ## .. code-block:: Nimrod + ## write(stdout, "Content-type: text/html\n\n") + write(stdout, "Content-type: text/html\n\n") diff --git a/lib/base/devel/FGInt.pas b/lib/base/devel/FGInt.pas deleted file mode 100644 index 7cb5a85168..0000000000 --- a/lib/base/devel/FGInt.pas +++ /dev/null @@ -1,2199 +0,0 @@ -{License, info, etc - ------------------ - -This implementation is made by me, Walied Othman, to contact me -mail to Walied.Othman@belgacom.net or Triade@ulyssis.org, -always mention wether it 's about the FGInt for Delphi or for -FreePascal, or wether it 's about the 6xs, preferably in the subject line. -If you 're going to use these implementations, at least mention my -name or something and notify me so I may even put a link on my page. -This implementation is freeware and according to the coderpunks' -manifesto it should remain so, so don 't use these implementations -in commercial software. Encryption, as a tool to ensure privacy -should be free and accessible for anyone. If you plan to use these -implementations in a commercial application, contact me before -doing so, that way you can license the software to use it in commercial -Software. If any algorithm is patented in your country, you should -acquire a license before using this software. Modified versions of this -software must contain an acknowledgement of the original author (=me). -This implementation is available at -http://triade.studentenweb.org - -copyright 2000, Walied Othman -This header may not be removed. -} - -Unit FGInt; - -{$H+} - -Interface - -Uses SysUtils, Math; - -Type - TCompare = (Lt, St, Eq, Er); - TSign = (negative, positive); - TFGInt = Record - Sign : TSign; - Number : Array Of LongWord; - End; - -Procedure zeronetochar8(Var g : char; Const x : String); -Procedure zeronetochar6(Var g : integer; Const x : String); -Procedure initialize8(Var trans : Array Of String); -Procedure initialize6(Var trans : Array Of String); -Procedure initialize6PGP(Var trans : Array Of String); -Procedure ConvertBase256to64(Const str256 : String; Var str64 : String); -Procedure ConvertBase64to256(Const str64 : String; Var str256 : String); -Procedure ConvertBase256to2(Const str256 : String; Var str2 : String); -Procedure ConvertBase64to2(Const str64 : String; Var str2 : String); -Procedure ConvertBase2to256(str2 : String; Var str256 : String); -Procedure ConvertBase2to64(str2 : String; Var str64 : String); -Procedure ConvertBase256StringToHexString(Str256 : String; Var HexStr : String); -Procedure ConvertHexStringToBase256String(HexStr : String; Var Str256 : String); -Procedure PGPConvertBase256to64(Var str256, str64 : String); -Procedure PGPConvertBase64to256(str64 : String; Var str256 : String); -Procedure PGPConvertBase64to2(str64 : String; Var str2 : String); -Procedure FGIntToBase2String(Const FGInt : TFGInt; Var S : String); -Procedure Base2StringToFGInt(S : String; Var FGInt : TFGInt); -Procedure FGIntToBase256String(Const FGInt : TFGInt; Var str256 : String); -Procedure Base256StringToFGInt(str256 : String; Var FGInt : TFGInt); -Procedure PGPMPIToFGInt(PGPMPI : String; Var FGInt : TFGInt); -Procedure FGIntToPGPMPI(FGInt : TFGInt; Var PGPMPI : String); -Procedure Base10StringToFGInt(Base10 : String; Var FGInt : TFGInt); -Procedure FGIntToBase10String(Const FGInt : TFGInt; Var Base10 : String); -Procedure FGIntDestroy(Var FGInt : TFGInt); -Function FGIntCompareAbs(Const FGInt1, FGInt2 : TFGInt) : TCompare; -Procedure FGIntAdd(Const FGInt1, FGInt2 : TFGInt; Var Sum : TFGInt); -Procedure FGIntChangeSign(Var FGInt : TFGInt); -Procedure FGIntSub(Var FGInt1, FGInt2, dif : TFGInt); -Procedure FGIntMulByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord); -Procedure FGIntMulByIntbis(Var FGInt : TFGInt; by : LongWord); -Procedure FGIntDivByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord; Var modres : LongWord); -Procedure FGIntDivByIntBis(Var FGInt : TFGInt; by : LongWord; Var modres : LongWord); -Procedure FGIntModByInt(Const FGInt : TFGInt; by : LongWord; Var modres : LongWord); -Procedure FGIntAbs(Var FGInt : TFGInt); -Procedure FGIntCopy(Const FGInt1 : TFGInt; Var FGInt2 : TFGInt); -Procedure FGIntShiftLeft(Var FGInt : TFGInt); -Procedure FGIntShiftRight(Var FGInt : TFGInt); -Procedure FGIntShiftRightBy31(Var FGInt : TFGInt); -Procedure FGIntAddBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt); -Procedure FGIntSubBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt); -Procedure FGIntMul(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt); -Procedure FGIntSquare(Const FGInt : TFGInt; Var Square : TFGInt); -Procedure FGIntExp(Const FGInt, exp : TFGInt; Var res : TFGInt); -Procedure FGIntFac(Const FGInt : TFGInt; Var res : TFGInt); -Procedure FGIntShiftLeftBy31(Var FGInt : TFGInt); -Procedure FGIntDivMod(Var FGInt1, FGInt2, QFGInt, MFGInt : TFGInt); -Procedure FGIntDiv(Var FGInt1, FGInt2, QFGInt : TFGInt); -Procedure FGIntMod(Var FGInt1, FGInt2, MFGInt : TFGInt); -Procedure FGIntSquareMod(Var FGInt, Modb, FGIntSM : TFGInt); -Procedure FGIntAddMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt); -Procedure FGIntMulMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt); -Procedure FGIntModExp(Var FGInt, exp, modb, res : TFGInt); -Procedure FGIntModBis(Const FGInt : TFGInt; Var FGIntOut : TFGInt; b, head : LongWord); -Procedure FGIntMulModBis(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt; b, head : LongWord); -Procedure FGIntMontgomeryMod(Const GInt, base, baseInv : TFGInt; Var MGInt : TFGInt; b : Longword; head : LongWord); -Procedure FGIntMontgomeryModExp(Var FGInt, exp, modb, res : TFGInt); -Procedure FGIntGCD(Const FGInt1, FGInt2 : TFGInt; Var GCD : TFGInt); -Procedure FGIntLCM(Const FGInt1, FGInt2 : TFGInt; Var LCM : TFGInt); -Procedure FGIntTrialDiv9999(Const FGInt : TFGInt; Var ok : boolean); -Procedure FGIntRandom1(Var Seed, RandomFGInt : TFGInt); -Procedure FGIntRabinMiller(Var FGIntp : TFGInt; nrtest : Longword; Var ok : boolean); -Procedure FGIntBezoutBachet(Var FGInt1, FGInt2, a, b : TFGInt); -Procedure FGIntModInv(Const FGInt1, base : TFGInt; Var Inverse : TFGInt); -Procedure FGIntPrimetest(Var FGIntp : TFGInt; nrRMtests : integer; Var ok : boolean); -Procedure FGIntLegendreSymbol(Var a, p : TFGInt; Var L : integer); -Procedure FGIntSquareRootModP(Square, Prime : TFGInt; Var SquareRoot : TFGInt); - - - -Implementation - -Var - primes : Array[1..1228] Of integer = - (3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, - 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, - 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, - 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, - 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, - 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, - 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, - 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, - 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, - 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, - 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, - 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, - 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, - 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, - 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, - 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, - 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, - 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, - 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, - 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, - 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, - 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, - 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, - 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, - 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, - 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, - 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, - 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, - 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, - 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, - 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, - 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, - 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, - 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, - 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, - 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, - 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, - 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, - 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, - 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, - 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, - 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, - 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, - 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, - 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, - 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, - 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, - 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, - 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, - 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, - 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, - 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, - 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, - 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, - 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, - 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, - 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, - 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, - 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, - 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, - 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, - 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, - 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973); - chr64 : Array[1..64] Of char = ('a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', - 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', - 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', - 'z', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '='); - PGPchr64 : Array[1..64] Of char = ('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', '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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'); - - - -Procedure zeronetochar8(Var g : char; Const x : String); -Var - i : Integer; - b : byte; -Begin - b := 0; - For i := 1 To 8 Do - Begin - If copy(x, i, 1) = '1' Then - b := b Or (1 Shl (8 - I)); - End; - g := chr(b); -End; - - -Procedure zeronetochar6(Var g : integer; Const x : String); -Var - I : Integer; -Begin - G := 0; - For I := 1 To Length(X) Do - Begin - If I > 6 Then - Break; - If X[I] <> '0' Then - G := G Or (1 Shl (6 - I)); - End; - Inc(G); -End; - - -Procedure initialize8(Var trans : Array Of String); -Var - c1, c2, c3, c4, c5, c6, c7, c8 : integer; - x : String; - g : char; -Begin - For c1 := 0 To 1 Do - For c2 := 0 To 1 Do - For c3 := 0 To 1 Do - For c4 := 0 To 1 Do - For c5 := 0 To 1 Do - For c6 := 0 To 1 Do - For c7 := 0 To 1 Do - For c8 := 0 To 1 Do - Begin - x := chr(48+c1) + chr(48+c2) + chr(48+c3) + chr(48+c4) + chr(48+c5) + chr(48+c6) + chr(48+c7) + chr(48+c8); - zeronetochar8(g, x); - trans[ord(g)] := x; - End; -End; - - -Procedure initialize6(Var trans : Array Of String); -Var - c1, c2, c3, c4, c5, c6 : integer; - x : String; - g : integer; -Begin - For c1 := 0 To 1 Do - For c2 := 0 To 1 Do - For c3 := 0 To 1 Do - For c4 := 0 To 1 Do - For c5 := 0 To 1 Do - For c6 := 0 To 1 Do - Begin - x := chr(48+c1) + chr(48+c2) + chr(48+c3) + chr(48+c4) + chr(48+c5) + chr(48+c6); - zeronetochar6(g, x); - trans[ord(chr64[g])] := x; - End; -End; - -Procedure initialize6PGP(Var trans : Array Of String); -Var - c1, c2, c3, c4, c5, c6 : integer; - x : String; - g : integer; -Begin - For c1 := 0 To 1 Do - For c2 := 0 To 1 Do - For c3 := 0 To 1 Do - For c4 := 0 To 1 Do - For c5 := 0 To 1 Do - For c6 := 0 To 1 Do - Begin - x := chr(48+c1) + chr(48+c2) + chr(48+c3) + chr(48+c4) + chr(48+c5) + chr(48+c6); - zeronetochar6(g, x); - trans[ord(PGPchr64[g])] := x; - End; -End; - - -// Convert base 8 strings to base 6 strings and visa versa - -Procedure ConvertBase256to64(Const str256 : String; Var str64 : String); -Var - temp : String; - trans : Array[0..255] Of String; - i, len6 : longint; - g : integer; -Begin - initialize8(trans); - temp := ''; - For i := 1 To length(str256) Do temp := temp + trans[ord(str256[i])]; - While (length(temp) Mod 6) <> 0 Do temp := temp + '0'; - len6 := length(temp) Div 6; - str64 := ''; - For i := 1 To len6 Do - Begin - zeronetochar6(g, copy(temp, 1, 6)); - str64 := str64 + chr64[g]; - delete(temp, 1, 6); - End; -End; - - -Procedure ConvertBase64to256(Const str64 : String; Var str256 : String); -Var - temp : String; - trans : Array[0..255] Of String; - i, len8 : longint; - g : char; -Begin - initialize6(trans); - temp := ''; - For i := 1 To length(str64) Do temp := temp + trans[ord(str64[i])]; - str256 := ''; - len8 := length(temp) Div 8; - For i := 1 To len8 Do - Begin - zeronetochar8(g, copy(temp, 1, 8)); - str256 := str256 + g; - delete(temp, 1, 8); - End; -End; - - -// Convert base 8 & 6 bit strings to base 2 strings and visa versa - -Procedure ConvertBase256to2(Const str256 : String; Var str2 : String); -Var - trans : Array[0..255] Of String; - i : longint; -Begin - str2 := ''; - initialize8(trans); - For i := 1 To length(str256) Do str2 := str2 + trans[ord(str256[i])]; -End; - - -Procedure ConvertBase64to2(Const str64 : String; Var str2 : String); -Var - trans : Array[0..255] Of String; - i : longint; -Begin - str2 := ''; - initialize6(trans); - For i := 1 To length(str64) Do str2 := str2 + trans[ord(str64[i])]; -End; - - -Procedure ConvertBase2to256(str2 : String; Var str256 : String); -Var - i, len8 : longint; - g : char; -Begin - str256 := ''; - While (length(str2) Mod 8) <> 0 Do str2 := '0' + str2; - len8 := length(str2) Div 8; - For i := 1 To len8 Do - Begin - zeronetochar8(g, copy(str2, 1, 8)); - str256 := str256 + g; - delete(str2, 1, 8); - End; -End; - - -Procedure ConvertBase2to64(str2 : String; Var str64 : String); -Var - i, len6 : longint; - g : integer; -Begin - str64 := ''; - While (length(str2) Mod 6) <> 0 Do str2 := '0' + str2; - len6 := length(str2) Div 6; - For i := 1 To len6 Do - Begin - zeronetochar6(g, copy(str2, 1, 6)); - str64 := str64 + chr64[g]; - delete(str2, 1, 6); - End; -End; - - -// Convert base 256 strings to base 16 (HexaDecimal) strings and visa versa - -Procedure ConvertBase256StringToHexString(Str256 : String; Var HexStr : String); -Var - i : longint; - b : byte; -Begin - HexStr := ''; - For i := 1 To length(str256) Do - Begin - b := ord(str256[i]); - If (b Shr 4) < 10 Then HexStr := HexStr + chr(48 + (b Shr 4)) - Else HexStr := HexStr + chr(55 + (b Shr 4)); - If (b And 15) < 10 Then HexStr := HexStr + chr(48 + (b And 15)) - Else HexStr := HexStr + chr(55 + (b And 15)); - End; -End; - - -Procedure ConvertHexStringToBase256String(HexStr : String; Var Str256 : String); -Var - i : longint; - b, h1, h2 : byte; - temp : string; -Begin - Str256 := ''; - If (length(Hexstr) mod 2) = 1 Then temp := '0' + HexStr Else temp := HexStr; - For i := 1 To (length(temp) Div 2) Do - Begin - h2 := ord(temp[2 * i]); - h1 := ord(temp[2 * i - 1]); - If h1 < 58 Then - b := ((h1 - 48) Shl 4) - Else - b := ((h1 - 55) Shl 4); - If h2 < 58 Then - b := (b Or (h2 - 48)) - Else - b := (b Or ((h2 - 55) and 15)); - Str256 := Str256 + chr(b); - End; -End; - - -// Convert base 256 strings to base 64 strings and visa versa, PGP style - -Procedure PGPConvertBase256to64(Var str256, str64 : String); -Var - temp, x, a : String; - i, len6 : longint; - g : integer; - trans : Array[0..255] Of String; -Begin - initialize8(trans); - temp := ''; - For i := 1 To length(str256) Do temp := temp + trans[ord(str256[i])]; - If (length(temp) Mod 6) = 0 Then a := '' Else - If (length(temp) Mod 6) = 4 Then - Begin - temp := temp + '00'; - a := '=' - End - Else - Begin - temp := temp + '0000'; - a := '==' - End; - str64 := ''; - len6 := length(temp) Div 6; - For i := 1 To len6 Do - Begin - x := copy(temp, 1, 6); - zeronetochar6(g, x); - str64 := str64 + PGPchr64[g]; - delete(temp, 1, 6); - End; - str64 := str64 + a; -End; - - -Procedure PGPConvertBase64to256(str64 : String; Var str256 : String); -Var - temp, x : String; - i, j, len8 : longint; - g : char; - trans : Array[0..255] Of String; -Begin - initialize6PGP(trans); - temp := ''; - str256 := ''; - If str64[length(str64) - 1] = '=' Then j := 2 Else - If str64[length(str64)] = '=' Then j := 1 Else j := 0; - For i := 1 To (length(str64) - j) Do temp := temp + trans[ord(str64[i])]; - If j <> 0 Then delete(temp, length(temp) - 2 * j + 1, 2 * j); - len8 := length(temp) Div 8; - For i := 1 To len8 Do - Begin - x := copy(temp, 1, 8); - zeronetochar8(g, x); - str256 := str256 + g; - delete(temp, 1, 8); - End; -End; - -// Convert base 64 strings to base 2 strings, PGP style - - -Procedure PGPConvertBase64to2(str64 : String; Var str2 : String); -Var - i, j : longint; - trans : Array[0..255] Of String; -Begin - str2 := ''; - initialize6(trans); - If str64[length(str64) - 1] = '=' Then j := 2 Else - If str64[length(str64)] = '=' Then j := 1 Else j := 0; - For i := 1 To (length(str64) - j) Do str2 := str2 + trans[ord(str64[i])]; - delete(str2, length(str2) - 2 * j + 1, 2 * j); -End; - - -// Convert a FGInt to a binary string (base 2) & visa versa - -Procedure FGIntToBase2String(Const FGInt : TFGInt; Var S : String); -Var - i : LongWord; - j : integer; -Begin - S := ''; - For i := 1 To FGInt.Number[0] Do - Begin - For j := 0 To 30 Do - If (1 And (FGInt.Number[i] Shr j)) = 1 Then - S := '1' + S - Else - S := '0' + S; - End; - While (length(S) > 1) And (S[1] = '0') Do - delete(S, 1, 1); - If S = '' Then S := '0'; -End; - - -Procedure Base2StringToFGInt(S : String; Var FGInt : TFGInt); -Var - i, j, size : LongWord; -Begin - While (S[1] = '0') And (length(S) > 1) Do - delete(S, 1, 1); - size := length(S) Div 31; - If (length(S) Mod 31) <> 0 Then size := size + 1; - SetLength(FGInt.Number, (size + 1)); - FGInt.Number[0] := size; - j := 1; - FGInt.Number[j] := 0; - i := 0; - While length(S) > 0 Do - Begin - If S[length(S)] = '1' Then - FGInt.Number[j] := FGInt.Number[j] Or (1 Shl i); - i := i + 1; - If i = 31 Then - Begin - i := 0; - j := j + 1; - If j <= size Then FGInt.Number[j] := 0; - End; - delete(S, length(S), 1); - End; - FGInt.Sign := positive; -End; - - -// Convert a FGInt to an base 256 string & visa versa - -Procedure FGIntToBase256String(Const FGInt : TFGInt; Var str256 : String); -Var - temp1 : String; - i, len8 : LongWord; - g : char; -Begin - FGIntToBase2String(FGInt, temp1); - While (length(temp1) Mod 8) <> 0 Do temp1 := '0' + temp1; - len8 := length(temp1) Div 8; - str256 := ''; - For i := 1 To len8 Do - Begin - zeronetochar8(g, copy(temp1, 1, 8)); - str256 := str256 + g; - delete(temp1, 1, 8); - End; -End; - - -Procedure Base256StringToFGInt(str256 : String; Var FGInt : TFGInt); -Var - temp1 : String; - i : longint; - trans : Array[0..255] Of String; -Begin - temp1 := ''; - initialize8(trans); - For i := 1 To length(str256) Do temp1 := temp1 + trans[ord(str256[i])]; - While (temp1[1] = '0') And (temp1 <> '0') Do delete(temp1, 1, 1); - Base2StringToFGInt(temp1, FGInt); -End; - -// Convert an MPI (Multiple Precision Integer, PGP style) to an FGInt & -// visa versa - -Procedure PGPMPIToFGInt(PGPMPI : String; Var FGInt : TFGInt); -Var - temp : String; -Begin - temp := PGPMPI; - delete(temp, 1, 2); - Base256StringToFGInt(temp, FGInt); -End; - - -Procedure FGIntToPGPMPI(FGInt : TFGInt; Var PGPMPI : String); -Var - len, i : word; - c : char; - b : byte; -Begin - FGIntToBase256String(FGInt, PGPMPI); - len := length(PGPMPI) * 8; - c := PGPMPI[1]; - For i := 7 Downto 0 Do If (ord(c) Shr i) = 0 Then len := len - 1 Else break; - b := len Mod 256; - PGPMPI := chr(b) + PGPMPI; - b := len Div 256; - PGPMPI := chr(b) + PGPMPI; -End; - - -// Convert a base 10 string to a FGInt -// NESTED -Procedure GIntDivByIntBis1(Var GInt : TFGInt; by : LongWord; Var modres : word); -Var - i, size, rest, temp : LongWord; -Begin - size := GInt.Number[0]; - temp := 0; - For i := size Downto 1 Do - Begin - temp := temp * 10000; - rest := temp + GInt.Number[i]; - GInt.Number[i] := rest Div by; - temp := rest Mod by; - End; - modres := temp; - While (GInt.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> GInt.Number[0] Then - Begin - SetLength(GInt.Number, size + 1); - GInt.Number[0] := size; - End; -End; - -Procedure Base10StringToFGInt(Base10 : String; Var FGInt : TFGInt); -Var - i, size : LongWord; - j : word; - S, x : String; - sign : TSign; - - -Begin - While (Not (Base10[1] In ['-', '0'..'9'])) And (length(Base10) > 1) Do - delete(Base10, 1, 1); - If copy(Base10, 1, 1) = '-' Then - Begin - Sign := negative; - delete(Base10, 1, 1); - End - Else - Sign := positive; - While (length(Base10) > 1) And (copy(Base10, 1, 1) = '0') Do - delete(Base10, 1, 1); - size := length(Base10) Div 4; - If (length(Base10) Mod 4) <> 0 Then size := size + 1; - SetLength(FGInt.Number, size + 1); - FGInt.Number[0] := size; - For i := 1 To (size - 1) Do - Begin - x := copy(Base10, length(Base10) - 3, 4); - FGInt.Number[i] := StrToInt(x); - delete(Base10, length(Base10) - 3, 4); - End; - FGInt.Number[size] := StrToInt(Base10); - - S := ''; - While (FGInt.Number[0] <> 1) Or (FGInt.Number[1] <> 0) Do - Begin - GIntDivByIntBis1(FGInt, 2, j); - S := inttostr(j) + S; - End; - If S = '' Then S := '0'; - FGIntDestroy(FGInt); - Base2StringToFGInt(S, FGInt); - FGInt.Sign := sign; -End; - - -// Convert a FGInt to a base 10 string - -Procedure FGIntToBase10String(Const FGInt : TFGInt; Var Base10 : String); -Var - S : String; - j : LongWord; - temp : TFGInt; -Begin - FGIntCopy(FGInt, temp); - Base10 := ''; - While (temp.Number[0] > 1) Or (temp.Number[1] > 0) Do - Begin - FGIntDivByIntBis(temp, 10000, j); - S := IntToStr(j); - While Length(S) < 4 Do - S := '0' + S; - Base10 := S + Base10; - End; - Base10 := '0' + Base10; - While (length(Base10) > 1) And (Base10[1] = '0') Do - delete(Base10, 1, 1); - If FGInt.Sign = negative Then Base10 := '-' + Base10; -End; - - -// Destroy a FGInt to free memory - -Procedure FGIntDestroy(Var FGInt : TFGInt); -Begin - FGInt.Number := Nil; -End; - - -// Compare 2 FGInts in absolute value, returns -// Lt if FGInt1 > FGInt2, St if FGInt1 < FGInt2, Eq if FGInt1 = FGInt2, -// Er otherwise - -Function FGIntCompareAbs(Const FGInt1, FGInt2 : TFGInt) : TCompare; -Var - size1, size2, i : LongWord; -Begin - FGIntCompareAbs := Er; - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - If size1 > size2 Then FGIntCompareAbs := Lt Else - If size1 < size2 Then FGIntCompareAbs := St Else - Begin - i := size2; - While (FGInt1.Number[i] = FGInt2.Number[i]) And (i > 1) Do i := i - 1; - If FGInt1.Number[i] = FGInt2.Number[i] Then FGIntCompareAbs := Eq Else - If FGInt1.Number[i] < FGInt2.Number[i] Then FGIntCompareAbs := St Else - If FGInt1.Number[i] > FGInt2.Number[i] Then FGIntCompareAbs := Lt; - End; -End; - - -// Add 2 FGInts, FGInt1 + FGInt2 = Sum - -Procedure FGIntAdd(Const FGInt1, FGInt2 : TFGInt; Var Sum : TFGInt); -Var - i, size1, size2, size, rest, Trest : LongWord; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - If size1 < size2 Then - FGIntAdd(FGInt2, FGInt1, Sum) - Else - Begin - If FGInt1.Sign = FGInt2.Sign Then - Begin - Sum.Sign := FGInt1.Sign; - setlength(Sum.Number, (size1 + 2)); - rest := 0; - For i := 1 To size2 Do - Begin - Trest := FGInt1.Number[i]; - Trest := Trest + FGInt2.Number[i]; - Trest := Trest + rest; - Sum.Number[i] := Trest And 2147483647; - rest := Trest Shr 31; - End; - For i := (size2 + 1) To size1 Do - Begin - Trest := FGInt1.Number[i] + rest; - Sum.Number[i] := Trest And 2147483647; - rest := Trest Shr 31; - End; - size := size1 + 1; - Sum.Number[0] := size; - Sum.Number[size] := rest; - While (Sum.Number[size] = 0) And (size > 1) Do - size := size - 1; - If Sum.Number[0] <> size Then SetLength(Sum.Number, size + 1); - Sum.Number[0] := size; - End - Else - Begin - If FGIntCompareAbs(FGInt2, FGInt1) = Lt Then - FGIntAdd(FGInt2, FGInt1, Sum) - Else - Begin - SetLength(Sum.Number, (size1 + 1)); - rest := 0; - For i := 1 To size2 Do - Begin - Trest := $80000000; // 2147483648; - TRest := Trest + FGInt1.Number[i]; - TRest := Trest - FGInt2.Number[i]; - TRest := Trest - rest; - Sum.Number[i] := Trest And 2147483647; - If (Trest > 2147483647) Then - rest := 0 - Else - rest := 1; - End; - For i := (size2 + 1) To size1 Do - Begin - Trest := $80000000; - TRest := Trest + FGInt1.Number[i]; - TRest := Trest - rest; - Sum.Number[i] := Trest And 2147483647; - If (Trest > 2147483647) Then - rest := 0 - Else - rest := 1; - End; - size := size1; - While (Sum.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> size1 Then SetLength(Sum.Number, size + 1); - Sum.Number[0] := size; - Sum.Sign := FGInt1.Sign; - End; - End; - End; -End; - - - -Procedure FGIntChangeSign(Var FGInt : TFGInt); -Begin - If FGInt.Sign = negative Then FGInt.Sign := positive Else FGInt.Sign := negative; -End; - - -// Substract 2 FGInts, FGInt1 - FGInt2 = dif - -Procedure FGIntSub(Var FGInt1, FGInt2, dif : TFGInt); -Begin - FGIntChangeSign(FGInt2); - FGIntAdd(FGInt1, FGInt2, dif); - FGIntChangeSign(FGInt2); -End; - - -// multiply a FGInt by an integer, FGInt * by = res, by < 2147483648 - -Procedure FGIntMulByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord); -Var - i, size, rest : LongWord; - Trest : int64; -Begin - size := FGInt.Number[0]; - setlength(res.Number, (size + 2)); - rest := 0; - For i := 1 To size Do - Begin - Trest := FGInt.Number[i]; - TRest := Trest * by; - TRest := Trest + rest; - res.Number[i] := Trest And 2147483647; - rest := Trest Shr 31; - End; - If rest <> 0 Then - Begin - size := size + 1; - Res.Number[size] := rest; - End - Else - SetLength(Res.Number, size + 1); - Res.Number[0] := size; - Res.Sign := FGInt.Sign; -End; - - -// multiply a FGInt by an integer, FGInt * by = res, by < 1000000000 - -Procedure FGIntMulByIntbis(Var FGInt : TFGInt; by : LongWord); -Var - i, size, rest : LongWord; - Trest : int64; -Begin - size := FGInt.Number[0]; - Setlength(FGInt.Number, size + 2); - rest := 0; - For i := 1 To size Do - Begin - Trest := FGInt.Number[i]; - TRest := Trest * by; - TRest := Trest + rest; - FGInt.Number[i] := Trest And 2147483647; - rest := Trest Shr 31; - End; - If rest <> 0 Then - Begin - size := size + 1; - FGInt.Number[size] := rest; - End - Else - SetLength(FGInt.Number, size + 1); - FGInt.Number[0] := size; -End; - - -// divide a FGInt by an integer, FGInt = res * by + modres - -Procedure FGIntDivByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord; Var modres : LongWord); -Var - i, size : LongWord; - rest : int64; -Begin - size := FGInt.Number[0]; - setlength(res.Number, (size + 1)); - modres := 0; - For i := size Downto 1 Do - Begin - rest := modres; - rest := rest Shl 31; - rest := rest Or FGInt.Number[i]; - res.Number[i] := rest Div by; - modres := rest Mod by; - End; - While (res.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> FGInt.Number[0] Then SetLength(res.Number, size + 1); - res.Number[0] := size; - Res.Sign := FGInt.Sign; - If FGInt.sign = negative Then modres := by - modres; -End; - - -// divide a FGInt by an integer, FGInt = FGInt * by + modres - -Procedure FGIntDivByIntBis(Var FGInt : TFGInt; by : LongWord; Var modres : LongWord); -Var - i, size : LongWord; - temp, rest : int64; -Begin - size := FGInt.Number[0]; - temp := 0; - For i := size Downto 1 Do - Begin - temp := temp Shl 31; - rest := temp Or FGInt.Number[i]; - FGInt.Number[i] := rest Div by; - temp := rest Mod by; - End; - modres := temp; - While (FGInt.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> FGInt.Number[0] Then - Begin - SetLength(FGInt.Number, size + 1); - FGInt.Number[0] := size; - End; -End; - - -// Reduce a FGInt modulo by (=an integer), FGInt mod by = modres - -Procedure FGIntModByInt(Const FGInt : TFGInt; by : LongWord; Var modres : LongWord); -Var - i, size : LongWord; - temp, rest : int64; -Begin - size := FGInt.Number[0]; - temp := 0; - For i := size Downto 1 Do - Begin - temp := temp Shl 31; - rest := temp Or FGInt.Number[i]; - temp := rest Mod by; - End; - modres := temp; - If FGInt.sign = negative Then modres := by - modres; -End; - - -// Returns the FGInt in absolute value - -Procedure FGIntAbs(Var FGInt : TFGInt); -Begin - FGInt.Sign := positive; -End; - - -// Copy a FGInt1 into FGInt2 - -Procedure FGIntCopy(Const FGInt1 : TFGInt; Var FGInt2 : TFGInt); -Begin - FGInt2.Sign := FGInt1.Sign; - FGInt2.Number := Nil; - FGInt2.Number := Copy(FGInt1.Number, 0, FGInt1.Number[0] + 1); -End; - - -// Shift the FGInt to the left in base 2 notation, ie FGInt = FGInt * 2 - -Procedure FGIntShiftLeft(Var FGInt : TFGInt); -Var - l, m, i, size : LongWord; -Begin - size := FGInt.Number[0]; - l := 0; - For i := 1 To Size Do - Begin - m := FGInt.Number[i] Shr 30; - FGInt.Number[i] := ((FGInt.Number[i] Shl 1) Or l) And 2147483647; - l := m; - End; - If l <> 0 Then - Begin - setlength(FGInt.Number, size + 2); - FGInt.Number[size + 1] := l; - FGInt.Number[0] := size + 1; - End; -End; - - -// Shift the FGInt to the right in base 2 notation, ie FGInt = FGInt div 2 - -Procedure FGIntShiftRight(Var FGInt : TFGInt); -Var - l, m, i, size : LongWord; -Begin - size := FGInt.Number[0]; - l := 0; - For i := size Downto 1 Do - Begin - m := FGInt.Number[i] And 1; - FGInt.Number[i] := (FGInt.Number[i] Shr 1) Or l; - l := m Shl 30; - End; - If (FGInt.Number[size] = 0) And (size > 1) Then - Begin - setlength(FGInt.Number, size); - FGInt.Number[0] := size - 1; - End; -End; - - -// FGInt = FGInt / 2147483648 - -Procedure FGIntShiftRightBy31(Var FGInt : TFGInt); -Var - size, i : LongWord; -Begin - size := FGInt.Number[0]; - If size > 1 Then - Begin - For i := 1 To size - 1 Do - Begin - FGInt.Number[i] := FGInt.Number[i + 1]; - End; - SetLength(FGInt.Number, Size); - FGInt.Number[0] := size - 1; - End - Else - FGInt.Number[1] := 0; -End; - - -// FGInt1 = FGInt1 + FGInt2, FGInt1 > FGInt2 - -Procedure FGIntAddBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt); -Var - i, size1, size2, Trest, rest : LongWord; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - rest := 0; - For i := 1 To size2 Do - Begin - Trest := FGInt1.Number[i] + FGInt2.Number[i] + rest; - rest := Trest Shr 31; - FGInt1.Number[i] := Trest And 2147483647; - End; - For i := size2 + 1 To size1 Do - Begin - Trest := FGInt1.Number[i] + rest; - rest := Trest Shr 31; - FGInt1.Number[i] := Trest And 2147483647; - End; - If rest <> 0 Then - Begin - SetLength(FGInt1.Number, size1 + 2); - FGInt1.Number[0] := size1 + 1; - FGInt1.Number[size1 + 1] := rest; - End; -End; - - -// FGInt1 = FGInt1 - FGInt2, use only when 0 < FGInt2 < FGInt1 - -Procedure FGIntSubBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt); -Var - i, size1, size2, rest, Trest : LongWord; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - rest := 0; - For i := 1 To size2 Do - Begin - Trest := ($80000000 Or FGInt1.Number[i]) - FGInt2.Number[i] - rest; - If (Trest > 2147483647) Then - rest := 0 - Else - rest := 1; - FGInt1.Number[i] := Trest And 2147483647; - End; - For i := size2 + 1 To size1 Do - Begin - Trest := ($80000000 Or FGInt1.Number[i]) - rest; - If (Trest > 2147483647) Then - rest := 0 - Else - rest := 1; - FGInt1.Number[i] := Trest And 2147483647; - End; - i := size1; - While (FGInt1.Number[i] = 0) And (i > 1) Do - i := i - 1; - If i <> size1 Then - Begin - SetLength(FGInt1.Number, i + 1); - FGInt1.Number[0] := i; - End; -End; - - -// Multiply 2 FGInts, FGInt1 * FGInt2 = Prod - -Procedure FGIntMul(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt); -Var - i, j, size, size1, size2, rest : LongWord; - Trest : int64; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - size := size1 + size2; - SetLength(Prod.Number, (size + 1)); - For i := 1 To size Do - Prod.Number[i] := 0; - - For i := 1 To size2 Do - Begin - rest := 0; - For j := 1 To size1 Do - Begin - Trest := FGInt1.Number[j]; - Trest := Trest * FGInt2.Number[i]; - Trest := Trest + Prod.Number[j + i - 1]; - Trest := Trest + rest; - Prod.Number[j + i - 1] := Trest And 2147483647; - rest := Trest Shr 31; - End; - Prod.Number[i + size1] := rest; - End; - - Prod.Number[0] := size; - While (Prod.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> Prod.Number[0] Then - Begin - SetLength(Prod.Number, size + 1); - Prod.Number[0] := size; - End; - If FGInt1.Sign = FGInt2.Sign Then - Prod.Sign := Positive - Else - prod.Sign := negative; -End; - - -// Square a FGInt, FGInt² = Square - -Procedure FGIntSquare(Const FGInt : TFGInt; Var Square : TFGInt); -Var - size, size1, i, j, rest : LongWord; - Trest : int64; -Begin - size1 := FGInt.Number[0]; - size := 2 * size1; - SetLength(Square.Number, (size + 1)); - Square.Number[0] := size; - For i := 1 To size Do - Square.Number[i] := 0; - For i := 1 To size1 Do - Begin - Trest := FGInt.Number[i]; - Trest := Trest * FGInt.Number[i]; - Trest := Trest + Square.Number[2 * i - 1]; - Square.Number[2 * i - 1] := Trest And 2147483647; - rest := Trest Shr 31; - For j := i + 1 To size1 Do - Begin - Trest := FGInt.Number[i] Shl 1; - Trest := Trest * FGInt.Number[j]; - Trest := Trest + Square.Number[i + j - 1]; - Trest := Trest + rest; - Square.Number[i + j - 1] := Trest And 2147483647; - rest := Trest Shr 31; - End; - Square.Number[i + size1] := rest; - End; - Square.Sign := positive; - While (Square.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> (2 * size1) Then - Begin - SetLength(Square.Number, size + 1); - Square.Number[0] := size; - End; -End; - - -// Exponentiate a FGInt, FGInt^exp = res - -Procedure FGIntExp(Const FGInt, exp : TFGInt; Var res : TFGInt); -Var - temp2, temp3 : TFGInt; - S : String; - i : LongWord; -Begin - FGIntToBase2String(exp, S); - If S[length(S)] = '0' Then Base10StringToFGInt('1', res) Else FGIntCopy(FGInt, res); - FGIntCopy(FGInt, temp2); - If length(S) > 1 Then - For i := (length(S) - 1) Downto 1 Do - Begin - FGIntSquare(temp2, temp3); - FGIntCopy(temp3, temp2); - If S[i] = '1' Then - Begin - FGIntMul(res, temp2, temp3); - FGIntCopy(temp3, res); - End; - End; -End; - - -// Compute FGInt! = FGInt * (FGInt - 1) * (FGInt - 2) * ... * 3 * 2 * 1 - -Procedure FGIntFac(Const FGInt : TFGInt; Var res : TFGInt); -Var - one, temp, temp1 : TFGInt; -Begin - FGIntCopy(FGInt, temp); - Base10StringToFGInt('1', res); - Base10StringToFGInt('1', one); - - While Not (FGIntCompareAbs(temp, one) = Eq) Do - Begin - FGIntMul(temp, res, temp1); - FGIntCopy(temp1, res); - FGIntSubBis(temp, one); - End; - - FGIntDestroy(one); - FGIntDestroy(temp); -End; - - -// FGInt = FGInt * 2147483648 - -Procedure FGIntShiftLeftBy31(Var FGInt : TFGInt); -Var - f1, f2 : LongWord; - i, size : longint; -Begin - size := FGInt.Number[0]; - SetLength(FGInt.Number, size + 2); - f1 := 0; - For i := 1 To (size + 1) Do - Begin - f2 := FGInt.Number[i]; - FGInt.Number[i] := f1; - f1 := f2; - End; - FGInt.Number[0] := size + 1; -End; - - -// Divide 2 FGInts, FGInt1 = FGInt2 * QFGInt + MFGInt, MFGInt is always positive - -Procedure FGIntDivMod(Var FGInt1, FGInt2, QFGInt, MFGInt : TFGInt); -Var - one, zero, temp1, temp2 : TFGInt; - s1, s2 : TSign; - j, s, t : LongWord; - i : int64; -Begin - s1 := FGInt1.Sign; - s2 := FGInt2.Sign; - FGIntAbs(FGInt1); - FGIntAbs(FGInt2); - FGIntCopy(FGInt1, MFGInt); - FGIntCopy(FGInt2, temp1); - - If FGIntCompareAbs(FGInt1, FGInt2) <> St Then - Begin - s := FGInt1.Number[0] - FGInt2.Number[0]; - SetLength(QFGInt.Number, (s + 2)); - QFGInt.Number[0] := s + 1; - For t := 1 To s Do - Begin - FGIntShiftLeftBy31(temp1); - QFGInt.Number[t] := 0; - End; - j := s + 1; - QFGInt.Number[j] := 0; - While FGIntCompareAbs(MFGInt, FGInt2) <> St Do - Begin - While FGIntCompareAbs(MFGInt, temp1) <> St Do - Begin - If MFGInt.Number[0] > temp1.Number[0] Then - Begin - i := MFGInt.Number[MFGInt.Number[0]]; - i := i Shl 31; - i := i + MFGInt.Number[MFGInt.Number[0] - 1]; - i := i Div (temp1.Number[temp1.Number[0]] + 1); - End - Else - i := MFGInt.Number[MFGInt.Number[0]] Div (temp1.Number[temp1.Number[0]] + 1); - If (i <> 0) Then - Begin - FGIntCopy(temp1, temp2); - FGIntMulByIntBis(temp2, i); - FGIntSubBis(MFGInt, temp2); - QFGInt.Number[j] := QFGInt.Number[j] + i; - If FGIntCompareAbs(MFGInt, temp2) <> St Then - Begin - QFGInt.Number[j] := QFGInt.Number[j] + i; - FGIntSubBis(MFGInt, temp2); - End; - FGIntDestroy(temp2); - End - Else - Begin - QFGInt.Number[j] := QFGInt.Number[j] + 1; - FGIntSubBis(MFGInt, temp1); - End; - End; - If MFGInt.Number[0] <= temp1.Number[0] Then - If FGIntCompareAbs(temp1, FGInt2) <> Eq Then - Begin - FGIntShiftRightBy31(temp1); - j := j - 1; - End; - End; - End - Else - Base10StringToFGInt('0', QFGInt); - s := QFGInt.Number[0]; - While (s > 1) And (QFGInt.Number[s] = 0) Do - s := s - 1; - If s < QFGInt.Number[0] Then - Begin - setlength(QFGInt.Number, s + 1); - QFGInt.Number[0] := s; - End; - QFGInt.Sign := positive; - - FGIntDestroy(temp1); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - If s1 = negative Then - Begin - If FGIntCompareAbs(MFGInt, zero) <> Eq Then - Begin - FGIntadd(QFGInt, one, temp1); - FGIntDestroy(QFGInt); - FGIntCopy(temp1, QFGInt); - FGIntDestroy(temp1); - FGIntsub(FGInt2, MFGInt, temp1); - FGIntDestroy(MFGInt); - FGIntCopy(temp1, MFGInt); - FGIntDestroy(temp1); - End; - If s2 = positive Then QFGInt.Sign := negative; - End - Else - QFGInt.Sign := s2; - FGIntDestroy(one); - FGIntDestroy(zero); - - FGInt1.Sign := s1; - FGInt2.Sign := s2; -End; - - -// Same as above but doesn 't compute MFGInt - -Procedure FGIntDiv(Var FGInt1, FGInt2, QFGInt : TFGInt); -Var - one, zero, temp1, temp2, MFGInt : TFGInt; - s1, s2 : TSign; - j, s, t : LongWord; - i : int64; -Begin - s1 := FGInt1.Sign; - s2 := FGInt2.Sign; - FGIntAbs(FGInt1); - FGIntAbs(FGInt2); - FGIntCopy(FGInt1, MFGInt); - FGIntCopy(FGInt2, temp1); - - If FGIntCompareAbs(FGInt1, FGInt2) <> St Then - Begin - s := FGInt1.Number[0] - FGInt2.Number[0]; - SetLength(QFGInt.Number, (s + 2)); - QFGInt.Number[0] := s + 1; - For t := 1 To s Do - Begin - FGIntShiftLeftBy31(temp1); - QFGInt.Number[t] := 0; - End; - j := s + 1; - QFGInt.Number[j] := 0; - While FGIntCompareAbs(MFGInt, FGInt2) <> St Do - Begin - While FGIntCompareAbs(MFGInt, temp1) <> St Do - Begin - If MFGInt.Number[0] > temp1.Number[0] Then - Begin - i := MFGInt.Number[MFGInt.Number[0]]; - i := i Shl 31; - i := i + MFGInt.Number[MFGInt.Number[0] - 1]; - i := i Div (temp1.Number[temp1.Number[0]] + 1); - End - Else - i := MFGInt.Number[MFGInt.Number[0]] Div (temp1.Number[temp1.Number[0]] + 1); - If (i <> 0) Then - Begin - FGIntCopy(temp1, temp2); - FGIntMulByIntBis(temp2, i); - FGIntSubBis(MFGInt, temp2); - QFGInt.Number[j] := QFGInt.Number[j] + i; - If FGIntCompareAbs(MFGInt, temp2) <> St Then - Begin - QFGInt.Number[j] := QFGInt.Number[j] + i; - FGIntSubBis(MFGInt, temp2); - End; - FGIntDestroy(temp2); - End - Else - Begin - QFGInt.Number[j] := QFGInt.Number[j] + 1; - FGIntSubBis(MFGInt, temp1); - End; - End; - If MFGInt.Number[0] <= temp1.Number[0] Then - If FGIntCompareAbs(temp1, FGInt2) <> Eq Then - Begin - FGIntShiftRightBy31(temp1); - j := j - 1; - End; - End; - End - Else - Base10StringToFGInt('0', QFGInt); - s := QFGInt.Number[0]; - While (s > 1) And (QFGInt.Number[s] = 0) Do - s := s - 1; - If s < QFGInt.Number[0] Then - Begin - setlength(QFGInt.Number, s + 1); - QFGInt.Number[0] := s; - End; - QFGInt.Sign := positive; - - FGIntDestroy(temp1); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - If s1 = negative Then - Begin - If FGIntCompareAbs(MFGInt, zero) <> Eq Then - Begin - FGIntadd(QFGInt, one, temp1); - FGIntDestroy(QFGInt); - FGIntCopy(temp1, QFGInt); - FGIntDestroy(temp1); - FGIntsub(FGInt2, MFGInt, temp1); - FGIntDestroy(MFGInt); - FGIntCopy(temp1, MFGInt); - FGIntDestroy(temp1); - End; - If s2 = positive Then QFGInt.Sign := negative; - End - Else - QFGInt.Sign := s2; - FGIntDestroy(one); - FGIntDestroy(zero); - FGIntDestroy(MFGInt); - - FGInt1.Sign := s1; - FGInt2.Sign := s2; -End; - - - -// Same as above but this computes MFGInt in stead of QFGInt -// MFGInt = FGInt1 mod FGInt2 - -Procedure FGIntMod(Var FGInt1, FGInt2, MFGInt : TFGInt); -Var - one, zero, temp1, temp2 : TFGInt; - s1, s2 : TSign; - s, t : LongWord; - i : int64; -Begin - s1 := FGInt1.Sign; - s2 := FGInt2.Sign; - FGIntAbs(FGInt1); - FGIntAbs(FGInt2); - FGIntCopy(FGInt1, MFGInt); - FGIntCopy(FGInt2, temp1); - - If FGIntCompareAbs(FGInt1, FGInt2) <> St Then - Begin - s := FGInt1.Number[0] - FGInt2.Number[0]; - For t := 1 To s Do - FGIntShiftLeftBy31(temp1); - While FGIntCompareAbs(MFGInt, FGInt2) <> St Do - Begin - While FGIntCompareAbs(MFGInt, temp1) <> St Do - Begin - If MFGInt.Number[0] > temp1.Number[0] Then - Begin - i := MFGInt.Number[MFGInt.Number[0]]; - i := i Shl 31; - i := i + MFGInt.Number[MFGInt.Number[0] - 1]; - i := i Div (temp1.Number[temp1.Number[0]] + 1); - End - Else - i := MFGInt.Number[MFGInt.Number[0]] Div (temp1.Number[temp1.Number[0]] + 1); - If (i <> 0) Then - Begin - FGIntCopy(temp1, temp2); - FGIntMulByIntBis(temp2, i); - FGIntSubBis(MFGInt, temp2); - If FGIntCompareAbs(MFGInt, temp2) <> St Then FGIntSubBis(MFGInt, temp2); - FGIntDestroy(temp2); - End - Else - FGIntSubBis(MFGInt, temp1); -// If FGIntCompareAbs(MFGInt, temp1) <> St Then FGIntSubBis(MFGInt,temp1); - End; - If MFGInt.Number[0] <= temp1.Number[0] Then - If FGIntCompareAbs(temp1, FGInt2) <> Eq Then FGIntShiftRightBy31(temp1); - End; - End; - - FGIntDestroy(temp1); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - If s1 = negative Then - Begin - If FGIntCompareAbs(MFGInt, zero) <> Eq Then - Begin - FGIntSub(FGInt2, MFGInt, temp1); - FGIntDestroy(MFGInt); - FGIntCopy(temp1, MFGInt); - FGIntDestroy(temp1); - End; - End; - FGIntDestroy(one); - FGIntDestroy(zero); - - FGInt1.Sign := s1; - FGInt2.Sign := s2; -End; - - -// Square a FGInt modulo Modb, FGInt^2 mod Modb = FGIntSM - -Procedure FGIntSquareMod(Var FGInt, Modb, FGIntSM : TFGInt); -Var - temp : TFGInt; -Begin - FGIntSquare(FGInt, temp); - FGIntMod(temp, Modb, FGIntSM); - FGIntDestroy(temp); -End; - - -// Add 2 FGInts modulo base, (FGInt1 + FGInt2) mod base = FGIntres - -Procedure FGIntAddMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt); -Var - temp : TFGInt; -Begin - FGIntadd(FGInt1, FGInt2, temp); - FGIntMod(temp, base, FGIntres); - FGIntDestroy(temp); -End; - - -// Multiply 2 FGInts modulo base, (FGInt1 * FGInt2) mod base = FGIntres - -Procedure FGIntMulMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt); -Var - temp : TFGInt; -Begin - FGIntMul(FGInt1, FGInt2, temp); - FGIntMod(temp, base, FGIntres); - FGIntDestroy(temp); -End; - - -// Exponentiate 2 FGInts modulo base, (FGInt1 ^ FGInt2) mod modb = res - -Procedure FGIntModExp(Var FGInt, exp, modb, res : TFGInt); -Var - temp2, temp3 : TFGInt; - i : LongWord; - S : String; -Begin - If (Modb.Number[1] Mod 2) = 1 Then - Begin - FGIntMontgomeryModExp(FGInt, exp, modb, res); - exit; - End; - FGIntToBase2String(exp, S); - Base10StringToFGInt('1', res); - FGIntcopy(FGInt, temp2); - - For i := length(S) Downto 1 Do - Begin - If S[i] = '1' Then - Begin - FGIntmulMod(res, temp2, modb, temp3); - FGIntCopy(temp3, res); - End; - FGIntSquareMod(temp2, Modb, temp3); - FGIntCopy(temp3, temp2); - End; - FGIntDestroy(temp2); -End; - - -// Procedures for Montgomery Exponentiation - -Procedure FGIntModBis(Const FGInt : TFGInt; Var FGIntOut : TFGInt; b, head : LongWord); -Var - i : LongWord; -Begin - If b <= FGInt.Number[0] Then - Begin - SetLength(FGIntOut.Number, (b + 1)); - For i := 0 To b Do - FGIntOut.Number[i] := FGInt.Number[i]; - FGIntOut.Number[b] := FGIntOut.Number[b] And head; - i := b; - While (FGIntOut.Number[i] = 0) And (i > 1) Do - i := i - 1; - If i < b Then SetLength(FGIntOut.Number, i + 1); - FGIntOut.Number[0] := i; - FGIntOut.Sign := positive; - End - Else - FGIntCopy(FGInt, FGIntOut); -End; - - -Procedure FGIntMulModBis(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt; b, head : LongWord); -Var - i, j, size, size1, size2, t, rest : LongWord; - Trest : int64; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - size := min(b, size1 + size2); - SetLength(Prod.Number, (size + 1)); - For i := 1 To size Do - Prod.Number[i] := 0; - - For i := 1 To size2 Do - Begin - rest := 0; - t := min(size1, b - i + 1); - For j := 1 To t Do - Begin - Trest := FGInt1.Number[j]; - Trest := Trest * FGInt2.Number[i]; - Trest := Trest + Prod.Number[j + i - 1]; - Trest := Trest + rest; - Prod.Number[j + i - 1] := Trest And 2147483647; - rest := Trest Shr 31; - End; - If (i + size1) <= b Then Prod.Number[i + size1] := rest; - End; - - Prod.Number[0] := size; - If size = b Then Prod.Number[b] := Prod.Number[b] And head; - While (Prod.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size < Prod.Number[0] Then - Begin - SetLength(Prod.Number, size + 1); - Prod.Number[0] := size; - End; - If FGInt1.Sign = FGInt2.Sign Then - Prod.Sign := Positive - Else - prod.Sign := negative; -End; - - -Procedure FGIntMontgomeryMod(Const GInt, base, baseInv : TFGInt; Var MGInt : TFGInt; b : Longword; head : LongWord); -Var - m, temp, temp1 : TFGInt; - r : LongWord; -Begin - FGIntModBis(GInt, temp, b, head); - FGIntMulModBis(temp, baseInv, m, b, head); - FGIntMul(m, base, temp1); - FGIntDestroy(temp); - FGIntAdd(temp1, GInt, temp); - FGIntDestroy(temp1); - MGInt.Number := copy(temp.Number, b - 1, temp.Number[0] - b + 2); - MGInt.Sign := positive; - MGInt.Number[0] := temp.Number[0] - b + 1; - FGIntDestroy(temp); - If (head Shr 30) = 0 Then FGIntDivByIntBis(MGInt, head + 1, r) - Else FGIntShiftRightBy31(MGInt); - If FGIntCompareAbs(MGInt, base) <> St Then FGIntSubBis(MGInt, base); - FGIntDestroy(temp); - FGIntDestroy(m); -End; - - -Procedure FGIntMontgomeryModExp(Var FGInt, exp, modb, res : TFGInt); -Var - temp2, temp3, baseInv, r, zero : TFGInt; - i, j, t, b, head : LongWord; - S : String; -Begin - Base2StringToFGInt('0', zero); - FGIntMod(FGInt, modb, res); - If FGIntCompareAbs(res, zero)=Eq then - Begin - FGIntDestroy(zero); - Exit; - End else FGIntDestroy(res); - FGIntDestroy(zero); - - FGIntToBase2String(exp, S); - t := modb.Number[0]; - b := t; - - If (modb.Number[t] Shr 30) = 1 Then t := t + 1; - SetLength(r.Number, (t + 1)); - r.Number[0] := t; - r.Sign := positive; - For i := 1 To t Do - r.Number[i] := 0; - If t = modb.Number[0] Then - Begin - head := 2147483647; - For j := 29 Downto 0 Do - Begin - head := head Shr 1; - If (modb.Number[t] Shr j) = 1 Then - Begin - r.Number[t] := 1 Shl (j + 1); - break; - End; - End; - End - Else - Begin - r.Number[t] := 1; - head := 2147483647; - End; - - FGIntModInv(modb, r, temp2); - If temp2.Sign = negative Then - FGIntCopy(temp2, BaseInv) - Else - Begin - FGIntCopy(r, BaseInv); - FGIntSubBis(BaseInv, temp2); - End; -// FGIntBezoutBachet(r, modb, temp2, BaseInv); - FGIntAbs(BaseInv); - FGIntDestroy(temp2); - FGIntMod(r, modb, res); - FGIntMulMod(FGInt, res, modb, temp2); - FGIntDestroy(r); - - For i := length(S) Downto 1 Do - Begin - If S[i] = '1' Then - Begin - FGIntmul(res, temp2, temp3); - FGIntDestroy(res); - FGIntMontgomeryMod(temp3, modb, baseinv, res, b, head); - FGIntDestroy(temp3); - End; - FGIntSquare(temp2, temp3); - FGIntDestroy(temp2); - FGIntMontgomeryMod(temp3, modb, baseinv, temp2, b, head); - FGIntDestroy(temp3); - End; - FGIntDestroy(temp2); - FGIntMontgomeryMod(res, modb, baseinv, temp3, b, head); - FGIntCopy(temp3, res); - FGIntDestroy(temp3); - FGIntDestroy(baseinv); -End; - - -// Compute the Greatest Common Divisor of 2 FGInts - -Procedure FGIntGCD(Const FGInt1, FGInt2 : TFGInt; Var GCD : TFGInt); -Var - k : TCompare; - zero, temp1, temp2, temp3 : TFGInt; -Begin - k := FGIntCompareAbs(FGInt1, FGInt2); - If (k = Eq) Then FGIntCopy(FGInt1, GCD) Else - If (k = St) Then FGIntGCD(FGInt2, FGInt1, GCD) Else - Begin - Base10StringToFGInt('0', zero); - FGIntCopy(FGInt1, temp1); - FGIntCopy(FGInt2, temp2); - While (temp2.Number[0] <> 1) Or (temp2.Number[1] <> 0) Do - Begin - FGIntMod(temp1, temp2, temp3); - FGIntCopy(temp2, temp1); - FGIntCopy(temp3, temp2); - FGIntDestroy(temp3); - End; - FGIntCopy(temp1, GCD); - FGIntDestroy(temp2); - FGIntDestroy(zero); - End; -End; - - -// Compute the Least Common Multiple of 2 FGInts - -Procedure FGIntLCM(Const FGInt1, FGInt2 : TFGInt; Var LCM : TFGInt); -Var - temp1, temp2 : TFGInt; -Begin - FGIntGCD(FGInt1, FGInt2, temp1); - FGIntmul(FGInt1, FGInt2, temp2); - FGIntdiv(temp2, temp1, LCM); - FGIntDestroy(temp1); - FGIntDestroy(temp2); -End; - - -// Trialdivision of a FGInt upto 9999 and stopping when a divisor is found, returning ok=false - -Procedure FGIntTrialDiv9999(Const FGInt : TFGInt; Var ok : boolean); -Var - j : LongWord; - i : integer; -Begin - If ((FGInt.Number[1] Mod 2) = 0) Then ok := false - Else - Begin - i := 0; - ok := true; - While ok And (i < 1228) Do - Begin - i := i + 1; - FGIntmodbyint(FGInt, primes[i], j); - If j = 0 Then ok := false; - End; - End; -End; - - -// A prng - -Procedure FGIntRandom1(Var Seed, RandomFGInt : TFGInt); -Var - temp, base : TFGInt; -Begin - Base10StringToFGInt('281474976710656', base); - Base10StringToFGInt('44485709377909', temp); - FGIntMulMod(seed, temp, base, RandomFGInt); - FGIntDestroy(temp); - FGIntDestroy(base); -End; - - -// Perform a Rabin Miller Primality Test nrtest times on FGIntp, returns ok=true when FGIntp passes the test - -Procedure FGIntRabinMiller(Var FGIntp : TFGInt; nrtest : Longword; Var ok : boolean); -Var - j, b, i : LongWord; - m, z, temp1, temp2, temp3, zero, one, two, pmin1 : TFGInt; - ok1, ok2 : boolean; -Begin - randomize; - j := 0; - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - Base10StringToFGInt('2', two); - FGIntsub(FGIntp, one, temp1); - FGIntsub(FGIntp, one, pmin1); - - b := 0; - While (temp1.Number[1] Mod 2) = 0 Do - Begin - b := b + 1; - FGIntShiftRight(temp1); - End; - m := temp1; - - i := 0; - ok := true; - Randomize; - While (i < nrtest) And ok Do - Begin - i := i + 1; - Base10StringToFGInt(inttostr(Primes[Random(1227) + 1]), temp2); - FGIntMontGomeryModExp(temp2, m, FGIntp, z); - FGIntDestroy(temp2); - ok1 := (FGIntCompareAbs(z, one) = Eq); - ok2 := (FGIntCompareAbs(z, pmin1) = Eq); - If Not (ok1 Or ok2) Then - Begin - - While (ok And (j < b)) Do - Begin - If (j > 0) And ok1 Then ok := false - Else - Begin - j := j + 1; - If (j < b) And (Not ok2) Then - Begin - FGIntSquaremod(z, FGIntp, temp3); - FGIntCopy(temp3, z); - ok1 := (FGIntCompareAbs(z, one) = Eq); - ok2 := (FGIntCompareAbs(z, pmin1) = Eq); - If ok2 Then j := b; - End - Else If (Not ok2) And (j >= b) Then ok := false; - End; - End; - - End - End; - - FGIntDestroy(zero); - FGIntDestroy(one); - FGIntDestroy(two); - FGIntDestroy(m); - FGIntDestroy(z); - FGIntDestroy(pmin1); -End; - - -// Compute the coefficients from the Bezout Bachet theorem, FGInt1 * a + FGInt2 * b = GCD(FGInt1, FGInt2) - -Procedure FGIntBezoutBachet(Var FGInt1, FGInt2, a, b : TFGInt); -Var - zero, r1, r2, r3, ta, gcd, temp, temp1, temp2 : TFGInt; -Begin - If FGIntCompareAbs(FGInt1, FGInt2) <> St Then - Begin - FGIntcopy(FGInt1, r1); - FGIntcopy(FGInt2, r2); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', a); - Base10StringToFGInt('0', ta); - - Repeat - FGIntdivmod(r1, r2, temp, r3); - FGIntDestroy(r1); - r1 := r2; - r2 := r3; - - FGIntmul(ta, temp, temp1); - FGIntsub(a, temp1, temp2); - FGIntCopy(ta, a); - FGIntCopy(temp2, ta); - FGIntDestroy(temp1); - - FGIntDestroy(temp); - Until FGIntCompareAbs(r3, zero) = Eq; - - FGIntGCD(FGInt1, FGInt2, gcd); - FGIntmul(a, FGInt1, temp1); - FGIntsub(gcd, temp1, temp2); - FGIntDestroy(temp1); - FGIntdiv(temp2, FGInt2, b); - FGIntDestroy(temp2); - - FGIntDestroy(ta); - FGIntDestroy(r1); - FGIntDestroy(r2); - FGIntDestroy(gcd); - End - Else FGIntBezoutBachet(FGInt2, FGInt1, b, a); -End; - - -// Find the (multiplicative) Modular inverse of a FGInt in a finite ring -// of additive order base - -Procedure FGIntModInv(Const FGInt1, base : TFGInt; Var Inverse : TFGInt); -Var - zero, one, r1, r2, r3, tb, gcd, temp, temp1, temp2 : TFGInt; -Begin - Base10StringToFGInt('1', one); - FGIntGCD(FGInt1, base, gcd); - If FGIntCompareAbs(one, gcd) = Eq Then - Begin - FGIntcopy(base, r1); - FGIntcopy(FGInt1, r2); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('0', inverse); - Base10StringToFGInt('1', tb); - - Repeat - FGIntDestroy(r3); - FGIntdivmod(r1, r2, temp, r3); - FGIntCopy(r2, r1); - FGIntCopy(r3, r2); - - FGIntmul(tb, temp, temp1); - FGIntsub(inverse, temp1, temp2); - FGIntDestroy(inverse); - FGIntDestroy(temp1); - FGIntCopy(tb, inverse); - FGIntCopy(temp2, tb); - - FGIntDestroy(temp); - Until FGIntCompareAbs(r3, zero) = Eq; - - If inverse.Sign = negative Then - Begin - FGIntadd(base, inverse, temp); - FGIntCopy(temp, inverse); - End; - - FGIntDestroy(tb); - FGIntDestroy(r1); - FGIntDestroy(r2); - End; - FGIntDestroy(gcd); - FGIntDestroy(one); -End; - - -// Perform a (combined) primality test on FGIntp consisting of a trialdivision upto 8192, -// if the FGInt passes perform nrRMtests Rabin Miller primality tests, returns ok when a -// FGInt is probably prime - -Procedure FGIntPrimetest(Var FGIntp : TFGInt; nrRMtests : integer; Var ok : boolean); -Begin - FGIntTrialdiv9999(FGIntp, ok); - If ok Then FGIntRabinMiller(FGIntp, nrRMtests, ok); -End; - - -// Computes the Legendre symbol for a any number and -// p a prime, returns 0 if p divides a, 1 if a is a -// quadratic residu mod p, -1 if a is a quadratic -// nonresidu mod p - -Procedure FGIntLegendreSymbol(Var a, p : TFGInt; Var L : integer); -Var - temp1, temp2, temp3, temp4, temp5, zero, one : TFGInt; - i : LongWord; - ok1, ok2 : boolean; -Begin - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - FGIntMod(a, p, temp1); - If FGIntCompareAbs(zero, temp1) = Eq Then - Begin - FGIntDestroy(temp1); - L := 0; - End - Else - Begin - FGIntDestroy(temp1); - FGIntCopy(p, temp1); - FGIntCopy(a, temp2); - L := 1; - While FGIntCompareAbs(temp2, one) <> Eq Do - Begin - If (temp2.Number[1] Mod 2) = 0 Then - Begin - FGIntSquare(temp1, temp3); - FGIntSub(temp3, one, temp4); - FGIntDestroy(temp3); - FGIntDivByInt(temp4, temp3, 8, i); - If (temp3.Number[1] Mod 2) = 0 Then ok1 := false Else ok1 := true; - FGIntDestroy(temp3); - FGIntDestroy(temp4); - If ok1 = true Then L := L * (-1); - FGIntDivByIntBis(temp2, 2, i); - End - Else - Begin - FGIntSub(temp1, one, temp3); - FGIntSub(temp2, one, temp4); - FGIntMul(temp3, temp4, temp5); - FGIntDestroy(temp3); - FGIntDestroy(temp4); - FGIntDivByInt(temp5, temp3, 4, i); - If (temp3.Number[1] Mod 2) = 0 Then ok2 := false Else ok2 := true; - FGIntDestroy(temp5); - FGIntDestroy(temp3); - If ok2 = true Then L := L * (-1); - FGIntMod(temp1, temp2, temp3); - FGIntCopy(temp2, temp1); - FGIntCopy(temp3, temp2); - End; - End; - FGIntDestroy(temp1); - FGIntDestroy(temp2); - End; - FGIntDestroy(zero); - FGIntDestroy(one); -End; - - -// Compute a square root modulo a prime number -// SquareRoot^2 mod Prime = Square - -Procedure FGIntSquareRootModP(Square, Prime : TFGInt; Var SquareRoot : TFGInt); -Var - one, n, b, s, r, temp, temp1, temp2, temp3 : TFGInt; - a, i, j : longint; - L : Integer; -Begin - Base2StringToFGInt('1', one); - Base2StringToFGInt('10', n); - a := 0; - FGIntLegendreSymbol(n, Prime, L); - While L <> -1 Do - Begin - FGIntAddBis(n, one); - FGIntLegendreSymbol(n, Prime, L); - End; - FGIntCopy(Prime, s); - s.Number[1] := s.Number[1] - 1; - While (s.Number[1] Mod 2) = 0 Do - Begin - FGIntShiftRight(s); - a := a + 1; - End; - FGIntMontgomeryModExp(n, s, Prime, b); - FGIntAdd(s, one, temp); - FGIntShiftRight(temp); - FGIntMontgomeryModExp(Square, temp, Prime, r); - FGIntDestroy(temp); - FGIntModInv(Square, Prime, temp1); - - For i := 0 To (a - 2) Do - Begin - FGIntSquareMod(r, Prime, temp2); - FGIntMulMod(temp1, temp2, Prime, temp); - FGIntDestroy(temp2); - For j := 1 To (a - i - 2) Do - Begin - FGIntSquareMod(temp, Prime, temp2); - FGIntDestroy(temp); - FGIntCopy(temp2, temp); - FGIntDestroy(temp2); - End; - If FGIntCompareAbs(temp, one) <> Eq Then - Begin - FGIntMulMod(r, b, Prime, temp3); - FGIntDestroy(r); - FGIntCopy(temp3, r); - FGIntDestroy(temp3); - End; - FGIntDestroy(temp); - FGIntDestroy(temp2); - If i = (a - 2) Then break; - FGIntSquareMod(b, Prime, temp3); - FGIntDestroy(b); - FGIntCopy(temp3, b); - FGIntDestroy(temp3); - End; - - FGIntCopy(r, SquareRoot); - FGIntDestroy(r); - FGIntDestroy(s); - FGIntDestroy(b); - FGIntDestroy(temp1); - FGIntDestroy(one); - FGIntDestroy(n); -End; - - -End. diff --git a/lib/base/devel/bignums.nim b/lib/base/devel/bignums.nim deleted file mode 100644 index 1d2b3685d8..0000000000 --- a/lib/base/devel/bignums.nim +++ /dev/null @@ -1,1712 +0,0 @@ -# -# -# Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf -# -# See the file "copying.txt", included in this -# distribution, for details about the copyright. -# - -## This module implements big integers for Nimrod. -## This module is an adaptation of the FGInt module for Pascal by Walied -## Othman: http://triade.studentenweb.org - - -# License, info, etc -# ------------------ -# -# This implementation is made by me, Walied Othman, to contact me -# mail to Walied.Othman@belgacom.net or Triade@ulyssis.org, -# always mention wether it 's about the FGInt for Delphi or for -# FreePascal, or wether it 's about the 6xs, preferably in the subject line. -# If you 're going to use these implementations, at least mention my -# name or something and notify me so I may even put a link on my page. -# This implementation is freeware and according to the coderpunks' -# manifesto it should remain so, so don 't use these implementations -# in commercial software. Encryption, as a tool to ensure privacy -# should be free and accessible for anyone. If you plan to use these -# implementations in a commercial application, contact me before -# doing so, that way you can license the software to use it in commercial -# Software. If any algorithm is patented in your country, you should -# acquire a license before using this software. Modified versions of this -# software must contain an acknowledgement of the original author (=me). -# This implementation is available at -# http://triade.studentenweb.org -# -# copyright 2000, Walied Othman -# This header may not be removed. -# - -type - TBigInt* {.final.} = object ## type that represent an arbitrary long - ## signed integer - s: int # sign: -1 or 1 - n: seq[int] # the number part - -proc len(x: TBigInt): int {.inline.} = return x.n.len - -proc CompareAbs(a, b: TBigInt): int = - result = a.len - b.len - if result == 0: - var i = b.len-1 - while (i > 0) and a.n[i] == b.n[i]: dec(i) - result = a.n[i] - b.n[i] - -const - bitMask = high(int) - bitshift = sizeof(int)*8 - 1 - -proc cutZeros(a: var TBigInt) = - var L = a.len - while a.len > 0 and a[L-1] == 0: dec(L) - setLen(a.n, L) - -proc addAux(a, b: TBigInt, bSign: int): TBigInt - if a.len < b.len: - result = addAux(b, a, bSign) - elif a.s == bSign: - result.s = a.s - result.n = [] - setlen(result.n, a.len+1) - var rest = 0 - for i in 0..b.len-1: - var trest = a.n[i] - trest = trest +% b.n[i] +% rest - result.n[i] = trest and bitMask - rest = trest shr bitshift - for i in b.len .. a.len-1: - var trest = a.n[i] +% rest - result.n[i] = trest and bitMask - rest = trest shr bitshift - result.n[a.len] = rest - cutZeros(result) - elif compareAbs(a, b) > 0: - result = addAux(b, a, bSign) - else: - setlen(result.n, a.len+1) - result.s = a.s - var rest = 0 - for i in 0..b.len-1: - var Trest = low(int) - TRest = Trest +% a.n[i] -% b.n[i] -% rest - result.n[i] = Trest and bitmask - if Trest >% bitMask: rest = 0 else: rest = 1 - for i in b.len .. a.len-1: - var Trest = low(int) - TRest = Trest +% a.n[i] -% rest - result.n[i] = Trest and bitmask - if (Trest >% bitmask): rest = 0 else: rest = 1 - cutZeros(result) - -proc `+` *(a, b: TBigInt): TBigInt = - ## the `+` operator for bigints - result = addAux(a, b, +1) - -proc `-` *(a, b: TBigInt): TBigInt = - ## the `-` operator for bigints - result = addAux(a, b, -1) - -proc mulInPlace(a: var TBigInt, b: int) = - var - size, rest: int32 - Trest: int64 - size = FGInt.Number[0] - setlen(FGInt.Number, size + 2) - rest = 0 - for i in countup(1, size): - Trest = FGInt.Number[i] - TRest = Trest * by - TRest = Trest + rest - FGInt.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - if rest != 0: - size = size + 1 - FGInt.Number[size] = rest - else: - setlen(FGInt.Number, size + 1) - FGInt.Number[0] = size - - -import - SysUtils, Math - -type - TCompare* = enum - Lt, St, Eq, Er - TSign = enum - negative, positive - TBigInt* {.final.} = object - Sign: TSign - Number: seq[int32] - - -proc zeronetochar8*(g: var char, x: String) -proc zeronetochar6*(g: var int, x: String) -proc initialize8*(trans: var openarray[String]) -proc initialize6*(trans: var openarray[String]) -proc initialize6PGP*(trans: var openarray[String]) -proc ConvertBase256to64*(str256: String, str64: var String) -proc ConvertBase64to256*(str64: String, str256: var String) -proc ConvertBase256to2*(str256: String, str2: var String) -proc ConvertBase64to2*(str64: String, str2: var String) -proc ConvertBase2to256*(str2: String, str256: var String) -proc ConvertBase2to64*(str2: String, str64: var String) -proc ConvertBase256StringToHexString*(Str256: String, HexStr: var String) -proc ConvertHexStringToBase256String*(HexStr: String, Str256: var String) -proc PGPConvertBase256to64*(str256, str64: var String) -proc PGPConvertBase64to256*(str64: String, str256: var String) -proc PGPConvertBase64to2*(str64: String, str2: var String) -proc FGIntToBase2String*(FGInt: TBigInt, S: var String) -proc Base2StringToFGInt*(S: String, FGInt: var TBigInt) -proc FGIntToBase256String*(FGInt: TBigInt, str256: var String) -proc Base256StringToFGInt*(str256: String, FGInt: var TBigInt) -proc PGPMPIToFGInt*(PGPMPI: String, FGInt: var TBigInt) -proc FGIntToPGPMPI*(FGInt: TBigInt, PGPMPI: var String) -proc Base10StringToFGInt*(Base10: String, FGInt: var TBigInt) -proc FGIntToBase10String*(FGInt: TBigInt, Base10: var String) -proc FGIntDestroy*(FGInt: var TBigInt) -proc FGIntCompareAbs*(FGInt1, FGInt2: TBigInt): TCompare -proc FGIntAdd*(FGInt1, FGInt2: TBigInt, Sum: var TBigInt) -proc FGIntChangeSign*(FGInt: var TBigInt) -proc FGIntSub*(FGInt1, FGInt2, dif: var TBigInt) -proc FGIntMulByInt*(FGInt: TBigInt, res: var TBigInt, by: int32) -proc FGIntMulByIntbis*(FGInt: var TBigInt, by: int32) -proc FGIntDivByInt*(FGInt: TBigInt, res: var TBigInt, by: int32, modres: var int32) -proc FGIntDivByIntBis*(FGInt: var TBigInt, by: int32, modres: var int32) -proc FGIntModByInt*(FGInt: TBigInt, by: int32, modres: var int32) -proc FGIntAbs*(FGInt: var TBigInt) -proc FGIntCopy*(FGInt1: TBigInt, FGInt2: var TBigInt) -proc FGIntShiftLeft*(FGInt: var TBigInt) -proc FGIntShiftRight*(FGInt: var TBigInt) -proc FGIntShiftRightBy31*(FGInt: var TBigInt) -proc FGIntAddBis*(FGInt1: var TBigInt, FGInt2: TBigInt) -proc FGIntSubBis*(FGInt1: var TBigInt, FGInt2: TBigInt) -proc FGIntMul*(FGInt1, FGInt2: TBigInt, Prod: var TBigInt) -proc FGIntSquare*(FGInt: TBigInt, Square: var TBigInt) -proc FGIntExp*(FGInt, exp: TBigInt, res: var TBigInt) -proc FGIntFac*(FGInt: TBigInt, res: var TBigInt) -proc FGIntShiftLeftBy31*(FGInt: var TBigInt) -proc FGIntDivMod*(FGInt1, FGInt2, QFGInt, MFGInt: var TBigInt) -proc FGIntDiv*(FGInt1, FGInt2, QFGInt: var TBigInt) -proc FGIntMod*(FGInt1, FGInt2, MFGInt: var TBigInt) -proc FGIntSquareMod*(FGInt, Modb, FGIntSM: var TBigInt) -proc FGIntAddMod*(FGInt1, FGInt2, base, FGIntres: var TBigInt) -proc FGIntMulMod*(FGInt1, FGInt2, base, FGIntres: var TBigInt) -proc FGIntModExp*(FGInt, exp, modb, res: var TBigInt) -proc FGIntModBis*(FGInt: TBigInt, FGIntOut: var TBigInt, b, head: int32) -proc FGIntMulModBis*(FGInt1, FGInt2: TBigInt, Prod: var TBigInt, b, head: int32) -proc FGIntMontgomeryMod*(GInt, base, baseInv: TBigInt, MGInt: var TBigInt, - b: int32, head: int32) -proc FGIntMontgomeryModExp*(FGInt, exp, modb, res: var TBigInt) -proc FGIntGCD*(FGInt1, FGInt2: TBigInt, GCD: var TBigInt) -proc FGIntLCM*(FGInt1, FGInt2: TBigInt, LCM: var TBigInt) -proc FGIntTrialDiv9999*(FGInt: TBigInt, ok: var bool) -proc FGIntRandom1*(Seed, RandomFGInt: var TBigInt) -proc FGIntRabinMiller*(FGIntp: var TBigInt, nrtest: int32, ok: var bool) -proc FGIntBezoutBachet*(FGInt1, FGInt2, a, b: var TBigInt) -proc FGIntModInv*(FGInt1, base: TBigInt, Inverse: var TBigInt) -proc FGIntPrimetest*(FGIntp: var TBigInt, nrRMtests: int, ok: var bool) -proc FGIntLegendreSymbol*(a, p: var TBigInt, L: var int) -proc FGIntSquareRootModP*(Square, Prime: TBigInt, SquareRoot: var TBigInt) -# implementation - -var - primes: array[1..1228, int] = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, - 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, - 101, 103, 107, 109, 113, 127, 131, 137, 139, - 149, 151, 157, 163, 167, 173, 179, 181, 191, - 193, 197, 199, 211, 223, 227, 229, 233, 239, - 241, 251, 257, 263, 269, 271, 277, 281, 283, - 293, 307, 311, 313, 317, 331, 337, 347, 349, - 353, 359, 367, 373, 379, 383, 389, 397, 401, - 409, 419, 421, 431, 433, 439, 443, 449, 457, - 461, 463, 467, 479, 487, 491, 499, 503, 509, - 521, 523, 541, 547, 557, 563, 569, 571, 577, - 587, 593, 599, 601, 607, 613, 617, 619, 631, - 641, 643, 647, 653, 659, 661, 673, 677, 683, - 691, 701, 709, 719, 727, 733, 739, 743, 751, - 757, 761, 769, 773, 787, 797, 809, 811, 821, - 823, 827, 829, 839, 853, 857, 859, 863, 877, - 881, 883, 887, 907, 911, 919, 929, 937, 941, - 947, 953, 967, 971, 977, 983, 991, 997, 1009, - 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, - 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, - 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, - 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, - 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, - 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, - 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, - 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, - 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, - 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, - 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, - 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, - 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, - 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, - 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, - 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, - 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, - 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, - 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, - 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, - 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, - 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, - 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, - 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, - 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, - 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, - 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, - 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, - 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, - 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, - 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, - 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, - 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, - 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, - 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, - 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, - 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, - 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, - 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, - 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, - 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, - 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, - 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, - 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, - 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, - 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, - 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, - 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, - 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, - 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, - 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, - 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, - 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, - 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, - 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, - 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, - 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, - 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, - 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, - 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, - 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, - 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, - 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, - 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, - 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, - 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, - 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, - 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, - 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, - 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, - 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, - 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, - 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, - 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, - 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, - 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, - 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, - 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, - 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, - 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, - 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, - 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, - 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, - 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, - 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, - 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, - 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, - 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, - 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, - 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, - 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, - 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, - 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, - 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, - 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, - 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, - 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, - 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, - 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, - 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, - 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, - 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, - 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, - 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, - 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, - 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, - 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, - 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, - 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, - 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, - 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, - 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, - 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, - 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, - 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, - 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, - 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, - 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, - 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, - 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, - 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, - 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, - 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, - 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, - 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, - 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, - 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, - 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, - 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, - 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, - 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, - 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, - 9941, 9949, 9967, 9973] - chr64: array[1..64, char] = ['a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', - 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', - 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', - 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', - 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', - 'z', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', '+', '='] - PGPchr64: array[1..64, char] = ['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', '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', '0', '1', - '2', '3', '4', '5', '6', '7', '8', '9', '+', - '/'] - -proc zeronetochar8(g: var char, x: String) = - var b: int8 - b = 0 - for i in countup(1, 8): - if copy(x, i, 1) == '1': b = b Or (1 Shl (8 - I)) - g = chr(b) - -proc zeronetochar6(g: var int, x: String) = - G = 0 - for I in countup(1, len(X)): - if I > 6: break - if X[I] != '0': G = G Or (1 Shl (6 - I)) - Inc(G) - -proc initialize8(trans: var openarray[String]) = - var - x: String - g: char - for c1 in countup(0, 1): - for c2 in countup(0, 1): - for c3 in countup(0, 1): - for c4 in countup(0, 1): - for c5 in countup(0, 1): - for c6 in countup(0, 1): - for c7 in countup(0, 1): - for c8 in countup(0, 1): - x = chr(48 + c1) + chr(48 + c2) + chr(48 + c3) + chr(48 + c4) + - chr(48 + c5) + chr(48 + c6) + chr(48 + c7) + chr(48 + c8) - zeronetochar8(g, x) - trans[ord(g)] = x - -proc initialize6(trans: var openarray[String]) = - var - x: String - g: int - for c1 in countup(0, 1): - for c2 in countup(0, 1): - for c3 in countup(0, 1): - for c4 in countup(0, 1): - for c5 in countup(0, 1): - for c6 in countup(0, 1): - x = chr(48 + c1) + chr(48 + c2) + chr(48 + c3) + chr(48 + c4) + - chr(48 + c5) + chr(48 + c6) - zeronetochar6(g, x) - trans[ord(chr64[g])] = x - -proc initialize6PGP(trans: var openarray[String]) = - var - x: String - g: int - for c1 in countup(0, 1): - for c2 in countup(0, 1): - for c3 in countup(0, 1): - for c4 in countup(0, 1): - for c5 in countup(0, 1): - for c6 in countup(0, 1): - x = chr(48 + c1) + chr(48 + c2) + chr(48 + c3) + chr(48 + c4) + - chr(48 + c5) + chr(48 + c6) - zeronetochar6(g, x) - trans[ord(PGPchr64[g])] = x - -proc ConvertBase256to64(str256: String, str64: var String) = - var - temp: String - trans: array[0..255, String] - len6: int32 - g: int - initialize8(trans) - temp = "" - for i in countup(1, len(str256)): temp = temp + trans[ord(str256[i])] - while (len(temp) Mod 6) != 0: temp = temp & '0' - len6 = len(temp) Div 6 - str64 = "" - for i in countup(1, len6): - zeronetochar6(g, copy(temp, 1, 6)) - str64 = str64 + chr64[g] - delete(temp, 1, 6) - -proc ConvertBase64to256(str64: String, str256: var String) = - var - temp: String - trans: array[0..255, String] - len8: int32 - g: char - initialize6(trans) - temp = "" - for i in countup(1, len(str64)): temp = temp + trans[ord(str64[i])] - str256 = "" - len8 = len(temp) Div 8 - for i in countup(1, len8): - zeronetochar8(g, copy(temp, 1, 8)) - str256 = str256 + g - delete(temp, 1, 8) - -proc ConvertBase256to2(str256: String, str2: var String) = - var trans: array[0..255, String] - str2 = "" - initialize8(trans) - for i in countup(1, len(str256)): str2 = str2 + trans[ord(str256[i])] - -proc ConvertBase64to2(str64: String, str2: var String) = - var trans: array[0..255, String] - str2 = "" - initialize6(trans) - for i in countup(1, len(str64)): str2 = str2 + trans[ord(str64[i])] - -proc ConvertBase2to256(str2: String, str256: var String) = - var - len8: int32 - g: char - str256 = "" - while (len(str2) Mod 8) != 0: str2 = '0' & str2 - len8 = len(str2) Div 8 - for i in countup(1, len8): - zeronetochar8(g, copy(str2, 1, 8)) - str256 = str256 + g - delete(str2, 1, 8) - -proc ConvertBase2to64(str2: String, str64: var String) = - var - len6: int32 - g: int - str64 = "" - while (len(str2) Mod 6) != 0: str2 = '0' & str2 - len6 = len(str2) Div 6 - for i in countup(1, len6): - zeronetochar6(g, copy(str2, 1, 6)) - str64 = str64 + chr64[g] - delete(str2, 1, 6) - -proc ConvertBase256StringToHexString(Str256: String, HexStr: var String) = - var b: int8 - HexStr = "" - for i in countup(1, len(str256)): - b = ord(str256[i]) - if (b Shr 4) < 10: HexStr = HexStr + chr(48 + (b Shr 4)) - else: HexStr = HexStr + chr(55 + (b Shr 4)) - if (b And 15) < 10: HexStr = HexStr + chr(48 + (b And 15)) - else: HexStr = HexStr + chr(55 + (b And 15)) - -proc ConvertHexStringToBase256String(HexStr: String, Str256: var String) = - var - b, h1, h2: int8 - temp: string - Str256 = "" - if (len(Hexstr) mod 2) == 1: temp = '0' & HexStr - else: temp = HexStr - for i in countup(1, (len(temp) Div 2)): - h2 = ord(temp[2 * i]) - h1 = ord(temp[2 * i - 1]) - if h1 < 58: b = ((h1 - 48) Shl 4) - else: b = ((h1 - 55) Shl 4) - if h2 < 58: b = (b Or (h2 - 48)) - else: b = (b Or ((h2 - 55) and 15)) - Str256 = Str256 + chr(b) - -proc PGPConvertBase256to64(str256, str64: var String) = - var - temp, x, a: String - len6: int32 - g: int - trans: array[0..255, String] - initialize8(trans) - temp = "" - for i in countup(1, len(str256)): temp = temp + trans[ord(str256[i])] - if (len(temp) Mod 6) == 0: - a = "" - elif (len(temp) Mod 6) == 4: - temp = temp & "00" - a = '=' - else: - temp = temp & "0000" - a = "==" - str64 = "" - len6 = len(temp) Div 6 - for i in countup(1, len6): - x = copy(temp, 1, 6) - zeronetochar6(g, x) - str64 = str64 + PGPchr64[g] - delete(temp, 1, 6) - str64 = str64 + a - -proc PGPConvertBase64to256(str64: String, str256: var String) = - var - temp, x: String - j, len8: int32 - g: char - trans: array[0..255, String] - initialize6PGP(trans) - temp = "" - str256 = "" - if str64[len(str64) - 1] == '=': j = 2 - elif str64[len(str64)] == '=': j = 1 - else: j = 0 - for i in countup(1, (len(str64) - j)): temp = temp + trans[ord(str64[i])] - if j != 0: delete(temp, len(temp) - 2 * j + 1, 2 * j) - len8 = len(temp) Div 8 - for i in countup(1, len8): - x = copy(temp, 1, 8) - zeronetochar8(g, x) - str256 = str256 + g - delete(temp, 1, 8) - -proc PGPConvertBase64to2(str64: String, str2: var String) = - var - j: int32 - trans: array[0..255, String] - str2 = "" - initialize6(trans) - if str64[len(str64) - 1] == '=': j = 2 - elif str64[len(str64)] == '=': j = 1 - else: j = 0 - for i in countup(1, (len(str64) - j)): str2 = str2 + trans[ord(str64[i])] - delete(str2, len(str2) - 2 * j + 1, 2 * j) - -proc FGIntToBase2String(FGInt: TBigInt, S: var String) = - S = "" - for i in countup(1, FGInt.Number[0]): - for j in countup(0, 30): - if (1 And (FGInt.Number[i] Shr j)) == 1: S = '1' & S - else: S = '0' & S - while (len(S) > 1) And (S[1] == '0'): delete(S, 1, 1) - if S == "": S = '0' - -proc Base2StringToFGInt(S: String, FGInt: var TBigInt) = - var i, j, size: int32 - while (S[1] == '0') And (len(S) > 1): delete(S, 1, 1) - size = len(S) Div 31 - if (len(S) Mod 31) != 0: size = size + 1 - setlen(FGInt.Number, (size + 1)) - FGInt.Number[0] = size - j = 1 - FGInt.Number[j] = 0 - i = 0 - while len(S) > 0: - if S[len(S)] == '1': FGInt.Number[j] = FGInt.Number[j] Or (1 Shl i) - i = i + 1 - if i == 31: - i = 0 - j = j + 1 - if j <= size: FGInt.Number[j] = 0 - delete(S, len(S), 1) - FGInt.Sign = positive - -proc FGIntToBase256String(FGInt: TBigInt, str256: var String) = - var - temp1: String - len8: int32 - g: char - FGIntToBase2String(FGInt, temp1) - while (len(temp1) Mod 8) != 0: temp1 = '0' & temp1 - len8 = len(temp1) Div 8 - str256 = "" - for i in countup(1, len8): - zeronetochar8(g, copy(temp1, 1, 8)) - str256 = str256 + g - delete(temp1, 1, 8) - -proc Base256StringToFGInt(str256: String, FGInt: var TBigInt) = - var - temp1: String - trans: array[0..255, String] - temp1 = "" - initialize8(trans) - for i in countup(1, len(str256)): temp1 = temp1 + trans[ord(str256[i])] - while (temp1[1] == '0') And (temp1 != '0'): delete(temp1, 1, 1) - Base2StringToFGInt(temp1, FGInt) - -proc PGPMPIToFGInt(PGPMPI: String, FGInt: var TBigInt) = - var temp: String - temp = PGPMPI - delete(temp, 1, 2) - Base256StringToFGInt(temp, FGInt) - -proc FGIntToPGPMPI(FGInt: TBigInt, PGPMPI: var String) = - var - length: int16 - c: char - b: int8 - FGIntToBase256String(FGInt, PGPMPI) - length = len(PGPMPI) * 8 - c = PGPMPI[1] - for i in countdown(7, 0): - if (ord(c) Shr i) == 0: length = length - 1 - else: break - b = length Mod 256 - PGPMPI = chr(b) + PGPMPI - b = length Div 256 - PGPMPI = chr(b) + PGPMPI - -proc GIntDivByIntBis1(GInt: var TBigInt, by: int32, modres: var int16) = - var size, rest, temp: int32 - size = GInt.Number[0] - temp = 0 - for i in countdown(size, 1): - temp = temp * 10000 - rest = temp + GInt.Number[i] - GInt.Number[i] = rest Div by - temp = rest Mod by - modres = temp - while (GInt.Number[size] == 0) And (size > 1): size = size - 1 - if size != GInt.Number[0]: - setlen(GInt.Number, size + 1) - GInt.Number[0] = size - -proc Base10StringToFGInt(Base10: String, FGInt: var TBigInt) = - var - size: int32 - j: int16 - S, x: String - sign: TSign - while (Not (Base10[1] In {'-', '0'..'9'})) And (len(Base10) > 1): - delete(Base10, 1, 1) - if copy(Base10, 1, 1) == '-': - Sign = negative - delete(Base10, 1, 1) - else: - Sign = positive - while (len(Base10) > 1) And (copy(Base10, 1, 1) == '0'): delete(Base10, 1, 1) - size = len(Base10) Div 4 - if (len(Base10) Mod 4) != 0: size = size + 1 - setlen(FGInt.Number, size + 1) - FGInt.Number[0] = size - for i in countup(1, (size - 1)): - x = copy(Base10, len(Base10) - 3, 4) - FGInt.Number[i] = StrToInt(x) - delete(Base10, len(Base10) - 3, 4) - FGInt.Number[size] = StrToInt(Base10) - S = "" - while (FGInt.Number[0] != 1) Or (FGInt.Number[1] != 0): - GIntDivByIntBis1(FGInt, 2, j) - S = inttostr(j) + S - if S == "": S = '0' - FGIntDestroy(FGInt) - Base2StringToFGInt(S, FGInt) - FGInt.Sign = sign - -proc FGIntToBase10String(FGInt: TBigInt, Base10: var String) = - var - S: String - j: int32 - temp: TBigInt - FGIntCopy(FGInt, temp) - Base10 = "" - while (temp.Number[0] > 1) Or (temp.Number[1] > 0): - FGIntDivByIntBis(temp, 10000, j) - S = IntToStr(j) - while len(S) < 4: S = '0' & S - Base10 = S + Base10 - Base10 = '0' & Base10 - while (len(Base10) > 1) And (Base10[1] == '0'): delete(Base10, 1, 1) - if FGInt.Sign == negative: Base10 = '-' & Base10 - -proc FGIntDestroy(FGInt: var TBigInt) = - FGInt.Number = nil - -proc FGIntCompareAbs(FGInt1, FGInt2: TBigInt): TCompare = - var size1, size2, i: int32 - FGIntCompareAbs = Er - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - if size1 > size2: - FGIntCompareAbs = Lt - elif size1 < size2: - FGIntCompareAbs = St - else: - i = size2 - while (FGInt1.Number[i] == FGInt2.Number[i]) And (i > 1): i = i - 1 - if FGInt1.Number[i] == FGInt2.Number[i]: FGIntCompareAbs = Eq - elif FGInt1.Number[i] < FGInt2.Number[i]: FGIntCompareAbs = St - elif FGInt1.Number[i] > FGInt2.Number[i]: FGIntCompareAbs = Lt - -proc FGIntAdd(FGInt1, FGInt2: TBigInt, Sum: var TBigInt) = - var size1, size2, size, rest, Trest: int32 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - if size1 < size2: - FGIntAdd(FGInt2, FGInt1, Sum) - else: - if FGInt1.Sign == FGInt2.Sign: - Sum.Sign = FGInt1.Sign - setlen(Sum.Number, (size1 + 2)) - rest = 0 - for i in countup(1, size2): - Trest = FGInt1.Number[i] - Trest = Trest + FGInt2.Number[i] - Trest = Trest + rest - Sum.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - for i in countup((size2 + 1), size1): - Trest = FGInt1.Number[i] + rest - Sum.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - size = size1 + 1 - Sum.Number[0] = size - Sum.Number[size] = rest - while (Sum.Number[size] == 0) And (size > 1): size = size - 1 - if Sum.Number[0] != size: setlen(Sum.Number, size + 1) - Sum.Number[0] = size - else: - if FGIntCompareAbs(FGInt2, FGInt1) == Lt: - FGIntAdd(FGInt2, FGInt1, Sum) - else: - setlen(Sum.Number, (size1 + 1)) - rest = 0 - for i in countup(1, size2): - Trest = 0x80000000 # 2147483648; - TRest = Trest + FGInt1.Number[i] - TRest = Trest - FGInt2.Number[i] - TRest = Trest - rest - Sum.Number[i] = Trest And 2147483647 - if (Trest > 2147483647): rest = 0 - else: rest = 1 - for i in countup((size2 + 1), size1): - Trest = 0x80000000 - TRest = Trest + FGInt1.Number[i] - TRest = Trest - rest - Sum.Number[i] = Trest And 2147483647 - if (Trest > 2147483647): rest = 0 - else: rest = 1 - size = size1 - while (Sum.Number[size] == 0) And (size > 1): size = size - 1 - if size != size1: setlen(Sum.Number, size + 1) - Sum.Number[0] = size - Sum.Sign = FGInt1.Sign - -proc FGIntChangeSign(FGInt: var TBigInt) = - if FGInt.Sign == negative: FGInt.Sign = positive - else: FGInt.Sign = negative - -proc FGIntSub(FGInt1, FGInt2, dif: var TBigInt) = - FGIntChangeSign(FGInt2) - FGIntAdd(FGInt1, FGInt2, dif) - FGIntChangeSign(FGInt2) - -proc FGIntMulByInt(FGInt: TBigInt, res: var TBigInt, by: int32) = - var - size, rest: int32 - Trest: int64 - size = FGInt.Number[0] - setlen(res.Number, (size + 2)) - rest = 0 - for i in countup(1, size): - Trest = FGInt.Number[i] - TRest = Trest * by - TRest = Trest + rest - res.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - if rest != 0: - size = size + 1 - Res.Number[size] = rest - else: - setlen(Res.Number, size + 1) - Res.Number[0] = size - Res.Sign = FGInt.Sign - -proc FGIntMulByIntbis(FGInt: var TBigInt, by: int32) = - var - size, rest: int32 - Trest: int64 - size = FGInt.Number[0] - setlen(FGInt.Number, size + 2) - rest = 0 - for i in countup(1, size): - Trest = FGInt.Number[i] - TRest = Trest * by - TRest = Trest + rest - FGInt.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - if rest != 0: - size = size + 1 - FGInt.Number[size] = rest - else: - setlen(FGInt.Number, size + 1) - FGInt.Number[0] = size - -proc FGIntDivByInt(FGInt: TBigInt, res: var TBigInt, by: int32, modres: var int32) = - var - size: int32 - rest: int64 - size = FGInt.Number[0] - setlen(res.Number, (size + 1)) - modres = 0 - for i in countdown(size, 1): - rest = modres - rest = rest Shl 31 - rest = rest Or FGInt.Number[i] - res.Number[i] = rest Div by - modres = rest Mod by - while (res.Number[size] == 0) And (size > 1): size = size - 1 - if size != FGInt.Number[0]: setlen(res.Number, size + 1) - res.Number[0] = size - Res.Sign = FGInt.Sign - if FGInt.sign == negative: modres = by - modres - -proc FGIntDivByIntBis(FGInt: var TBigInt, by: int32, modres: var int32) = - var - size: int32 - temp, rest: int64 - size = FGInt.Number[0] - temp = 0 - for i in countdown(size, 1): - temp = temp Shl 31 - rest = temp Or FGInt.Number[i] - FGInt.Number[i] = rest Div by - temp = rest Mod by - modres = temp - while (FGInt.Number[size] == 0) And (size > 1): size = size - 1 - if size != FGInt.Number[0]: - setlen(FGInt.Number, size + 1) - FGInt.Number[0] = size - -proc FGIntModByInt(FGInt: TBigInt, by: int32, modres: var int32) = - var - size: int32 - temp, rest: int64 - size = FGInt.Number[0] - temp = 0 - for i in countdown(size, 1): - temp = temp Shl 31 - rest = temp Or FGInt.Number[i] - temp = rest Mod by - modres = temp - if FGInt.sign == negative: modres = by - modres - -proc FGIntAbs(FGInt: var TBigInt) = - FGInt.Sign = positive - -proc FGIntCopy(FGInt1: TBigInt, FGInt2: var TBigInt) = - FGInt2.Sign = FGInt1.Sign - FGInt2.Number = nil - FGInt2.Number = Copy(FGInt1.Number, 0, FGInt1.Number[0] + 1) - -proc FGIntShiftLeft(FGInt: var TBigInt) = - var l, m, size: int32 - size = FGInt.Number[0] - l = 0 - for i in countup(1, Size): - m = FGInt.Number[i] Shr 30 - FGInt.Number[i] = ((FGInt.Number[i] Shl 1) Or l) And 2147483647 - l = m - if l != 0: - setlen(FGInt.Number, size + 2) - FGInt.Number[size + 1] = l - FGInt.Number[0] = size + 1 - -proc FGIntShiftRight(FGInt: var TBigInt) = - var l, m, size: int32 - size = FGInt.Number[0] - l = 0 - for i in countdown(size, 1): - m = FGInt.Number[i] And 1 - FGInt.Number[i] = (FGInt.Number[i] Shr 1) Or l - l = m Shl 30 - if (FGInt.Number[size] == 0) And (size > 1): - setlen(FGInt.Number, size) - FGInt.Number[0] = size - 1 - -proc FGIntShiftRightBy31(FGInt: var TBigInt) = - var size: int32 - size = FGInt.Number[0] - if size > 1: - for i in countup(1, size - 1): - FGInt.Number[i] = FGInt.Number[i + 1] - setlen(FGInt.Number, Size) - FGInt.Number[0] = size - 1 - else: - FGInt.Number[1] = 0 - -proc FGIntAddBis(FGInt1: var TBigInt, FGInt2: TBigInt) = - var size1, size2, Trest, rest: int32 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - rest = 0 - for i in countup(1, size2): - Trest = FGInt1.Number[i] + FGInt2.Number[i] + rest - rest = Trest Shr 31 - FGInt1.Number[i] = Trest And 2147483647 - for i in countup(size2 + 1, size1): - Trest = FGInt1.Number[i] + rest - rest = Trest Shr 31 - FGInt1.Number[i] = Trest And 2147483647 - if rest != 0: - setlen(FGInt1.Number, size1 + 2) - FGInt1.Number[0] = size1 + 1 - FGInt1.Number[size1 + 1] = rest - -proc FGIntSubBis(FGInt1: var TBigInt, FGInt2: TBigInt) = - var size1, size2, rest, Trest: int32 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - rest = 0 - for i in countup(1, size2): - Trest = (0x80000000 Or FGInt1.Number[i]) - FGInt2.Number[i] - rest - if (Trest > 2147483647): rest = 0 - else: rest = 1 - FGInt1.Number[i] = Trest And 2147483647 - for i in countup(size2 + 1, size1): - Trest = (0x80000000 Or FGInt1.Number[i]) - rest - if (Trest > 2147483647): rest = 0 - else: rest = 1 - FGInt1.Number[i] = Trest And 2147483647 - i = size1 - while (FGInt1.Number[i] == 0) And (i > 1): i = i - 1 - if i != size1: - setlen(FGInt1.Number, i + 1) - FGInt1.Number[0] = i - -proc FGIntMul(FGInt1, FGInt2: TBigInt, Prod: var TBigInt) = - var - size, size1, size2, rest: int32 - Trest: int64 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - size = size1 + size2 - setlen(Prod.Number, (size + 1)) - for i in countup(1, size): Prod.Number[i] = 0 - for i in countup(1, size2): - rest = 0 - for j in countup(1, size1): - Trest = FGInt1.Number[j] - Trest = Trest * FGInt2.Number[i] - Trest = Trest + Prod.Number[j + i - 1] - Trest = Trest + rest - Prod.Number[j + i - 1] = Trest And 2147483647 - rest = Trest Shr 31 - Prod.Number[i + size1] = rest - Prod.Number[0] = size - while (Prod.Number[size] == 0) And (size > 1): size = size - 1 - if size != Prod.Number[0]: - setlen(Prod.Number, size + 1) - Prod.Number[0] = size - if FGInt1.Sign == FGInt2.Sign: Prod.Sign = Positive - else: prod.Sign = negative - -proc FGIntSquare(FGInt: TBigInt, Square: var TBigInt) = - var - size, size1, rest: int32 - Trest: int64 - size1 = FGInt.Number[0] - size = 2 * size1 - setlen(Square.Number, (size + 1)) - Square.Number[0] = size - for i in countup(1, size): Square.Number[i] = 0 - for i in countup(1, size1): - Trest = FGInt.Number[i] - Trest = Trest * FGInt.Number[i] - Trest = Trest + Square.Number[2 * i - 1] - Square.Number[2 * i - 1] = Trest And 2147483647 - rest = Trest Shr 31 - for j in countup(i + 1, size1): - Trest = FGInt.Number[i] Shl 1 - Trest = Trest * FGInt.Number[j] - Trest = Trest + Square.Number[i + j - 1] - Trest = Trest + rest - Square.Number[i + j - 1] = Trest And 2147483647 - rest = Trest Shr 31 - Square.Number[i + size1] = rest - Square.Sign = positive - while (Square.Number[size] == 0) And (size > 1): size = size - 1 - if size != (2 * size1): - setlen(Square.Number, size + 1) - Square.Number[0] = size - -proc FGIntExp(FGInt, exp: TBigInt, res: var TBigInt) = - var - temp2, temp3: TBigInt - S: String - FGIntToBase2String(exp, S) - if S[len(S)] == '0': Base10StringToFGInt('1', res) - else: FGIntCopy(FGInt, res) - FGIntCopy(FGInt, temp2) - if len(S) > 1: - for i in countdown((len(S) - 1), 1): - FGIntSquare(temp2, temp3) - FGIntCopy(temp3, temp2) - if S[i] == '1': - FGIntMul(res, temp2, temp3) - FGIntCopy(temp3, res) - -proc FGIntFac(FGInt: TBigInt, res: var TBigInt) = - var one, temp, temp1: TBigInt - FGIntCopy(FGInt, temp) - Base10StringToFGInt('1', res) - Base10StringToFGInt('1', one) - while Not (FGIntCompareAbs(temp, one) == Eq): - FGIntMul(temp, res, temp1) - FGIntCopy(temp1, res) - FGIntSubBis(temp, one) - FGIntDestroy(one) - FGIntDestroy(temp) - -proc FGIntShiftLeftBy31(FGInt: var TBigInt) = - var - f1, f2: int32 - size: int32 - size = FGInt.Number[0] - setlen(FGInt.Number, size + 2) - f1 = 0 - for i in countup(1, (size + 1)): - f2 = FGInt.Number[i] - FGInt.Number[i] = f1 - f1 = f2 - FGInt.Number[0] = size + 1 - -proc FGIntDivMod(FGInt1, FGInt2, QFGInt, MFGInt: var TBigInt) = - var - one, zero, temp1, temp2: TBigInt - s1, s2: TSign - j, s: int32 - i: int64 - s1 = FGInt1.Sign - s2 = FGInt2.Sign - FGIntAbs(FGInt1) - FGIntAbs(FGInt2) - FGIntCopy(FGInt1, MFGInt) - FGIntCopy(FGInt2, temp1) - if FGIntCompareAbs(FGInt1, FGInt2) != St: - s = FGInt1.Number[0] - FGInt2.Number[0] - setlen(QFGInt.Number, (s + 2)) - QFGInt.Number[0] = s + 1 - for t in countup(1, s): - FGIntShiftLeftBy31(temp1) - QFGInt.Number[t] = 0 - j = s + 1 - QFGInt.Number[j] = 0 - while FGIntCompareAbs(MFGInt, FGInt2) != St: - while FGIntCompareAbs(MFGInt, temp1) != St: - if MFGInt.Number[0] > temp1.Number[0]: - i = MFGInt.Number[MFGInt.Number[0]] - i = i Shl 31 - i = i + MFGInt.Number[MFGInt.Number[0] - 1] - i = i Div (temp1.Number[temp1.Number[0]] + 1) - else: - i = MFGInt.Number[MFGInt.Number[0]] Div - (temp1.Number[temp1.Number[0]] + 1) - if (i != 0): - FGIntCopy(temp1, temp2) - FGIntMulByIntBis(temp2, i) - FGIntSubBis(MFGInt, temp2) - QFGInt.Number[j] = QFGInt.Number[j] + i - if FGIntCompareAbs(MFGInt, temp2) != St: - QFGInt.Number[j] = QFGInt.Number[j] + i - FGIntSubBis(MFGInt, temp2) - FGIntDestroy(temp2) - else: - QFGInt.Number[j] = QFGInt.Number[j] + 1 - FGIntSubBis(MFGInt, temp1) - if MFGInt.Number[0] <= temp1.Number[0]: - if FGIntCompareAbs(temp1, FGInt2) != Eq: - FGIntShiftRightBy31(temp1) - j = j - 1 - else: - Base10StringToFGInt('0', QFGInt) - s = QFGInt.Number[0] - while (s > 1) And (QFGInt.Number[s] == 0): s = s - 1 - if s < QFGInt.Number[0]: - setlen(QFGInt.Number, s + 1) - QFGInt.Number[0] = s - QFGInt.Sign = positive - FGIntDestroy(temp1) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - if s1 == negative: - if FGIntCompareAbs(MFGInt, zero) != Eq: - FGIntadd(QFGInt, one, temp1) - FGIntDestroy(QFGInt) - FGIntCopy(temp1, QFGInt) - FGIntDestroy(temp1) - FGIntsub(FGInt2, MFGInt, temp1) - FGIntDestroy(MFGInt) - FGIntCopy(temp1, MFGInt) - FGIntDestroy(temp1) - if s2 == positive: QFGInt.Sign = negative - else: - QFGInt.Sign = s2 - FGIntDestroy(one) - FGIntDestroy(zero) - FGInt1.Sign = s1 - FGInt2.Sign = s2 - -proc FGIntDiv(FGInt1, FGInt2, QFGInt: var TBigInt) = - var - one, zero, temp1, temp2, MFGInt: TBigInt - s1, s2: TSign - j, s: int32 - i: int64 - s1 = FGInt1.Sign - s2 = FGInt2.Sign - FGIntAbs(FGInt1) - FGIntAbs(FGInt2) - FGIntCopy(FGInt1, MFGInt) - FGIntCopy(FGInt2, temp1) - if FGIntCompareAbs(FGInt1, FGInt2) != St: - s = FGInt1.Number[0] - FGInt2.Number[0] - setlen(QFGInt.Number, (s + 2)) - QFGInt.Number[0] = s + 1 - for t in countup(1, s): - FGIntShiftLeftBy31(temp1) - QFGInt.Number[t] = 0 - j = s + 1 - QFGInt.Number[j] = 0 - while FGIntCompareAbs(MFGInt, FGInt2) != St: - while FGIntCompareAbs(MFGInt, temp1) != St: - if MFGInt.Number[0] > temp1.Number[0]: - i = MFGInt.Number[MFGInt.Number[0]] - i = i Shl 31 - i = i + MFGInt.Number[MFGInt.Number[0] - 1] - i = i Div (temp1.Number[temp1.Number[0]] + 1) - else: - i = MFGInt.Number[MFGInt.Number[0]] Div - (temp1.Number[temp1.Number[0]] + 1) - if (i != 0): - FGIntCopy(temp1, temp2) - FGIntMulByIntBis(temp2, i) - FGIntSubBis(MFGInt, temp2) - QFGInt.Number[j] = QFGInt.Number[j] + i - if FGIntCompareAbs(MFGInt, temp2) != St: - QFGInt.Number[j] = QFGInt.Number[j] + i - FGIntSubBis(MFGInt, temp2) - FGIntDestroy(temp2) - else: - QFGInt.Number[j] = QFGInt.Number[j] + 1 - FGIntSubBis(MFGInt, temp1) - if MFGInt.Number[0] <= temp1.Number[0]: - if FGIntCompareAbs(temp1, FGInt2) != Eq: - FGIntShiftRightBy31(temp1) - j = j - 1 - else: - Base10StringToFGInt('0', QFGInt) - s = QFGInt.Number[0] - while (s > 1) And (QFGInt.Number[s] == 0): s = s - 1 - if s < QFGInt.Number[0]: - setlen(QFGInt.Number, s + 1) - QFGInt.Number[0] = s - QFGInt.Sign = positive - FGIntDestroy(temp1) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - if s1 == negative: - if FGIntCompareAbs(MFGInt, zero) != Eq: - FGIntadd(QFGInt, one, temp1) - FGIntDestroy(QFGInt) - FGIntCopy(temp1, QFGInt) - FGIntDestroy(temp1) - FGIntsub(FGInt2, MFGInt, temp1) - FGIntDestroy(MFGInt) - FGIntCopy(temp1, MFGInt) - FGIntDestroy(temp1) - if s2 == positive: QFGInt.Sign = negative - else: - QFGInt.Sign = s2 - FGIntDestroy(one) - FGIntDestroy(zero) - FGIntDestroy(MFGInt) - FGInt1.Sign = s1 - FGInt2.Sign = s2 - -proc FGIntMod(FGInt1, FGInt2, MFGInt: var TBigInt) = - var - one, zero, temp1, temp2: TBigInt - s1, s2: TSign - s: int32 - i: int64 - s1 = FGInt1.Sign - s2 = FGInt2.Sign - FGIntAbs(FGInt1) - FGIntAbs(FGInt2) - FGIntCopy(FGInt1, MFGInt) - FGIntCopy(FGInt2, temp1) - if FGIntCompareAbs(FGInt1, FGInt2) != St: - s = FGInt1.Number[0] - FGInt2.Number[0] - for t in countup(1, s): FGIntShiftLeftBy31(temp1) - while FGIntCompareAbs(MFGInt, FGInt2) != St: - while FGIntCompareAbs(MFGInt, temp1) != St: - if MFGInt.Number[0] > temp1.Number[0]: - i = MFGInt.Number[MFGInt.Number[0]] - i = i Shl 31 - i = i + MFGInt.Number[MFGInt.Number[0] - 1] - i = i Div (temp1.Number[temp1.Number[0]] + 1) - else: - i = MFGInt.Number[MFGInt.Number[0]] Div - (temp1.Number[temp1.Number[0]] + 1) - if (i != 0): - FGIntCopy(temp1, temp2) - FGIntMulByIntBis(temp2, i) - FGIntSubBis(MFGInt, temp2) - if FGIntCompareAbs(MFGInt, temp2) != St: FGIntSubBis(MFGInt, temp2) - FGIntDestroy(temp2) - else: - FGIntSubBis(MFGInt, temp1) # If FGIntCompareAbs(MFGInt, temp1) <> St Then FGIntSubBis(MFGInt,temp1); - if MFGInt.Number[0] <= temp1.Number[0]: - if FGIntCompareAbs(temp1, FGInt2) != Eq: FGIntShiftRightBy31(temp1) - FGIntDestroy(temp1) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - if s1 == negative: - if FGIntCompareAbs(MFGInt, zero) != Eq: - FGIntSub(FGInt2, MFGInt, temp1) - FGIntDestroy(MFGInt) - FGIntCopy(temp1, MFGInt) - FGIntDestroy(temp1) - FGIntDestroy(one) - FGIntDestroy(zero) - FGInt1.Sign = s1 - FGInt2.Sign = s2 - -proc FGIntSquareMod(FGInt, Modb, FGIntSM: var TBigInt) = - var temp: TBigInt - FGIntSquare(FGInt, temp) - FGIntMod(temp, Modb, FGIntSM) - FGIntDestroy(temp) - -proc FGIntAddMod(FGInt1, FGInt2, base, FGIntres: var TBigInt) = - var temp: TBigInt - FGIntadd(FGInt1, FGInt2, temp) - FGIntMod(temp, base, FGIntres) - FGIntDestroy(temp) - -proc FGIntMulMod(FGInt1, FGInt2, base, FGIntres: var TBigInt) = - var temp: TBigInt - FGIntMul(FGInt1, FGInt2, temp) - FGIntMod(temp, base, FGIntres) - FGIntDestroy(temp) - -proc FGIntModExp(FGInt, exp, modb, res: var TBigInt) = - var - temp2, temp3: TBigInt - S: String - if (Modb.Number[1] Mod 2) == 1: - FGIntMontgomeryModExp(FGInt, exp, modb, res) - return - FGIntToBase2String(exp, S) - Base10StringToFGInt('1', res) - FGIntcopy(FGInt, temp2) - for i in countdown(len(S), 1): - if S[i] == '1': - FGIntmulMod(res, temp2, modb, temp3) - FGIntCopy(temp3, res) - FGIntSquareMod(temp2, Modb, temp3) - FGIntCopy(temp3, temp2) - FGIntDestroy(temp2) - -proc FGIntModBis(FGInt: TBigInt, FGIntOut: var TBigInt, b, head: int32) = - if b <= FGInt.Number[0]: - setlen(FGIntOut.Number, (b + 1)) - for i in countup(0, b): FGIntOut.Number[i] = FGInt.Number[i] - FGIntOut.Number[b] = FGIntOut.Number[b] And head - i = b - while (FGIntOut.Number[i] == 0) And (i > 1): i = i - 1 - if i < b: setlen(FGIntOut.Number, i + 1) - FGIntOut.Number[0] = i - FGIntOut.Sign = positive - else: - FGIntCopy(FGInt, FGIntOut) - -proc FGIntMulModBis(FGInt1, FGInt2: TBigInt, Prod: var TBigInt, b, head: int32) = - var - size, size1, size2, t, rest: int32 - Trest: int64 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - size = min(b, size1 + size2) - setlen(Prod.Number, (size + 1)) - for i in countup(1, size): Prod.Number[i] = 0 - for i in countup(1, size2): - rest = 0 - t = min(size1, b - i + 1) - for j in countup(1, t): - Trest = FGInt1.Number[j] - Trest = Trest * FGInt2.Number[i] - Trest = Trest + Prod.Number[j + i - 1] - Trest = Trest + rest - Prod.Number[j + i - 1] = Trest And 2147483647 - rest = Trest Shr 31 - if (i + size1) <= b: Prod.Number[i + size1] = rest - Prod.Number[0] = size - if size == b: Prod.Number[b] = Prod.Number[b] And head - while (Prod.Number[size] == 0) And (size > 1): size = size - 1 - if size < Prod.Number[0]: - setlen(Prod.Number, size + 1) - Prod.Number[0] = size - if FGInt1.Sign == FGInt2.Sign: Prod.Sign = Positive - else: prod.Sign = negative - -proc FGIntMontgomeryMod(GInt, base, baseInv: TBigInt, MGInt: var TBigInt, - b: int32, head: int32) = - var - m, temp, temp1: TBigInt - r: int32 - FGIntModBis(GInt, temp, b, head) - FGIntMulModBis(temp, baseInv, m, b, head) - FGIntMul(m, base, temp1) - FGIntDestroy(temp) - FGIntAdd(temp1, GInt, temp) - FGIntDestroy(temp1) - MGInt.Number = copy(temp.Number, b - 1, temp.Number[0] - b + 2) - MGInt.Sign = positive - MGInt.Number[0] = temp.Number[0] - b + 1 - FGIntDestroy(temp) - if (head Shr 30) == 0: FGIntDivByIntBis(MGInt, head + 1, r) - else: FGIntShiftRightBy31(MGInt) - if FGIntCompareAbs(MGInt, base) != St: FGIntSubBis(MGInt, base) - FGIntDestroy(temp) - FGIntDestroy(m) - -proc FGIntMontgomeryModExp(FGInt, exp, modb, res: var TBigInt) = - var - temp2, temp3, baseInv, r, zero: TBigInt - t, b, head: int32 - S: String - Base2StringToFGInt('0', zero) - FGIntMod(FGInt, modb, res) - if FGIntCompareAbs(res, zero) == Eq: - FGIntDestroy(zero) - return - else: - FGIntDestroy(res) - FGIntDestroy(zero) - FGIntToBase2String(exp, S) - t = modb.Number[0] - b = t - if (modb.Number[t] Shr 30) == 1: t = t + 1 - setlen(r.Number, (t + 1)) - r.Number[0] = t - r.Sign = positive - for i in countup(1, t): r.Number[i] = 0 - if t == modb.Number[0]: - head = 2147483647 - for j in countdown(29, 0): - head = head Shr 1 - if (modb.Number[t] Shr j) == 1: - r.Number[t] = 1 Shl (j + 1) - break - else: - r.Number[t] = 1 - head = 2147483647 - FGIntModInv(modb, r, temp2) - if temp2.Sign == negative: - FGIntCopy(temp2, BaseInv) - else: - FGIntCopy(r, BaseInv) - FGIntSubBis(BaseInv, temp2) - FGIntAbs(BaseInv) - FGIntDestroy(temp2) - FGIntMod(r, modb, res) - FGIntMulMod(FGInt, res, modb, temp2) - FGIntDestroy(r) - for i in countdown(len(S), 1): - if S[i] == '1': - FGIntmul(res, temp2, temp3) - FGIntDestroy(res) - FGIntMontgomeryMod(temp3, modb, baseinv, res, b, head) - FGIntDestroy(temp3) - FGIntSquare(temp2, temp3) - FGIntDestroy(temp2) - FGIntMontgomeryMod(temp3, modb, baseinv, temp2, b, head) - FGIntDestroy(temp3) - FGIntDestroy(temp2) - FGIntMontgomeryMod(res, modb, baseinv, temp3, b, head) - FGIntCopy(temp3, res) - FGIntDestroy(temp3) - FGIntDestroy(baseinv) - -proc FGIntGCD(FGInt1, FGInt2: TBigInt, GCD: var TBigInt) = - var - k: TCompare - zero, temp1, temp2, temp3: TBigInt - k = FGIntCompareAbs(FGInt1, FGInt2) - if (k == Eq): - FGIntCopy(FGInt1, GCD) - elif (k == St): - FGIntGCD(FGInt2, FGInt1, GCD) - else: - Base10StringToFGInt('0', zero) - FGIntCopy(FGInt1, temp1) - FGIntCopy(FGInt2, temp2) - while (temp2.Number[0] != 1) Or (temp2.Number[1] != 0): - FGIntMod(temp1, temp2, temp3) - FGIntCopy(temp2, temp1) - FGIntCopy(temp3, temp2) - FGIntDestroy(temp3) - FGIntCopy(temp1, GCD) - FGIntDestroy(temp2) - FGIntDestroy(zero) - -proc FGIntLCM(FGInt1, FGInt2: TBigInt, LCM: var TBigInt) = - var temp1, temp2: TBigInt - FGIntGCD(FGInt1, FGInt2, temp1) - FGIntmul(FGInt1, FGInt2, temp2) - FGIntdiv(temp2, temp1, LCM) - FGIntDestroy(temp1) - FGIntDestroy(temp2) - -proc FGIntTrialDiv9999(FGInt: TBigInt, ok: var bool) = - var - j: int32 - i: int - if ((FGInt.Number[1] Mod 2) == 0): - ok = false - else: - i = 0 - ok = true - while ok And (i < 1228): - i = i + 1 - FGIntmodbyint(FGInt, primes[i], j) - if j == 0: ok = false - -proc FGIntRandom1(Seed, RandomFGInt: var TBigInt) = - var temp, base: TBigInt - Base10StringToFGInt("281474976710656", base) - Base10StringToFGInt("44485709377909", temp) - FGIntMulMod(seed, temp, base, RandomFGInt) - FGIntDestroy(temp) - FGIntDestroy(base) - -proc FGIntRabinMiller(FGIntp: var TBigInt, nrtest: int32, ok: var bool) = - var - j, b, i: int32 - m, z, temp1, temp2, temp3, zero, one, two, pmin1: TBigInt - ok1, ok2: bool - randomize - j = 0 - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - Base10StringToFGInt('2', two) - FGIntsub(FGIntp, one, temp1) - FGIntsub(FGIntp, one, pmin1) - b = 0 - while (temp1.Number[1] Mod 2) == 0: - b = b + 1 - FGIntShiftRight(temp1) - m = temp1 - i = 0 - ok = true - Randomize - while (i < nrtest) And ok: - i = i + 1 - Base10StringToFGInt(inttostr(Primes[Random(1227) + 1]), temp2) - FGIntMontGomeryModExp(temp2, m, FGIntp, z) - FGIntDestroy(temp2) - ok1 = (FGIntCompareAbs(z, one) == Eq) - ok2 = (FGIntCompareAbs(z, pmin1) == Eq) - if Not (ok1 Or ok2): - while (ok And (j < b)): - if (j > 0) And ok1: - ok = false - else: - j = j + 1 - if (j < b) And (Not ok2): - FGIntSquaremod(z, FGIntp, temp3) - FGIntCopy(temp3, z) - ok1 = (FGIntCompareAbs(z, one) == Eq) - ok2 = (FGIntCompareAbs(z, pmin1) == Eq) - if ok2: j = b - elif (Not ok2) And (j >= b): - ok = false - FGIntDestroy(zero) - FGIntDestroy(one) - FGIntDestroy(two) - FGIntDestroy(m) - FGIntDestroy(z) - FGIntDestroy(pmin1) - -proc FGIntBezoutBachet(FGInt1, FGInt2, a, b: var TBigInt) = - var zero, r1, r2, r3, ta, gcd, temp, temp1, temp2: TBigInt - if FGIntCompareAbs(FGInt1, FGInt2) != St: - FGIntcopy(FGInt1, r1) - FGIntcopy(FGInt2, r2) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', a) - Base10StringToFGInt('0', ta) - while true: - FGIntdivmod(r1, r2, temp, r3) - FGIntDestroy(r1) - r1 = r2 - r2 = r3 - FGIntmul(ta, temp, temp1) - FGIntsub(a, temp1, temp2) - FGIntCopy(ta, a) - FGIntCopy(temp2, ta) - FGIntDestroy(temp1) - FGIntDestroy(temp) - if FGIntCompareAbs(r3, zero) == Eq: break - FGIntGCD(FGInt1, FGInt2, gcd) - FGIntmul(a, FGInt1, temp1) - FGIntsub(gcd, temp1, temp2) - FGIntDestroy(temp1) - FGIntdiv(temp2, FGInt2, b) - FGIntDestroy(temp2) - FGIntDestroy(ta) - FGIntDestroy(r1) - FGIntDestroy(r2) - FGIntDestroy(gcd) - else: - FGIntBezoutBachet(FGInt2, FGInt1, b, a) - -proc FGIntModInv(FGInt1, base: TBigInt, Inverse: var TBigInt) = - var zero, one, r1, r2, r3, tb, gcd, temp, temp1, temp2: TBigInt - Base10StringToFGInt('1', one) - FGIntGCD(FGInt1, base, gcd) - if FGIntCompareAbs(one, gcd) == Eq: - FGIntcopy(base, r1) - FGIntcopy(FGInt1, r2) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('0', inverse) - Base10StringToFGInt('1', tb) - while true: - FGIntDestroy(r3) - FGIntdivmod(r1, r2, temp, r3) - FGIntCopy(r2, r1) - FGIntCopy(r3, r2) - FGIntmul(tb, temp, temp1) - FGIntsub(inverse, temp1, temp2) - FGIntDestroy(inverse) - FGIntDestroy(temp1) - FGIntCopy(tb, inverse) - FGIntCopy(temp2, tb) - FGIntDestroy(temp) - if FGIntCompareAbs(r3, zero) == Eq: break - if inverse.Sign == negative: - FGIntadd(base, inverse, temp) - FGIntCopy(temp, inverse) - FGIntDestroy(tb) - FGIntDestroy(r1) - FGIntDestroy(r2) - FGIntDestroy(gcd) - FGIntDestroy(one) - -proc FGIntPrimetest(FGIntp: var TBigInt, nrRMtests: int, ok: var bool) = - FGIntTrialdiv9999(FGIntp, ok) - if ok: FGIntRabinMiller(FGIntp, nrRMtests, ok) - -proc FGIntLegendreSymbol(a, p: var TBigInt, L: var int) = - var - temp1, temp2, temp3, temp4, temp5, zero, one: TBigInt - i: int32 - ok1, ok2: bool - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - FGIntMod(a, p, temp1) - if FGIntCompareAbs(zero, temp1) == Eq: - FGIntDestroy(temp1) - L = 0 - else: - FGIntDestroy(temp1) - FGIntCopy(p, temp1) - FGIntCopy(a, temp2) - L = 1 - while FGIntCompareAbs(temp2, one) != Eq: - if (temp2.Number[1] Mod 2) == 0: - FGIntSquare(temp1, temp3) - FGIntSub(temp3, one, temp4) - FGIntDestroy(temp3) - FGIntDivByInt(temp4, temp3, 8, i) - if (temp3.Number[1] Mod 2) == 0: ok1 = false - else: ok1 = true - FGIntDestroy(temp3) - FGIntDestroy(temp4) - if ok1 == true: L = L * (- 1) - FGIntDivByIntBis(temp2, 2, i) - else: - FGIntSub(temp1, one, temp3) - FGIntSub(temp2, one, temp4) - FGIntMul(temp3, temp4, temp5) - FGIntDestroy(temp3) - FGIntDestroy(temp4) - FGIntDivByInt(temp5, temp3, 4, i) - if (temp3.Number[1] Mod 2) == 0: ok2 = false - else: ok2 = true - FGIntDestroy(temp5) - FGIntDestroy(temp3) - if ok2 == true: L = L * (- 1) - FGIntMod(temp1, temp2, temp3) - FGIntCopy(temp2, temp1) - FGIntCopy(temp3, temp2) - FGIntDestroy(temp1) - FGIntDestroy(temp2) - FGIntDestroy(zero) - FGIntDestroy(one) - -proc FGIntSquareRootModP(Square, Prime: TBigInt, SquareRoot: var TBigInt) = - var - one, n, b, s, r, temp, temp1, temp2, temp3: TBigInt - a: int32 - L: int - Base2StringToFGInt('1', one) - Base2StringToFGInt("10", n) - a = 0 - FGIntLegendreSymbol(n, Prime, L) - while L != - 1: - FGIntAddBis(n, one) - FGIntLegendreSymbol(n, Prime, L) - FGIntCopy(Prime, s) - s.Number[1] = s.Number[1] - 1 - while (s.Number[1] Mod 2) == 0: - FGIntShiftRight(s) - a = a + 1 - FGIntMontgomeryModExp(n, s, Prime, b) - FGIntAdd(s, one, temp) - FGIntShiftRight(temp) - FGIntMontgomeryModExp(Square, temp, Prime, r) - FGIntDestroy(temp) - FGIntModInv(Square, Prime, temp1) - for i in countup(0, (a - 2)): - FGIntSquareMod(r, Prime, temp2) - FGIntMulMod(temp1, temp2, Prime, temp) - FGIntDestroy(temp2) - for j in countup(1, (a - i - 2)): - FGIntSquareMod(temp, Prime, temp2) - FGIntDestroy(temp) - FGIntCopy(temp2, temp) - FGIntDestroy(temp2) - if FGIntCompareAbs(temp, one) != Eq: - FGIntMulMod(r, b, Prime, temp3) - FGIntDestroy(r) - FGIntCopy(temp3, r) - FGIntDestroy(temp3) - FGIntDestroy(temp) - FGIntDestroy(temp2) - if i == (a - 2): break - FGIntSquareMod(b, Prime, temp3) - FGIntDestroy(b) - FGIntCopy(temp3, b) - FGIntDestroy(temp3) - FGIntCopy(r, SquareRoot) - FGIntDestroy(r) - FGIntDestroy(s) - FGIntDestroy(b) - FGIntDestroy(temp1) - FGIntDestroy(one) - FGIntDestroy(n) diff --git a/lib/base/devel/diff.nim b/lib/base/devel/diff.nim deleted file mode 100644 index 4fda69b459..0000000000 --- a/lib/base/devel/diff.nim +++ /dev/null @@ -1,460 +0,0 @@ -# -# -# Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf -# -# See the file "copying.txt", included in this -# distribution, for details about the copyright. -# - -## This module implements the Difference Algorithm published in -## "An O(ND) Difference Algorithm and its Variations" by Eugene Myers -## Algorithmica Vol. 1 No. 2, 1986, p 251. - -## This implementation is based on: -## -## diff.cs: A port of the algorythm to C# -## Copyright (c) by Matthias Hertel, http://www.mathertel.de -## This work is licensed under a BSD style license. -## See http://www.mathertel.de/License.aspx - -{.push debugger:off .} # the user does not want to trace a part - # of the standard library! - -import - strutils - -type - TResultItem* = object of TObject - startA*: int ## start of line number in A - startB*: int ## start of line number in B - deletedA*: int ## number of deletions in A - deletedB*: int ## number of deletions in B - - SMSRD = tuple[x, y: int] ## shortest middle snake return data - - TDiffData {.final.} = object - len: int - data: seq[int] - modified: seq[bool] - -proc diffText*(a, b: seq[string], - eq: proc (x, y: string): bool): seq[TResultItem] = - ## returns the difference of two texts `a` and `b`. The texts are compared - ## line by line with the `eq` proc. - nil - -proc diffText*(a, b: string, eq: proc (x, y: string): bool): seq[TResultItem] = - ## returns the difference of two texts `a` and `b`. The texts are compared - ## line by line with the `eq` proc. - result = diffText(linesSeq(a), linesSeq(b), eq) - - /// details of one difference. - public struct Item - { - /// Start Line number in Data A. - public int StartA; - /// Start Line number in Data B. - public int StartB; - - /// Number of changes in Data A. - public int deletedA; - /// Number of changes in Data B. - public int insertedB; - } // Item - - /// - /// Shortest Middle Snake Return Data - /// - private struct SMSRD - { - internal int x, y; - // internal int u, v; // 2002.09.20: no need for 2 points - } - - - /// - /// Find the difference in 2 texts, comparing by textlines. - /// - /// A-version of the text (usualy the old one) - /// B-version of the text (usualy the new one) - /// Returns a array of Items that describe the differences. - public Item[] DiffText(string TextA, string TextB) { - return (DiffText(TextA, TextB, false, false, false)); - } // DiffText - - - /// - /// Find the difference in 2 text documents, comparing by textlines. - /// The algorithm itself is comparing 2 arrays of numbers so when comparing 2 text documents - /// each line is converted into a (hash) number. This hash-value is computed by storing all - /// textlines into a common hashtable so i can find dublicates in there, and generating a - /// new number each time a new textline is inserted. - /// - /// A-version of the text (usualy the old one) - /// B-version of the text (usualy the new one) - /// When set to true, all leading and trailing whitespace characters are stripped out before the comparation is done. - /// When set to true, all whitespace characters are converted to a single space character before the comparation is done. - /// When set to true, all characters are converted to their lowercase equivivalence before the comparation is done. - /// Returns a array of Items that describe the differences. - public static Item[] DiffText(string TextA, string TextB, bool trimSpace, bool ignoreSpace, bool ignoreCase) { - // prepare the input-text and convert to comparable numbers. - Hashtable h = new Hashtable(TextA.Length + TextB.Length); - - // The A-Version of the data (original data) to be compared. - DiffData DataA = new DiffData(DiffCodes(TextA, h, trimSpace, ignoreSpace, ignoreCase)); - - // The B-Version of the data (modified data) to be compared. - DiffData DataB = new DiffData(DiffCodes(TextB, h, trimSpace, ignoreSpace, ignoreCase)); - - h = null; // free up hashtable memory (maybe) - - int MAX = DataA.Length + DataB.Length + 1; - /// vector for the (0,0) to (x,y) search - int[] DownVector = new int[2 * MAX + 2]; - /// vector for the (u,v) to (N,M) search - int[] UpVector = new int[2 * MAX + 2]; - - LCS(DataA, 0, DataA.Length, DataB, 0, DataB.Length, DownVector, UpVector); - - Optimize(DataA); - Optimize(DataB); - return CreateDiffs(DataA, DataB); - } // DiffText - - -proc Optimize(d: var TDiffData) = - ## If a sequence of modified lines starts with a line that contains the - ## same content as the line that appends the changes, the difference sequence - ## is modified so that the appended line and not the starting line is marked - ## as modified. This leads to more readable diff sequences when comparing - ## text files. - var startPos = 0 - while startPos < d.len: - while StartPos < d.len and not d.modified[StartPos]: inc(startPos) - var endPos = startPos - while EndPos < d.len and d.modified[EndPos]: inc(endPos) - if EndPos < d.len and d.data[StartPos] == d.data[EndPos]: - d.modified[StartPos] = false - d.modified[EndPos] = true - else: - StartPos = EndPos - - - /// - /// Find the difference in 2 arrays of integers. - /// - /// A-version of the numbers (usualy the old one) - /// B-version of the numbers (usualy the new one) - /// Returns a array of Items that describe the differences. - public static Item[] DiffInt(int[] ArrayA, int[] ArrayB) { - // The A-Version of the data (original data) to be compared. - DiffData DataA = new DiffData(ArrayA); - - // The B-Version of the data (modified data) to be compared. - DiffData DataB = new DiffData(ArrayB); - - int MAX = DataA.Length + DataB.Length + 1; - /// vector for the (0,0) to (x,y) search - int[] DownVector = new int[2 * MAX + 2]; - /// vector for the (u,v) to (N,M) search - int[] UpVector = new int[2 * MAX + 2]; - - LCS(DataA, 0, DataA.Length, DataB, 0, DataB.Length, DownVector, UpVector); - return CreateDiffs(DataA, DataB); - } // Diff - - - /// - /// This function converts all textlines of the text into unique numbers for every unique textline - /// so further work can work only with simple numbers. - /// - /// the input text - /// This extern initialized hashtable is used for storing all ever used textlines. - /// ignore leading and trailing space characters - /// a array of integers. - private static int[] DiffCodes(string aText, Hashtable h, bool trimSpace, bool ignoreSpace, bool ignoreCase) { - // get all codes of the text - string[] Lines; - int[] Codes; - int lastUsedCode = h.Count; - object aCode; - string s; - - // strip off all cr, only use lf as textline separator. - aText = aText.Replace("\r", ""); - Lines = aText.Split('\n'); - - Codes = new int[Lines.Length]; - - for (int i = 0; i < Lines.Length; ++i) { - s = Lines[i]; - if (trimSpace) - s = s.Trim(); - - if (ignoreSpace) { - s = Regex.Replace(s, "\\s+", " "); // TODO: optimization: faster blank removal. - } - - if (ignoreCase) - s = s.ToLower(); - - aCode = h[s]; - if (aCode == null) { - lastUsedCode++; - h[s] = lastUsedCode; - Codes[i] = lastUsedCode; - } else { - Codes[i] = (int)aCode; - } // if - } // for - return (Codes); - } // DiffCodes - - - /// - /// This is the algorithm to find the Shortest Middle Snake (SMS). - /// - /// sequence A - /// lower bound of the actual range in DataA - /// upper bound of the actual range in DataA (exclusive) - /// sequence B - /// lower bound of the actual range in DataB - /// upper bound of the actual range in DataB (exclusive) - /// a vector for the (0,0) to (x,y) search. Passed as a parameter for speed reasons. - /// a vector for the (u,v) to (N,M) search. Passed as a parameter for speed reasons. - /// a MiddleSnakeData record containing x,y and u,v - private static SMSRD SMS(DiffData DataA, int LowerA, int UpperA, DiffData DataB, int LowerB, int UpperB, - int[] DownVector, int[] UpVector) { - - SMSRD ret; - int MAX = DataA.Length + DataB.Length + 1; - - int DownK = LowerA - LowerB; // the k-line to start the forward search - int UpK = UpperA - UpperB; // the k-line to start the reverse search - - int Delta = (UpperA - LowerA) - (UpperB - LowerB); - bool oddDelta = (Delta & 1) != 0; - - // The vectors in the publication accepts negative indexes. the vectors implemented here are 0-based - // and are access using a specific offset: UpOffset UpVector and DownOffset for DownVektor - int DownOffset = MAX - DownK; - int UpOffset = MAX - UpK; - - int MaxD = ((UpperA - LowerA + UpperB - LowerB) / 2) + 1; - - // Debug.Write(2, "SMS", String.Format("Search the box: A[{0}-{1}] to B[{2}-{3}]", LowerA, UpperA, LowerB, UpperB)); - - // init vectors - DownVector[DownOffset + DownK + 1] = LowerA; - UpVector[UpOffset + UpK - 1] = UpperA; - - for (int D = 0; D <= MaxD; D++) { - - // Extend the forward path. - for (int k = DownK - D; k <= DownK + D; k += 2) { - // Debug.Write(0, "SMS", "extend forward path " + k.ToString()); - - // find the only or better starting point - int x, y; - if (k == DownK - D) { - x = DownVector[DownOffset + k + 1]; // down - } else { - x = DownVector[DownOffset + k - 1] + 1; // a step to the right - if ((k < DownK + D) && (DownVector[DownOffset + k + 1] >= x)) - x = DownVector[DownOffset + k + 1]; // down - } - y = x - k; - - // find the end of the furthest reaching forward D-path in diagonal k. - while ((x < UpperA) && (y < UpperB) && (DataA.data[x] == DataB.data[y])) { - x++; y++; - } - DownVector[DownOffset + k] = x; - - // overlap ? - if (oddDelta && (UpK - D < k) && (k < UpK + D)) { - if (UpVector[UpOffset + k] <= DownVector[DownOffset + k]) { - ret.x = DownVector[DownOffset + k]; - ret.y = DownVector[DownOffset + k] - k; - // ret.u = UpVector[UpOffset + k]; // 2002.09.20: no need for 2 points - // ret.v = UpVector[UpOffset + k] - k; - return (ret); - } // if - } // if - - } // for k - - // Extend the reverse path. - for (int k = UpK - D; k <= UpK + D; k += 2) { - // Debug.Write(0, "SMS", "extend reverse path " + k.ToString()); - - // find the only or better starting point - int x, y; - if (k == UpK + D) { - x = UpVector[UpOffset + k - 1]; // up - } else { - x = UpVector[UpOffset + k + 1] - 1; // left - if ((k > UpK - D) && (UpVector[UpOffset + k - 1] < x)) - x = UpVector[UpOffset + k - 1]; // up - } // if - y = x - k; - - while ((x > LowerA) && (y > LowerB) && (DataA.data[x - 1] == DataB.data[y - 1])) { - x--; y--; // diagonal - } - UpVector[UpOffset + k] = x; - - // overlap ? - if (!oddDelta && (DownK - D <= k) && (k <= DownK + D)) { - if (UpVector[UpOffset + k] <= DownVector[DownOffset + k]) { - ret.x = DownVector[DownOffset + k]; - ret.y = DownVector[DownOffset + k] - k; - // ret.u = UpVector[UpOffset + k]; // 2002.09.20: no need for 2 points - // ret.v = UpVector[UpOffset + k] - k; - return (ret); - } // if - } // if - - } // for k - - } // for D - - throw new ApplicationException("the algorithm should never come here."); - } // SMS - - - /// - /// This is the divide-and-conquer implementation of the longes common-subsequence (LCS) - /// algorithm. - /// The published algorithm passes recursively parts of the A and B sequences. - /// To avoid copying these arrays the lower and upper bounds are passed while the sequences stay constant. - /// - /// sequence A - /// lower bound of the actual range in DataA - /// upper bound of the actual range in DataA (exclusive) - /// sequence B - /// lower bound of the actual range in DataB - /// upper bound of the actual range in DataB (exclusive) - /// a vector for the (0,0) to (x,y) search. Passed as a parameter for speed reasons. - /// a vector for the (u,v) to (N,M) search. Passed as a parameter for speed reasons. - private static void LCS(DiffData DataA, int LowerA, int UpperA, DiffData DataB, int LowerB, int UpperB, int[] DownVector, int[] UpVector) { - // Debug.Write(2, "LCS", String.Format("Analyse the box: A[{0}-{1}] to B[{2}-{3}]", LowerA, UpperA, LowerB, UpperB)); - - // Fast walkthrough equal lines at the start - while (LowerA < UpperA && LowerB < UpperB && DataA.data[LowerA] == DataB.data[LowerB]) { - LowerA++; LowerB++; - } - - // Fast walkthrough equal lines at the end - while (LowerA < UpperA && LowerB < UpperB && DataA.data[UpperA - 1] == DataB.data[UpperB - 1]) { - --UpperA; --UpperB; - } - - if (LowerA == UpperA) { - // mark as inserted lines. - while (LowerB < UpperB) - DataB.modified[LowerB++] = true; - - } else if (LowerB == UpperB) { - // mark as deleted lines. - while (LowerA < UpperA) - DataA.modified[LowerA++] = true; - - } else { - // Find the middle snakea and length of an optimal path for A and B - SMSRD smsrd = SMS(DataA, LowerA, UpperA, DataB, LowerB, UpperB, DownVector, UpVector); - // Debug.Write(2, "MiddleSnakeData", String.Format("{0},{1}", smsrd.x, smsrd.y)); - - // The path is from LowerX to (x,y) and (x,y) to UpperX - LCS(DataA, LowerA, smsrd.x, DataB, LowerB, smsrd.y, DownVector, UpVector); - LCS(DataA, smsrd.x, UpperA, DataB, smsrd.y, UpperB, DownVector, UpVector); // 2002.09.20: no need for 2 points - } - } // LCS() - - - /// Scan the tables of which lines are inserted and deleted, - /// producing an edit script in forward order. - /// - /// dynamic array - private static Item[] CreateDiffs(DiffData DataA, DiffData DataB) { - ArrayList a = new ArrayList(); - Item aItem; - Item[] result; - - int StartA, StartB; - int LineA, LineB; - - LineA = 0; - LineB = 0; - while (LineA < DataA.Length || LineB < DataB.Length) { - if ((LineA < DataA.Length) && (!DataA.modified[LineA]) - && (LineB < DataB.Length) && (!DataB.modified[LineB])) { - // equal lines - LineA++; - LineB++; - - } else { - // maybe deleted and/or inserted lines - StartA = LineA; - StartB = LineB; - - while (LineA < DataA.Length && (LineB >= DataB.Length || DataA.modified[LineA])) - // while (LineA < DataA.Length && DataA.modified[LineA]) - LineA++; - - while (LineB < DataB.Length && (LineA >= DataA.Length || DataB.modified[LineB])) - // while (LineB < DataB.Length && DataB.modified[LineB]) - LineB++; - - if ((StartA < LineA) || (StartB < LineB)) { - // store a new difference-item - aItem = new Item(); - aItem.StartA = StartA; - aItem.StartB = StartB; - aItem.deletedA = LineA - StartA; - aItem.insertedB = LineB - StartB; - a.Add(aItem); - } // if - } // if - } // while - - result = new Item[a.Count]; - a.CopyTo(result); - - return (result); - } - - } // class Diff - - /// Data on one input file being compared. - /// - internal class DiffData - { - - /// Number of elements (lines). - internal int Length; - - /// Buffer of numbers that will be compared. - internal int[] data; - - /// - /// Array of booleans that flag for modified data. - /// This is the result of the diff. - /// This means deletedA in the first Data or inserted in the second Data. - /// - internal bool[] modified; - - /// - /// Initialize the Diff-Data buffer. - /// - /// reference to the buffer - internal DiffData(int[] initData) { - data = initData; - Length = initData.Length; - modified = new bool[Length + 2]; - } // DiffData - - } // class DiffData - -{.pop.} diff --git a/lib/base/devel/lex.nim b/lib/base/devel/lex.nim deleted file mode 100644 index 34f0c32a86..0000000000 --- a/lib/base/devel/lex.nim +++ /dev/null @@ -1,73 +0,0 @@ -# Lexer generator for Nimrod -# (c) 2008 Andreas Rumpf - -# Stress testing for the macro feature - -# the syntax that should be supported is: - -# template numpostfix = -# '\'' & 'F'|'f'|'i'|'I' & "32"|"64"|"8"|"16" -# template edigits = -# 'e'|'E' & +digits -# tokens( -# tkIdent: +UniIdentStart & *UniIdentRest, -# tkHexNumber: '0' & ('x'|'X') & +hexDigits & ?( numpostfix ), -# tkOctNumber: '0' & ('c'|'C') & +octDigits & ?( numpostfix ), -# tkBinNumber: '0' & ('b'|'B') & +binDigits & ?( numpostfix ), -# tkIntNumber: +digits & ?( numpostfix ), -# tkFloatNumber: +digits & ('.' & +digits & ?(edigits) | edigits) & ?(numpostfix), -# -# ) -# actions( -# tkIdent: lookup -# ) -# - -# -# match inputstream -# of +('A'..'Z' | '_' | 'a'..'z') *('A'..'Z' | '_' | 'a'..'z' | '0'..'9') : -# -# x = inputstream[pos..length] -# of '0' 'x' +('0'..'9' | 'a'..'f' | '_' | 'A'..'F') : -# y = ... - -const - AsciiLetter = {'A'..'Z', 'a'..'z'} - uniLetter = AsciiLetter + {'\128'..'\255'} - digits = {'0'..'9'} - hexDigits = {'0'..'9', 'a'..'f', 'A'..'F'} - octDigits = {'0'..'7'} - binDigits = {'0'..'1'} - AsciiIdentStart = AsciiLetter + {'_'} - AsciiIdentRest = AsciiIdentStart + Digits - UniIdentStart = UniLetter + {'_'} - UniIdentRest = UniIdentStart + Digits - -# --> if match(s, +AsciiIdentStart & *AsciiIdentRest): - -# Regular expressions in Nimrod itself! -# ------------------------------------- -# -# 'a' -- matches the character a -# 'a'..'z' -- range operator '-' -# 'A' | 'B' -- alternative operator | -# * 'a' -- prefix * is needed -# + 'a' -- prefix + is needed -# ? 'a' -- prefix ? is needed -# *? prefix is needed -# +? prefix is needed -# letter -- character classes with real names! -# letters -# white -# whites -# any -- any character -# () -- are Nimrod syntax -# ! 'a'-'z' -# -# -- concatentation via proc call: -# -# re('A' 'Z' *word ) - -macro re(n: expr): expr = - - result = newCall("magic_re", x) diff --git a/lib/base/devel/nregex.nim b/lib/base/devel/nregex.nim deleted file mode 100644 index 77afb8421e..0000000000 --- a/lib/base/devel/nregex.nim +++ /dev/null @@ -1,124 +0,0 @@ -# new implementation of regular expressions - -type - TRegexKind = enum - regNone, - regChar, - regSet, - regConc, - regAlt, - regStar, - regPlus, - regMN, - regNewline - - TRegex = object of TObject - case kind: TRegexKind - of regChar: c: char - of regSet: s: ref set[char] - else: a, b: PRegEx - - PRegEx* = ref TRegEx - - TRegExFlag* = enum ## Flags concerning the semantics of regular expressions - reCaseInsensitive, ## case insensitive match - reStyleInsensitive ## style insensitive match - - - TRegExFlags* = set[TRegExFlag] - ## Flags concerning the semantics of regular expressions - -proc raiseRegex(msg: string) {.noreturn.} = - var e: ref Exception - new(e) - e.msg = msg - raise e - -proc compileAux(i: int, s: string, r: PRegEx): int - -proc compileBackslash(i: int, s: string, r: PRegEx): int = - var i = i - inc(i) - case s[i] - of 'A'..'Z': - of 'a'..'z': - of '0': - of '1'..'9': - - else: - r.kind = regChar - r.c = s[i] - inc(i) - result = i - -proc compileAtom(i: int, s: string, r: PRegEx): int = - var i = i - case s[i] - of '[': - inc(i) - var inverse = s[i] == '^' - if inverse: inc(i) - r.kind = regSet - new(r.s) - while true: - case s[i] - of '\\': i = compileBackslash(i, s, r) - of ']': - inc(i) - break - of '\0': - raiseRegex("']' expected") - elif s[i+1] == '-': - var x = s[i] - inc(i, 2) - var y = s[i] - inc(i) - r.s = r.s + {x..y} - else: - incl(r.s, s[i]) - inc(i) - if inverse: - r.s = {'\0'..'\255'} - r.s - of '\\': - inc(i) - i = compileBackslash(i, s, r) - of '.': - r.kind = regAny - inc(i) - of '(': - inc(i) - i = compileAux(i, s, r) - if s[i] = ')': inc(i) - else: raiseRegex("')' expected") - of '\0': nil # do nothing - else: - r.kind = regChar - r.c = s[i] - inc(i) - result = i - -proc compilePostfix(i: int, s: string, r: PRegEx): int = - var i = compileAtom(i, s, r) - var a: PRegEx - case s[i] - of '*': - of '+': - of '?': - else: nil - -proc compileAux(i: int, s: string, r: PRegEx): int = - var i = i - i = compileAtom(i, s, r) - - while s[i] != '\0': - - result = i - -proc compile*(regex: string, flags: TRegExFlags = {}): PRegEx = - ## Compiles the string `regex` that represents a regular expression into - ## an internal data structure that can be used for matching. - new(result) - var i = compileAux(0, regex, result) - if i < len(regex)-1: - # not all characters used for the regular expression? - raiseRegEx("invalid regular expression") diff --git a/lib/base/devel/python.nim b/lib/base/devel/python.nim deleted file mode 100644 index d9e87af8c0..0000000000 --- a/lib/base/devel/python.nim +++ /dev/null @@ -1,1877 +0,0 @@ -# -# Light-weight binding for the Python interpreter -# (c) 2008 Andreas Rumpf -# Based on 'PythonEngine' module by Dr. Dietmar Budelsky -# -# -#************************************************************************ -# -# Module: Unit 'PythonEngine' Copyright (c) 1997 -# -# Version: 3.0 Dr. Dietmar Budelsky -# Sub-Version: 0.25 dbudelsky@web.de -# Germany -# -# Morgan Martinet -# 4721 rue Brebeuf -# H2J 3L2 MONTREAL (QC) -# CANADA -# e-mail: mmm@free.fr -# -# look our page at: http://www.multimania.com/marat -#************************************************************************ -# Functionality: Delphi Components that provide an interface to the -# Python language (see python.txt for more infos on -# Python itself). -# -#************************************************************************ -# Contributors: -# Grzegorz Makarewicz (mak@mikroplan.com.pl) -# Andrew Robinson (andy@hps1.demon.co.uk) -# Mark Watts(mark_watts@hotmail.com) -# Olivier Deckmyn (olivier.deckmyn@mail.dotcom.fr) -# Sigve Tjora (public@tjora.no) -# Mark Derricutt (mark@talios.com) -# Igor E. Poteryaev (jah@mail.ru) -# Yuri Filimonov (fil65@mail.ru) -# Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de) -#************************************************************************ -# This source code is distributed with no WARRANTY, for no reason or use. -# Everyone is allowed to use and change this code free for his own tasks -# and projects, as long as this header and its copyright text is intact. -# For changed versions of this code, which are public distributed the -# following additional conditions have to be fullfilled: -# 1) The header has to contain a comment on the change and the author of -# it. -# 2) A copy of the changed source has to be sent to the above E-Mail -# address or my then valid address, if this is possible to the -# author. -# The second condition has the target to maintain an up to date central -# version of the component. If this condition is not acceptable for -# confidential or legal reasons, everyone is free to derive a component -# or to generate a diff file to my or other original sources. -# Dr. Dietmar Budelsky, 1997-11-17 -#************************************************************************ - -import - dyncalls - -when defined(windows): - const - DllName* = "python24.dll" -else: - const - DllName* = "libpython2.4.so" # for UNIX systems -const - PYT_METHOD_BUFFER_INCREASE* = 10 - PYT_MEMBER_BUFFER_INCREASE* = 10 - PYT_GETSET_BUFFER_INCREASE* = 10 - METH_VARARGS* = 0x0001 - METH_KEYWORDS* = 0x0002 # Masks for the co_flags field of PyCodeObject - CO_OPTIMIZED* = 0x0001 - CO_NEWLOCALS* = 0x0002 - CO_VARARGS* = 0x0004 - CO_VARKEYWORDS* = 0x0008 - -type # Rich comparison opcodes introduced in version 2.1 - TRichComparisonOpcode* = enum - pyLT, pyLE, pyEQ, pyNE, pyGT, pyGE - -const - Py_TPFLAGS_HAVE_GETCHARBUFFER* = (1 shl 0) # PySequenceMethods contains sq_contains - Py_TPFLAGS_HAVE_SEQUENCE_IN* = (1 shl 1) # Objects which participate in garbage collection (see objimp.h) - Py_TPFLAGS_GC* = (1 shl 2) # PySequenceMethods and PyNumberMethods contain in-place operators - Py_TPFLAGS_HAVE_INPLACEOPS* = (1 shl 3) # PyNumberMethods do their own coercion */ - Py_TPFLAGS_CHECKTYPES* = (1 shl 4) - Py_TPFLAGS_HAVE_RICHCOMPARE* = (1 shl 5) # Objects which are weakly referencable if their tp_weaklistoffset is >0 - # XXX Should this have the same value as Py_TPFLAGS_HAVE_RICHCOMPARE? - # These both indicate a feature that appeared in the same alpha release. - Py_TPFLAGS_HAVE_WEAKREFS* = (1 shl 6) # tp_iter is defined - Py_TPFLAGS_HAVE_ITER* = (1 shl 7) # New members introduced by Python 2.2 exist - Py_TPFLAGS_HAVE_CLASS* = (1 shl 8) # Set if the type object is dynamically allocated - Py_TPFLAGS_HEAPTYPE* = (1 shl 9) # Set if the type allows subclassing - Py_TPFLAGS_BASETYPE* = (1 shl 10) # Set if the type is 'ready' -- fully initialized - Py_TPFLAGS_READY* = (1 shl 12) # Set while the type is being 'readied', to prevent recursive ready calls - Py_TPFLAGS_READYING* = (1 shl 13) # Objects support garbage collection (see objimp.h) - Py_TPFLAGS_HAVE_GC* = (1 shl 14) - Py_TPFLAGS_DEFAULT* = Py_TPFLAGS_HAVE_GETCHARBUFFER or - Py_TPFLAGS_HAVE_SEQUENCE_IN or Py_TPFLAGS_HAVE_INPLACEOPS or - Py_TPFLAGS_HAVE_RICHCOMPARE or Py_TPFLAGS_HAVE_WEAKREFS or - Py_TPFLAGS_HAVE_ITER or Py_TPFLAGS_HAVE_CLASS - -type - TPFlag* = enum - tpfHaveGetCharBuffer, tpfHaveSequenceIn, tpfGC, tpfHaveInplaceOps, - tpfCheckTypes, tpfHaveRichCompare, tpfHaveWeakRefs, tpfHaveIter, - tpfHaveClass, tpfHeapType, tpfBaseType, tpfReady, tpfReadying, tpfHaveGC - TPFlags* = set[TPFlag] - -const - TPFLAGS_DEFAULT* = {tpfHaveGetCharBuffer, tpfHaveSequenceIn, - tpfHaveInplaceOps, tpfHaveRichCompare, tpfHaveWeakRefs, tpfHaveIter, - tpfHaveClass} - -const # Python opcodes - single_input* = 256 - file_input* = 257 - eval_input* = 258 - funcdef* = 259 - parameters* = 260 - varargslist* = 261 - fpdef* = 262 - fplist* = 263 - stmt* = 264 - simple_stmt* = 265 - small_stmt* = 266 - expr_stmt* = 267 - augassign* = 268 - print_stmt* = 269 - del_stmt* = 270 - pass_stmt* = 271 - flow_stmt* = 272 - break_stmt* = 273 - continue_stmt* = 274 - return_stmt* = 275 - raise_stmt* = 276 - import_stmt* = 277 - import_as_name* = 278 - dotted_as_name* = 279 - dotted_name* = 280 - global_stmt* = 281 - exec_stmt* = 282 - assert_stmt* = 283 - compound_stmt* = 284 - if_stmt* = 285 - while_stmt* = 286 - for_stmt* = 287 - try_stmt* = 288 - except_clause* = 289 - suite* = 290 - test* = 291 - and_test* = 291 - not_test* = 293 - comparison* = 294 - comp_op* = 295 - expr* = 296 - xor_expr* = 297 - and_expr* = 298 - shift_expr* = 299 - arith_expr* = 300 - term* = 301 - factor* = 302 - power* = 303 - atom* = 304 - listmaker* = 305 - lambdef* = 306 - trailer* = 307 - subscriptlist* = 308 - subscript* = 309 - sliceop* = 310 - exprlist* = 311 - testlist* = 312 - dictmaker* = 313 - classdef* = 314 - arglist* = 315 - argument* = 316 - list_iter* = 317 - list_for* = 318 - list_if* = 319 - -const - T_SHORT* = 0 - T_INT* = 1 - T_LONG* = 2 - T_FLOAT* = 3 - T_DOUBLE* = 4 - T_STRING* = 5 - T_OBJECT* = 6 - T_CHAR* = 7 # 1-character string - T_BYTE* = 8 # 8-bit signed int - T_UBYTE* = 9 - T_USHORT* = 10 - T_UINT* = 11 - T_ULONG* = 12 - T_STRING_INPLACE* = 13 - T_OBJECT_EX* = 16 - READONLY* = 1 - RO* = READONLY # Shorthand - READ_RESTRICTED* = 2 - WRITE_RESTRICTED* = 4 - RESTRICTED* = (READ_RESTRICTED or WRITE_RESTRICTED) - -type - TPyMemberType* = enum - mtShort, mtInt, mtLong, mtFloat, mtDouble, mtString, mtObject, mtChar, - mtByte, mtUByte, mtUShort, mtUInt, mtULong, mtStringInplace, mtObjectEx - TPyMemberFlag* = enum - mfDefault, mfReadOnly, mfReadRestricted, mfWriteRestricted, mfRestricted - -type - TPChar* = array[0..16000, cstring] - PPChar* = ptr TPChar - PInt* = ptr int - PDouble* = ptr float64 - PFloat* = ptr float - PLong* = ptr int32 - PShort* = ptr int8 - PString* = ptr cstring - -type - PP_frozen* = ptr Pfrozen - P_frozen* = ptr Tfrozen - PPyObject* = ptr PyObject - PPPyObject* = ptr PPyObject - PPPPyObject* = ptr PPPyObject - PPyIntObject* = ptr PyIntObject - PPyTypeObject* = ptr PyTypeObject - PPySliceObject* = ptr PySliceObject - TPyCFunction* = proc (self, args: PPyObject): PPyObject{.cdecl.} - Tunaryfunc* = proc (ob1: PPyObject): PPyObject{.cdecl.} - Tbinaryfunc* = proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} - Tternaryfunc* = proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} - Tinquiry* = proc (ob1: PPyObject): int{.cdecl.} - Tcoercion* = proc (ob1, ob2: PPPyObject): int{.cdecl.} - Tintargfunc* = proc (ob1: PPyObject, i: int): PPyObject{.cdecl.} - Tintintargfunc* = proc (ob1: PPyObject, i1, i2: int): PPyObject{.cdecl.} - Tintobjargproc* = proc (ob1: PPyObject, i: int, ob2: PPyObject): int{.cdecl.} - Tintintobjargproc* = proc (ob1: PPyObject, i1, i2: int, ob2: PPyObject): int{. - cdecl.} - Tobjobjargproc* = proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} - Tpydestructor* = proc (ob: PPyObject){.cdecl.} - Tprintfunc* = proc (ob: PPyObject, f: var file, i: int): int{.cdecl.} - Tgetattrfunc* = proc (ob1: PPyObject, name: cstring): PPyObject{.cdecl.} - Tsetattrfunc* = proc (ob1: PPyObject, name: cstring, ob2: PPyObject): int{. - cdecl.} - Tcmpfunc* = proc (ob1, ob2: PPyObject): int{.cdecl.} - Treprfunc* = proc (ob: PPyObject): PPyObject{.cdecl.} - Thashfunc* = proc (ob: PPyObject): int32{.cdecl.} - Tgetattrofunc* = proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} - Tsetattrofunc* = proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} - Tgetreadbufferproc* = proc (ob1: PPyObject, i: int, ptr: Pointer): int{.cdecl.} - Tgetwritebufferproc* = proc (ob1: PPyObject, i: int, ptr: Pointer): int{.cdecl.} - Tgetsegcountproc* = proc (ob1: PPyObject, i: int): int{.cdecl.} - Tgetcharbufferproc* = proc (ob1: PPyObject, i: int, pstr: cstring): int{.cdecl.} - Tobjobjproc* = proc (ob1, ob2: PPyObject): int{.cdecl.} - Tvisitproc* = proc (ob1: PPyObject, ptr: Pointer): int{.cdecl.} - Ttraverseproc* = proc (ob1: PPyObject, proc: visitproc, ptr: Pointer): int{. - cdecl.} - Trichcmpfunc* = proc (ob1, ob2: PPyObject, i: int): PPyObject{.cdecl.} - Tgetiterfunc* = proc (ob1: PPyObject): PPyObject{.cdecl.} - Titernextfunc* = proc (ob1: PPyObject): PPyObject{.cdecl.} - Tdescrgetfunc* = proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} - Tdescrsetfunc* = proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} - Tinitproc* = proc (self, args, kwds: PPyObject): int{.cdecl.} - Tnewfunc* = proc (subtype: PPyTypeObject, args, kwds: PPyObject): PPyObject{. - cdecl.} - Tallocfunc* = proc (self: PPyTypeObject, nitems: int): PPyObject{.cdecl.} - TPyNumberMethods*{.final.} = object - nb_add*: Tbinaryfunc - nb_substract*: Tbinaryfunc - nb_multiply*: Tbinaryfunc - nb_divide*: Tbinaryfunc - nb_remainder*: Tbinaryfunc - nb_divmod*: Tbinaryfunc - nb_power*: Tternaryfunc - nb_negative*: Tunaryfunc - nb_positive*: Tunaryfunc - nb_absolute*: Tunaryfunc - nb_nonzero*: Tinquiry - nb_invert*: Tunaryfunc - nb_lshift*: Tbinaryfunc - nb_rshift*: Tbinaryfunc - nb_and*: Tbinaryfunc - nb_xor*: Tbinaryfunc - nb_or*: Tbinaryfunc - nb_coerce*: Tcoercion - nb_int*: Tunaryfunc - nb_long*: Tunaryfunc - nb_float*: Tunaryfunc - nb_oct*: Tunaryfunc - nb_hex*: Tunaryfunc #/ jah 29-sep-2000: updated for python 2.0 - #/ added from .h - nb_inplace_add*: Tbinaryfunc - nb_inplace_subtract*: Tbinaryfunc - nb_inplace_multiply*: Tbinaryfunc - nb_inplace_divide*: Tbinaryfunc - nb_inplace_remainder*: Tbinaryfunc - nb_inplace_power*: Tternaryfunc - nb_inplace_lshift*: Tbinaryfunc - nb_inplace_rshift*: Tbinaryfunc - nb_inplace_and*: Tbinaryfunc - nb_inplace_xor*: Tbinaryfunc - nb_inplace_or*: Tbinaryfunc # Added in release 2.2 - # The following require the Py_TPFLAGS_HAVE_CLASS flag - nb_floor_divide*: Tbinaryfunc - nb_true_divide*: Tbinaryfunc - nb_inplace_floor_divide*: Tbinaryfunc - nb_inplace_true_divide*: Tbinaryfunc - - PPyNumberMethods* = ptr TPyNumberMethods - TPySequenceMethods*{.final.} = object - sq_length*: Tinquiry - sq_concat*: Tbinaryfunc - sq_repeat*: Tintargfunc - sq_item*: Tintargfunc - sq_slice*: Tintintargfunc - sq_ass_item*: Tintobjargproc - sq_ass_slice*: Tintintobjargproc #/ jah 29-sep-2000: updated for python 2.0 - #/ added from .h - sq_contains*: Tobjobjproc - sq_inplace_concat*: Tbinaryfunc - sq_inplace_repeat*: Tintargfunc - - PPySequenceMethods* = ptr TPySequenceMethods - TPyMappingMethods*{.final.} = object - mp_length*: Tinquiry - mp_subscript*: Tbinaryfunc - mp_ass_subscript*: Tobjobjargproc - - PPyMappingMethods* = ptr PyMappingMethods #/ jah 29-sep-2000: updated for python 2.0 - #/ added from .h - TPyBufferProcs*{.final.} = object - bf_getreadbuffer*: Tgetreadbufferproc - bf_getwritebuffer*: Tgetwritebufferproc - bf_getsegcount*: Tgetsegcountproc - bf_getcharbuffer*: Tgetcharbufferproc - - PPyBufferProcs* = ptr TPyBufferProcs - TPy_complex*{.final.} = object - float*: float64 - imag*: float64 - - TPyObject*{.pure.} = object - ob_refcnt*: int - ob_type*: PPyTypeObject - - TPyIntObject* = object of TPyObject - ob_ival*: int32 - - PByte* = ptr int8 - Tfrozen*{.final.} = object - name*: cstring - code*: PByte - size*: int - - TPySliceObject* = object of TPyObject - start*, stop*, step*: PPyObject - - PPyMethodDef* = ptr TPyMethodDef - TPyMethodDef*{.final.} = object # structmember.h - ml_name*: cstring - ml_meth*: TPyCFunction - ml_flags*: int - ml_doc*: cstring - - PPyMemberDef* = ptr TPyMemberDef - TPyMemberDef*{.final.} = object # descrobject.h - # Descriptors - name*: cstring - theType*: int - offset*: int - flags*: int - doc*: cstring - - Tgetter* = proc (obj: PPyObject, context: Pointer): PPyObject{.cdecl.} - Tsetter* = proc (obj, value: PPyObject, context: Pointer): int{.cdecl.} - PPyGetSetDef* = ptr TPyGetSetDef - TPyGetSetDef*{.final.} = object - name*: cstring - get*: Tgetter - set_*: Tsetter - doc*: cstring - closure*: Pointer - - Twrapperfunc* = proc (self, args: PPyObject, wrapped: Pointer): PPyObject{. - cdecl.} - pwrapperbase* = ptr Twrapperbase - Twrapperbase*{.final.} = object # Various kinds of descriptor objects - ##define PyDescr_COMMON \ - # PyObject_HEAD \ - # PyTypeObject *d_type; \ - # PyObject *d_name - # - name*: cstring - wrapper*: Twrapperfunc - doc*: cstring - - PPyDescrObject* = ptr TPyDescrObject - TPyDescrObject* = object of TPyObject - d_type*: PPyTypeObject - d_name*: PPyObject - - PPyMethodDescrObject* = ptr TPyMethodDescrObject - TPyMethodDescrObject* = object of TPyDescrObject - d_method*: PPyMethodDef - - PPyMemberDescrObject* = ptr TPyMemberDescrObject - TPyMemberDescrObject* = object of TPyDescrObject - d_member*: PPyMemberDef - - PPyGetSetDescrObject* = ptr TPyGetSetDescrObject - TPyGetSetDescrObject* = object of TPyDescrObject - d_getset*: PPyGetSetDef - - PPyWrapperDescrObject* = ptr TPyWrapperDescrObject - TPyWrapperDescrObject* = object of TPyDescrObject # object.h - d_base*: pwrapperbase - d_wrapped*: Pointer # This can be any function pointer - - TPyTypeObject* = object of TPyObject - ob_size*: int # Number of items in variable part - tp_name*: cstring # For printing - tp_basicsize*, tp_itemsize*: int # For allocation - # Methods to implement standard operations - tp_dealloc*: Tpydestructor - tp_print*: Tprintfunc - tp_getattr*: Tgetattrfunc - tp_setattr*: Tsetattrfunc - tp_compare*: Tcmpfunc - tp_repr*: Treprfunc # Method suites for standard classes - tp_as_number*: PPyNumberMethods - tp_as_sequence*: PPySequenceMethods - tp_as_mapping*: PPyMappingMethods # More standard operations (here for binary compatibility) - tp_hash*: Thashfunc - tp_call*: Tternaryfunc - tp_str*: Treprfunc - tp_getattro*: Tgetattrofunc - tp_setattro*: Tsetattrofunc #/ jah 29-sep-2000: updated for python 2.0 - # Functions to access object as input/output buffer - tp_as_buffer*: PPyBufferProcs # Flags to define presence of optional/expanded features - tp_flags*: int32 - tp_doc*: cstring # Documentation string - # call function for all accessible objects - tp_traverse*: Ttraverseproc # delete references to contained objects - tp_clear*: Tinquiry # rich comparisons - tp_richcompare*: Trichcmpfunc # weak reference enabler - tp_weaklistoffset*: int32 # Iterators - tp_iter*: Tgetiterfunc - tp_iternext*: Titernextfunc # Attribute descriptor and subclassing stuff - tp_methods*: PPyMethodDef - tp_members*: PPyMemberDef - tp_getset*: PPyGetSetDef - tp_base*: PPyTypeObject - tp_dict*: PPyObject - tp_descr_get*: Tdescrgetfunc - tp_descr_set*: Tdescrsetfunc - tp_dictoffset*: int32 - tp_init*: Tinitproc - tp_alloc*: Tallocfunc - tp_new*: Tnewfunc - tp_free*: Tpydestructor # Low-level free-memory routine - tp_is_gc*: Tinquiry # For PyObject_IS_GC - tp_bases*: PPyObject - tp_mro*: PPyObject # method resolution order - tp_cache*: PPyObject - tp_subclasses*: PPyObject - tp_weaklist*: PPyObject #More spares - tp_xxx7*: pointer - tp_xxx8*: pointer - - PPyMethodChain* = ptr TPyMethodChain - TPyMethodChain*{.final.} = object - methods*: PPyMethodDef - link*: PPyMethodChain - - PPyClassObject* = ptr TPyClassObject - TPyClassObject* = object of TPyObject - cl_bases*: PPyObject # A tuple of class objects - cl_dict*: PPyObject # A dictionary - cl_name*: PPyObject # A string - # The following three are functions or NULL - cl_getattr*: PPyObject - cl_setattr*: PPyObject - cl_delattr*: PPyObject - - PPyInstanceObject* = ptr TPyInstanceObject - TPyInstanceObject* = object of TPyObject # Instance method objects are used for two purposes: - # (a) as bound instance methods (returned by instancename.methodname) - # (b) as unbound methods (returned by ClassName.methodname) - # In case (b), im_self is NULL - # - in_class*: PPyClassObject # The class object - in_dict*: PPyObject # A dictionary - - PPyMethodObject* = ptr TPyMethodObject - TPyMethodObject* = object of TPyObject # Bytecode object, compile.h - im_func*: PPyObject # The function implementing the method - im_self*: PPyObject # The instance it is bound to, or NULL - im_class*: PPyObject # The class that defined the method - - PPyCodeObject* = ptr TPyCodeObject - TPyCodeObject* = object of TPyObject # from pystate.h - co_argcount*: int # #arguments, except *args - co_nlocals*: int # #local variables - co_stacksize*: int # #entries needed for evaluation stack - co_flags*: int # CO_..., see below - co_code*: PPyObject # instruction opcodes (it hides a PyStringObject) - co_consts*: PPyObject # list (constants used) - co_names*: PPyObject # list of strings (names used) - co_varnames*: PPyObject # tuple of strings (local variable names) - co_freevars*: PPyObject # tuple of strings (free variable names) - co_cellvars*: PPyObject # tuple of strings (cell variable names) - # The rest doesn't count for hash/cmp - co_filename*: PPyObject # string (where it was loaded from) - co_name*: PPyObject # string (name, for reference) - co_firstlineno*: int # first source line number - co_lnotab*: PPyObject # string (encoding addr<->lineno mapping) - - PPyInterpreterState* = ptr TPyInterpreterState - PPyThreadState* = ptr TPyThreadState - PPyFrameObject* = ptr TPyFrameObject # Interpreter environments - TPyInterpreterState*{.final.} = object # Thread specific information - next*: PPyInterpreterState - tstate_head*: PPyThreadState - modules*: PPyObject - sysdict*: PPyObject - builtins*: PPyObject - checkinterval*: int - - TPyThreadState*{.final.} = object # from frameobject.h - next*: PPyThreadState - interp*: PPyInterpreterState - frame*: PPyFrameObject - recursion_depth*: int - ticker*: int - tracing*: int - sys_profilefunc*: PPyObject - sys_tracefunc*: PPyObject - curexc_type*: PPyObject - curexc_value*: PPyObject - curexc_traceback*: PPyObject - exc_type*: PPyObject - exc_value*: PPyObject - exc_traceback*: PPyObject - dict*: PPyObject - - PPyTryBlock* = ptr TPyTryBlock - TPyTryBlock*{.final.} = object - b_type*: int # what kind of block this is - b_handler*: int # where to jump to find handler - b_level*: int # value stack level to pop to - - CO_MAXBLOCKS* = range[0..19] - TPyFrameObject* = object of TPyObject # start of the VAR_HEAD of an object - # From traceback.c - ob_size*: int # Number of items in variable part - # End of the Head of an object - f_back*: PPyFrameObject # previous frame, or NULL - f_code*: PPyCodeObject # code segment - f_builtins*: PPyObject # builtin symbol table (PyDictObject) - f_globals*: PPyObject # global symbol table (PyDictObject) - f_locals*: PPyObject # local symbol table (PyDictObject) - f_valuestack*: PPPyObject # points after the last local - # Next free slot in f_valuestack. Frame creation sets to f_valuestack. - # Frame evaluation usually NULLs it, but a frame that yields sets it - # to the current stack top. - f_stacktop*: PPPyObject - f_trace*: PPyObject # Trace function - f_exc_type*, f_exc_value*, f_exc_traceback*: PPyObject - f_tstate*: PPyThreadState - f_lasti*: int # Last instruction if called - f_lineno*: int # Current line number - f_restricted*: int # Flag set if restricted operations - # in this scope - f_iblock*: int # index in f_blockstack - f_blockstack*: array[CO_MAXBLOCKS, PyTryBlock] # for try and loop blocks - f_nlocals*: int # number of locals - f_ncells*: int - f_nfreevars*: int - f_stacksize*: int # size of value stack - f_localsplus*: array[0..0, PPyObject] # locals+stack, dynamically sized - - PPyTraceBackObject* = ptr TPyTraceBackObject - TPyTraceBackObject* = object of TPyObject # Parse tree node interface - tb_next*: PPyTraceBackObject - tb_frame*: PPyFrameObject - tb_lasti*: int - tb_lineno*: int - - PNode* = ptr Tnode - Tnode*{.final.} = object # From weakrefobject.h - n_type*: int16 - n_str*: cstring - n_lineno*: int16 - n_nchildren*: int16 - n_child*: PNode - - PPyWeakReference* = ptr TPyWeakReference - TPyWeakReference* = object of TPyObject # from datetime.h - #* Fields are packed into successive bytes, each viewed as unsigned and - # * big-endian, unless otherwise noted: - # * - # * byte offset - # * 0 year 2 bytes, 1-9999 - # * 2 month 1 byte, 1-12 - # * 3 day 1 byte, 1-31 - # * 4 hour 1 byte, 0-23 - # * 5 minute 1 byte, 0-59 - # * 6 second 1 byte, 0-59 - # * 7 usecond 3 bytes, 0-999999 - # * 10 - # * - wr_object*: PPyObject - wr_callback*: PPyObject - hash*: int32 - wr_prev*: PPyWeakReference - wr_next*: PPyWeakReference - - -const # # of bytes for year, month, and day. - PyDateTime_DATE_DATASIZE* = 4 # # of bytes for hour, minute, second, and usecond. - PyDateTime_TIME_DATASIZE* = 6 # # of bytes for year, month, day, hour, minute, second, and usecond. - PyDateTime_DATETIME_DATASIZE* = 10 - -type - TPyDateTime_Delta* = object of TPyObject - hashcode*: int # -1 when unknown - days*: int # -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS - seconds*: int # 0 <= seconds < 24*3600 is invariant - microseconds*: int # 0 <= microseconds < 1000000 is invariant - - PPyDateTime_Delta* = ptr TPyDateTime_Delta - TPyDateTime_TZInfo* = object of TPyObject # a pure abstract base clase - PPyDateTime_TZInfo* = ptr TPyDateTime_TZInfo # - #/* The datetime and time types have hashcodes, and an optional tzinfo member, - # * present if and only if hastzinfo is true. - # */ - ##define _PyTZINFO_HEAD \ - # PyObject_HEAD \ - # long hashcode; \ - # char hastzinfo; /* boolean flag */ - # - #* No _PyDateTime_BaseTZInfo is allocated; it's just to have something - # * convenient to cast to, when getting at the hastzinfo member of objects - # * starting with _PyTZINFO_HEAD. - # * - TPyDateTime_BaseTZInfo* = object of TPyObject - hashcode*: int - hastzinfo*: bool # boolean flag - - PPyDateTime_BaseTZInfo* = ptr TPyDateTime_BaseTZInfo #* All time objects are of PyDateTime_TimeType, but that can be allocated - # * in two ways, with or without a tzinfo member. Without is the same as - # * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an - # * internal struct used to allocate the right amount of space for the - # * "without" case. - # * - ##define _PyDateTime_TIMEHEAD \ - # _PyTZINFO_HEAD \ - # unsigned char data[_PyDateTime_TIME_DATASIZE]; - # - TPyDateTime_BaseTime* = object of TPyDateTime_BaseTZInfo - data*: array[0..Pred(PyDateTime_TIME_DATASIZE), int8] - - PPyDateTime_BaseTime* = ptr TPyDateTime_BaseTime - TPyDateTime_Time* = object of TPyDateTime_BaseTime # hastzinfo true - tzinfo*: PPyObject - - PPyDateTime_Time* = ptr PyDateTime_Time #* All datetime objects are of PyDateTime_DateTimeType, but that can be - # * allocated in two ways too, just like for time objects above. In addition, - # * the plain date type is a base class for datetime, so it must also have - # * a hastzinfo member (although it's unused there). - # * - TPyDateTime_Date* = object of TPyDateTime_BaseTZInfo - data*: array[0..Pred(PyDateTime_DATE_DATASIZE), int8] - - PPyDateTime_Date* = ptr TPyDateTime_Date # - ##define _PyDateTime_DATETIMEHEAD \ - # _PyTZINFO_HEAD \ - # unsigned char data[_PyDateTime_DATETIME_DATASIZE]; - # - TPyDateTime_BaseDateTime* = object of TPyDateTime_BaseTZInfo # hastzinfo false - data*: array[0..Pred(PyDateTime_DATETIME_DATASIZE), int8] - - PPyDateTime_BaseDateTime* = ptr TPyDateTime_BaseDateTime - TPyDateTime_DateTime* = object of TPyDateTime_BaseTZInfo # hastzinfo true - data*: array[0..Pred(PyDateTime_DATETIME_DATASIZE), int8] - tzinfo*: PPyObject - - PPyDateTime_DateTime* = ptr TPyDateTime_DateTime - -######################################################## -### ## -### New exception classes ## -### ## -######################################################## -# -# // Python's exceptions -# EPythonError = object(Exception) -# EName: String; -# EValue: String; -# end; -# EPyExecError = object(EPythonError) -# end; -# -# // Standard exception classes of Python -# -#/// jah 29-sep-2000: updated for python 2.0 -#/// base classes updated according python documentation -# -#{ Hierarchy of Python exceptions, Python 2.3, copied from \Python\exceptions.c -# -#Exception\n\ -# |\n\ -# +-- SystemExit\n\ -# +-- StopIteration\n\ -# +-- StandardError\n\ -# | |\n\ -# | +-- KeyboardInterrupt\n\ -# | +-- ImportError\n\ -# | +-- EnvironmentError\n\ -# | | |\n\ -# | | +-- IOError\n\ -# | | +-- OSError\n\ -# | | |\n\ -# | | +-- WindowsError\n\ -# | | +-- VMSError\n\ -# | |\n\ -# | +-- EOFError\n\ -# | +-- RuntimeError\n\ -# | | |\n\ -# | | +-- NotImplementedError\n\ -# | |\n\ -# | +-- NameError\n\ -# | | |\n\ -# | | +-- UnboundLocalError\n\ -# | |\n\ -# | +-- AttributeError\n\ -# | +-- SyntaxError\n\ -# | | |\n\ -# | | +-- IndentationError\n\ -# | | |\n\ -# | | +-- TabError\n\ -# | |\n\ -# | +-- TypeError\n\ -# | +-- AssertionError\n\ -# | +-- LookupError\n\ -# | | |\n\ -# | | +-- IndexError\n\ -# | | +-- KeyError\n\ -# | |\n\ -# | +-- ArithmeticError\n\ -# | | |\n\ -# | | +-- OverflowError\n\ -# | | +-- ZeroDivisionError\n\ -# | | +-- FloatingPointError\n\ -# | |\n\ -# | +-- ValueError\n\ -# | | |\n\ -# | | +-- UnicodeError\n\ -# | | |\n\ -# | | +-- UnicodeEncodeError\n\ -# | | +-- UnicodeDecodeError\n\ -# | | +-- UnicodeTranslateError\n\ -# | |\n\ -# | +-- ReferenceError\n\ -# | +-- SystemError\n\ -# | +-- MemoryError\n\ -# |\n\ -# +---Warning\n\ -# |\n\ -# +-- UserWarning\n\ -# +-- DeprecationWarning\n\ -# +-- PendingDeprecationWarning\n\ -# +-- SyntaxWarning\n\ -# +-- OverflowWarning\n\ -# +-- RuntimeWarning\n\ -# +-- FutureWarning" -#} -# EPyException = class (EPythonError); -# EPyStandardError = class (EPyException); -# EPyArithmeticError = class (EPyStandardError); -# EPyLookupError = class (EPyStandardError); -# EPyAssertionError = class (EPyStandardError); -# EPyAttributeError = class (EPyStandardError); -# EPyEOFError = class (EPyStandardError); -# EPyFloatingPointError = class (EPyArithmeticError); -# EPyEnvironmentError = class (EPyStandardError); -# EPyIOError = class (EPyEnvironmentError); -# EPyOSError = class (EPyEnvironmentError); -# EPyImportError = class (EPyStandardError); -# EPyIndexError = class (EPyLookupError); -# EPyKeyError = class (EPyLookupError); -# EPyKeyboardInterrupt = class (EPyStandardError); -# EPyMemoryError = class (EPyStandardError); -# EPyNameError = class (EPyStandardError); -# EPyOverflowError = class (EPyArithmeticError); -# EPyRuntimeError = class (EPyStandardError); -# EPyNotImplementedError = class (EPyRuntimeError); -# EPySyntaxError = class (EPyStandardError) -# public -# EFileName: string; -# ELineStr: string; -# ELineNumber: Integer; -# EOffset: Integer; -# end; -# EPyIndentationError = class (EPySyntaxError); -# EPyTabError = class (EPyIndentationError); -# EPySystemError = class (EPyStandardError); -# EPySystemExit = class (EPyException); -# EPyTypeError = class (EPyStandardError); -# EPyUnboundLocalError = class (EPyNameError); -# EPyValueError = class (EPyStandardError); -# EPyUnicodeError = class (EPyValueError); -# UnicodeEncodeError = class (EPyUnicodeError); -# UnicodeDecodeError = class (EPyUnicodeError); -# UnicodeTranslateError = class (EPyUnicodeError); -# EPyZeroDivisionError = class (EPyArithmeticError); -# EPyStopIteration = class(EPyException); -# EPyWarning = class (EPyException); -# EPyUserWarning = class (EPyWarning); -# EPyDeprecationWarning = class (EPyWarning); -# PendingDeprecationWarning = class (EPyWarning); -# FutureWarning = class (EPyWarning); -# EPySyntaxWarning = class (EPyWarning); -# EPyOverflowWarning = class (EPyWarning); -# EPyRuntimeWarning = class (EPyWarning); -# EPyReferenceError = class (EPyStandardError); -# - -var - PyArg_Parse*: proc (args: PPyObject, format: cstring): int{.cdecl, varargs.} - PyArg_ParseTuple*: proc (args: PPyObject, format: cstring, x1: Pointer = nil, - x2: Pointer = nil, x3: Pointer = nil): int{.cdecl, varargs.} - Py_BuildValue*: proc (format: cstring): PPyObject{.cdecl, varargs.} - PyCode_Addr2Line*: proc (co: PPyCodeObject, addrq: int): int{.cdecl.} - DLL_Py_GetBuildInfo*: proc (): cstring{.cdecl.} # define Python flags. See file pyDebug.h - Py_DebugFlag*: PInt - Py_VerboseFlag*: PInt - Py_InteractiveFlag*: PInt - Py_OptimizeFlag*: PInt - Py_NoSiteFlag*: PInt - Py_UseClassExceptionsFlag*: PInt - Py_FrozenFlag*: PInt - Py_TabcheckFlag*: PInt - Py_UnicodeFlag*: PInt - Py_IgnoreEnvironmentFlag*: PInt - Py_DivisionWarningFlag*: PInt #_PySys_TraceFunc: PPPyObject; - #_PySys_ProfileFunc: PPPPyObject; - PyImport_FrozenModules*: PP_frozen - Py_None*: PPyObject - Py_Ellipsis*: PPyObject - Py_False*: PPyIntObject - Py_True*: PPyIntObject - Py_NotImplemented*: PPyObject - PyExc_AttributeError*: PPPyObject - PyExc_EOFError*: PPPyObject - PyExc_IOError*: PPPyObject - PyExc_ImportError*: PPPyObject - PyExc_IndexError*: PPPyObject - PyExc_KeyError*: PPPyObject - PyExc_KeyboardInterrupt*: PPPyObject - PyExc_MemoryError*: PPPyObject - PyExc_NameError*: PPPyObject - PyExc_OverflowError*: PPPyObject - PyExc_RuntimeError*: PPPyObject - PyExc_SyntaxError*: PPPyObject - PyExc_SystemError*: PPPyObject - PyExc_SystemExit*: PPPyObject - PyExc_TypeError*: PPPyObject - PyExc_ValueError*: PPPyObject - PyExc_ZeroDivisionError*: PPPyObject - PyExc_ArithmeticError*: PPPyObject - PyExc_Exception*: PPPyObject - PyExc_FloatingPointError*: PPPyObject - PyExc_LookupError*: PPPyObject - PyExc_StandardError*: PPPyObject - PyExc_AssertionError*: PPPyObject - PyExc_EnvironmentError*: PPPyObject - PyExc_IndentationError*: PPPyObject - PyExc_MemoryErrorInst*: PPPyObject - PyExc_NotImplementedError*: PPPyObject - PyExc_OSError*: PPPyObject - PyExc_TabError*: PPPyObject - PyExc_UnboundLocalError*: PPPyObject - PyExc_UnicodeError*: PPPyObject - PyExc_Warning*: PPPyObject - PyExc_DeprecationWarning*: PPPyObject - PyExc_RuntimeWarning*: PPPyObject - PyExc_SyntaxWarning*: PPPyObject - PyExc_UserWarning*: PPPyObject - PyExc_OverflowWarning*: PPPyObject - PyExc_ReferenceError*: PPPyObject - PyExc_StopIteration*: PPPyObject - PyExc_FutureWarning*: PPPyObject - PyExc_PendingDeprecationWarning*: PPPyObject - PyExc_UnicodeDecodeError*: PPPyObject - PyExc_UnicodeEncodeError*: PPPyObject - PyExc_UnicodeTranslateError*: PPPyObject - PyType_Type*: PPyTypeObject - PyCFunction_Type*: PPyTypeObject - PyCObject_Type*: PPyTypeObject - PyClass_Type*: PPyTypeObject - PyCode_Type*: PPyTypeObject - PyComplex_Type*: PPyTypeObject - PyDict_Type*: PPyTypeObject - PyFile_Type*: PPyTypeObject - PyFloat_Type*: PPyTypeObject - PyFrame_Type*: PPyTypeObject - PyFunction_Type*: PPyTypeObject - PyInstance_Type*: PPyTypeObject - PyInt_Type*: PPyTypeObject - PyList_Type*: PPyTypeObject - PyLong_Type*: PPyTypeObject - PyMethod_Type*: PPyTypeObject - PyModule_Type*: PPyTypeObject - PyObject_Type*: PPyTypeObject - PyRange_Type*: PPyTypeObject - PySlice_Type*: PPyTypeObject - PyString_Type*: PPyTypeObject - PyTuple_Type*: PPyTypeObject - PyBaseObject_Type*: PPyTypeObject - PyBuffer_Type*: PPyTypeObject - PyCallIter_Type*: PPyTypeObject - PyCell_Type*: PPyTypeObject - PyClassMethod_Type*: PPyTypeObject - PyProperty_Type*: PPyTypeObject - PySeqIter_Type*: PPyTypeObject - PyStaticMethod_Type*: PPyTypeObject - PySuper_Type*: PPyTypeObject - PySymtableEntry_Type*: PPyTypeObject - PyTraceBack_Type*: PPyTypeObject - PyUnicode_Type*: PPyTypeObject - PyWrapperDescr_Type*: PPyTypeObject - PyBaseString_Type*: PPyTypeObject - PyBool_Type*: PPyTypeObject - PyEnum_Type*: PPyTypeObject #PyArg_GetObject: function(args: PPyObject; nargs, i: integer; p_a: PPPyObject): integer; cdecl; - #PyArg_GetLong: function(args: PPyObject; nargs, i: integer; p_a: PLong): integer; cdecl; - #PyArg_GetShort: function(args: PPyObject; nargs, i: integer; p_a: PShort): integer; cdecl; - #PyArg_GetFloat: function(args: PPyObject; nargs, i: integer; p_a: PFloat): integer; cdecl; - #PyArg_GetString: function(args: PPyObject; nargs, i: integer; p_a: PString): integer; cdecl; - #PyArgs_VaParse: function (args: PPyObject; format: PChar; va_list: array of const): integer; cdecl; - # Does not work! - # Py_VaBuildValue: function (format: PChar; va_list: array of const): PPyObject; cdecl; - #PyBuiltin_Init: procedure; cdecl; - PyComplex_FromCComplex*: proc (c: TPy_complex): PPyObject{.cdecl.} - PyComplex_FromDoubles*: proc (realv, imag: float64): PPyObject{.cdecl.} - PyComplex_RealAsDouble*: proc (op: PPyObject): float64{.cdecl.} - PyComplex_ImagAsDouble*: proc (op: PPyObject): float64{.cdecl.} - PyComplex_AsCComplex*: proc (op: PPyObject): TPy_complex{.cdecl.} - PyCFunction_GetFunction*: proc (ob: PPyObject): Pointer{.cdecl.} - PyCFunction_GetSelf*: proc (ob: PPyObject): PPyObject{.cdecl.} - PyCallable_Check*: proc (ob: PPyObject): int{.cdecl.} - PyCObject_FromVoidPtr*: proc (cobj, destruct: Pointer): PPyObject{.cdecl.} - PyCObject_AsVoidPtr*: proc (ob: PPyObject): Pointer{.cdecl.} - PyClass_New*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} - PyClass_IsSubclass*: proc (ob1, ob2: PPyObject): int{.cdecl.} - Py_InitModule4*: proc (name: cstring, methods: PPyMethodDef, doc: cstring, - passthrough: PPyObject, Api_Version: int): PPyObject{. - cdecl.} - PyErr_BadArgument*: proc (): int{.cdecl.} - PyErr_BadInternalCall*: proc (){.cdecl.} - PyErr_CheckSignals*: proc (): int{.cdecl.} - PyErr_Clear*: proc (){.cdecl.} - PyErr_Fetch*: proc (errtype, errvalue, errtraceback: PPPyObject){.cdecl.} - PyErr_NoMemory*: proc (): PPyObject{.cdecl.} - PyErr_Occurred*: proc (): PPyObject{.cdecl.} - PyErr_Print*: proc (){.cdecl.} - PyErr_Restore*: proc (errtype, errvalue, errtraceback: PPyObject){.cdecl.} - PyErr_SetFromErrno*: proc (ob: PPyObject): PPyObject{.cdecl.} - PyErr_SetNone*: proc (value: PPyObject){.cdecl.} - PyErr_SetObject*: proc (ob1, ob2: PPyObject){.cdecl.} - PyErr_SetString*: proc (ErrorObject: PPyObject, text: cstring){.cdecl.} - PyImport_GetModuleDict*: proc (): PPyObject{.cdecl.} - PyInt_FromLong*: proc (x: int32): PPyObject{.cdecl.} - Py_Initialize*: proc (){.cdecl.} - Py_Exit*: proc (RetVal: int){.cdecl.} - PyEval_GetBuiltins*: proc (): PPyObject{.cdecl.} - PyDict_GetItem*: proc (mp, key: PPyObject): PPyObject{.cdecl.} - PyDict_SetItem*: proc (mp, key, item: PPyObject): int{.cdecl.} - PyDict_DelItem*: proc (mp, key: PPyObject): int{.cdecl.} - PyDict_Clear*: proc (mp: PPyObject){.cdecl.} - PyDict_Next*: proc (mp: PPyObject, pos: PInt, key, value: PPPyObject): int{. - cdecl.} - PyDict_Keys*: proc (mp: PPyObject): PPyObject{.cdecl.} - PyDict_Values*: proc (mp: PPyObject): PPyObject{.cdecl.} - PyDict_Items*: proc (mp: PPyObject): PPyObject{.cdecl.} - PyDict_Size*: proc (mp: PPyObject): int{.cdecl.} - PyDict_DelItemString*: proc (dp: PPyObject, key: cstring): int{.cdecl.} - PyDict_New*: proc (): PPyObject{.cdecl.} - PyDict_GetItemString*: proc (dp: PPyObject, key: cstring): PPyObject{.cdecl.} - PyDict_SetItemString*: proc (dp: PPyObject, key: cstring, item: PPyObject): int{. - cdecl.} - PyDictProxy_New*: proc (obj: PPyObject): PPyObject{.cdecl.} - PyModule_GetDict*: proc (module: PPyObject): PPyObject{.cdecl.} - PyObject_Str*: proc (v: PPyObject): PPyObject{.cdecl.} - PyRun_String*: proc (str: cstring, start: int, globals: PPyObject, - locals: PPyObject): PPyObject{.cdecl.} - PyRun_SimpleString*: proc (str: cstring): int{.cdecl.} - PyString_AsString*: proc (ob: PPyObject): cstring{.cdecl.} - PyString_FromString*: proc (str: cstring): PPyObject{.cdecl.} - PySys_SetArgv*: proc (argc: int, argv: PPChar){.cdecl.} #+ means, Grzegorz or me has tested his non object version of this function - #+ - PyCFunction_New*: proc (md: PPyMethodDef, ob: PPyObject): PPyObject{.cdecl.} #+ - PyEval_CallObject*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyEval_CallObjectWithKeywords*: proc (ob1, ob2, ob3: PPyObject): PPyObject{. - cdecl.} #- - PyEval_GetFrame*: proc (): PPyObject{.cdecl.} #- - PyEval_GetGlobals*: proc (): PPyObject{.cdecl.} #- - PyEval_GetLocals*: proc (): PPyObject{.cdecl.} #- - #PyEval_GetOwner:function:PPyObject; cdecl; - #- - PyEval_GetRestricted*: proc (): int{.cdecl.} #- - PyEval_InitThreads*: proc (){.cdecl.} #- - PyEval_RestoreThread*: proc (tstate: PPyThreadState){.cdecl.} #- - PyEval_SaveThread*: proc (): PPyThreadState{.cdecl.} #- - PyFile_FromString*: proc (pc1, pc2: cstring): PPyObject{.cdecl.} #- - PyFile_GetLine*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #- - PyFile_Name*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyFile_SetBufSize*: proc (ob: PPyObject, i: int){.cdecl.} #- - PyFile_SoftSpace*: proc (ob: PPyObject, i: int): int{.cdecl.} #- - PyFile_WriteObject*: proc (ob1, ob2: PPyObject, i: int): int{.cdecl.} #- - PyFile_WriteString*: proc (s: cstring, ob: PPyObject){.cdecl.} #+ - PyFloat_AsDouble*: proc (ob: PPyObject): float64{.cdecl.} #+ - PyFloat_FromDouble*: proc (db: float64): PPyObject{.cdecl.} #- - PyFunction_GetCode*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyFunction_GetGlobals*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyFunction_New*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyImport_AddModule*: proc (name: cstring): PPyObject{.cdecl.} #- - PyImport_Cleanup*: proc (){.cdecl.} #- - PyImport_GetMagicNumber*: proc (): int32{.cdecl.} #+ - PyImport_ImportFrozenModule*: proc (key: cstring): int{.cdecl.} #+ - PyImport_ImportModule*: proc (name: cstring): PPyObject{.cdecl.} #+ - PyImport_Import*: proc (name: PPyObject): PPyObject{.cdecl.} #- - #PyImport_Init:procedure; cdecl; - #- - PyImport_ReloadModule*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyInstance_New*: proc (obClass, obArg, obKW: PPyObject): PPyObject{.cdecl.} #+ - PyInt_AsLong*: proc (ob: PPyObject): int32{.cdecl.} #- - PyList_Append*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PyList_AsTuple*: proc (ob: PPyObject): PPyObject{.cdecl.} #+ - PyList_GetItem*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #- - PyList_GetSlice*: proc (ob: PPyObject, i1, i2: int): PPyObject{.cdecl.} #- - PyList_Insert*: proc (dp: PPyObject, idx: int, item: PPyObject): int{.cdecl.} #- - PyList_New*: proc (size: int): PPyObject{.cdecl.} #- - PyList_Reverse*: proc (ob: PPyObject): int{.cdecl.} #- - PyList_SetItem*: proc (dp: PPyObject, idx: int, item: PPyObject): int{.cdecl.} #- - PyList_SetSlice*: proc (ob: PPyObject, i1, i2: int, ob2: PPyObject): int{. - cdecl.} #+ - PyList_Size*: proc (ob: PPyObject): int{.cdecl.} #- - PyList_Sort*: proc (ob: PPyObject): int{.cdecl.} #- - PyLong_AsDouble*: proc (ob: PPyObject): float64{.cdecl.} #+ - PyLong_AsLong*: proc (ob: PPyObject): int32{.cdecl.} #+ - PyLong_FromDouble*: proc (db: float64): PPyObject{.cdecl.} #+ - PyLong_FromLong*: proc (l: int32): PPyObject{.cdecl.} #- - PyLong_FromString*: proc (pc: cstring, ppc: var cstring, i: int): PPyObject{. - cdecl.} #- - PyLong_FromUnsignedLong*: proc (val: int): PPyObject{.cdecl.} #- - PyLong_AsUnsignedLong*: proc (ob: PPyObject): int{.cdecl.} #- - PyLong_FromUnicode*: proc (ob: PPyObject, a, b: int): PPyObject{.cdecl.} #- - PyLong_FromLongLong*: proc (val: Int64): PPyObject{.cdecl.} #- - PyLong_AsLongLong*: proc (ob: PPyObject): Int64{.cdecl.} #- - PyMapping_Check*: proc (ob: PPyObject): int{.cdecl.} #- - PyMapping_GetItemString*: proc (ob: PPyObject, key: cstring): PPyObject{.cdecl.} #- - PyMapping_HasKey*: proc (ob, key: PPyObject): int{.cdecl.} #- - PyMapping_HasKeyString*: proc (ob: PPyObject, key: cstring): int{.cdecl.} #- - PyMapping_Length*: proc (ob: PPyObject): int{.cdecl.} #- - PyMapping_SetItemString*: proc (ob: PPyObject, key: cstring, value: PPyObject): int{. - cdecl.} #- - PyMethod_Class*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyMethod_Function*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyMethod_New*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} #- - PyMethod_Self*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyModule_GetName*: proc (ob: PPyObject): cstring{.cdecl.} #- - PyModule_New*: proc (key: cstring): PPyObject{.cdecl.} #- - PyNumber_Absolute*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Add*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_And*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Check*: proc (ob: PPyObject): int{.cdecl.} #- - PyNumber_Coerce*: proc (ob1, ob2: var PPyObject): int{.cdecl.} #- - PyNumber_Divide*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_FloorDivide*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_TrueDivide*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Divmod*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Float*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Int*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Invert*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Long*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Lshift*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Multiply*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Negative*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Or*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Positive*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Power*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Remainder*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Rshift*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Subtract*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Xor*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyOS_InitInterrupts*: proc (){.cdecl.} #- - PyOS_InterruptOccurred*: proc (): int{.cdecl.} #- - PyObject_CallObject*: proc (ob, args: PPyObject): PPyObject{.cdecl.} #- - PyObject_Compare*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PyObject_GetAttr*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #+ - PyObject_GetAttrString*: proc (ob: PPyObject, c: cstring): PPyObject{.cdecl.} #- - PyObject_GetItem*: proc (ob, key: PPyObject): PPyObject{.cdecl.} #- - PyObject_DelItem*: proc (ob, key: PPyObject): PPyObject{.cdecl.} #- - PyObject_HasAttrString*: proc (ob: PPyObject, key: cstring): int{.cdecl.} #- - PyObject_Hash*: proc (ob: PPyObject): int32{.cdecl.} #- - PyObject_IsTrue*: proc (ob: PPyObject): int{.cdecl.} #- - PyObject_Length*: proc (ob: PPyObject): int{.cdecl.} #- - PyObject_Repr*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyObject_SetAttr*: proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} #- - PyObject_SetAttrString*: proc (ob: PPyObject, key: cstring, value: PPyObject): int{. - cdecl.} #- - PyObject_SetItem*: proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} #- - PyObject_Init*: proc (ob: PPyObject, t: PPyTypeObject): PPyObject{.cdecl.} #- - PyObject_InitVar*: proc (ob: PPyObject, t: PPyTypeObject, size: int): PPyObject{. - cdecl.} #- - PyObject_New*: proc (t: PPyTypeObject): PPyObject{.cdecl.} #- - PyObject_NewVar*: proc (t: PPyTypeObject, size: int): PPyObject{.cdecl.} - PyObject_Free*: proc (ob: PPyObject){.cdecl.} #- - PyObject_IsInstance*: proc (inst, cls: PPyObject): int{.cdecl.} #- - PyObject_IsSubclass*: proc (derived, cls: PPyObject): int{.cdecl.} - PyObject_GenericGetAttr*: proc (obj, name: PPyObject): PPyObject{.cdecl.} - PyObject_GenericSetAttr*: proc (obj, name, value: PPyObject): int{.cdecl.} #- - PyObject_GC_Malloc*: proc (size: int): PPyObject{.cdecl.} #- - PyObject_GC_New*: proc (t: PPyTypeObject): PPyObject{.cdecl.} #- - PyObject_GC_NewVar*: proc (t: PPyTypeObject, size: int): PPyObject{.cdecl.} #- - PyObject_GC_Resize*: proc (t: PPyObject, newsize: int): PPyObject{.cdecl.} #- - PyObject_GC_Del*: proc (ob: PPyObject){.cdecl.} #- - PyObject_GC_Track*: proc (ob: PPyObject){.cdecl.} #- - PyObject_GC_UnTrack*: proc (ob: PPyObject){.cdecl.} #- - PyRange_New*: proc (l1, l2, l3: int32, i: int): PPyObject{.cdecl.} #- - PySequence_Check*: proc (ob: PPyObject): int{.cdecl.} #- - PySequence_Concat*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PySequence_Count*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PySequence_GetItem*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #- - PySequence_GetSlice*: proc (ob: PPyObject, i1, i2: int): PPyObject{.cdecl.} #- - PySequence_In*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PySequence_Index*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PySequence_Length*: proc (ob: PPyObject): int{.cdecl.} #- - PySequence_Repeat*: proc (ob: PPyObject, count: int): PPyObject{.cdecl.} #- - PySequence_SetItem*: proc (ob: PPyObject, i: int, value: PPyObject): int{. - cdecl.} #- - PySequence_SetSlice*: proc (ob: PPyObject, i1, i2: int, value: PPyObject): int{. - cdecl.} #- - PySequence_DelSlice*: proc (ob: PPyObject, i1, i2: int): int{.cdecl.} #- - PySequence_Tuple*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PySequence_Contains*: proc (ob, value: PPyObject): int{.cdecl.} #- - PySlice_GetIndices*: proc (ob: PPySliceObject, len: int, - start, stop, step: var int): int{.cdecl.} #- - PySlice_GetIndicesEx*: proc (ob: PPySliceObject, len: int, - start, stop, step, slicelength: var int): int{. - cdecl.} #- - PySlice_New*: proc (start, stop, step: PPyObject): PPyObject{.cdecl.} #- - PyString_Concat*: proc (ob1: var PPyObject, ob2: PPyObject){.cdecl.} #- - PyString_ConcatAndDel*: proc (ob1: var PPyObject, ob2: PPyObject){.cdecl.} #- - PyString_Format*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyString_FromStringAndSize*: proc (s: cstring, i: int): PPyObject{.cdecl.} #- - PyString_Size*: proc (ob: PPyObject): int{.cdecl.} #- - PyString_DecodeEscape*: proc (s: cstring, length: int, errors: cstring, - unicode: int, recode_encoding: cstring): PPyObject{. - cdecl.} #- - PyString_Repr*: proc (ob: PPyObject, smartquotes: int): PPyObject{.cdecl.} #+ - PySys_GetObject*: proc (s: cstring): PPyObject{.cdecl.} #- - #PySys_Init:procedure; cdecl; - #- - PySys_SetObject*: proc (s: cstring, ob: PPyObject): int{.cdecl.} #- - PySys_SetPath*: proc (path: cstring){.cdecl.} #- - #PyTraceBack_Fetch:function:PPyObject; cdecl; - #- - PyTraceBack_Here*: proc (p: pointer): int{.cdecl.} #- - PyTraceBack_Print*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - #PyTraceBack_Store:function (ob:PPyObject):integer; cdecl; - #+ - PyTuple_GetItem*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #- - PyTuple_GetSlice*: proc (ob: PPyObject, i1, i2: int): PPyObject{.cdecl.} #+ - PyTuple_New*: proc (size: int): PPyObject{.cdecl.} #+ - PyTuple_SetItem*: proc (ob: PPyObject, key: int, value: PPyObject): int{.cdecl.} #+ - PyTuple_Size*: proc (ob: PPyObject): int{.cdecl.} #+ - PyType_IsSubtype*: proc (a, b: PPyTypeObject): int{.cdecl.} - PyType_GenericAlloc*: proc (atype: PPyTypeObject, nitems: int): PPyObject{. - cdecl.} - PyType_GenericNew*: proc (atype: PPyTypeObject, args, kwds: PPyObject): PPyObject{. - cdecl.} - PyType_Ready*: proc (atype: PPyTypeObject): int{.cdecl.} #+ - PyUnicode_FromWideChar*: proc (w: PWideChar, size: int): PPyObject{.cdecl.} #+ - PyUnicode_AsWideChar*: proc (unicode: PPyObject, w: PWideChar, size: int): int{. - cdecl.} #- - PyUnicode_FromOrdinal*: proc (ordinal: int): PPyObject{.cdecl.} - PyWeakref_GetObject*: proc (ref: PPyObject): PPyObject{.cdecl.} - PyWeakref_NewProxy*: proc (ob, callback: PPyObject): PPyObject{.cdecl.} - PyWeakref_NewRef*: proc (ob, callback: PPyObject): PPyObject{.cdecl.} - PyWrapper_New*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} - PyBool_FromLong*: proc (ok: int): PPyObject{.cdecl.} #- - Py_AtExit*: proc (proc: proc ()): int{.cdecl.} #- - #Py_Cleanup:procedure; cdecl; - #- - Py_CompileString*: proc (s1, s2: cstring, i: int): PPyObject{.cdecl.} #- - Py_FatalError*: proc (s: cstring){.cdecl.} #- - Py_FindMethod*: proc (md: PPyMethodDef, ob: PPyObject, key: cstring): PPyObject{. - cdecl.} #- - Py_FindMethodInChain*: proc (mc: PPyMethodChain, ob: PPyObject, key: cstring): PPyObject{. - cdecl.} #- - Py_FlushLine*: proc (){.cdecl.} #+ - Py_Finalize*: proc (){.cdecl.} #- - PyErr_ExceptionMatches*: proc (exc: PPyObject): int{.cdecl.} #- - PyErr_GivenExceptionMatches*: proc (raised_exc, exc: PPyObject): int{.cdecl.} #- - PyEval_EvalCode*: proc (co: PPyCodeObject, globals, locals: PPyObject): PPyObject{. - cdecl.} #+ - Py_GetVersion*: proc (): cstring{.cdecl.} #+ - Py_GetCopyright*: proc (): cstring{.cdecl.} #+ - Py_GetExecPrefix*: proc (): cstring{.cdecl.} #+ - Py_GetPath*: proc (): cstring{.cdecl.} #+ - Py_GetPrefix*: proc (): cstring{.cdecl.} #+ - Py_GetProgramName*: proc (): cstring{.cdecl.} #- - PyParser_SimpleParseString*: proc (str: cstring, start: int): PNode{.cdecl.} #- - PyNode_Free*: proc (n: PNode){.cdecl.} #- - PyErr_NewException*: proc (name: cstring, base, dict: PPyObject): PPyObject{. - cdecl.} #- - Py_Malloc*: proc (size: int): Pointer #- - PyMem_Malloc*: proc (size: int): Pointer #- - PyObject_CallMethod*: proc (obj: PPyObject, method, format: cstring): PPyObject{. - cdecl.} #New exported Objects in Python 1.5 - Py_SetProgramName*: proc (name: cstring){.cdecl.} - Py_IsInitialized*: proc (): int{.cdecl.} - Py_GetProgramFullPath*: proc (): cstring{.cdecl.} - Py_NewInterpreter*: proc (): PPyThreadState{.cdecl.} - Py_EndInterpreter*: proc (tstate: PPyThreadState){.cdecl.} - PyEval_AcquireLock*: proc (){.cdecl.} - PyEval_ReleaseLock*: proc (){.cdecl.} - PyEval_AcquireThread*: proc (tstate: PPyThreadState){.cdecl.} - PyEval_ReleaseThread*: proc (tstate: PPyThreadState){.cdecl.} - PyInterpreterState_New*: proc (): PPyInterpreterState{.cdecl.} - PyInterpreterState_Clear*: proc (interp: PPyInterpreterState){.cdecl.} - PyInterpreterState_Delete*: proc (interp: PPyInterpreterState){.cdecl.} - PyThreadState_New*: proc (interp: PPyInterpreterState): PPyThreadState{.cdecl.} - PyThreadState_Clear*: proc (tstate: PPyThreadState){.cdecl.} - PyThreadState_Delete*: proc (tstate: PPyThreadState){.cdecl.} - PyThreadState_Get*: proc (): PPyThreadState{.cdecl.} - PyThreadState_Swap*: proc (tstate: PPyThreadState): PPyThreadState{.cdecl.} - -#Further exported Objects, may be implemented later -# -# PyCode_New: Pointer; -# PyErr_SetInterrupt: Pointer; -# PyFile_AsFile: Pointer; -# PyFile_FromFile: Pointer; -# PyFloat_AsString: Pointer; -# PyFrame_BlockPop: Pointer; -# PyFrame_BlockSetup: Pointer; -# PyFrame_ExtendStack: Pointer; -# PyFrame_FastToLocals: Pointer; -# PyFrame_LocalsToFast: Pointer; -# PyFrame_New: Pointer; -# PyGrammar_AddAccelerators: Pointer; -# PyGrammar_FindDFA: Pointer; -# PyGrammar_LabelRepr: Pointer; -# PyInstance_DoBinOp: Pointer; -# PyInt_GetMax: Pointer; -# PyMarshal_Init: Pointer; -# PyMarshal_ReadLongFromFile: Pointer; -# PyMarshal_ReadObjectFromFile: Pointer; -# PyMarshal_ReadObjectFromString: Pointer; -# PyMarshal_WriteLongToFile: Pointer; -# PyMarshal_WriteObjectToFile: Pointer; -# PyMember_Get: Pointer; -# PyMember_Set: Pointer; -# PyNode_AddChild: Pointer; -# PyNode_Compile: Pointer; -# PyNode_New: Pointer; -# PyOS_GetLastModificationTime: Pointer; -# PyOS_Readline: Pointer; -# PyOS_strtol: Pointer; -# PyOS_strtoul: Pointer; -# PyObject_CallFunction: Pointer; -# PyObject_CallMethod: Pointer; -# PyObject_Print: Pointer; -# PyParser_AddToken: Pointer; -# PyParser_Delete: Pointer; -# PyParser_New: Pointer; -# PyParser_ParseFile: Pointer; -# PyParser_ParseString: Pointer; -# PyParser_SimpleParseFile: Pointer; -# PyRun_AnyFile: Pointer; -# PyRun_File: Pointer; -# PyRun_InteractiveLoop: Pointer; -# PyRun_InteractiveOne: Pointer; -# PyRun_SimpleFile: Pointer; -# PySys_GetFile: Pointer; -# PyToken_OneChar: Pointer; -# PyToken_TwoChars: Pointer; -# PyTokenizer_Free: Pointer; -# PyTokenizer_FromFile: Pointer; -# PyTokenizer_FromString: Pointer; -# PyTokenizer_Get: Pointer; -# Py_Main: Pointer; -# _PyObject_NewVar: Pointer; -# _PyParser_Grammar: Pointer; -# _PyParser_TokenNames: Pointer; -# _PyThread_Started: Pointer; -# _Py_c_diff: Pointer; -# _Py_c_neg: Pointer; -# _Py_c_pow: Pointer; -# _Py_c_prod: Pointer; -# _Py_c_quot: Pointer; -# _Py_c_sum: Pointer; -# - -# This function handles all cardinals, pointer types (with no adjustment of pointers!) -# (Extended) floats, which are handled as Python doubles and currencies, handled -# as (normalized) Python doubles. -proc PyImport_ExecCodeModule*(name: String, codeobject: PPyObject): PPyObject -proc PyString_Check*(obj: PPyObject): bool -proc PyString_CheckExact*(obj: PPyObject): bool -proc PyFloat_Check*(obj: PPyObject): bool -proc PyFloat_CheckExact*(obj: PPyObject): bool -proc PyInt_Check*(obj: PPyObject): bool -proc PyInt_CheckExact*(obj: PPyObject): bool -proc PyLong_Check*(obj: PPyObject): bool -proc PyLong_CheckExact*(obj: PPyObject): bool -proc PyTuple_Check*(obj: PPyObject): bool -proc PyTuple_CheckExact*(obj: PPyObject): bool -proc PyInstance_Check*(obj: PPyObject): bool -proc PyClass_Check*(obj: PPyObject): bool -proc PyMethod_Check*(obj: PPyObject): bool -proc PyList_Check*(obj: PPyObject): bool -proc PyList_CheckExact*(obj: PPyObject): bool -proc PyDict_Check*(obj: PPyObject): bool -proc PyDict_CheckExact*(obj: PPyObject): bool -proc PyModule_Check*(obj: PPyObject): bool -proc PyModule_CheckExact*(obj: PPyObject): bool -proc PySlice_Check*(obj: PPyObject): bool -proc PyFunction_Check*(obj: PPyObject): bool -proc PyUnicode_Check*(obj: PPyObject): bool -proc PyUnicode_CheckExact*(obj: PPyObject): bool -proc PyType_IS_GC*(t: PPyTypeObject): bool -proc PyObject_IS_GC*(obj: PPyObject): bool -proc PyWeakref_Check*(obj: PPyObject): bool -proc PyWeakref_CheckRef*(obj: PPyObject): bool -proc PyWeakref_CheckProxy*(obj: PPyObject): bool -proc PyBool_Check*(obj: PPyObject): bool -proc PyBaseString_Check*(obj: PPyObject): bool -proc PyEnum_Check*(obj: PPyObject): bool -proc PyObject_TypeCheck*(obj: PPyObject, t: PPyTypeObject): bool -proc Py_InitModule*(name: cstring, md: PPyMethodDef): PPyObject -proc PyType_HasFeature*(AType: PPyTypeObject, AFlag: int): bool -# implementation - -proc Py_INCREF*(op: PPyObject) {.inline.} = - Inc(op.ob_refcnt) - -proc Py_DECREF*(op: PPyObject) {.inline.} = - Dec(op.ob_refcnt) - if op.ob_refcnt == 0: - op.ob_type.tp_dealloc(op) - -proc Py_XINCREF*(op: PPyObject) {.inline.} = - if op != nil: Py_INCREF(op) - -proc Py_XDECREF*(op: PPyObject) {.inline.} = - if op != nil: Py_DECREF(op) - -proc PyImport_ExecCodeModule(name: String, codeobject: PPyObject): PPyObject = - var m, d, v, modules: PPyObject - m = PyImport_AddModule(cstring(name)) - if m == nil: - return nil - d = PyModule_GetDict(m) - if PyDict_GetItemString(d, "__builtins__") == nil: - if PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins) != 0: - return nil - if PyDict_SetItemString(d, "__file__", PPyCodeObject(codeobject).co_filename) != - 0: - PyErr_Clear() # Not important enough to report - v = PyEval_EvalCode(PPyCodeObject(codeobject), d, d) # XXX owner ? - if v == nil: - return nil - Py_XDECREF(v) - modules = PyImport_GetModuleDict() - if PyDict_GetItemString(modules, cstring(name)) == nil: - PyErr_SetString(PyExc_ImportError^ , cstring( - Format("Loaded module %.200s not found in sys.modules", [name]))) - return nil - Py_XINCREF(m) - Result = m - -proc PyString_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyString_Type) - -proc PyString_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyString_Type)) - -proc PyFloat_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyFloat_Type) - -proc PyFloat_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyFloat_Type)) - -proc PyInt_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyInt_Type) - -proc PyInt_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyInt_Type)) - -proc PyLong_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyLong_Type) - -proc PyLong_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyLong_Type)) - -proc PyTuple_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyTuple_Type) - -proc PyTuple_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyTuple_Type)) - -proc PyInstance_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyInstance_Type)) - -proc PyClass_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyClass_Type)) - -proc PyMethod_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyMethod_Type)) - -proc PyList_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyList_Type) - -proc PyList_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyList_Type)) - -proc PyDict_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyDict_Type) - -proc PyDict_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyDict_Type)) - -proc PyModule_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyModule_Type) - -proc PyModule_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyModule_Type)) - -proc PySlice_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PySlice_Type)) - -proc PyFunction_Check(obj: PPyObject): bool = - Result = (obj != nil) and - ((obj.ob_type == PPyTypeObject(PyCFunction_Type)) or - (obj.ob_type == PPyTypeObject(PyFunction_Type))) - -proc PyUnicode_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyUnicode_Type) - -proc PyUnicode_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyUnicode_Type)) - -proc PyType_IS_GC(t: PPyTypeObject): bool = - Result = PyType_HasFeature(t, Py_TPFLAGS_HAVE_GC) - -proc PyObject_IS_GC(obj: PPyObject): bool = - Result = PyType_IS_GC(obj.ob_type) and - ((obj.ob_type.tp_is_gc == nil) or (obj.ob_type.tp_is_gc(obj) == 1)) - -proc PyWeakref_Check(obj: PPyObject): bool = - Result = (obj != nil) and - (PyWeakref_CheckRef(obj) or PyWeakref_CheckProxy(obj)) - -proc PyWeakref_CheckRef(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyWeakref_RefType)) - -proc PyWeakref_CheckProxy(obj: PPyObject): bool = - Result = (obj != nil) and - ((obj.ob_type == PPyTypeObject(PyWeakref_ProxyType)) or - (obj.ob_type == PPyTypeObject(PyWeakref_CallableProxyType))) - -proc PyBool_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyBool_Type)) - -proc PyBaseString_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyBaseString_Type) - -proc PyEnum_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyEnum_Type)) - -proc PyObject_TypeCheck(obj: PPyObject, t: PPyTypeObject): bool = - Result = (obj != nil) and (obj.ob_type == t) - if not Result and (obj != nil) and (t != nil): - Result = PyType_IsSubtype(obj.ob_type, t) == 1 - -proc Py_InitModule(name: cstring, md: PPyMethodDef): PPyObject = - result = Py_InitModule4(name, md, nil, nil, 1012) - -proc PyType_HasFeature(AType: PPyTypeObject, AFlag: int): bool = - #(((t)->tp_flags & (f)) != 0) - Result = (AType.tp_flags and AFlag) != 0 - -proc init(lib: TLibHandle) = - Py_DebugFlag = getProcAddr(lib, "Py_DebugFlag") - Py_VerboseFlag = getProcAddr(lib, "Py_VerboseFlag") - Py_InteractiveFlag = getProcAddr(lib, "Py_InteractiveFlag") - Py_OptimizeFlag = getProcAddr(lib, "Py_OptimizeFlag") - Py_NoSiteFlag = getProcAddr(lib, "Py_NoSiteFlag") - Py_UseClassExceptionsFlag = getProcAddr(lib, "Py_UseClassExceptionsFlag") - Py_FrozenFlag = getProcAddr(lib, "Py_FrozenFlag") - Py_TabcheckFlag = getProcAddr(lib, "Py_TabcheckFlag") - Py_UnicodeFlag = getProcAddr(lib, "Py_UnicodeFlag") - Py_IgnoreEnvironmentFlag = getProcAddr(lib, "Py_IgnoreEnvironmentFlag") - Py_DivisionWarningFlag = getProcAddr(lib, "Py_DivisionWarningFlag") - Py_None = getProcAddr(lib, "_Py_NoneStruct") - Py_Ellipsis = getProcAddr(lib, "_Py_EllipsisObject") - Py_False = getProcAddr(lib, "_Py_ZeroStruct") - Py_True = getProcAddr(lib, "_Py_TrueStruct") - Py_NotImplemented = getProcAddr(lib, "_Py_NotImplementedStruct") - PyImport_FrozenModules = getProcAddr(lib, "PyImport_FrozenModules") - PyExc_AttributeError = getProcAddr(lib, "PyExc_AttributeError") - PyExc_EOFError = getProcAddr(lib, "PyExc_EOFError") - PyExc_IOError = getProcAddr(lib, "PyExc_IOError") - PyExc_ImportError = getProcAddr(lib, "PyExc_ImportError") - PyExc_IndexError = getProcAddr(lib, "PyExc_IndexError") - PyExc_KeyError = getProcAddr(lib, "PyExc_KeyError") - PyExc_KeyboardInterrupt = getProcAddr(lib, "PyExc_KeyboardInterrupt") - PyExc_MemoryError = getProcAddr(lib, "PyExc_MemoryError") - PyExc_NameError = getProcAddr(lib, "PyExc_NameError") - PyExc_OverflowError = getProcAddr(lib, "PyExc_OverflowError") - PyExc_RuntimeError = getProcAddr(lib, "PyExc_RuntimeError") - PyExc_SyntaxError = getProcAddr(lib, "PyExc_SyntaxError") - PyExc_SystemError = getProcAddr(lib, "PyExc_SystemError") - PyExc_SystemExit = getProcAddr(lib, "PyExc_SystemExit") - PyExc_TypeError = getProcAddr(lib, "PyExc_TypeError") - PyExc_ValueError = getProcAddr(lib, "PyExc_ValueError") - PyExc_ZeroDivisionError = getProcAddr(lib, "PyExc_ZeroDivisionError") - PyExc_ArithmeticError = getProcAddr(lib, "PyExc_ArithmeticError") - PyExc_Exception = getProcAddr(lib, "PyExc_Exception") - PyExc_FloatingPointError = getProcAddr(lib, "PyExc_FloatingPointError") - PyExc_LookupError = getProcAddr(lib, "PyExc_LookupError") - PyExc_StandardError = getProcAddr(lib, "PyExc_StandardError") - PyExc_AssertionError = getProcAddr(lib, "PyExc_AssertionError") - PyExc_EnvironmentError = getProcAddr(lib, "PyExc_EnvironmentError") - PyExc_IndentationError = getProcAddr(lib, "PyExc_IndentationError") - PyExc_MemoryErrorInst = getProcAddr(lib, "PyExc_MemoryErrorInst") - PyExc_NotImplementedError = getProcAddr(lib, "PyExc_NotImplementedError") - PyExc_OSError = getProcAddr(lib, "PyExc_OSError") - PyExc_TabError = getProcAddr(lib, "PyExc_TabError") - PyExc_UnboundLocalError = getProcAddr(lib, "PyExc_UnboundLocalError") - PyExc_UnicodeError = getProcAddr(lib, "PyExc_UnicodeError") - PyExc_Warning = getProcAddr(lib, "PyExc_Warning") - PyExc_DeprecationWarning = getProcAddr(lib, "PyExc_DeprecationWarning") - PyExc_RuntimeWarning = getProcAddr(lib, "PyExc_RuntimeWarning") - PyExc_SyntaxWarning = getProcAddr(lib, "PyExc_SyntaxWarning") - PyExc_UserWarning = getProcAddr(lib, "PyExc_UserWarning") - PyExc_OverflowWarning = getProcAddr(lib, "PyExc_OverflowWarning") - PyExc_ReferenceError = getProcAddr(lib, "PyExc_ReferenceError") - PyExc_StopIteration = getProcAddr(lib, "PyExc_StopIteration") - PyExc_FutureWarning = getProcAddr(lib, "PyExc_FutureWarning") - PyExc_PendingDeprecationWarning = getProcAddr(lib, - "PyExc_PendingDeprecationWarning") - PyExc_UnicodeDecodeError = getProcAddr(lib, "PyExc_UnicodeDecodeError") - PyExc_UnicodeEncodeError = getProcAddr(lib, "PyExc_UnicodeEncodeError") - PyExc_UnicodeTranslateError = getProcAddr(lib, "PyExc_UnicodeTranslateError") - PyType_Type = getProcAddr(lib, "PyType_Type") - PyCFunction_Type = getProcAddr(lib, "PyCFunction_Type") - PyCObject_Type = getProcAddr(lib, "PyCObject_Type") - PyClass_Type = getProcAddr(lib, "PyClass_Type") - PyCode_Type = getProcAddr(lib, "PyCode_Type") - PyComplex_Type = getProcAddr(lib, "PyComplex_Type") - PyDict_Type = getProcAddr(lib, "PyDict_Type") - PyFile_Type = getProcAddr(lib, "PyFile_Type") - PyFloat_Type = getProcAddr(lib, "PyFloat_Type") - PyFrame_Type = getProcAddr(lib, "PyFrame_Type") - PyFunction_Type = getProcAddr(lib, "PyFunction_Type") - PyInstance_Type = getProcAddr(lib, "PyInstance_Type") - PyInt_Type = getProcAddr(lib, "PyInt_Type") - PyList_Type = getProcAddr(lib, "PyList_Type") - PyLong_Type = getProcAddr(lib, "PyLong_Type") - PyMethod_Type = getProcAddr(lib, "PyMethod_Type") - PyModule_Type = getProcAddr(lib, "PyModule_Type") - PyObject_Type = getProcAddr(lib, "PyObject_Type") - PyRange_Type = getProcAddr(lib, "PyRange_Type") - PySlice_Type = getProcAddr(lib, "PySlice_Type") - PyString_Type = getProcAddr(lib, "PyString_Type") - PyTuple_Type = getProcAddr(lib, "PyTuple_Type") - PyUnicode_Type = getProcAddr(lib, "PyUnicode_Type") - PyBaseObject_Type = getProcAddr(lib, "PyBaseObject_Type") - PyBuffer_Type = getProcAddr(lib, "PyBuffer_Type") - PyCallIter_Type = getProcAddr(lib, "PyCallIter_Type") - PyCell_Type = getProcAddr(lib, "PyCell_Type") - PyClassMethod_Type = getProcAddr(lib, "PyClassMethod_Type") - PyProperty_Type = getProcAddr(lib, "PyProperty_Type") - PySeqIter_Type = getProcAddr(lib, "PySeqIter_Type") - PyStaticMethod_Type = getProcAddr(lib, "PyStaticMethod_Type") - PySuper_Type = getProcAddr(lib, "PySuper_Type") - PySymtableEntry_Type = getProcAddr(lib, "PySymtableEntry_Type") - PyTraceBack_Type = getProcAddr(lib, "PyTraceBack_Type") - PyWrapperDescr_Type = getProcAddr(lib, "PyWrapperDescr_Type") - PyBaseString_Type = getProcAddr(lib, "PyBaseString_Type") - PyBool_Type = getProcAddr(lib, "PyBool_Type") - PyEnum_Type = getProcAddr(lib, "PyEnum_Type") #PyArg_GetObject := getProcAddr(lib, 'PyArg_GetObject'); - #PyArg_GetLong := getProcAddr(lib, 'PyArg_GetLong'); - #PyArg_GetShort := getProcAddr(lib, 'PyArg_GetShort'); - #PyArg_GetFloat := getProcAddr(lib, 'PyArg_GetFloat'); - #PyArg_GetString := getProcAddr(lib, 'PyArg_GetString'); - #PyArgs_VaParse := getProcAddr(lib, 'PyArgs_VaParse'); - #Py_VaBuildValue := getProcAddr(lib, 'Py_VaBuildValue'); - #PyBuiltin_Init := getProcAddr(lib, 'PyBuiltin_Init'); - PyComplex_FromCComplex = getProcAddr(lib, "PyComplex_FromCComplex") - PyComplex_FromDoubles = getProcAddr(lib, "PyComplex_FromDoubles") - PyComplex_RealAsDouble = getProcAddr(lib, "PyComplex_RealAsDouble") - PyComplex_ImagAsDouble = getProcAddr(lib, "PyComplex_ImagAsDouble") - PyComplex_AsCComplex = getProcAddr(lib, "PyComplex_AsCComplex") - PyCFunction_GetFunction = getProcAddr(lib, "PyCFunction_GetFunction") - PyCFunction_GetSelf = getProcAddr(lib, "PyCFunction_GetSelf") - PyCallable_Check = getProcAddr(lib, "PyCallable_Check") - PyCObject_FromVoidPtr = getProcAddr(lib, "PyCObject_FromVoidPtr") - PyCObject_AsVoidPtr = getProcAddr(lib, "PyCObject_AsVoidPtr") - PyClass_New = getProcAddr(lib, "PyClass_New") - PyClass_IsSubclass = getProcAddr(lib, "PyClass_IsSubclass") - PyDict_GetItem = getProcAddr(lib, "PyDict_GetItem") - PyDict_SetItem = getProcAddr(lib, "PyDict_SetItem") - PyDict_DelItem = getProcAddr(lib, "PyDict_DelItem") - PyDict_Clear = getProcAddr(lib, "PyDict_Clear") - PyDict_Next = getProcAddr(lib, "PyDict_Next") - PyDict_Keys = getProcAddr(lib, "PyDict_Keys") - PyDict_Values = getProcAddr(lib, "PyDict_Values") - PyDict_Items = getProcAddr(lib, "PyDict_Items") - PyDict_Size = getProcAddr(lib, "PyDict_Size") - PyDict_DelItemString = getProcAddr(lib, "PyDict_DelItemString") - PyDictProxy_New = getProcAddr(lib, "PyDictProxy_New") - Py_InitModule4 = getProcAddr(lib, "Py_InitModule4") - PyErr_Print = getProcAddr(lib, "PyErr_Print") - PyErr_SetNone = getProcAddr(lib, "PyErr_SetNone") - PyErr_SetObject = getProcAddr(lib, "PyErr_SetObject") - PyErr_Restore = getProcAddr(lib, "PyErr_Restore") - PyErr_BadArgument = getProcAddr(lib, "PyErr_BadArgument") - PyErr_NoMemory = getProcAddr(lib, "PyErr_NoMemory") - PyErr_SetFromErrno = getProcAddr(lib, "PyErr_SetFromErrno") - PyErr_BadInternalCall = getProcAddr(lib, "PyErr_BadInternalCall") - PyErr_CheckSignals = getProcAddr(lib, "PyErr_CheckSignals") - PyErr_Occurred = getProcAddr(lib, "PyErr_Occurred") - PyErr_Clear = getProcAddr(lib, "PyErr_Clear") - PyErr_Fetch = getProcAddr(lib, "PyErr_Fetch") - PyErr_SetString = getProcAddr(lib, "PyErr_SetString") - PyEval_GetBuiltins = getProcAddr(lib, "PyEval_GetBuiltins") - PyImport_GetModuleDict = getProcAddr(lib, "PyImport_GetModuleDict") - PyInt_FromLong = getProcAddr(lib, "PyInt_FromLong") - PyArg_ParseTuple = getProcAddr(lib, "PyArg_ParseTuple") - PyArg_Parse = getProcAddr(lib, "PyArg_Parse") - Py_BuildValue = getProcAddr(lib, "Py_BuildValue") - Py_Initialize = getProcAddr(lib, "Py_Initialize") - PyDict_New = getProcAddr(lib, "PyDict_New") - PyDict_SetItemString = getProcAddr(lib, "PyDict_SetItemString") - PyModule_GetDict = getProcAddr(lib, "PyModule_GetDict") - PyObject_Str = getProcAddr(lib, "PyObject_Str") - PyRun_String = getProcAddr(lib, "PyRun_String") - PyRun_SimpleString = getProcAddr(lib, "PyRun_SimpleString") - PyDict_GetItemString = getProcAddr(lib, "PyDict_GetItemString") - PyString_AsString = getProcAddr(lib, "PyString_AsString") - PyString_FromString = getProcAddr(lib, "PyString_FromString") - PySys_SetArgv = getProcAddr(lib, "PySys_SetArgv") - Py_Exit = getProcAddr(lib, "Py_Exit") - PyCFunction_New = getProcAddr(lib, "PyCFunction_New") - PyEval_CallObject = getProcAddr(lib, "PyEval_CallObject") - PyEval_CallObjectWithKeywords = getProcAddr(lib, - "PyEval_CallObjectWithKeywords") - PyEval_GetFrame = getProcAddr(lib, "PyEval_GetFrame") - PyEval_GetGlobals = getProcAddr(lib, "PyEval_GetGlobals") - PyEval_GetLocals = getProcAddr(lib, "PyEval_GetLocals") #PyEval_GetOwner :=getProcAddr(lib, 'PyEval_GetOwner'); - PyEval_GetRestricted = getProcAddr(lib, "PyEval_GetRestricted") - PyEval_InitThreads = getProcAddr(lib, "PyEval_InitThreads") - PyEval_RestoreThread = getProcAddr(lib, "PyEval_RestoreThread") - PyEval_SaveThread = getProcAddr(lib, "PyEval_SaveThread") - PyFile_FromString = getProcAddr(lib, "PyFile_FromString") - PyFile_GetLine = getProcAddr(lib, "PyFile_GetLine") - PyFile_Name = getProcAddr(lib, "PyFile_Name") - PyFile_SetBufSize = getProcAddr(lib, "PyFile_SetBufSize") - PyFile_SoftSpace = getProcAddr(lib, "PyFile_SoftSpace") - PyFile_WriteObject = getProcAddr(lib, "PyFile_WriteObject") - PyFile_WriteString = getProcAddr(lib, "PyFile_WriteString") - PyFloat_AsDouble = getProcAddr(lib, "PyFloat_AsDouble") - PyFloat_FromDouble = getProcAddr(lib, "PyFloat_FromDouble") - PyFunction_GetCode = getProcAddr(lib, "PyFunction_GetCode") - PyFunction_GetGlobals = getProcAddr(lib, "PyFunction_GetGlobals") - PyFunction_New = getProcAddr(lib, "PyFunction_New") - PyImport_AddModule = getProcAddr(lib, "PyImport_AddModule") - PyImport_Cleanup = getProcAddr(lib, "PyImport_Cleanup") - PyImport_GetMagicNumber = getProcAddr(lib, "PyImport_GetMagicNumber") - PyImport_ImportFrozenModule = getProcAddr(lib, "PyImport_ImportFrozenModule") - PyImport_ImportModule = getProcAddr(lib, "PyImport_ImportModule") - PyImport_Import = getProcAddr(lib, "PyImport_Import") #@PyImport_Init :=getProcAddr(lib, 'PyImport_Init'); - PyImport_ReloadModule = getProcAddr(lib, "PyImport_ReloadModule") - PyInstance_New = getProcAddr(lib, "PyInstance_New") - PyInt_AsLong = getProcAddr(lib, "PyInt_AsLong") - PyList_Append = getProcAddr(lib, "PyList_Append") - PyList_AsTuple = getProcAddr(lib, "PyList_AsTuple") - PyList_GetItem = getProcAddr(lib, "PyList_GetItem") - PyList_GetSlice = getProcAddr(lib, "PyList_GetSlice") - PyList_Insert = getProcAddr(lib, "PyList_Insert") - PyList_New = getProcAddr(lib, "PyList_New") - PyList_Reverse = getProcAddr(lib, "PyList_Reverse") - PyList_SetItem = getProcAddr(lib, "PyList_SetItem") - PyList_SetSlice = getProcAddr(lib, "PyList_SetSlice") - PyList_Size = getProcAddr(lib, "PyList_Size") - PyList_Sort = getProcAddr(lib, "PyList_Sort") - PyLong_AsDouble = getProcAddr(lib, "PyLong_AsDouble") - PyLong_AsLong = getProcAddr(lib, "PyLong_AsLong") - PyLong_FromDouble = getProcAddr(lib, "PyLong_FromDouble") - PyLong_FromLong = getProcAddr(lib, "PyLong_FromLong") - PyLong_FromString = getProcAddr(lib, "PyLong_FromString") - PyLong_FromString = getProcAddr(lib, "PyLong_FromString") - PyLong_FromUnsignedLong = getProcAddr(lib, "PyLong_FromUnsignedLong") - PyLong_AsUnsignedLong = getProcAddr(lib, "PyLong_AsUnsignedLong") - PyLong_FromUnicode = getProcAddr(lib, "PyLong_FromUnicode") - PyLong_FromLongLong = getProcAddr(lib, "PyLong_FromLongLong") - PyLong_AsLongLong = getProcAddr(lib, "PyLong_AsLongLong") - PyMapping_Check = getProcAddr(lib, "PyMapping_Check") - PyMapping_GetItemString = getProcAddr(lib, "PyMapping_GetItemString") - PyMapping_HasKey = getProcAddr(lib, "PyMapping_HasKey") - PyMapping_HasKeyString = getProcAddr(lib, "PyMapping_HasKeyString") - PyMapping_Length = getProcAddr(lib, "PyMapping_Length") - PyMapping_SetItemString = getProcAddr(lib, "PyMapping_SetItemString") - PyMethod_Class = getProcAddr(lib, "PyMethod_Class") - PyMethod_Function = getProcAddr(lib, "PyMethod_Function") - PyMethod_New = getProcAddr(lib, "PyMethod_New") - PyMethod_Self = getProcAddr(lib, "PyMethod_Self") - PyModule_GetName = getProcAddr(lib, "PyModule_GetName") - PyModule_New = getProcAddr(lib, "PyModule_New") - PyNumber_Absolute = getProcAddr(lib, "PyNumber_Absolute") - PyNumber_Add = getProcAddr(lib, "PyNumber_Add") - PyNumber_And = getProcAddr(lib, "PyNumber_And") - PyNumber_Check = getProcAddr(lib, "PyNumber_Check") - PyNumber_Coerce = getProcAddr(lib, "PyNumber_Coerce") - PyNumber_Divide = getProcAddr(lib, "PyNumber_Divide") - PyNumber_FloorDivide = getProcAddr(lib, "PyNumber_FloorDivide") - PyNumber_TrueDivide = getProcAddr(lib, "PyNumber_TrueDivide") - PyNumber_Divmod = getProcAddr(lib, "PyNumber_Divmod") - PyNumber_Float = getProcAddr(lib, "PyNumber_Float") - PyNumber_Int = getProcAddr(lib, "PyNumber_Int") - PyNumber_Invert = getProcAddr(lib, "PyNumber_Invert") - PyNumber_Long = getProcAddr(lib, "PyNumber_Long") - PyNumber_Lshift = getProcAddr(lib, "PyNumber_Lshift") - PyNumber_Multiply = getProcAddr(lib, "PyNumber_Multiply") - PyNumber_Negative = getProcAddr(lib, "PyNumber_Negative") - PyNumber_Or = getProcAddr(lib, "PyNumber_Or") - PyNumber_Positive = getProcAddr(lib, "PyNumber_Positive") - PyNumber_Power = getProcAddr(lib, "PyNumber_Power") - PyNumber_Remainder = getProcAddr(lib, "PyNumber_Remainder") - PyNumber_Rshift = getProcAddr(lib, "PyNumber_Rshift") - PyNumber_Subtract = getProcAddr(lib, "PyNumber_Subtract") - PyNumber_Xor = getProcAddr(lib, "PyNumber_Xor") - PyOS_InitInterrupts = getProcAddr(lib, "PyOS_InitInterrupts") - PyOS_InterruptOccurred = getProcAddr(lib, "PyOS_InterruptOccurred") - PyObject_CallObject = getProcAddr(lib, "PyObject_CallObject") - PyObject_Compare = getProcAddr(lib, "PyObject_Compare") - PyObject_GetAttr = getProcAddr(lib, "PyObject_GetAttr") - PyObject_GetAttrString = getProcAddr(lib, "PyObject_GetAttrString") - PyObject_GetItem = getProcAddr(lib, "PyObject_GetItem") - PyObject_DelItem = getProcAddr(lib, "PyObject_DelItem") - PyObject_HasAttrString = getProcAddr(lib, "PyObject_HasAttrString") - PyObject_Hash = getProcAddr(lib, "PyObject_Hash") - PyObject_IsTrue = getProcAddr(lib, "PyObject_IsTrue") - PyObject_Length = getProcAddr(lib, "PyObject_Length") - PyObject_Repr = getProcAddr(lib, "PyObject_Repr") - PyObject_SetAttr = getProcAddr(lib, "PyObject_SetAttr") - PyObject_SetAttrString = getProcAddr(lib, "PyObject_SetAttrString") - PyObject_SetItem = getProcAddr(lib, "PyObject_SetItem") - PyObject_Init = getProcAddr(lib, "PyObject_Init") - PyObject_InitVar = getProcAddr(lib, "PyObject_InitVar") - PyObject_New = getProcAddr(lib, "_PyObject_New") - PyObject_NewVar = getProcAddr(lib, "_PyObject_NewVar") - PyObject_Free = getProcAddr(lib, "PyObject_Free") - PyObject_IsInstance = getProcAddr(lib, "PyObject_IsInstance") - PyObject_IsSubclass = getProcAddr(lib, "PyObject_IsSubclass") - PyObject_GenericGetAttr = getProcAddr(lib, "PyObject_GenericGetAttr") - PyObject_GenericSetAttr = getProcAddr(lib, "PyObject_GenericSetAttr") - PyObject_GC_Malloc = getProcAddr(lib, "_PyObject_GC_Malloc") - PyObject_GC_New = getProcAddr(lib, "_PyObject_GC_New") - PyObject_GC_NewVar = getProcAddr(lib, "_PyObject_GC_NewVar") - PyObject_GC_Resize = getProcAddr(lib, "_PyObject_GC_Resize") - PyObject_GC_Del = getProcAddr(lib, "PyObject_GC_Del") - PyObject_GC_Track = getProcAddr(lib, "PyObject_GC_Track") - PyObject_GC_UnTrack = getProcAddr(lib, "PyObject_GC_UnTrack") - PyRange_New = getProcAddr(lib, "PyRange_New") - PySequence_Check = getProcAddr(lib, "PySequence_Check") - PySequence_Concat = getProcAddr(lib, "PySequence_Concat") - PySequence_Count = getProcAddr(lib, "PySequence_Count") - PySequence_GetItem = getProcAddr(lib, "PySequence_GetItem") - PySequence_GetSlice = getProcAddr(lib, "PySequence_GetSlice") - PySequence_In = getProcAddr(lib, "PySequence_In") - PySequence_Index = getProcAddr(lib, "PySequence_Index") - PySequence_Length = getProcAddr(lib, "PySequence_Length") - PySequence_Repeat = getProcAddr(lib, "PySequence_Repeat") - PySequence_SetItem = getProcAddr(lib, "PySequence_SetItem") - PySequence_SetSlice = getProcAddr(lib, "PySequence_SetSlice") - PySequence_DelSlice = getProcAddr(lib, "PySequence_DelSlice") - PySequence_Tuple = getProcAddr(lib, "PySequence_Tuple") - PySequence_Contains = getProcAddr(lib, "PySequence_Contains") - PySlice_GetIndices = getProcAddr(lib, "PySlice_GetIndices") - PySlice_GetIndicesEx = getProcAddr(lib, "PySlice_GetIndicesEx") - PySlice_New = getProcAddr(lib, "PySlice_New") - PyString_Concat = getProcAddr(lib, "PyString_Concat") - PyString_ConcatAndDel = getProcAddr(lib, "PyString_ConcatAndDel") - PyString_Format = getProcAddr(lib, "PyString_Format") - PyString_FromStringAndSize = getProcAddr(lib, "PyString_FromStringAndSize") - PyString_Size = getProcAddr(lib, "PyString_Size") - PyString_DecodeEscape = getProcAddr(lib, "PyString_DecodeEscape") - PyString_Repr = getProcAddr(lib, "PyString_Repr") - PySys_GetObject = getProcAddr(lib, "PySys_GetObject") #PySys_Init :=getProcAddr(lib, 'PySys_Init'); - PySys_SetObject = getProcAddr(lib, "PySys_SetObject") - PySys_SetPath = getProcAddr(lib, "PySys_SetPath") #PyTraceBack_Fetch :=getProcAddr(lib, 'PyTraceBack_Fetch'); - PyTraceBack_Here = getProcAddr(lib, "PyTraceBack_Here") - PyTraceBack_Print = getProcAddr(lib, "PyTraceBack_Print") #PyTraceBack_Store :=getProcAddr(lib, 'PyTraceBack_Store'); - PyTuple_GetItem = getProcAddr(lib, "PyTuple_GetItem") - PyTuple_GetSlice = getProcAddr(lib, "PyTuple_GetSlice") - PyTuple_New = getProcAddr(lib, "PyTuple_New") - PyTuple_SetItem = getProcAddr(lib, "PyTuple_SetItem") - PyTuple_Size = getProcAddr(lib, "PyTuple_Size") - PyType_IsSubtype = getProcAddr(lib, "PyType_IsSubtype") - PyType_GenericAlloc = getProcAddr(lib, "PyType_GenericAlloc") - PyType_GenericNew = getProcAddr(lib, "PyType_GenericNew") - PyType_Ready = getProcAddr(lib, "PyType_Ready") - PyUnicode_FromWideChar = getProcAddr(lib, "PyUnicodeUCS2_FromWideChar") - PyUnicode_AsWideChar = getProcAddr(lib, "PyUnicodeUCS2_AsWideChar") - PyUnicode_FromOrdinal = getProcAddr(lib, "PyUnicodeUCS2_FromOrdinal") - PyWeakref_GetObject = getProcAddr(lib, "PyWeakref_GetObject") - PyWeakref_NewProxy = getProcAddr(lib, "PyWeakref_NewProxy") - PyWeakref_NewRef = getProcAddr(lib, "PyWeakref_NewRef") - PyWrapper_New = getProcAddr(lib, "PyWrapper_New") - PyBool_FromLong = getProcAddr(lib, "PyBool_FromLong") - Py_AtExit = getProcAddr(lib, "Py_AtExit") #Py_Cleanup :=getProcAddr(lib, 'Py_Cleanup'); - Py_CompileString = getProcAddr(lib, "Py_CompileString") - Py_FatalError = getProcAddr(lib, "Py_FatalError") - Py_FindMethod = getProcAddr(lib, "Py_FindMethod") - Py_FindMethodInChain = getProcAddr(lib, "Py_FindMethodInChain") - Py_FlushLine = getProcAddr(lib, "Py_FlushLine") - Py_Finalize = getProcAddr(lib, "Py_Finalize") - PyCode_Addr2Line = getProcAddr(lib, "PyCode_Addr2Line") - PyClass_IsSubclass = getProcAddr(lib, "PyClass_IsSubclass") - PyErr_ExceptionMatches = getProcAddr(lib, "PyErr_ExceptionMatches") - PyErr_GivenExceptionMatches = getProcAddr(lib, "PyErr_GivenExceptionMatches") - PyEval_EvalCode = getProcAddr(lib, "PyEval_EvalCode") - Py_GetVersion = getProcAddr(lib, "Py_GetVersion") - Py_GetCopyright = getProcAddr(lib, "Py_GetCopyright") - Py_GetExecPrefix = getProcAddr(lib, "Py_GetExecPrefix") - Py_GetPath = getProcAddr(lib, "Py_GetPath") - Py_GetPrefix = getProcAddr(lib, "Py_GetPrefix") - Py_GetProgramName = getProcAddr(lib, "Py_GetProgramName") - PyParser_SimpleParseString = getProcAddr(lib, "PyParser_SimpleParseString") - PyNode_Free = getProcAddr(lib, "PyNode_Free") - PyErr_NewException = getProcAddr(lib, "PyErr_NewException") #/ jah 29-sep-2000 : updated for python 2.0 - #/ replaced Py_Malloc with PyMem_Malloc - #/--- @Py_Malloc := Import ('Py_Malloc'); - #/+++ @Py_Malloc := Import ('PyMem_Malloc'); - Py_Malloc = getProcAddr(lib, "PyMem_Malloc") - PyMem_Malloc = getProcAddr(lib, "PyMem_Malloc") - PyObject_CallMethod = getProcAddr(lib, "PyObject_CallMethod") - Py_SetProgramName = getProcAddr(lib, "Py_SetProgramName") - Py_IsInitialized = getProcAddr(lib, "Py_IsInitialized") - Py_GetProgramFullPath = getProcAddr(lib, "Py_GetProgramFullPath") - DLL_Py_GetBuildInfo = getProcAddr(lib, "Py_GetBuildInfo") - Py_NewInterpreter = getProcAddr(lib, "Py_NewInterpreter") - Py_EndInterpreter = getProcAddr(lib, "Py_EndInterpreter") - PyEval_AcquireLock = getProcAddr(lib, "PyEval_AcquireLock") - PyEval_ReleaseLock = getProcAddr(lib, "PyEval_ReleaseLock") - PyEval_AcquireThread = getProcAddr(lib, "PyEval_AcquireThread") - PyEval_ReleaseThread = getProcAddr(lib, "PyEval_ReleaseThread") - PyInterpreterState_New = getProcAddr(lib, "PyInterpreterState_New") - PyInterpreterState_Clear = getProcAddr(lib, "PyInterpreterState_Clear") - PyInterpreterState_Delete = getProcAddr(lib, "PyInterpreterState_Delete") - PyThreadState_New = getProcAddr(lib, "PyThreadState_New") - PyThreadState_Clear = getProcAddr(lib, "PyThreadState_Clear") - PyThreadState_Delete = getProcAddr(lib, "PyThreadState_Delete") - PyThreadState_Get = getProcAddr(lib, "PyThreadState_Get") - PyThreadState_Swap = getProcAddr(lib, "PyThreadState_Swap") - -var lib: TLibHandle - -lib = loadLibrary(dllName) -if lib != NilLibHandle: init(lib) diff --git a/lib/base/devel/python.pas b/lib/base/devel/python.pas deleted file mode 100644 index 587ec6dc98..0000000000 --- a/lib/base/devel/python.pas +++ /dev/null @@ -1,2205 +0,0 @@ -{ - Light-weight binding for the Python interpreter - (c) 2008 Andreas Rumpf - Based on 'PythonEngine' module by Dr. Dietmar Budelsky - -} - -(**************************************************************************) -(* *) -(* Module: Unit 'PythonEngine' Copyright (c) 1997 *) -(* *) -(* Version: 3.0 Dr. Dietmar Budelsky *) -(* Sub-Version: 0.25 dbudelsky@web.de *) -(* Germany *) -(* *) -(* Morgan Martinet *) -(* 4721 rue Brebeuf *) -(* H2J 3L2 MONTREAL (QC) *) -(* CANADA *) -(* e-mail: mmm@free.fr *) -(* *) -(* look our page at: http://www.multimania.com/marat *) -(**************************************************************************) -(* Functionality: Delphi Components that provide an interface to the *) -(* Python language (see python.txt for more infos on *) -(* Python itself). *) -(* *) -(**************************************************************************) -(* Contributors: *) -(* Grzegorz Makarewicz (mak@mikroplan.com.pl) *) -(* Andrew Robinson (andy@hps1.demon.co.uk) *) -(* Mark Watts(mark_watts@hotmail.com) *) -(* Olivier Deckmyn (olivier.deckmyn@mail.dotcom.fr) *) -(* Sigve Tjora (public@tjora.no) *) -(* Mark Derricutt (mark@talios.com) *) -(* Igor E. Poteryaev (jah@mail.ru) *) -(* Yuri Filimonov (fil65@mail.ru) *) -(* Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de) *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(* Dr. Dietmar Budelsky, 1997-11-17 *) -(**************************************************************************) -unit python; - -interface - -uses - dyncalls; - -{$ifdef windows} -const - DllName = 'python24.dll'; -{$else} -const - DllName = 'libpython2.4.so'; // for UNIX systems -{$endif} - -const - PYT_METHOD_BUFFER_INCREASE = 10; - PYT_MEMBER_BUFFER_INCREASE = 10; - PYT_GETSET_BUFFER_INCREASE = 10; - - METH_VARARGS = $0001; - METH_KEYWORDS = $0002; - - // Masks for the co_flags field of PyCodeObject - CO_OPTIMIZED = $0001; - CO_NEWLOCALS = $0002; - CO_VARARGS = $0004; - CO_VARKEYWORDS = $0008; - -type - // Rich comparison opcodes introduced in version 2.1 - TRichComparisonOpcode = (pyLT, pyLE, pyEQ, pyNE, pyGT, pyGE); -const -{Type flags (tp_flags) introduced in version 2.0 - -These flags are used to extend the type structure in a backwards-compatible -fashion. Extensions can use the flags to indicate (and test) when a given -type structure contains a new feature. The Python core will use these when -introducing new functionality between major revisions (to avoid mid-version -changes in the PYTHON_API_VERSION). - -Arbitration of the flag bit positions will need to be coordinated among -all extension writers who publically release their extensions (this will -be fewer than you might expect!).. - -Python 1.5.2 introduced the bf_getcharbuffer slot into PyBufferProcs. - -Type definitions should use Py_TPFLAGS_DEFAULT for their tp_flags value. - -Code can use PyType_HasFeature(type_ob, flag_value) to test whether the -given type object has a specified feature. -} - -// PyBufferProcs contains bf_getcharbuffer - Py_TPFLAGS_HAVE_GETCHARBUFFER = (1 shl 0); - -// PySequenceMethods contains sq_contains - Py_TPFLAGS_HAVE_SEQUENCE_IN = (1 shl 1); - -// Objects which participate in garbage collection (see objimp.h) - Py_TPFLAGS_GC = (1 shl 2); - -// PySequenceMethods and PyNumberMethods contain in-place operators - Py_TPFLAGS_HAVE_INPLACEOPS = (1 shl 3); - -// PyNumberMethods do their own coercion */ - Py_TPFLAGS_CHECKTYPES = (1 shl 4); - - Py_TPFLAGS_HAVE_RICHCOMPARE = (1 shl 5); - -// Objects which are weakly referencable if their tp_weaklistoffset is >0 -// XXX Should this have the same value as Py_TPFLAGS_HAVE_RICHCOMPARE? -// These both indicate a feature that appeared in the same alpha release. - - Py_TPFLAGS_HAVE_WEAKREFS = (1 shl 6); - -// tp_iter is defined - Py_TPFLAGS_HAVE_ITER = (1 shl 7); - -// New members introduced by Python 2.2 exist - Py_TPFLAGS_HAVE_CLASS = (1 shl 8); - -// Set if the type object is dynamically allocated - Py_TPFLAGS_HEAPTYPE = (1 shl 9); - -// Set if the type allows subclassing - Py_TPFLAGS_BASETYPE = (1 shl 10); - -// Set if the type is 'ready' -- fully initialized - Py_TPFLAGS_READY = (1 shl 12); - -// Set while the type is being 'readied', to prevent recursive ready calls - Py_TPFLAGS_READYING = (1 shl 13); - -// Objects support garbage collection (see objimp.h) - Py_TPFLAGS_HAVE_GC = (1 shl 14); - - Py_TPFLAGS_DEFAULT = Py_TPFLAGS_HAVE_GETCHARBUFFER - or Py_TPFLAGS_HAVE_SEQUENCE_IN - or Py_TPFLAGS_HAVE_INPLACEOPS - or Py_TPFLAGS_HAVE_RICHCOMPARE - or Py_TPFLAGS_HAVE_WEAKREFS - or Py_TPFLAGS_HAVE_ITER - or Py_TPFLAGS_HAVE_CLASS; - -// See function PyType_HasFeature below for testing the flags. - -// Delphi equivalent used by TPythonType -type - TPFlag = (tpfHaveGetCharBuffer, tpfHaveSequenceIn, tpfGC, tpfHaveInplaceOps, - tpfCheckTypes, tpfHaveRichCompare, tpfHaveWeakRefs, - tpfHaveIter, tpfHaveClass, tpfHeapType, tpfBaseType, tpfReady, - tpfReadying, tpfHaveGC - ); - TPFlags = set of TPFlag; -const - TPFLAGS_DEFAULT = [tpfHaveGetCharBuffer, tpfHaveSequenceIn, tpfHaveInplaceOps, - tpfHaveRichCompare, tpfHaveWeakRefs, tpfHaveIter, - tpfHaveClass]; -//------- Python opcodes ----------// -Const - single_input = 256; - file_input = 257; - eval_input = 258; - funcdef = 259; - parameters = 260; - varargslist = 261; - fpdef = 262; - fplist = 263; - stmt = 264; - simple_stmt = 265; - small_stmt = 266; - expr_stmt = 267; - augassign = 268; - print_stmt = 269; - del_stmt = 270; - pass_stmt = 271; - flow_stmt = 272; - break_stmt = 273; - continue_stmt = 274; - return_stmt = 275; - raise_stmt = 276; - import_stmt = 277; - import_as_name = 278; - dotted_as_name = 279; - dotted_name = 280; - global_stmt = 281; - exec_stmt = 282; - assert_stmt = 283; - compound_stmt = 284; - if_stmt = 285; - while_stmt = 286; - for_stmt = 287; - try_stmt = 288; - except_clause = 289; - suite = 290; - test = 291; - and_test = 291; - not_test = 293; - comparison = 294; - comp_op = 295; - expr = 296; - xor_expr = 297; - and_expr = 298; - shift_expr = 299; - arith_expr = 300; - term = 301; - factor = 302; - power = 303; - atom = 304; - listmaker = 305; - lambdef = 306; - trailer = 307; - subscriptlist = 308; - subscript = 309; - sliceop = 310; - exprlist = 311; - testlist = 312; - dictmaker = 313; - classdef = 314; - arglist = 315; - argument = 316; - list_iter = 317; - list_for = 318; - list_if = 319; - -const - T_SHORT = 0; - T_INT = 1; - T_LONG = 2; - T_FLOAT = 3; - T_DOUBLE = 4; - T_STRING = 5; - T_OBJECT = 6; - T_CHAR = 7; // 1-character string - T_BYTE = 8; // 8-bit signed int - T_UBYTE = 9; - T_USHORT = 10; - T_UINT = 11; - T_ULONG = 12; - -// Added by Jack: strings contained in the structure - T_STRING_INPLACE= 13; - - T_OBJECT_EX = 16;{ Like T_OBJECT, but raises AttributeError - when the value is NULL, instead of - converting to None. } - -// Flags - READONLY = 1; - RO = READONLY; // Shorthand - READ_RESTRICTED = 2; - WRITE_RESTRICTED = 4; - RESTRICTED = (READ_RESTRICTED or WRITE_RESTRICTED); -type - TPyMemberType = (mtShort, mtInt, mtLong, mtFloat, mtDouble, mtString, - mtObject, mtChar, mtByte, mtUByte, mtUShort, mtUInt, - mtULong, mtStringInplace, mtObjectEx); - TPyMemberFlag = (mfDefault, mfReadOnly, mfReadRestricted, mfWriteRestricted, mfRestricted); - -//####################################################### -//## ## -//## Global declarations, nothing Python specific ## -//## ## -//####################################################### - -type - TPChar = array[0..16000] of PChar; - PPChar = ^TPChar; - PInt = ^Integer; - PDouble = ^Double; - PFloat = ^Real; - PLong = ^LongInt; - PShort = ^ShortInt; - PString = ^PChar; - -//####################################################### -//## ## -//## Python specific interface ## -//## ## -//####################################################### - -type - PP_frozen = ^Pfrozen; - P_frozen = ^Tfrozen; - PPyObject = ^PyObject; - PPPyObject = ^PPyObject; - PPPPyObject = ^PPPyObject; - PPyIntObject = ^PyIntObject; - PPyTypeObject = ^PyTypeObject; - PPySliceObject = ^PySliceObject; - - TPyCFunction = function (self, args: PPyObject): PPyObject; cdecl; - - Tunaryfunc = function (ob1: PPyObject): PPyObject; cdecl; - Tbinaryfunc = function (ob1,ob2: PPyObject): PPyObject; cdecl; - Tternaryfunc = function (ob1,ob2,ob3: PPyObject): PPyObject; cdecl; - Tinquiry = function (ob1: PPyObject): integer; cdecl; - Tcoercion = function (ob1,ob2: PPPyObject): integer; cdecl; - Tintargfunc = function (ob1: PPyObject; i: integer): PPyObject; cdecl; - Tintintargfunc = function (ob1: PPyObject; i1, i2: integer): - PPyObject; cdecl; - Tintobjargproc = function (ob1: PPyObject; i: integer; ob2: PPyObject): - integer; cdecl; - Tintintobjargproc = function (ob1: PPyObject; i1, i2: integer; - ob2: PPyObject): integer; cdecl; - Tobjobjargproc = function (ob1,ob2,ob3: PPyObject): integer; cdecl; - - Tpydestructor = procedure (ob: PPyObject); cdecl; - Tprintfunc = function (ob: PPyObject; var f: file; i: integer): integer; cdecl; - Tgetattrfunc = function (ob1: PPyObject; name: PChar): PPyObject; cdecl; - Tsetattrfunc = function (ob1: PPyObject; name: PChar; ob2: PPyObject): integer; cdecl; - Tcmpfunc = function (ob1, ob2: PPyObject): integer; cdecl; - Treprfunc = function (ob: PPyObject): PPyObject; cdecl; - Thashfunc = function (ob: PPyObject): LongInt; cdecl; - Tgetattrofunc = function (ob1, ob2: PPyObject): PPyObject; cdecl; - Tsetattrofunc = function (ob1, ob2, ob3: PPyObject): integer; cdecl; - -/// jah 29-sep-2000: updated for python 2.0 -/// added from object.h - Tgetreadbufferproc = function (ob1: PPyObject; i: integer; ptr: Pointer): integer; cdecl; - Tgetwritebufferproc= function (ob1: PPyObject; i: integer; ptr: Pointer): integer; cdecl; - Tgetsegcountproc = function (ob1: PPyObject; i: integer): integer; cdecl; - Tgetcharbufferproc = function (ob1: PPyObject; i: integer; const pstr: PChar): integer; cdecl; - Tobjobjproc = function (ob1, ob2: PPyObject): integer; cdecl; - Tvisitproc = function (ob1: PPyObject; ptr: Pointer): integer; cdecl; - Ttraverseproc = function (ob1: PPyObject; proc: visitproc; ptr: Pointer): integer; cdecl; - - Trichcmpfunc = function (ob1, ob2: PPyObject; i: Integer): PPyObject; cdecl; - Tgetiterfunc = function (ob1: PPyObject): PPyObject; cdecl; - Titernextfunc = function (ob1: PPyObject): PPyObject; cdecl; - Tdescrgetfunc = function (ob1, ob2, ob3: PPyObject): PPyObject; cdecl; - Tdescrsetfunc = function (ob1, ob2, ob3: PPyObject): Integer; cdecl; - Tinitproc = function (self, args, kwds: PPyObject): Integer; cdecl; - Tnewfunc = function (subtype: PPyTypeObject; args, kwds: PPyObject): PPyObject; cdecl; - Tallocfunc = function (self: PPyTypeObject; nitems: integer): PPyObject; cdecl; - - TPyNumberMethods = record - nb_add: Tbinaryfunc; - nb_substract: Tbinaryfunc; - nb_multiply: Tbinaryfunc; - nb_divide: Tbinaryfunc; - nb_remainder: Tbinaryfunc; - nb_divmod: Tbinaryfunc; - nb_power: Tternaryfunc; - nb_negative: Tunaryfunc; - nb_positive: Tunaryfunc; - nb_absolute: Tunaryfunc; - nb_nonzero: Tinquiry; - nb_invert: Tunaryfunc; - nb_lshift: Tbinaryfunc; - nb_rshift: Tbinaryfunc; - nb_and: Tbinaryfunc; - nb_xor: Tbinaryfunc; - nb_or: Tbinaryfunc; - nb_coerce: Tcoercion; - nb_int: Tunaryfunc; - nb_long: Tunaryfunc; - nb_float: Tunaryfunc; - nb_oct: Tunaryfunc; - nb_hex: Tunaryfunc; -/// jah 29-sep-2000: updated for python 2.0 -/// added from .h - nb_inplace_add: Tbinaryfunc; - nb_inplace_subtract: Tbinaryfunc; - nb_inplace_multiply: Tbinaryfunc; - nb_inplace_divide: Tbinaryfunc; - nb_inplace_remainder: Tbinaryfunc; - nb_inplace_power: Tternaryfunc; - nb_inplace_lshift: Tbinaryfunc; - nb_inplace_rshift: Tbinaryfunc; - nb_inplace_and: Tbinaryfunc; - nb_inplace_xor: Tbinaryfunc; - nb_inplace_or: Tbinaryfunc; - // Added in release 2.2 - // The following require the Py_TPFLAGS_HAVE_CLASS flag - nb_floor_divide: Tbinaryfunc; - nb_true_divide: Tbinaryfunc; - nb_inplace_floor_divide: Tbinaryfunc; - nb_inplace_true_divide: Tbinaryfunc; - end; - PPyNumberMethods = ^TPyNumberMethods; - - TPySequenceMethods = record - sq_length: Tinquiry; - sq_concat: Tbinaryfunc; - sq_repeat: Tintargfunc; - sq_item: Tintargfunc; - sq_slice: Tintintargfunc; - sq_ass_item: Tintobjargproc; - sq_ass_slice: Tintintobjargproc; -/// jah 29-sep-2000: updated for python 2.0 -/// added from .h - sq_contains: Tobjobjproc; - sq_inplace_concat: Tbinaryfunc; - sq_inplace_repeat: Tintargfunc; - end; - PPySequenceMethods = ^TPySequenceMethods; - - TPyMappingMethods = record - mp_length : Tinquiry; - mp_subscript: Tbinaryfunc; - mp_ass_subscript: Tobjobjargproc; - end; - PPyMappingMethods = ^PyMappingMethods; - -/// jah 29-sep-2000: updated for python 2.0 -/// added from .h - TPyBufferProcs = record - bf_getreadbuffer: Tgetreadbufferproc; - bf_getwritebuffer: Tgetwritebufferproc; - bf_getsegcount: Tgetsegcountproc; - bf_getcharbuffer: Tgetcharbufferproc; - end; - PPyBufferProcs = ^TPyBufferProcs; - - TPy_complex = record - real: double; - imag: double; - end; - - TPyObject = record - ob_refcnt: Integer; - ob_type: PPyTypeObject; - end; - - TPyIntObject = object(TPyObject) - ob_ival: LongInt; - end; - - PByte = ^Byte; - Tfrozen = packed record - name: PChar; - code: PByte; - size: Integer; - end; - - TPySliceObject = object(TPyObject) - start, stop, step: PPyObject; - end; - - PPyMethodDef = ^TPyMethodDef; - TPyMethodDef = record - ml_name: PChar; - ml_meth: TPyCFunction; - ml_flags: Integer; - ml_doc: PChar; - end; - - // structmember.h - PPyMemberDef = ^TPyMemberDef; - TPyMemberDef = record - name: PChar; - theType: integer; - offset: integer; - flags: integer; - doc: PChar; - end; - - // descrobject.h - - // Descriptors - - Tgetter = function (obj: PPyObject; context: Pointer): PPyObject; cdecl; - Tsetter = function (obj, value: PPyObject; context: Pointer): integer; cdecl; - - PPyGetSetDef = ^TPyGetSetDef; - TPyGetSetDef = record - name: PChar; - get: Tgetter; - set_: Tsetter; - doc: PChar; - closure: Pointer; - end; - - Twrapperfunc = function (self, args: PPyObject; wrapped: Pointer): PPyObject; cdecl; - - pwrapperbase = ^Twrapperbase; - Twrapperbase = record - name: PChar; - wrapper: Twrapperfunc; - doc: PChar; - end; - - // Various kinds of descriptor objects - - {#define PyDescr_COMMON \ - PyObject_HEAD \ - PyTypeObject *d_type; \ - PyObject *d_name - } - - PPyDescrObject = ^TPyDescrObject; - TPyDescrObject = object(TPyObject) - d_type: PPyTypeObject; - d_name: PPyObject; - end; - - PPyMethodDescrObject = ^TPyMethodDescrObject; - TPyMethodDescrObject = object(TPyDescrObject) - d_method: PPyMethodDef; - end; - - PPyMemberDescrObject = ^TPyMemberDescrObject; - TPyMemberDescrObject = object(TPyDescrObject) - d_member: PPyMemberDef; - end; - - PPyGetSetDescrObject = ^TPyGetSetDescrObject; - TPyGetSetDescrObject = object(TPyDescrObject) - d_getset: PPyGetSetDef; - end; - - PPyWrapperDescrObject = ^TPyWrapperDescrObject; - TPyWrapperDescrObject = object(TPyDescrObject) - d_base: pwrapperbase; - d_wrapped: Pointer; // This can be any function pointer - end; - - // object.h - TPyTypeObject = object(TPyObject) - ob_size: Integer; // Number of items in variable part - tp_name: PChar; // For printing - tp_basicsize, tp_itemsize: Integer; // For allocation - - // Methods to implement standard operations - - tp_dealloc: Tpydestructor; - tp_print: Tprintfunc; - tp_getattr: Tgetattrfunc; - tp_setattr: Tsetattrfunc; - tp_compare: Tcmpfunc; - tp_repr: Treprfunc; - - // Method suites for standard classes - - tp_as_number: PPyNumberMethods; - tp_as_sequence: PPySequenceMethods; - tp_as_mapping: PPyMappingMethods; - - // More standard operations (here for binary compatibility) - - tp_hash: Thashfunc; - tp_call: Tternaryfunc; - tp_str: Treprfunc; - tp_getattro: Tgetattrofunc; - tp_setattro: Tsetattrofunc; - -/// jah 29-sep-2000: updated for python 2.0 - - // Functions to access object as input/output buffer - tp_as_buffer: PPyBufferProcs; - // Flags to define presence of optional/expanded features - tp_flags: LongInt; - - tp_doc: PChar; // Documentation string - - // call function for all accessible objects - tp_traverse: Ttraverseproc; - - // delete references to contained objects - tp_clear: Tinquiry; - // rich comparisons - tp_richcompare: Trichcmpfunc; - - // weak reference enabler - tp_weaklistoffset: Longint; - // Iterators - tp_iter: Tgetiterfunc; - tp_iternext: Titernextfunc; - - // Attribute descriptor and subclassing stuff - tp_methods: PPyMethodDef; - tp_members: PPyMemberDef; - tp_getset: PPyGetSetDef; - tp_base: PPyTypeObject; - tp_dict: PPyObject; - tp_descr_get: Tdescrgetfunc; - tp_descr_set: Tdescrsetfunc; - tp_dictoffset: longint; - tp_init: Tinitproc; - tp_alloc: Tallocfunc; - tp_new: Tnewfunc; - tp_free: Tpydestructor; // Low-level free-memory routine - tp_is_gc: Tinquiry; // For PyObject_IS_GC - tp_bases: PPyObject; - tp_mro: PPyObject; // method resolution order - tp_cache: PPyObject; - tp_subclasses: PPyObject; - tp_weaklist: PPyObject; - //More spares - tp_xxx7: pointer; - tp_xxx8: pointer; - end; - - PPyMethodChain = ^TPyMethodChain; - TPyMethodChain = record - methods: PPyMethodDef; - link: PPyMethodChain; - end; - - PPyClassObject = ^TPyClassObject; - TPyClassObject = object(TPyObject) - cl_bases: PPyObject; // A tuple of class objects - cl_dict: PPyObject; // A dictionary - cl_name: PPyObject; // A string - // The following three are functions or NULL - cl_getattr: PPyObject; - cl_setattr: PPyObject; - cl_delattr: PPyObject; - end; - - PPyInstanceObject = ^TPyInstanceObject; - TPyInstanceObject = object(TPyObject) - in_class: PPyClassObject; // The class object - in_dict: PPyObject; // A dictionary - end; - -{ Instance method objects are used for two purposes: - (a) as bound instance methods (returned by instancename.methodname) - (b) as unbound methods (returned by ClassName.methodname) - In case (b), im_self is NULL -} - - PPyMethodObject = ^TPyMethodObject; - TPyMethodObject = object(TPyObject) - im_func: PPyObject; // The function implementing the method - im_self: PPyObject; // The instance it is bound to, or NULL - im_class: PPyObject; // The class that defined the method - end; - - // Bytecode object, compile.h - PPyCodeObject = ^TPyCodeObject; - TPyCodeObject = object(TPyObject) - co_argcount: Integer; // #arguments, except *args - co_nlocals: Integer; // #local variables - co_stacksize: Integer; // #entries needed for evaluation stack - co_flags: Integer; // CO_..., see below - co_code: PPyObject; // instruction opcodes (it hides a PyStringObject) - co_consts: PPyObject; // list (constants used) - co_names: PPyObject; // list of strings (names used) - co_varnames: PPyObject; // tuple of strings (local variable names) - co_freevars: PPyObject; // tuple of strings (free variable names) - co_cellvars: PPyObject; // tuple of strings (cell variable names) - // The rest doesn't count for hash/cmp - co_filename: PPyObject; // string (where it was loaded from) - co_name: PPyObject; // string (name, for reference) - co_firstlineno: Integer; // first source line number - co_lnotab: PPyObject; // string (encoding addr<->lineno mapping) - end; - - // from pystate.h - PPyInterpreterState = ^TPyInterpreterState; - PPyThreadState = ^TPyThreadState; - PPyFrameObject = ^TPyFrameObject; - - // Interpreter environments - TPyInterpreterState = record - next: PPyInterpreterState; - tstate_head: PPyThreadState; - - modules: PPyObject; - sysdict: PPyObject; - builtins: PPyObject; - - checkinterval: integer; - end; - - // Thread specific information - TPyThreadState = record - next: PPyThreadState; - interp: PPyInterpreterState; - - frame: PPyFrameObject; - recursion_depth: integer; - ticker: integer; - tracing: integer; - - sys_profilefunc: PPyObject; - sys_tracefunc: PPyObject; - - curexc_type: PPyObject; - curexc_value: PPyObject; - curexc_traceback: PPyObject; - - exc_type: PPyObject; - exc_value: PPyObject; - exc_traceback: PPyObject; - - dict: PPyObject; - end; - - // from frameobject.h - - PPyTryBlock = ^TPyTryBlock; - TPyTryBlock = record - b_type: Integer; // what kind of block this is - b_handler: Integer; // where to jump to find handler - b_level: Integer; // value stack level to pop to - end; - - CO_MAXBLOCKS = 0..19; - TPyFrameObject = object(TPyObject) - // start of the VAR_HEAD of an object - ob_size: Integer; // Number of items in variable part - // End of the Head of an object - f_back: PPyFrameObject; // previous frame, or NULL - f_code: PPyCodeObject; // code segment - f_builtins: PPyObject; // builtin symbol table (PyDictObject) - f_globals: PPyObject; // global symbol table (PyDictObject) - f_locals: PPyObject; // local symbol table (PyDictObject) - f_valuestack: PPPyObject; // points after the last local - (* Next free slot in f_valuestack. Frame creation sets to f_valuestack. - Frame evaluation usually NULLs it, but a frame that yields sets it - to the current stack top. *) - f_stacktop: PPPyObject; - f_trace: PPyObject; // Trace function - f_exc_type, f_exc_value, f_exc_traceback: PPyObject; - f_tstate: PPyThreadState; - f_lasti: Integer; // Last instruction if called - f_lineno: Integer; // Current line number - f_restricted: Integer; // Flag set if restricted operations - // in this scope - f_iblock: Integer; // index in f_blockstack - f_blockstack: array[CO_MAXBLOCKS] of PyTryBlock; // for try and loop blocks - f_nlocals: Integer; // number of locals - f_ncells: Integer; - f_nfreevars: Integer; - f_stacksize: Integer; // size of value stack - f_localsplus: array[0..0] of PPyObject; // locals+stack, dynamically sized - end; - - // From traceback.c - PPyTraceBackObject = ^TPyTraceBackObject; - TPyTraceBackObject = object(TPyObject) - tb_next: PPyTraceBackObject; - tb_frame: PPyFrameObject; - tb_lasti: Integer; - tb_lineno: Integer; - end; - - // Parse tree node interface - - PNode = ^Tnode; - Tnode = record - n_type: smallint; - n_str: PChar; - n_lineno: smallint; - n_nchildren: smallint; - n_child: PNode; - end; - - // From weakrefobject.h - - PPyWeakReference = ^TPyWeakReference; - TPyWeakReference = object(TPyObject) - wr_object: PPyObject; - wr_callback: PPyObject; - hash: longint; - wr_prev: PPyWeakReference; - wr_next: PPyWeakReference; - end; - - // from datetime.h - - -{* Fields are packed into successive bytes, each viewed as unsigned and - * big-endian, unless otherwise noted: - * - * byte offset - * 0 year 2 bytes, 1-9999 - * 2 month 1 byte, 1-12 - * 3 day 1 byte, 1-31 - * 4 hour 1 byte, 0-23 - * 5 minute 1 byte, 0-59 - * 6 second 1 byte, 0-59 - * 7 usecond 3 bytes, 0-999999 - * 10 - *} - -const - { # of bytes for year, month, and day. } - PyDateTime_DATE_DATASIZE = 4; - - { # of bytes for hour, minute, second, and usecond. } - PyDateTime_TIME_DATASIZE = 6; - - { # of bytes for year, month, day, hour, minute, second, and usecond. } - PyDateTime_DATETIME_DATASIZE = 10; -type - TPyDateTime_Delta = object(TPyObject) - hashcode: Integer; // -1 when unknown - days: Integer; // -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS - seconds: Integer; // 0 <= seconds < 24*3600 is invariant - microseconds: Integer; // 0 <= microseconds < 1000000 is invariant - end; - PPyDateTime_Delta = ^TPyDateTime_Delta; - - TPyDateTime_TZInfo = object(TPyObject) // a pure abstract base clase - end; - PPyDateTime_TZInfo = ^TPyDateTime_TZInfo; - -{ -/* The datetime and time types have hashcodes, and an optional tzinfo member, - * present if and only if hastzinfo is true. - */ -#define _PyTZINFO_HEAD \ - PyObject_HEAD \ - long hashcode; \ - char hastzinfo; /* boolean flag */ -} - -{* No _PyDateTime_BaseTZInfo is allocated; it's just to have something - * convenient to cast to, when getting at the hastzinfo member of objects - * starting with _PyTZINFO_HEAD. - *} - TPyDateTime_BaseTZInfo = object(TPyObject) - hashcode: Integer; - hastzinfo: bool; // boolean flag - end; - PPyDateTime_BaseTZInfo = ^TPyDateTime_BaseTZInfo; - -{* All time objects are of PyDateTime_TimeType, but that can be allocated - * in two ways, with or without a tzinfo member. Without is the same as - * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an - * internal struct used to allocate the right amount of space for the - * "without" case. - *} -{#define _PyDateTime_TIMEHEAD \ - _PyTZINFO_HEAD \ - unsigned char data[_PyDateTime_TIME_DATASIZE]; -} - - TPyDateTime_BaseTime = object(TPyDateTime_BaseTZInfo) - data: array[0..Pred(PyDateTime_TIME_DATASIZE)] of Byte; - end; - PPyDateTime_BaseTime = ^TPyDateTime_BaseTime; - - TPyDateTime_Time = object(TPyDateTime_BaseTime) // hastzinfo true - tzinfo: PPyObject; - end; - PPyDateTime_Time = ^PyDateTime_Time; - -{* All datetime objects are of PyDateTime_DateTimeType, but that can be - * allocated in two ways too, just like for time objects above. In addition, - * the plain date type is a base class for datetime, so it must also have - * a hastzinfo member (although it's unused there). - *} - TPyDateTime_Date = object(TPyDateTime_BaseTZInfo) - data: array [0..Pred(PyDateTime_DATE_DATASIZE)] of Byte; - end; - PPyDateTime_Date = ^TPyDateTime_Date; - - { -#define _PyDateTime_DATETIMEHEAD \ - _PyTZINFO_HEAD \ - unsigned char data[_PyDateTime_DATETIME_DATASIZE]; -} - - TPyDateTime_BaseDateTime = object(TPyDateTime_BaseTZInfo) // hastzinfo false - data: array[0..Pred(PyDateTime_DATETIME_DATASIZE)] of Byte; - end; - PPyDateTime_BaseDateTime = ^TPyDateTime_BaseDateTime; - - TPyDateTime_DateTime = object(TPyDateTime_BaseTZInfo) // hastzinfo true - data: array[0..Pred(PyDateTime_DATETIME_DATASIZE)] of Byte; - tzinfo: PPyObject; - end; - PPyDateTime_DateTime = ^TPyDateTime_DateTime; - - -//####################################################### -//## ## -//## New exception classes ## -//## ## -//####################################################### -(* - // Python's exceptions - EPythonError = object(Exception) - EName: String; - EValue: String; - end; - EPyExecError = object(EPythonError) - end; - - // Standard exception classes of Python - -/// jah 29-sep-2000: updated for python 2.0 -/// base classes updated according python documentation - -{ Hierarchy of Python exceptions, Python 2.3, copied from \Python\exceptions.c - -Exception\n\ - |\n\ - +-- SystemExit\n\ - +-- StopIteration\n\ - +-- StandardError\n\ - | |\n\ - | +-- KeyboardInterrupt\n\ - | +-- ImportError\n\ - | +-- EnvironmentError\n\ - | | |\n\ - | | +-- IOError\n\ - | | +-- OSError\n\ - | | |\n\ - | | +-- WindowsError\n\ - | | +-- VMSError\n\ - | |\n\ - | +-- EOFError\n\ - | +-- RuntimeError\n\ - | | |\n\ - | | +-- NotImplementedError\n\ - | |\n\ - | +-- NameError\n\ - | | |\n\ - | | +-- UnboundLocalError\n\ - | |\n\ - | +-- AttributeError\n\ - | +-- SyntaxError\n\ - | | |\n\ - | | +-- IndentationError\n\ - | | |\n\ - | | +-- TabError\n\ - | |\n\ - | +-- TypeError\n\ - | +-- AssertionError\n\ - | +-- LookupError\n\ - | | |\n\ - | | +-- IndexError\n\ - | | +-- KeyError\n\ - | |\n\ - | +-- ArithmeticError\n\ - | | |\n\ - | | +-- OverflowError\n\ - | | +-- ZeroDivisionError\n\ - | | +-- FloatingPointError\n\ - | |\n\ - | +-- ValueError\n\ - | | |\n\ - | | +-- UnicodeError\n\ - | | |\n\ - | | +-- UnicodeEncodeError\n\ - | | +-- UnicodeDecodeError\n\ - | | +-- UnicodeTranslateError\n\ - | |\n\ - | +-- ReferenceError\n\ - | +-- SystemError\n\ - | +-- MemoryError\n\ - |\n\ - +---Warning\n\ - |\n\ - +-- UserWarning\n\ - +-- DeprecationWarning\n\ - +-- PendingDeprecationWarning\n\ - +-- SyntaxWarning\n\ - +-- OverflowWarning\n\ - +-- RuntimeWarning\n\ - +-- FutureWarning" -} - EPyException = class (EPythonError); - EPyStandardError = class (EPyException); - EPyArithmeticError = class (EPyStandardError); - EPyLookupError = class (EPyStandardError); - EPyAssertionError = class (EPyStandardError); - EPyAttributeError = class (EPyStandardError); - EPyEOFError = class (EPyStandardError); - EPyFloatingPointError = class (EPyArithmeticError); - EPyEnvironmentError = class (EPyStandardError); - EPyIOError = class (EPyEnvironmentError); - EPyOSError = class (EPyEnvironmentError); - EPyImportError = class (EPyStandardError); - EPyIndexError = class (EPyLookupError); - EPyKeyError = class (EPyLookupError); - EPyKeyboardInterrupt = class (EPyStandardError); - EPyMemoryError = class (EPyStandardError); - EPyNameError = class (EPyStandardError); - EPyOverflowError = class (EPyArithmeticError); - EPyRuntimeError = class (EPyStandardError); - EPyNotImplementedError = class (EPyRuntimeError); - EPySyntaxError = class (EPyStandardError) - public - EFileName: string; - ELineStr: string; - ELineNumber: Integer; - EOffset: Integer; - end; - EPyIndentationError = class (EPySyntaxError); - EPyTabError = class (EPyIndentationError); - EPySystemError = class (EPyStandardError); - EPySystemExit = class (EPyException); - EPyTypeError = class (EPyStandardError); - EPyUnboundLocalError = class (EPyNameError); - EPyValueError = class (EPyStandardError); - EPyUnicodeError = class (EPyValueError); - UnicodeEncodeError = class (EPyUnicodeError); - UnicodeDecodeError = class (EPyUnicodeError); - UnicodeTranslateError = class (EPyUnicodeError); - EPyZeroDivisionError = class (EPyArithmeticError); - EPyStopIteration = class(EPyException); - EPyWarning = class (EPyException); - EPyUserWarning = class (EPyWarning); - EPyDeprecationWarning = class (EPyWarning); - PendingDeprecationWarning = class (EPyWarning); - FutureWarning = class (EPyWarning); - EPySyntaxWarning = class (EPyWarning); - EPyOverflowWarning = class (EPyWarning); - EPyRuntimeWarning = class (EPyWarning); - EPyReferenceError = class (EPyStandardError); -*) - -var - PyArg_Parse: function(args: PPyObject; format: PChar): - Integer; cdecl;// varargs; - PyArg_ParseTuple: function(args: PPyObject; format: PChar; - x1: Pointer = nil; - x2: Pointer = nil; - x3: Pointer = nil): - Integer; cdecl;// varargs - Py_BuildValue: function(format: PChar): PPyObject; cdecl; // varargs - PyCode_Addr2Line: function (co: PPyCodeObject; addrq: Integer): Integer; cdecl; - DLL_Py_GetBuildInfo: function: PChar; cdecl; - - // define Python flags. See file pyDebug.h - Py_DebugFlag: PInt; - Py_VerboseFlag: PInt; - Py_InteractiveFlag: PInt; - Py_OptimizeFlag: PInt; - Py_NoSiteFlag: PInt; - Py_UseClassExceptionsFlag: PInt; - Py_FrozenFlag: PInt; - Py_TabcheckFlag: PInt; - Py_UnicodeFlag: PInt; - Py_IgnoreEnvironmentFlag: PInt; - Py_DivisionWarningFlag: PInt; - //_PySys_TraceFunc: PPPyObject; - //_PySys_ProfileFunc: PPPPyObject; - - PyImport_FrozenModules: PP_frozen; - - Py_None: PPyObject; - Py_Ellipsis: PPyObject; - Py_False: PPyIntObject; - Py_True: PPyIntObject; - Py_NotImplemented: PPyObject; - - PyExc_AttributeError: PPPyObject; - PyExc_EOFError: PPPyObject; - PyExc_IOError: PPPyObject; - PyExc_ImportError: PPPyObject; - PyExc_IndexError: PPPyObject; - PyExc_KeyError: PPPyObject; - PyExc_KeyboardInterrupt: PPPyObject; - PyExc_MemoryError: PPPyObject; - PyExc_NameError: PPPyObject; - PyExc_OverflowError: PPPyObject; - PyExc_RuntimeError: PPPyObject; - PyExc_SyntaxError: PPPyObject; - PyExc_SystemError: PPPyObject; - PyExc_SystemExit: PPPyObject; - PyExc_TypeError: PPPyObject; - PyExc_ValueError: PPPyObject; - PyExc_ZeroDivisionError: PPPyObject; - PyExc_ArithmeticError: PPPyObject; - PyExc_Exception: PPPyObject; - PyExc_FloatingPointError: PPPyObject; - PyExc_LookupError: PPPyObject; - PyExc_StandardError: PPPyObject; - PyExc_AssertionError: PPPyObject; - PyExc_EnvironmentError: PPPyObject; - PyExc_IndentationError: PPPyObject; - PyExc_MemoryErrorInst: PPPyObject; - PyExc_NotImplementedError: PPPyObject; - PyExc_OSError: PPPyObject; - PyExc_TabError: PPPyObject; - PyExc_UnboundLocalError: PPPyObject; - PyExc_UnicodeError: PPPyObject; - - PyExc_Warning: PPPyObject; - PyExc_DeprecationWarning: PPPyObject; - PyExc_RuntimeWarning: PPPyObject; - PyExc_SyntaxWarning: PPPyObject; - PyExc_UserWarning: PPPyObject; - PyExc_OverflowWarning: PPPyObject; - PyExc_ReferenceError: PPPyObject; - PyExc_StopIteration: PPPyObject; - PyExc_FutureWarning: PPPyObject; - PyExc_PendingDeprecationWarning: PPPyObject; - PyExc_UnicodeDecodeError: PPPyObject; - PyExc_UnicodeEncodeError: PPPyObject; - PyExc_UnicodeTranslateError: PPPyObject; - - PyType_Type: PPyTypeObject; - PyCFunction_Type: PPyTypeObject; - PyCObject_Type: PPyTypeObject; - PyClass_Type: PPyTypeObject; - PyCode_Type: PPyTypeObject; - PyComplex_Type: PPyTypeObject; - PyDict_Type: PPyTypeObject; - PyFile_Type: PPyTypeObject; - PyFloat_Type: PPyTypeObject; - PyFrame_Type: PPyTypeObject; - PyFunction_Type: PPyTypeObject; - PyInstance_Type: PPyTypeObject; - PyInt_Type: PPyTypeObject; - PyList_Type: PPyTypeObject; - PyLong_Type: PPyTypeObject; - PyMethod_Type: PPyTypeObject; - PyModule_Type: PPyTypeObject; - PyObject_Type: PPyTypeObject; - PyRange_Type: PPyTypeObject; - PySlice_Type: PPyTypeObject; - PyString_Type: PPyTypeObject; - PyTuple_Type: PPyTypeObject; - - PyBaseObject_Type: PPyTypeObject; - PyBuffer_Type: PPyTypeObject; - PyCallIter_Type: PPyTypeObject; - PyCell_Type: PPyTypeObject; - PyClassMethod_Type: PPyTypeObject; - PyProperty_Type: PPyTypeObject; - PySeqIter_Type: PPyTypeObject; - PyStaticMethod_Type: PPyTypeObject; - PySuper_Type: PPyTypeObject; - PySymtableEntry_Type: PPyTypeObject; - PyTraceBack_Type: PPyTypeObject; - PyUnicode_Type: PPyTypeObject; - PyWrapperDescr_Type: PPyTypeObject; - - PyBaseString_Type: PPyTypeObject; - PyBool_Type: PPyTypeObject; - PyEnum_Type: PPyTypeObject; - - //PyArg_GetObject: function(args: PPyObject; nargs, i: integer; p_a: PPPyObject): integer; cdecl; - //PyArg_GetLong: function(args: PPyObject; nargs, i: integer; p_a: PLong): integer; cdecl; - //PyArg_GetShort: function(args: PPyObject; nargs, i: integer; p_a: PShort): integer; cdecl; - //PyArg_GetFloat: function(args: PPyObject; nargs, i: integer; p_a: PFloat): integer; cdecl; - //PyArg_GetString: function(args: PPyObject; nargs, i: integer; p_a: PString): integer; cdecl; - //PyArgs_VaParse: function (args: PPyObject; format: PChar; va_list: array of const): integer; cdecl; - // Does not work! - // Py_VaBuildValue: function (format: PChar; va_list: array of const): PPyObject; cdecl; - //PyBuiltin_Init: procedure; cdecl; - - PyComplex_FromCComplex: function(c: TPy_complex):PPyObject; cdecl; - PyComplex_FromDoubles: function(realv,imag: double):PPyObject; cdecl; - PyComplex_RealAsDouble: function(op: PPyObject): double; cdecl; - PyComplex_ImagAsDouble: function(op: PPyObject): double; cdecl; - PyComplex_AsCComplex: function(op: PPyObject): TPy_complex; cdecl; - PyCFunction_GetFunction: function(ob: PPyObject): Pointer; cdecl; - PyCFunction_GetSelf: function(ob: PPyObject): PPyObject; cdecl; - PyCallable_Check: function(ob : PPyObject): integer; cdecl; - PyCObject_FromVoidPtr: function(cobj, destruct: Pointer): PPyObject; cdecl; - PyCObject_AsVoidPtr: function(ob: PPyObject): Pointer; cdecl; - PyClass_New: function (ob1,ob2,ob3: PPyObject): PPyObject; cdecl; - PyClass_IsSubclass: function (ob1, ob2: PPyObject): integer cdecl; - - Py_InitModule4: function(name: PChar; methods: PPyMethodDef; doc: PChar; - passthrough: PPyObject; Api_Version: Integer):PPyObject; cdecl; - PyErr_BadArgument: function: integer; cdecl; - PyErr_BadInternalCall: procedure; cdecl; - PyErr_CheckSignals: function: integer; cdecl; - PyErr_Clear: procedure; cdecl; - PyErr_Fetch: procedure(errtype, errvalue, errtraceback: PPPyObject); cdecl; - PyErr_NoMemory: function: PPyObject; cdecl; - PyErr_Occurred: function: PPyObject; cdecl; - PyErr_Print: procedure; cdecl; - PyErr_Restore: procedure (errtype, errvalue, errtraceback: PPyObject); cdecl; - PyErr_SetFromErrno: function (ob: PPyObject):PPyObject; cdecl; - PyErr_SetNone: procedure(value: PPyObject); cdecl; - PyErr_SetObject: procedure (ob1, ob2 : PPyObject); cdecl; - PyErr_SetString: procedure(ErrorObject: PPyObject; text: PChar); cdecl; - PyImport_GetModuleDict: function: PPyObject; cdecl; - PyInt_FromLong: function(x: LongInt):PPyObject; cdecl; - Py_Initialize: procedure; cdecl; - Py_Exit: procedure(RetVal: Integer); cdecl; - PyEval_GetBuiltins: function: PPyObject; cdecl; - PyDict_GetItem: function(mp, key: PPyObject):PPyObject; cdecl; - PyDict_SetItem: function(mp, key, item:PPyObject):integer; cdecl; - PyDict_DelItem: function(mp, key: PPyObject):integer; cdecl; - PyDict_Clear: procedure(mp: PPyObject); cdecl; - PyDict_Next: function(mp: PPyObject; pos: PInt; key, value: PPPyObject):integer; cdecl; - PyDict_Keys: function(mp: PPyObject):PPyObject; cdecl; - PyDict_Values: function(mp: PPyObject):PPyObject; cdecl; - PyDict_Items: function(mp: PPyObject):PPyObject; cdecl; - PyDict_Size: function(mp: PPyObject):integer; cdecl; - PyDict_DelItemString: function(dp: PPyObject;key: PChar):integer; cdecl; - PyDict_New: function: PPyObject; cdecl; - PyDict_GetItemString: function(dp: PPyObject; key: PChar): PPyObject; cdecl; - PyDict_SetItemString: function(dp: PPyObject; key: PChar; item: PPyObject): - Integer; cdecl; - PyDictProxy_New: function (obj: PPyObject): PPyObject; cdecl; - PyModule_GetDict: function(module:PPyObject): PPyObject; cdecl; - PyObject_Str: function(v: PPyObject): PPyObject; cdecl; - PyRun_String: function(str: PChar; start: Integer; globals: PPyObject; - locals: PPyObject): PPyObject; cdecl; - PyRun_SimpleString: function(str: PChar): Integer; cdecl; - PyString_AsString: function(ob: PPyObject): PChar; cdecl; - PyString_FromString: function(str: PChar): PPyObject; cdecl; - PySys_SetArgv: procedure(argc: Integer; argv: PPChar); cdecl; - -{+ means, Grzegorz or me has tested his non object version of this function} -{+} PyCFunction_New: function(md:PPyMethodDef;ob:PPyObject):PPyObject; cdecl; -{+} PyEval_CallObject: function(ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyEval_CallObjectWithKeywords:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl; -{-} PyEval_GetFrame:function:PPyObject; cdecl; -{-} PyEval_GetGlobals:function:PPyObject; cdecl; -{-} PyEval_GetLocals:function:PPyObject; cdecl; -{-} //PyEval_GetOwner:function:PPyObject; cdecl; -{-} PyEval_GetRestricted:function:integer; cdecl; - -{-} PyEval_InitThreads:procedure; cdecl; -{-} PyEval_RestoreThread:procedure(tstate: PPyThreadState); cdecl; -{-} PyEval_SaveThread:function:PPyThreadState; cdecl; - -{-} PyFile_FromString:function (pc1,pc2:PChar):PPyObject; cdecl; -{-} PyFile_GetLine:function (ob:PPyObject;i:integer):PPyObject; cdecl; -{-} PyFile_Name:function (ob:PPyObject):PPyObject; cdecl; -{-} PyFile_SetBufSize:procedure(ob:PPyObject;i:integer); cdecl; -{-} PyFile_SoftSpace:function (ob:PPyObject;i:integer):integer; cdecl; -{-} PyFile_WriteObject:function (ob1,ob2:PPyObject;i:integer):integer; cdecl; -{-} PyFile_WriteString:procedure(s:PChar;ob:PPyObject); cdecl; -{+} PyFloat_AsDouble:function (ob:PPyObject):DOUBLE; cdecl; -{+} PyFloat_FromDouble:function (db:double):PPyObject; cdecl; -{-} PyFunction_GetCode:function (ob:PPyObject):PPyObject; cdecl; -{-} PyFunction_GetGlobals:function (ob:PPyObject):PPyObject; cdecl; -{-} PyFunction_New:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyImport_AddModule:function (name:PChar):PPyObject; cdecl; -{-} PyImport_Cleanup:procedure; cdecl; -{-} PyImport_GetMagicNumber:function:LONGINT; cdecl; -{+} PyImport_ImportFrozenModule:function (key:PChar):integer; cdecl; -{+} PyImport_ImportModule:function (name:PChar):PPyObject; cdecl; -{+} PyImport_Import:function (name:PPyObject):PPyObject; cdecl; -{-} //PyImport_Init:procedure; cdecl; -{-} PyImport_ReloadModule:function (ob:PPyObject):PPyObject; cdecl; -{-} PyInstance_New:function (obClass, obArg, obKW:PPyObject):PPyObject; cdecl; -{+} PyInt_AsLong:function (ob:PPyObject):LONGINT; cdecl; -{-} PyList_Append:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PyList_AsTuple:function (ob:PPyObject):PPyObject; cdecl; -{+} PyList_GetItem:function (ob:PPyObject;i:integer):PPyObject; cdecl; -{-} PyList_GetSlice:function (ob:PPyObject;i1,i2:integer):PPyObject; cdecl; -{-} PyList_Insert:function (dp:PPyObject;idx:Integer;item:PPyObject):integer; cdecl; -{-} PyList_New:function (size:integer):PPyObject; cdecl; -{-} PyList_Reverse:function (ob:PPyObject):integer; cdecl; -{-} PyList_SetItem:function (dp:PPyObject;idx:Integer;item:PPyObject):integer; cdecl; -{-} PyList_SetSlice:function (ob:PPyObject;i1,i2:integer;ob2:PPyObject):integer; cdecl; -{+} PyList_Size:function (ob:PPyObject):integer; cdecl; -{-} PyList_Sort:function (ob:PPyObject):integer; cdecl; -{-} PyLong_AsDouble:function (ob:PPyObject):DOUBLE; cdecl; -{+} PyLong_AsLong:function (ob:PPyObject):LONGINT; cdecl; -{+} PyLong_FromDouble:function (db:double):PPyObject; cdecl; -{+} PyLong_FromLong:function (l:longint):PPyObject; cdecl; -{-} PyLong_FromString:function (pc:PChar;var ppc:PChar;i:integer):PPyObject; cdecl; -{-} PyLong_FromUnsignedLong:function(val:cardinal): PPyObject; cdecl; -{-} PyLong_AsUnsignedLong:function(ob:PPyObject): Cardinal; cdecl; -{-} PyLong_FromUnicode:function(ob:PPyObject; a, b: integer): PPyObject; cdecl; -{-} PyLong_FromLongLong:function(val:Int64): PPyObject; cdecl; -{-} PyLong_AsLongLong:function(ob:PPyObject): Int64; cdecl; -{-} PyMapping_Check:function (ob:PPyObject):integer; cdecl; -{-} PyMapping_GetItemString:function (ob:PPyObject;key:PChar):PPyObject; cdecl; -{-} PyMapping_HasKey:function (ob,key:PPyObject):integer; cdecl; -{-} PyMapping_HasKeyString:function (ob:PPyObject;key:PChar):integer; cdecl; -{-} PyMapping_Length:function (ob:PPyObject):integer; cdecl; -{-} PyMapping_SetItemString:function (ob:PPyObject; key:PChar; value:PPyObject):integer; cdecl; -{-} PyMethod_Class:function (ob:PPyObject):PPyObject; cdecl; -{-} PyMethod_Function:function (ob:PPyObject):PPyObject; cdecl; -{-} PyMethod_New:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl; -{-} PyMethod_Self:function (ob:PPyObject):PPyObject; cdecl; -{-} PyModule_GetName:function (ob:PPyObject):PChar; cdecl; -{-} PyModule_New:function (key:PChar):PPyObject; cdecl; -{-} PyNumber_Absolute:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Add:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_And:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Check:function (ob:PPyObject):integer; cdecl; -{-} PyNumber_Coerce:function (var ob1,ob2:PPyObject):integer; cdecl; -{-} PyNumber_Divide:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_FloorDivide:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_TrueDivide:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Divmod:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Float:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Int:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Invert:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Long:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Lshift:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Multiply:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Negative:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Or:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Positive:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Power:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl; -{-} PyNumber_Remainder:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Rshift:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Subtract:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Xor:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyOS_InitInterrupts:procedure; cdecl; -{-} PyOS_InterruptOccurred:function:integer; cdecl; -{-} PyObject_CallObject:function (ob,args:PPyObject):PPyObject; cdecl; -{-} PyObject_Compare:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PyObject_GetAttr:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{+} PyObject_GetAttrString:function (ob:PPyObject;c:PChar):PPyObject; cdecl; -{-} PyObject_GetItem:function (ob,key:PPyObject):PPyObject; cdecl; -{-} PyObject_DelItem:function (ob,key:PPyObject):PPyObject; cdecl; -{-} PyObject_HasAttrString:function (ob:PPyObject;key:PChar):integer; cdecl; -{-} PyObject_Hash:function (ob:PPyObject):LONGINT; cdecl; -{-} PyObject_IsTrue:function (ob:PPyObject):integer; cdecl; -{-} PyObject_Length:function (ob:PPyObject):integer; cdecl; -{-} PyObject_Repr:function (ob:PPyObject):PPyObject; cdecl; -{-} PyObject_SetAttr:function (ob1,ob2,ob3:PPyObject):integer; cdecl; -{-} PyObject_SetAttrString:function (ob:PPyObject;key:Pchar;value:PPyObject):integer; cdecl; -{-} PyObject_SetItem:function (ob1,ob2,ob3:PPyObject):integer; cdecl; -{-} PyObject_Init:function (ob:PPyObject; t:PPyTypeObject):PPyObject; cdecl; -{-} PyObject_InitVar:function (ob:PPyObject; t:PPyTypeObject; size:integer):PPyObject; cdecl; -{-} PyObject_New:function (t:PPyTypeObject):PPyObject; cdecl; -{-} PyObject_NewVar:function (t:PPyTypeObject; size:integer):PPyObject; cdecl; - PyObject_Free:procedure (ob:PPyObject); cdecl; -{-} PyObject_IsInstance:function (inst, cls:PPyObject):integer; cdecl; -{-} PyObject_IsSubclass:function (derived, cls:PPyObject):integer; cdecl; - PyObject_GenericGetAttr:function (obj, name: PPyObject): PPyObject; cdecl; - PyObject_GenericSetAttr:function (obj, name, value: PPyObject): Integer; cdecl; -{-} PyObject_GC_Malloc:function (size:integer):PPyObject; cdecl; -{-} PyObject_GC_New:function (t:PPyTypeObject):PPyObject; cdecl; -{-} PyObject_GC_NewVar:function (t:PPyTypeObject; size:integer):PPyObject; cdecl; -{-} PyObject_GC_Resize:function (t:PPyObject; newsize:integer):PPyObject; cdecl; -{-} PyObject_GC_Del:procedure (ob:PPyObject); cdecl; -{-} PyObject_GC_Track:procedure (ob:PPyObject); cdecl; -{-} PyObject_GC_UnTrack:procedure (ob:PPyObject); cdecl; -{-} PyRange_New:function (l1,l2,l3:longint;i:integer):PPyObject; cdecl; -{-} PySequence_Check:function (ob:PPyObject):integer; cdecl; -{-} PySequence_Concat:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PySequence_Count:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PySequence_GetItem:function (ob:PPyObject;i:integer):PPyObject; cdecl; -{-} PySequence_GetSlice:function (ob:PPyObject;i1,i2:integer):PPyObject; cdecl; -{-} PySequence_In:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PySequence_Index:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PySequence_Length:function (ob:PPyObject):integer; cdecl; -{-} PySequence_Repeat:function (ob:PPyObject;count:integer):PPyObject; cdecl; -{-} PySequence_SetItem:function (ob:PPyObject;i:integer;value:PPyObject):integer; cdecl; -{-} PySequence_SetSlice:function (ob:PPyObject;i1,i2:integer;value:PPyObject):integer; cdecl; -{-} PySequence_DelSlice:function (ob:PPyObject;i1,i2:integer):integer; cdecl; -{-} PySequence_Tuple:function (ob:PPyObject):PPyObject; cdecl; -{-} PySequence_Contains:function (ob, value:PPyObject):integer; cdecl; -{-} PySlice_GetIndices:function (ob:PPySliceObject;length:integer;var start,stop,step:integer):integer; cdecl; -{-} PySlice_GetIndicesEx:function (ob:PPySliceObject;length:integer;var start,stop,step,slicelength:integer):integer; cdecl; -{-} PySlice_New:function (start,stop,step:PPyObject):PPyObject; cdecl; -{-} PyString_Concat:procedure(var ob1:PPyObject;ob2:PPyObject); cdecl; -{-} PyString_ConcatAndDel:procedure(var ob1:PPyObject;ob2:PPyObject); cdecl; -{-} PyString_Format:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyString_FromStringAndSize:function (s:PChar;i:integer):PPyObject; cdecl; -{-} PyString_Size:function (ob:PPyObject):integer; cdecl; -{-} PyString_DecodeEscape:function(s:PChar; len:integer; errors:PChar; unicode:integer; recode_encoding:PChar):PPyObject; cdecl; -{-} PyString_Repr:function(ob:PPyObject; smartquotes:integer):PPyObject; cdecl; -{+} PySys_GetObject:function (s:PChar):PPyObject; cdecl; -{-} //PySys_Init:procedure; cdecl; -{-} PySys_SetObject:function (s:PChar;ob:PPyObject):integer; cdecl; -{-} PySys_SetPath:procedure(path:PChar); cdecl; -{-} //PyTraceBack_Fetch:function:PPyObject; cdecl; -{-} PyTraceBack_Here:function (p:pointer):integer; cdecl; -{-} PyTraceBack_Print:function (ob1,ob2:PPyObject):integer; cdecl; -{-} //PyTraceBack_Store:function (ob:PPyObject):integer; cdecl; -{+} PyTuple_GetItem:function (ob:PPyObject;i:integer):PPyObject; cdecl; -{-} PyTuple_GetSlice:function (ob:PPyObject;i1,i2:integer):PPyObject; cdecl; -{+} PyTuple_New:function (size:Integer):PPyObject; cdecl; -{+} PyTuple_SetItem:function (ob:PPyObject;key:integer;value:PPyObject):integer; cdecl; -{+} PyTuple_Size:function (ob:PPyObject):integer; cdecl; -{+} PyType_IsSubtype:function (a, b: PPyTypeObject):integer; cdecl; - PyType_GenericAlloc:function(atype: PPyTypeObject; nitems:Integer): PPyObject; cdecl; - PyType_GenericNew:function(atype: PPyTypeObject; args, kwds: PPyObject): PPyObject; cdecl; - PyType_Ready:function(atype: PPyTypeObject): integer; cdecl; -{+} PyUnicode_FromWideChar:function (const w:PWideChar; size:integer):PPyObject; cdecl; -{+} PyUnicode_AsWideChar:function (unicode: PPyObject; w:PWideChar; size:integer):integer; cdecl; -{-} PyUnicode_FromOrdinal:function (ordinal:integer):PPyObject; cdecl; - PyWeakref_GetObject: function (ref: PPyObject): PPyObject; cdecl; - PyWeakref_NewProxy: function (ob, callback: PPyObject): PPyObject; cdecl; - PyWeakref_NewRef: function (ob, callback: PPyObject): PPyObject; cdecl; - PyWrapper_New: function (ob1, ob2: PPyObject): PPyObject; cdecl; - PyBool_FromLong: function (ok: Integer): PPyObject; cdecl; -{-} Py_AtExit:function (proc: procedure):integer; cdecl; -{-} //Py_Cleanup:procedure; cdecl; -{-} Py_CompileString:function (s1,s2:PChar;i:integer):PPyObject; cdecl; -{-} Py_FatalError:procedure(s:PChar); cdecl; -{-} Py_FindMethod:function (md:PPyMethodDef;ob:PPyObject;key:PChar):PPyObject; cdecl; -{-} Py_FindMethodInChain:function (mc:PPyMethodChain;ob:PPyObject;key:PChar):PPyObject; cdecl; -{-} Py_FlushLine:procedure; cdecl; -{+} Py_Finalize: procedure; cdecl; -{-} PyErr_ExceptionMatches: function (exc: PPyObject): Integer; cdecl; -{-} PyErr_GivenExceptionMatches: function (raised_exc, exc: PPyObject): Integer; cdecl; -{-} PyEval_EvalCode: function (co: PPyCodeObject; globals, locals: PPyObject): PPyObject; cdecl; -{+} Py_GetVersion: function: PChar; cdecl; -{+} Py_GetCopyright: function: PChar; cdecl; -{+} Py_GetExecPrefix: function: PChar; cdecl; -{+} Py_GetPath: function: PChar; cdecl; -{+} Py_GetPrefix: function: PChar; cdecl; -{+} Py_GetProgramName: function: PChar; cdecl; - -{-} PyParser_SimpleParseString: function (str: PChar; start: Integer): PNode; cdecl; -{-} PyNode_Free: procedure(n: PNode); cdecl; -{-} PyErr_NewException: function (name: PChar; base, dict: PPyObject): PPyObject; cdecl; -{-} Py_Malloc: function (size: Integer): Pointer; -{-} PyMem_Malloc: function (size: Integer): Pointer; -{-} PyObject_CallMethod: function (obj: PPyObject; method, format: PChar): PPyObject; cdecl; - -{New exported Objects in Python 1.5} - Py_SetProgramName: procedure(name: PChar); cdecl; - Py_IsInitialized: function: integer; cdecl; - Py_GetProgramFullPath: function: PChar; cdecl; - Py_NewInterpreter: function: PPyThreadState; cdecl; - Py_EndInterpreter: procedure(tstate: PPyThreadState); cdecl; - PyEval_AcquireLock: procedure; cdecl; - PyEval_ReleaseLock: procedure; cdecl; - PyEval_AcquireThread: procedure(tstate: PPyThreadState); cdecl; - PyEval_ReleaseThread: procedure(tstate: PPyThreadState); cdecl; - PyInterpreterState_New: function: PPyInterpreterState; cdecl; - PyInterpreterState_Clear: procedure(interp: PPyInterpreterState); cdecl; - PyInterpreterState_Delete: procedure(interp: PPyInterpreterState); cdecl; - PyThreadState_New: function (interp: PPyInterpreterState): PPyThreadState; cdecl; - PyThreadState_Clear: procedure(tstate: PPyThreadState); cdecl; - PyThreadState_Delete: procedure(tstate: PPyThreadState); cdecl; - PyThreadState_Get: function: PPyThreadState; cdecl; - PyThreadState_Swap: function (tstate: PPyThreadState): PPyThreadState; cdecl; - -{Further exported Objects, may be implemented later} -{ - PyCode_New: Pointer; - PyErr_SetInterrupt: Pointer; - PyFile_AsFile: Pointer; - PyFile_FromFile: Pointer; - PyFloat_AsString: Pointer; - PyFrame_BlockPop: Pointer; - PyFrame_BlockSetup: Pointer; - PyFrame_ExtendStack: Pointer; - PyFrame_FastToLocals: Pointer; - PyFrame_LocalsToFast: Pointer; - PyFrame_New: Pointer; - PyGrammar_AddAccelerators: Pointer; - PyGrammar_FindDFA: Pointer; - PyGrammar_LabelRepr: Pointer; - PyInstance_DoBinOp: Pointer; - PyInt_GetMax: Pointer; - PyMarshal_Init: Pointer; - PyMarshal_ReadLongFromFile: Pointer; - PyMarshal_ReadObjectFromFile: Pointer; - PyMarshal_ReadObjectFromString: Pointer; - PyMarshal_WriteLongToFile: Pointer; - PyMarshal_WriteObjectToFile: Pointer; - PyMember_Get: Pointer; - PyMember_Set: Pointer; - PyNode_AddChild: Pointer; - PyNode_Compile: Pointer; - PyNode_New: Pointer; - PyOS_GetLastModificationTime: Pointer; - PyOS_Readline: Pointer; - PyOS_strtol: Pointer; - PyOS_strtoul: Pointer; - PyObject_CallFunction: Pointer; - PyObject_CallMethod: Pointer; - PyObject_Print: Pointer; - PyParser_AddToken: Pointer; - PyParser_Delete: Pointer; - PyParser_New: Pointer; - PyParser_ParseFile: Pointer; - PyParser_ParseString: Pointer; - PyParser_SimpleParseFile: Pointer; - PyRun_AnyFile: Pointer; - PyRun_File: Pointer; - PyRun_InteractiveLoop: Pointer; - PyRun_InteractiveOne: Pointer; - PyRun_SimpleFile: Pointer; - PySys_GetFile: Pointer; - PyToken_OneChar: Pointer; - PyToken_TwoChars: Pointer; - PyTokenizer_Free: Pointer; - PyTokenizer_FromFile: Pointer; - PyTokenizer_FromString: Pointer; - PyTokenizer_Get: Pointer; - Py_Main: Pointer; - _PyObject_NewVar: Pointer; - _PyParser_Grammar: Pointer; - _PyParser_TokenNames: Pointer; - _PyThread_Started: Pointer; - _Py_c_diff: Pointer; - _Py_c_neg: Pointer; - _Py_c_pow: Pointer; - _Py_c_prod: Pointer; - _Py_c_quot: Pointer; - _Py_c_sum: Pointer; -} -// functions redefined in Delphi -procedure Py_INCREF(op: PPyObject); -procedure Py_DECREF(op: PPyObject); -procedure Py_XINCREF(op: PPyObject); -procedure Py_XDECREF(op: PPyObject); - -// This function handles all cardinals, pointer types (with no adjustment of pointers!) -// (Extended) floats, which are handled as Python doubles and currencies, handled -// as (normalized) Python doubles. -function PyImport_ExecCodeModule(const name: String; codeobject: PPyObject): PPyObject; -function PyString_Check(obj: PPyObject): Boolean; -function PyString_CheckExact(obj: PPyObject): Boolean; -function PyFloat_Check(obj: PPyObject): Boolean; -function PyFloat_CheckExact(obj: PPyObject): Boolean; -function PyInt_Check(obj: PPyObject): Boolean; -function PyInt_CheckExact(obj: PPyObject): Boolean; -function PyLong_Check(obj: PPyObject): Boolean; -function PyLong_CheckExact(obj: PPyObject): Boolean; -function PyTuple_Check(obj: PPyObject): Boolean; -function PyTuple_CheckExact(obj: PPyObject): Boolean; -function PyInstance_Check(obj: PPyObject): Boolean; -function PyClass_Check(obj: PPyObject): Boolean; -function PyMethod_Check(obj: PPyObject): Boolean; -function PyList_Check(obj: PPyObject): Boolean; -function PyList_CheckExact(obj: PPyObject): Boolean; -function PyDict_Check(obj: PPyObject): Boolean; -function PyDict_CheckExact(obj: PPyObject): Boolean; -function PyModule_Check(obj: PPyObject): Boolean; -function PyModule_CheckExact(obj: PPyObject): Boolean; -function PySlice_Check(obj: PPyObject): Boolean; -function PyFunction_Check(obj: PPyObject): Boolean; -function PyUnicode_Check(obj: PPyObject): Boolean; -function PyUnicode_CheckExact(obj: PPyObject): Boolean; -function PyType_IS_GC(t: PPyTypeObject): Boolean; -function PyObject_IS_GC(obj: PPyObject): Boolean; -function PyWeakref_Check(obj: PPyObject): Boolean; -function PyWeakref_CheckRef(obj: PPyObject): Boolean; -function PyWeakref_CheckProxy(obj: PPyObject): Boolean; -function PyBool_Check(obj: PPyObject): Boolean; -function PyBaseString_Check(obj: PPyObject): Boolean; -function PyEnum_Check(obj: PPyObject): Boolean; -function PyObject_TypeCheck(obj:PPyObject; t:PPyTypeObject): Boolean; -function Py_InitModule(const name: PChar; md: PPyMethodDef): PPyObject; - -function PyType_HasFeature(AType: PPyTypeObject; AFlag: Integer): Boolean; - -implementation - -procedure Py_INCREF(op: PPyObject); -begin - Inc(op.ob_refcnt); -end; - -procedure Py_DECREF(op: PPyObject); -begin - Dec(op.ob_refcnt); - if op.ob_refcnt = 0 then begin - op.ob_type.tp_dealloc(op); - end; -end; - -procedure Py_XINCREF(op: PPyObject); -begin - if op <> nil then Py_INCREF(op); -end; - -procedure Py_XDECREF(op: PPyObject); -begin - if op <> nil then Py_DECREF(op); -end; - -function PyImport_ExecCodeModule(const name: String; - codeobject: PPyObject): PPyObject; -var - m, d, v, modules: PPyObject; -begin - m:= PyImport_AddModule(PChar(name)); - if m = nil then - begin - Result:= nil; - Exit; - end; - d:= PyModule_GetDict(m); - if PyDict_GetItemString(d, '__builtins__') = nil then - begin - if PyDict_SetItemString(d, '__builtins__', PyEval_GetBuiltins) <> 0 then - begin - Result:= nil; - Exit; - end; - end; - // Remember the fielname as the __file__ attribute - if PyDict_SetItemString(d, '__file__', PPyCodeObject(codeobject).co_filename) <> 0 then - PyErr_Clear(); // Not important enough to report - v:= PyEval_EvalCode(PPyCodeObject(codeobject), d, d); // XXX owner ? - if v = nil then - begin - Result:= nil; - Exit; - end; - Py_XDECREF(v); - modules:= PyImport_GetModuleDict(); - if PyDict_GetItemString(modules, PChar(name)) = nil then - begin - PyErr_SetString(PyExc_ImportError^, PChar(Format('Loaded module %.200s not found in sys.modules', [name]))); - Result:= nil; - Exit; - end; - Py_XINCREF(m); - Result:= m; -end; - -function PyString_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyString_Type); -end; - -function PyString_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyString_Type)); -end; - -function PyFloat_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyFloat_Type); -end; - -function PyFloat_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyFloat_Type)); -end; - -function PyInt_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyInt_Type); -end; - -function PyInt_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyInt_Type)); -end; - -function PyLong_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyLong_Type); -end; - -function PyLong_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyLong_Type)); -end; - -function PyTuple_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyTuple_Type); -end; - -function PyTuple_CheckExact(obj: PPyObject): Boolean; -begin - Result:= ( obj<> nil) and (obj^.ob_type = PPyTypeObject(PyTuple_Type)); -end; - -function PyInstance_Check(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj^.ob_type = PPyTypeObject(PyInstance_Type)); -end; - -function PyClass_Check(obj: PPyObject): Boolean; -begin - Result:= ( obj<> nil) and (obj^.ob_type = PPyTypeObject(PyClass_Type)); -end; - -function PyMethod_Check(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj^.ob_type = PPyTypeObject(PyMethod_Type)); -end; - -function PyList_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyList_Type); -end; - -function PyList_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyList_Type)); -end; - -function PyDict_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyDict_Type); -end; - -function PyDict_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyDict_Type)); -end; - -function PyModule_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyModule_Type); -end; - -function PyModule_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyModule_Type)); -end; - -function PySlice_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PySlice_Type)); -end; - -function PyFunction_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and - ((obj.ob_type = PPyTypeObject(PyCFunction_Type)) or - (obj.ob_type = PPyTypeObject(PyFunction_Type))); -end; - -function PyUnicode_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyUnicode_Type); -end; - -function PyUnicode_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyUnicode_Type)); -end; - -function PyType_IS_GC(t: PPyTypeObject): Boolean; -begin - Result:= PyType_HasFeature(t, Py_TPFLAGS_HAVE_GC); -end; - -function PyObject_IS_GC(obj: PPyObject): Boolean; -begin - Result:= PyType_IS_GC(obj.ob_type) and - ((obj.ob_type.tp_is_gc = nil) or (obj.ob_type.tp_is_gc(obj) = 1)); -end; - -function PyWeakref_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (PyWeakref_CheckRef(obj) or PyWeakref_CheckProxy(obj)); -end; - -function PyWeakref_CheckRef(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj.ob_type = PPyTypeObject(PyWeakref_RefType)); -end; - -function PyWeakref_CheckProxy(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and - ((obj.ob_type = PPyTypeObject(PyWeakref_ProxyType)) or - (obj.ob_type = PPyTypeObject(PyWeakref_CallableProxyType))); -end; - -function PyBool_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj.ob_type = PPyTypeObject(PyBool_Type)); -end; - -function PyBaseString_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyBaseString_Type); -end; - -function PyEnum_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj.ob_type = PPyTypeObject(PyEnum_Type)); -end; - -function PyObject_TypeCheck(obj: PPyObject; t: PPyTypeObject): Boolean; -begin - Result:= (obj<>nil) and (obj.ob_type = t); - if not Result and (obj<>nil) and (t<>nil) then - Result:= PyType_IsSubtype(obj.ob_type, t) = 1; -end; - -function Py_InitModule(const name: PChar; md: PPyMethodDef): PPyObject; -begin - result:= Py_InitModule4(name, md, nil, nil, 1012); -end; - -function PyType_HasFeature(AType: PPyTypeObject; AFlag: Integer): Boolean; -begin - //(((t)->tp_flags & (f)) != 0) - Result:= (AType.tp_flags and AFlag) <> 0; -end; - -procedure init(lib: TLibHandle); -begin - Py_DebugFlag := getProcAddr(lib, 'Py_DebugFlag'); - Py_VerboseFlag := getProcAddr(lib, 'Py_VerboseFlag'); - Py_InteractiveFlag := getProcAddr(lib, 'Py_InteractiveFlag'); - Py_OptimizeFlag := getProcAddr(lib, 'Py_OptimizeFlag'); - Py_NoSiteFlag := getProcAddr(lib, 'Py_NoSiteFlag'); - Py_UseClassExceptionsFlag := getProcAddr(lib, 'Py_UseClassExceptionsFlag'); - Py_FrozenFlag := getProcAddr(lib, 'Py_FrozenFlag'); - Py_TabcheckFlag := getProcAddr(lib, 'Py_TabcheckFlag'); - Py_UnicodeFlag := getProcAddr(lib, 'Py_UnicodeFlag'); - - Py_IgnoreEnvironmentFlag := getProcAddr(lib, 'Py_IgnoreEnvironmentFlag'); - Py_DivisionWarningFlag := getProcAddr(lib, 'Py_DivisionWarningFlag'); - Py_None := getProcAddr(lib, '_Py_NoneStruct'); - Py_Ellipsis := getProcAddr(lib, '_Py_EllipsisObject'); - Py_False := getProcAddr(lib, '_Py_ZeroStruct'); - Py_True := getProcAddr(lib, '_Py_TrueStruct'); - Py_NotImplemented := getProcAddr(lib, '_Py_NotImplementedStruct'); - - PyImport_FrozenModules := getProcAddr(lib, 'PyImport_FrozenModules'); - - PyExc_AttributeError := getProcAddr(lib, 'PyExc_AttributeError'); - PyExc_EOFError := getProcAddr(lib, 'PyExc_EOFError'); - PyExc_IOError := getProcAddr(lib, 'PyExc_IOError'); - PyExc_ImportError := getProcAddr(lib, 'PyExc_ImportError'); - PyExc_IndexError := getProcAddr(lib, 'PyExc_IndexError'); - PyExc_KeyError := getProcAddr(lib, 'PyExc_KeyError'); - PyExc_KeyboardInterrupt := getProcAddr(lib, 'PyExc_KeyboardInterrupt'); - PyExc_MemoryError := getProcAddr(lib, 'PyExc_MemoryError'); - PyExc_NameError := getProcAddr(lib, 'PyExc_NameError'); - PyExc_OverflowError := getProcAddr(lib, 'PyExc_OverflowError'); - PyExc_RuntimeError := getProcAddr(lib, 'PyExc_RuntimeError'); - PyExc_SyntaxError := getProcAddr(lib, 'PyExc_SyntaxError'); - PyExc_SystemError := getProcAddr(lib, 'PyExc_SystemError'); - PyExc_SystemExit := getProcAddr(lib, 'PyExc_SystemExit'); - PyExc_TypeError := getProcAddr(lib, 'PyExc_TypeError'); - PyExc_ValueError := getProcAddr(lib, 'PyExc_ValueError'); - PyExc_ZeroDivisionError := getProcAddr(lib, 'PyExc_ZeroDivisionError'); - PyExc_ArithmeticError := getProcAddr(lib, 'PyExc_ArithmeticError'); - PyExc_Exception := getProcAddr(lib, 'PyExc_Exception'); - PyExc_FloatingPointError := getProcAddr(lib, 'PyExc_FloatingPointError'); - PyExc_LookupError := getProcAddr(lib, 'PyExc_LookupError'); - PyExc_StandardError := getProcAddr(lib, 'PyExc_StandardError'); - - PyExc_AssertionError := getProcAddr(lib, 'PyExc_AssertionError'); - PyExc_EnvironmentError := getProcAddr(lib, 'PyExc_EnvironmentError'); - PyExc_IndentationError := getProcAddr(lib, 'PyExc_IndentationError'); - PyExc_MemoryErrorInst := getProcAddr(lib, 'PyExc_MemoryErrorInst'); - PyExc_NotImplementedError := getProcAddr(lib, 'PyExc_NotImplementedError'); - PyExc_OSError := getProcAddr(lib, 'PyExc_OSError'); - PyExc_TabError := getProcAddr(lib, 'PyExc_TabError'); - PyExc_UnboundLocalError := getProcAddr(lib, 'PyExc_UnboundLocalError'); - PyExc_UnicodeError := getProcAddr(lib, 'PyExc_UnicodeError'); - - PyExc_Warning := getProcAddr(lib, 'PyExc_Warning'); - PyExc_DeprecationWarning := getProcAddr(lib, 'PyExc_DeprecationWarning'); - PyExc_RuntimeWarning := getProcAddr(lib, 'PyExc_RuntimeWarning'); - PyExc_SyntaxWarning := getProcAddr(lib, 'PyExc_SyntaxWarning'); - PyExc_UserWarning := getProcAddr(lib, 'PyExc_UserWarning'); - - PyExc_OverflowWarning := getProcAddr(lib, 'PyExc_OverflowWarning'); - PyExc_ReferenceError := getProcAddr(lib, 'PyExc_ReferenceError'); - PyExc_StopIteration := getProcAddr(lib, 'PyExc_StopIteration'); - - PyExc_FutureWarning := getProcAddr(lib, 'PyExc_FutureWarning'); - PyExc_PendingDeprecationWarning:= getProcAddr(lib, 'PyExc_PendingDeprecationWarning'); - PyExc_UnicodeDecodeError := getProcAddr(lib, 'PyExc_UnicodeDecodeError'); - PyExc_UnicodeEncodeError := getProcAddr(lib, 'PyExc_UnicodeEncodeError'); - PyExc_UnicodeTranslateError:= getProcAddr(lib, 'PyExc_UnicodeTranslateError'); - - PyType_Type := getProcAddr(lib, 'PyType_Type'); - PyCFunction_Type := getProcAddr(lib, 'PyCFunction_Type'); - PyCObject_Type := getProcAddr(lib, 'PyCObject_Type'); - PyClass_Type := getProcAddr(lib, 'PyClass_Type'); - PyCode_Type := getProcAddr(lib, 'PyCode_Type'); - PyComplex_Type := getProcAddr(lib, 'PyComplex_Type'); - PyDict_Type := getProcAddr(lib, 'PyDict_Type'); - PyFile_Type := getProcAddr(lib, 'PyFile_Type'); - PyFloat_Type := getProcAddr(lib, 'PyFloat_Type'); - PyFrame_Type := getProcAddr(lib, 'PyFrame_Type'); - PyFunction_Type := getProcAddr(lib, 'PyFunction_Type'); - PyInstance_Type := getProcAddr(lib, 'PyInstance_Type'); - PyInt_Type := getProcAddr(lib, 'PyInt_Type'); - PyList_Type := getProcAddr(lib, 'PyList_Type'); - PyLong_Type := getProcAddr(lib, 'PyLong_Type'); - PyMethod_Type := getProcAddr(lib, 'PyMethod_Type'); - PyModule_Type := getProcAddr(lib, 'PyModule_Type'); - PyObject_Type := getProcAddr(lib, 'PyObject_Type'); - PyRange_Type := getProcAddr(lib, 'PyRange_Type'); - PySlice_Type := getProcAddr(lib, 'PySlice_Type'); - PyString_Type := getProcAddr(lib, 'PyString_Type'); - PyTuple_Type := getProcAddr(lib, 'PyTuple_Type'); - - PyUnicode_Type := getProcAddr(lib, 'PyUnicode_Type'); - - PyBaseObject_Type := getProcAddr(lib, 'PyBaseObject_Type'); - PyBuffer_Type := getProcAddr(lib, 'PyBuffer_Type'); - PyCallIter_Type := getProcAddr(lib, 'PyCallIter_Type'); - PyCell_Type := getProcAddr(lib, 'PyCell_Type'); - PyClassMethod_Type := getProcAddr(lib, 'PyClassMethod_Type'); - PyProperty_Type := getProcAddr(lib, 'PyProperty_Type'); - PySeqIter_Type := getProcAddr(lib, 'PySeqIter_Type'); - PyStaticMethod_Type := getProcAddr(lib, 'PyStaticMethod_Type'); - PySuper_Type := getProcAddr(lib, 'PySuper_Type'); - PySymtableEntry_Type := getProcAddr(lib, 'PySymtableEntry_Type'); - PyTraceBack_Type := getProcAddr(lib, 'PyTraceBack_Type'); - PyWrapperDescr_Type := getProcAddr(lib, 'PyWrapperDescr_Type'); - - PyBaseString_Type := getProcAddr(lib, 'PyBaseString_Type'); - PyBool_Type := getProcAddr(lib, 'PyBool_Type'); - PyEnum_Type := getProcAddr(lib, 'PyEnum_Type'); - - - //PyArg_GetObject := getProcAddr(lib, 'PyArg_GetObject'); - //PyArg_GetLong := getProcAddr(lib, 'PyArg_GetLong'); - //PyArg_GetShort := getProcAddr(lib, 'PyArg_GetShort'); - //PyArg_GetFloat := getProcAddr(lib, 'PyArg_GetFloat'); - //PyArg_GetString := getProcAddr(lib, 'PyArg_GetString'); - //PyArgs_VaParse := getProcAddr(lib, 'PyArgs_VaParse'); - //Py_VaBuildValue := getProcAddr(lib, 'Py_VaBuildValue'); - //PyBuiltin_Init := getProcAddr(lib, 'PyBuiltin_Init'); - PyComplex_FromCComplex := getProcAddr(lib, 'PyComplex_FromCComplex'); - PyComplex_FromDoubles := getProcAddr(lib, 'PyComplex_FromDoubles'); - PyComplex_RealAsDouble := getProcAddr(lib, 'PyComplex_RealAsDouble'); - PyComplex_ImagAsDouble := getProcAddr(lib, 'PyComplex_ImagAsDouble'); - PyComplex_AsCComplex := getProcAddr(lib, 'PyComplex_AsCComplex'); - PyCFunction_GetFunction := getProcAddr(lib, 'PyCFunction_GetFunction'); - PyCFunction_GetSelf := getProcAddr(lib, 'PyCFunction_GetSelf'); - PyCallable_Check := getProcAddr(lib, 'PyCallable_Check'); - PyCObject_FromVoidPtr := getProcAddr(lib, 'PyCObject_FromVoidPtr'); - PyCObject_AsVoidPtr := getProcAddr(lib, 'PyCObject_AsVoidPtr'); - PyClass_New := getProcAddr(lib, 'PyClass_New'); - PyClass_IsSubclass := getProcAddr(lib, 'PyClass_IsSubclass'); - PyDict_GetItem := getProcAddr(lib, 'PyDict_GetItem'); - PyDict_SetItem := getProcAddr(lib, 'PyDict_SetItem'); - PyDict_DelItem := getProcAddr(lib, 'PyDict_DelItem'); - PyDict_Clear := getProcAddr(lib, 'PyDict_Clear'); - PyDict_Next := getProcAddr(lib, 'PyDict_Next'); - PyDict_Keys := getProcAddr(lib, 'PyDict_Keys'); - PyDict_Values := getProcAddr(lib, 'PyDict_Values'); - PyDict_Items := getProcAddr(lib, 'PyDict_Items'); - PyDict_Size := getProcAddr(lib, 'PyDict_Size'); - PyDict_DelItemString := getProcAddr(lib, 'PyDict_DelItemString'); - PyDictProxy_New := getProcAddr(lib, 'PyDictProxy_New'); - Py_InitModule4 := getProcAddr(lib, 'Py_InitModule4'); - PyErr_Print := getProcAddr(lib, 'PyErr_Print'); - PyErr_SetNone := getProcAddr(lib, 'PyErr_SetNone'); - PyErr_SetObject := getProcAddr(lib, 'PyErr_SetObject'); - PyErr_Restore := getProcAddr(lib, 'PyErr_Restore'); - PyErr_BadArgument := getProcAddr(lib, 'PyErr_BadArgument'); - PyErr_NoMemory := getProcAddr(lib, 'PyErr_NoMemory'); - PyErr_SetFromErrno := getProcAddr(lib, 'PyErr_SetFromErrno'); - PyErr_BadInternalCall := getProcAddr(lib, 'PyErr_BadInternalCall'); - PyErr_CheckSignals := getProcAddr(lib, 'PyErr_CheckSignals'); - PyErr_Occurred := getProcAddr(lib, 'PyErr_Occurred'); - PyErr_Clear := getProcAddr(lib, 'PyErr_Clear'); - PyErr_Fetch := getProcAddr(lib, 'PyErr_Fetch'); - PyErr_SetString := getProcAddr(lib, 'PyErr_SetString'); - PyEval_GetBuiltins := getProcAddr(lib, 'PyEval_GetBuiltins'); - PyImport_GetModuleDict := getProcAddr(lib, 'PyImport_GetModuleDict'); - PyInt_FromLong := getProcAddr(lib, 'PyInt_FromLong'); - PyArg_ParseTuple := getProcAddr(lib, 'PyArg_ParseTuple'); - PyArg_Parse := getProcAddr(lib, 'PyArg_Parse'); - Py_BuildValue := getProcAddr(lib, 'Py_BuildValue'); - Py_Initialize := getProcAddr(lib, 'Py_Initialize'); - PyDict_New := getProcAddr(lib, 'PyDict_New'); - PyDict_SetItemString := getProcAddr(lib, 'PyDict_SetItemString'); - PyModule_GetDict := getProcAddr(lib, 'PyModule_GetDict'); - PyObject_Str := getProcAddr(lib, 'PyObject_Str'); - PyRun_String := getProcAddr(lib, 'PyRun_String'); - PyRun_SimpleString := getProcAddr(lib, 'PyRun_SimpleString'); - PyDict_GetItemString := getProcAddr(lib, 'PyDict_GetItemString'); - PyString_AsString := getProcAddr(lib, 'PyString_AsString'); - PyString_FromString := getProcAddr(lib, 'PyString_FromString'); - PySys_SetArgv := getProcAddr(lib, 'PySys_SetArgv'); - Py_Exit := getProcAddr(lib, 'Py_Exit'); - - PyCFunction_New :=getProcAddr(lib, 'PyCFunction_New'); - PyEval_CallObject :=getProcAddr(lib, 'PyEval_CallObject'); - PyEval_CallObjectWithKeywords:=getProcAddr(lib, 'PyEval_CallObjectWithKeywords'); - PyEval_GetFrame :=getProcAddr(lib, 'PyEval_GetFrame'); - PyEval_GetGlobals :=getProcAddr(lib, 'PyEval_GetGlobals'); - PyEval_GetLocals :=getProcAddr(lib, 'PyEval_GetLocals'); - //PyEval_GetOwner :=getProcAddr(lib, 'PyEval_GetOwner'); - PyEval_GetRestricted :=getProcAddr(lib, 'PyEval_GetRestricted'); - PyEval_InitThreads :=getProcAddr(lib, 'PyEval_InitThreads'); - PyEval_RestoreThread :=getProcAddr(lib, 'PyEval_RestoreThread'); - PyEval_SaveThread :=getProcAddr(lib, 'PyEval_SaveThread'); - PyFile_FromString :=getProcAddr(lib, 'PyFile_FromString'); - PyFile_GetLine :=getProcAddr(lib, 'PyFile_GetLine'); - PyFile_Name :=getProcAddr(lib, 'PyFile_Name'); - PyFile_SetBufSize :=getProcAddr(lib, 'PyFile_SetBufSize'); - PyFile_SoftSpace :=getProcAddr(lib, 'PyFile_SoftSpace'); - PyFile_WriteObject :=getProcAddr(lib, 'PyFile_WriteObject'); - PyFile_WriteString :=getProcAddr(lib, 'PyFile_WriteString'); - PyFloat_AsDouble :=getProcAddr(lib, 'PyFloat_AsDouble'); - PyFloat_FromDouble :=getProcAddr(lib, 'PyFloat_FromDouble'); - PyFunction_GetCode :=getProcAddr(lib, 'PyFunction_GetCode'); - PyFunction_GetGlobals :=getProcAddr(lib, 'PyFunction_GetGlobals'); - PyFunction_New :=getProcAddr(lib, 'PyFunction_New'); - PyImport_AddModule :=getProcAddr(lib, 'PyImport_AddModule'); - PyImport_Cleanup :=getProcAddr(lib, 'PyImport_Cleanup'); - PyImport_GetMagicNumber :=getProcAddr(lib, 'PyImport_GetMagicNumber'); - PyImport_ImportFrozenModule:=getProcAddr(lib, 'PyImport_ImportFrozenModule'); - PyImport_ImportModule :=getProcAddr(lib, 'PyImport_ImportModule'); - PyImport_Import :=getProcAddr(lib, 'PyImport_Import'); - //@PyImport_Init :=getProcAddr(lib, 'PyImport_Init'); - PyImport_ReloadModule :=getProcAddr(lib, 'PyImport_ReloadModule'); - PyInstance_New :=getProcAddr(lib, 'PyInstance_New'); - PyInt_AsLong :=getProcAddr(lib, 'PyInt_AsLong'); - PyList_Append :=getProcAddr(lib, 'PyList_Append'); - PyList_AsTuple :=getProcAddr(lib, 'PyList_AsTuple'); - PyList_GetItem :=getProcAddr(lib, 'PyList_GetItem'); - PyList_GetSlice :=getProcAddr(lib, 'PyList_GetSlice'); - PyList_Insert :=getProcAddr(lib, 'PyList_Insert'); - PyList_New :=getProcAddr(lib, 'PyList_New'); - PyList_Reverse :=getProcAddr(lib, 'PyList_Reverse'); - PyList_SetItem :=getProcAddr(lib, 'PyList_SetItem'); - PyList_SetSlice :=getProcAddr(lib, 'PyList_SetSlice'); - PyList_Size :=getProcAddr(lib, 'PyList_Size'); - PyList_Sort :=getProcAddr(lib, 'PyList_Sort'); - PyLong_AsDouble :=getProcAddr(lib, 'PyLong_AsDouble'); - PyLong_AsLong :=getProcAddr(lib, 'PyLong_AsLong'); - PyLong_FromDouble :=getProcAddr(lib, 'PyLong_FromDouble'); - PyLong_FromLong :=getProcAddr(lib, 'PyLong_FromLong'); - PyLong_FromString :=getProcAddr(lib, 'PyLong_FromString'); - PyLong_FromString :=getProcAddr(lib, 'PyLong_FromString'); - PyLong_FromUnsignedLong :=getProcAddr(lib, 'PyLong_FromUnsignedLong'); - PyLong_AsUnsignedLong :=getProcAddr(lib, 'PyLong_AsUnsignedLong'); - PyLong_FromUnicode :=getProcAddr(lib, 'PyLong_FromUnicode'); - PyLong_FromLongLong :=getProcAddr(lib, 'PyLong_FromLongLong'); - PyLong_AsLongLong :=getProcAddr(lib, 'PyLong_AsLongLong'); - - PyMapping_Check :=getProcAddr(lib, 'PyMapping_Check'); - PyMapping_GetItemString :=getProcAddr(lib, 'PyMapping_GetItemString'); - PyMapping_HasKey :=getProcAddr(lib, 'PyMapping_HasKey'); - PyMapping_HasKeyString :=getProcAddr(lib, 'PyMapping_HasKeyString'); - PyMapping_Length :=getProcAddr(lib, 'PyMapping_Length'); - PyMapping_SetItemString :=getProcAddr(lib, 'PyMapping_SetItemString'); - PyMethod_Class :=getProcAddr(lib, 'PyMethod_Class'); - PyMethod_Function :=getProcAddr(lib, 'PyMethod_Function'); - PyMethod_New :=getProcAddr(lib, 'PyMethod_New'); - PyMethod_Self :=getProcAddr(lib, 'PyMethod_Self'); - PyModule_GetName :=getProcAddr(lib, 'PyModule_GetName'); - PyModule_New :=getProcAddr(lib, 'PyModule_New'); - PyNumber_Absolute :=getProcAddr(lib, 'PyNumber_Absolute'); - PyNumber_Add :=getProcAddr(lib, 'PyNumber_Add'); - PyNumber_And :=getProcAddr(lib, 'PyNumber_And'); - PyNumber_Check :=getProcAddr(lib, 'PyNumber_Check'); - PyNumber_Coerce :=getProcAddr(lib, 'PyNumber_Coerce'); - PyNumber_Divide :=getProcAddr(lib, 'PyNumber_Divide'); - - PyNumber_FloorDivide :=getProcAddr(lib, 'PyNumber_FloorDivide'); - PyNumber_TrueDivide :=getProcAddr(lib, 'PyNumber_TrueDivide'); - PyNumber_Divmod :=getProcAddr(lib, 'PyNumber_Divmod'); - PyNumber_Float :=getProcAddr(lib, 'PyNumber_Float'); - PyNumber_Int :=getProcAddr(lib, 'PyNumber_Int'); - PyNumber_Invert :=getProcAddr(lib, 'PyNumber_Invert'); - PyNumber_Long :=getProcAddr(lib, 'PyNumber_Long'); - PyNumber_Lshift :=getProcAddr(lib, 'PyNumber_Lshift'); - PyNumber_Multiply :=getProcAddr(lib, 'PyNumber_Multiply'); - PyNumber_Negative :=getProcAddr(lib, 'PyNumber_Negative'); - PyNumber_Or :=getProcAddr(lib, 'PyNumber_Or'); - PyNumber_Positive :=getProcAddr(lib, 'PyNumber_Positive'); - PyNumber_Power :=getProcAddr(lib, 'PyNumber_Power'); - PyNumber_Remainder :=getProcAddr(lib, 'PyNumber_Remainder'); - PyNumber_Rshift :=getProcAddr(lib, 'PyNumber_Rshift'); - PyNumber_Subtract :=getProcAddr(lib, 'PyNumber_Subtract'); - PyNumber_Xor :=getProcAddr(lib, 'PyNumber_Xor'); - PyOS_InitInterrupts :=getProcAddr(lib, 'PyOS_InitInterrupts'); - PyOS_InterruptOccurred :=getProcAddr(lib, 'PyOS_InterruptOccurred'); - PyObject_CallObject :=getProcAddr(lib, 'PyObject_CallObject'); - PyObject_Compare :=getProcAddr(lib, 'PyObject_Compare'); - PyObject_GetAttr :=getProcAddr(lib, 'PyObject_GetAttr'); - PyObject_GetAttrString :=getProcAddr(lib, 'PyObject_GetAttrString'); - PyObject_GetItem :=getProcAddr(lib, 'PyObject_GetItem'); - PyObject_DelItem :=getProcAddr(lib, 'PyObject_DelItem'); - PyObject_HasAttrString :=getProcAddr(lib, 'PyObject_HasAttrString'); - PyObject_Hash :=getProcAddr(lib, 'PyObject_Hash'); - PyObject_IsTrue :=getProcAddr(lib, 'PyObject_IsTrue'); - PyObject_Length :=getProcAddr(lib, 'PyObject_Length'); - PyObject_Repr :=getProcAddr(lib, 'PyObject_Repr'); - PyObject_SetAttr :=getProcAddr(lib, 'PyObject_SetAttr'); - PyObject_SetAttrString :=getProcAddr(lib, 'PyObject_SetAttrString'); - PyObject_SetItem :=getProcAddr(lib, 'PyObject_SetItem'); - - PyObject_Init :=getProcAddr(lib, 'PyObject_Init'); - PyObject_InitVar :=getProcAddr(lib, 'PyObject_InitVar'); - PyObject_New :=getProcAddr(lib, '_PyObject_New'); - PyObject_NewVar :=getProcAddr(lib, '_PyObject_NewVar'); - PyObject_Free :=getProcAddr(lib, 'PyObject_Free'); - - PyObject_IsInstance :=getProcAddr(lib, 'PyObject_IsInstance'); - PyObject_IsSubclass :=getProcAddr(lib, 'PyObject_IsSubclass'); - - PyObject_GenericGetAttr :=getProcAddr(lib, 'PyObject_GenericGetAttr'); - PyObject_GenericSetAttr :=getProcAddr(lib, 'PyObject_GenericSetAttr'); - - PyObject_GC_Malloc :=getProcAddr(lib, '_PyObject_GC_Malloc'); - PyObject_GC_New :=getProcAddr(lib, '_PyObject_GC_New'); - PyObject_GC_NewVar :=getProcAddr(lib, '_PyObject_GC_NewVar'); - PyObject_GC_Resize :=getProcAddr(lib, '_PyObject_GC_Resize'); - PyObject_GC_Del :=getProcAddr(lib, 'PyObject_GC_Del'); - PyObject_GC_Track :=getProcAddr(lib, 'PyObject_GC_Track'); - PyObject_GC_UnTrack :=getProcAddr(lib, 'PyObject_GC_UnTrack'); - - PyRange_New :=getProcAddr(lib, 'PyRange_New'); - PySequence_Check :=getProcAddr(lib, 'PySequence_Check'); - PySequence_Concat :=getProcAddr(lib, 'PySequence_Concat'); - PySequence_Count :=getProcAddr(lib, 'PySequence_Count'); - PySequence_GetItem :=getProcAddr(lib, 'PySequence_GetItem'); - PySequence_GetSlice :=getProcAddr(lib, 'PySequence_GetSlice'); - PySequence_In :=getProcAddr(lib, 'PySequence_In'); - PySequence_Index :=getProcAddr(lib, 'PySequence_Index'); - PySequence_Length :=getProcAddr(lib, 'PySequence_Length'); - PySequence_Repeat :=getProcAddr(lib, 'PySequence_Repeat'); - PySequence_SetItem :=getProcAddr(lib, 'PySequence_SetItem'); - PySequence_SetSlice :=getProcAddr(lib, 'PySequence_SetSlice'); - PySequence_DelSlice :=getProcAddr(lib, 'PySequence_DelSlice'); - PySequence_Tuple :=getProcAddr(lib, 'PySequence_Tuple'); - PySequence_Contains :=getProcAddr(lib, 'PySequence_Contains'); - PySlice_GetIndices :=getProcAddr(lib, 'PySlice_GetIndices'); - PySlice_GetIndicesEx :=getProcAddr(lib, 'PySlice_GetIndicesEx'); - PySlice_New :=getProcAddr(lib, 'PySlice_New'); - PyString_Concat :=getProcAddr(lib, 'PyString_Concat'); - PyString_ConcatAndDel :=getProcAddr(lib, 'PyString_ConcatAndDel'); - PyString_Format :=getProcAddr(lib, 'PyString_Format'); - PyString_FromStringAndSize:=getProcAddr(lib, 'PyString_FromStringAndSize'); - PyString_Size :=getProcAddr(lib, 'PyString_Size'); - PyString_DecodeEscape :=getProcAddr(lib, 'PyString_DecodeEscape'); - PyString_Repr :=getProcAddr(lib, 'PyString_Repr'); - PySys_GetObject :=getProcAddr(lib, 'PySys_GetObject'); - //PySys_Init :=getProcAddr(lib, 'PySys_Init'); - PySys_SetObject :=getProcAddr(lib, 'PySys_SetObject'); - PySys_SetPath :=getProcAddr(lib, 'PySys_SetPath'); - //PyTraceBack_Fetch :=getProcAddr(lib, 'PyTraceBack_Fetch'); - PyTraceBack_Here :=getProcAddr(lib, 'PyTraceBack_Here'); - PyTraceBack_Print :=getProcAddr(lib, 'PyTraceBack_Print'); - //PyTraceBack_Store :=getProcAddr(lib, 'PyTraceBack_Store'); - PyTuple_GetItem :=getProcAddr(lib, 'PyTuple_GetItem'); - PyTuple_GetSlice :=getProcAddr(lib, 'PyTuple_GetSlice'); - PyTuple_New :=getProcAddr(lib, 'PyTuple_New'); - PyTuple_SetItem :=getProcAddr(lib, 'PyTuple_SetItem'); - PyTuple_Size :=getProcAddr(lib, 'PyTuple_Size'); - - PyType_IsSubtype :=getProcAddr(lib, 'PyType_IsSubtype'); - PyType_GenericAlloc :=getProcAddr(lib, 'PyType_GenericAlloc'); - PyType_GenericNew :=getProcAddr(lib, 'PyType_GenericNew'); - PyType_Ready :=getProcAddr(lib, 'PyType_Ready'); - - PyUnicode_FromWideChar :=getProcAddr(lib, 'PyUnicodeUCS2_FromWideChar'); - PyUnicode_AsWideChar :=getProcAddr(lib, 'PyUnicodeUCS2_AsWideChar'); - PyUnicode_FromOrdinal :=getProcAddr(lib, 'PyUnicodeUCS2_FromOrdinal'); - - PyWeakref_GetObject :=getProcAddr(lib, 'PyWeakref_GetObject'); - PyWeakref_NewProxy :=getProcAddr(lib, 'PyWeakref_NewProxy'); - PyWeakref_NewRef :=getProcAddr(lib, 'PyWeakref_NewRef'); - PyWrapper_New :=getProcAddr(lib, 'PyWrapper_New'); - - PyBool_FromLong :=getProcAddr(lib, 'PyBool_FromLong'); - - Py_AtExit :=getProcAddr(lib, 'Py_AtExit'); - //Py_Cleanup :=getProcAddr(lib, 'Py_Cleanup'); - Py_CompileString :=getProcAddr(lib, 'Py_CompileString'); - Py_FatalError :=getProcAddr(lib, 'Py_FatalError'); - Py_FindMethod :=getProcAddr(lib, 'Py_FindMethod'); - Py_FindMethodInChain :=getProcAddr(lib, 'Py_FindMethodInChain'); - Py_FlushLine :=getProcAddr(lib, 'Py_FlushLine'); - Py_Finalize :=getProcAddr(lib, 'Py_Finalize'); - PyCode_Addr2Line := getProcAddr(lib, 'PyCode_Addr2Line'); - PyClass_IsSubclass :=getProcAddr(lib, 'PyClass_IsSubclass'); - PyErr_ExceptionMatches :=getProcAddr(lib, 'PyErr_ExceptionMatches'); - PyErr_GivenExceptionMatches:=getProcAddr(lib, 'PyErr_GivenExceptionMatches'); - PyEval_EvalCode :=getProcAddr(lib, 'PyEval_EvalCode'); - Py_GetVersion :=getProcAddr(lib, 'Py_GetVersion'); - Py_GetCopyright :=getProcAddr(lib, 'Py_GetCopyright'); - Py_GetExecPrefix :=getProcAddr(lib, 'Py_GetExecPrefix'); - Py_GetPath :=getProcAddr(lib, 'Py_GetPath'); - Py_GetPrefix :=getProcAddr(lib, 'Py_GetPrefix'); - Py_GetProgramName :=getProcAddr(lib, 'Py_GetProgramName'); - PyParser_SimpleParseString :=getProcAddr(lib, 'PyParser_SimpleParseString'); - PyNode_Free :=getProcAddr(lib, 'PyNode_Free'); - PyErr_NewException :=getProcAddr(lib, 'PyErr_NewException'); -/// jah 29-sep-2000 : updated for python 2.0 -/// replaced Py_Malloc with PyMem_Malloc -///--- @Py_Malloc := Import ('Py_Malloc'); -///+++ @Py_Malloc := Import ('PyMem_Malloc'); - Py_Malloc := getProcAddr(lib, 'PyMem_Malloc'); - PyMem_Malloc := getProcAddr(lib, 'PyMem_Malloc'); - PyObject_CallMethod := getProcAddr(lib, 'PyObject_CallMethod'); - Py_SetProgramName := getProcAddr(lib, 'Py_SetProgramName'); - Py_IsInitialized := getProcAddr(lib, 'Py_IsInitialized'); - Py_GetProgramFullPath := getProcAddr(lib, 'Py_GetProgramFullPath'); - DLL_Py_GetBuildInfo := getProcAddr(lib, 'Py_GetBuildInfo'); - Py_NewInterpreter := getProcAddr(lib, 'Py_NewInterpreter'); - Py_EndInterpreter := getProcAddr(lib, 'Py_EndInterpreter'); - PyEval_AcquireLock := getProcAddr(lib, 'PyEval_AcquireLock'); - PyEval_ReleaseLock := getProcAddr(lib, 'PyEval_ReleaseLock'); - PyEval_AcquireThread := getProcAddr(lib, 'PyEval_AcquireThread'); - PyEval_ReleaseThread := getProcAddr(lib, 'PyEval_ReleaseThread'); - PyInterpreterState_New := getProcAddr(lib, 'PyInterpreterState_New'); - PyInterpreterState_Clear := getProcAddr(lib, 'PyInterpreterState_Clear'); - PyInterpreterState_Delete:= getProcAddr(lib, 'PyInterpreterState_Delete'); - PyThreadState_New := getProcAddr(lib, 'PyThreadState_New'); - PyThreadState_Clear := getProcAddr(lib, 'PyThreadState_Clear'); - PyThreadState_Delete := getProcAddr(lib, 'PyThreadState_Delete'); - PyThreadState_Get := getProcAddr(lib, 'PyThreadState_Get'); - PyThreadState_Swap := getProcAddr(lib, 'PyThreadState_Swap'); -end; - -var - lib: TLibHandle; -initialization - lib := loadLibrary(dllName); - if lib <> NilLibHandle then init(lib); -end. diff --git a/lib/base/gtk/atk.nim b/lib/base/gtk/atk.nim index 84017bf039..8004eccfc3 100644 --- a/lib/base/gtk/atk.nim +++ b/lib/base/gtk/atk.nim @@ -55,7 +55,7 @@ type ATK_LAYER_INVALID, ATK_LAYER_BACKGROUND, ATK_LAYER_CANVAS, ATK_LAYER_WIDGET, ATK_LAYER_MDI, ATK_LAYER_POPUP, ATK_LAYER_OVERLAY PAtkPropertyValues* = ptr TAtkPropertyValues - TAtkPropertyValues* {.final.} = object + TAtkPropertyValues* {.final, pure.} = object property_name*: cstring old_value*: TGValue new_value*: TGValue @@ -378,7 +378,7 @@ type TAtkAttributeSet* = TGSList PAtkAttribute* = ptr TAtkAttribute - TAtkAttribute* {.final.} = object + TAtkAttribute* {.final, pure.} = object name*: cstring value*: cstring @@ -452,7 +452,7 @@ type TAtkEventListenerInitProc* = proc () TAtkEventListenerInit* = proc (para1: TAtkEventListenerInitProc){.cdecl.} PAtkKeyEventStruct* = ptr TAtkKeyEventStruct - TAtkKeyEventStruct* {.final.} = object + TAtkKeyEventStruct* {.final, pure.} = object `type`*: gint state*: guint keyval*: guint diff --git a/lib/base/gtk/gdk2.nim b/lib/base/gtk/gdk2.nim index 497f5619fb..66838ab99a 100644 --- a/lib/base/gtk/gdk2.nim +++ b/lib/base/gtk/gdk2.nim @@ -31,7 +31,7 @@ type TGdkVisualClass* = object of TGObjectClass PGdkColor* = ptr TGdkColor - TGdkColor* {.final.} = object + TGdkColor* {.final, pure.} = object pixel*: guint32 red*: guint16 green*: guint16 @@ -51,7 +51,7 @@ type TGdkFontType* = enum GDK_FONT_FONT, GDK_FONT_FONTSET PGdkFont* = ptr TGdkFont - TGdkFont* {.final.} = object + TGdkFont* {.final, pure.} = object `type`*: TGdkFontType ascent*: gint descent*: gint @@ -78,7 +78,7 @@ type PGdkGCValuesMask* = ptr TGdkGCValuesMask TGdkGCValuesMask* = int32 PGdkGCValues* = ptr TGdkGCValues - TGdkGCValues* {.final.} = object + TGdkGCValues* {.final, pure.} = object foreground*: TGdkColor background*: TGdkColor font*: PGdkFont @@ -124,7 +124,7 @@ type TGdkInputCondition* = int32 PGdkStatus* = ptr TGdkStatus TGdkStatus* = int32 - TGdkPoint* {.final.} = object + TGdkPoint* {.final, pure.} = object x*: gint y*: gint @@ -134,14 +134,14 @@ type PGdkWChar* = ptr TGdkWChar TGdkWChar* = guint32 PGdkSegment* = ptr TGdkSegment - TGdkSegment* {.final.} = object + TGdkSegment* {.final, pure.} = object x1*: gint y1*: gint x2*: gint y2*: gint PGdkRectangle* = ptr TGdkRectangle - TGdkRectangle* {.final.} = object + TGdkRectangle* {.final, pure.} = object x*: gint y*: gint width*: gint @@ -189,7 +189,7 @@ type PGdkCursorType* = ptr TGdkCursorType TGdkCursorType* = gint PGdkCursor* = ptr TGdkCursor - TGdkCursor* {.final.} = object + TGdkCursor* {.final, pure.} = object `type`*: TGdkCursorType ref_count*: guint @@ -219,14 +219,14 @@ type PGdkRegionBox* = ptr TGdkRegionBox TGdkRegionBox* = TGdkSegment PGdkRegion* = ptr TGdkRegion - TGdkRegion* {.final.} = object + TGdkRegion* {.final, pure.} = object size*: int32 numRects*: int32 rects*: PGdkRegionBox extents*: TGdkRegionBox PPOINTBLOCK* = ptr TPOINTBLOCK - TPOINTBLOCK* {.final.} = object + TPOINTBLOCK* {.final, pure.} = object pts*: array[0..(NUMPTSTOBUFFER) - 1, TGdkPoint] next*: PPOINTBLOCK @@ -335,13 +335,13 @@ type GDK_SETTING_ACTION_NEW, GDK_SETTING_ACTION_CHANGED, GDK_SETTING_ACTION_DELETED PGdkEventAny* = ptr TGdkEventAny - TGdkEventAny* {.final.} = object + TGdkEventAny* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 PGdkEventExpose* = ptr TGdkEventExpose - TGdkEventExpose* {.final.} = object + TGdkEventExpose* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -350,20 +350,20 @@ type count*: gint PGdkEventNoExpose* = ptr TGdkEventNoExpose - TGdkEventNoExpose* {.final.} = object + TGdkEventNoExpose* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 PGdkEventVisibility* = ptr TGdkEventVisibility - TGdkEventVisibility* {.final.} = object + TGdkEventVisibility* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 state*: TGdkVisibilityState PGdkEventMotion* = ptr TGdkEventMotion - TGdkEventMotion* {.final.} = object + TGdkEventMotion* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -378,7 +378,7 @@ type y_root*: gdouble PGdkEventButton* = ptr TGdkEventButton - TGdkEventButton* {.final.} = object + TGdkEventButton* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -393,7 +393,7 @@ type y_root*: gdouble PGdkEventScroll* = ptr TGdkEventScroll - TGdkEventScroll* {.final.} = object + TGdkEventScroll* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -407,7 +407,7 @@ type y_root*: gdouble PGdkEventKey* = ptr TGdkEventKey - TGdkEventKey* {.final.} = object + TGdkEventKey* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -420,7 +420,7 @@ type group*: guint8 PGdkEventCrossing* = ptr TGdkEventCrossing - TGdkEventCrossing* {.final.} = object + TGdkEventCrossing* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -436,14 +436,14 @@ type state*: guint PGdkEventFocus* = ptr TGdkEventFocus - TGdkEventFocus* {.final.} = object + TGdkEventFocus* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 `in`*: gint16 PGdkEventConfigure* = ptr TGdkEventConfigure - TGdkEventConfigure* {.final.} = object + TGdkEventConfigure* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -453,7 +453,7 @@ type height*: gint PGdkEventProperty* = ptr TGdkEventProperty - TGdkEventProperty* {.final.} = object + TGdkEventProperty* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -463,7 +463,7 @@ type TGdkNativeWindow* = pointer PGdkEventSelection* = ptr TGdkEventSelection - TGdkEventSelection* {.final.} = object + TGdkEventSelection* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -474,7 +474,7 @@ type requestor*: TGdkNativeWindow PGdkEventProximity* = ptr TGdkEventProximity - TGdkEventProximity* {.final.} = object + TGdkEventProximity* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -482,11 +482,11 @@ type device*: PGdkDevice PmatDUMMY* = ptr TmatDUMMY - TmatDUMMY* {.final.} = object + TmatDUMMY* {.final, pure.} = object b*: array[0..19, char] PGdkEventClient* = ptr TGdkEventClient - TGdkEventClient* {.final.} = object + TGdkEventClient* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -495,7 +495,7 @@ type b*: array[0..19, char] PGdkEventSetting* = ptr TGdkEventSetting - TGdkEventSetting* {.final.} = object + TGdkEventSetting* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -503,7 +503,7 @@ type name*: cstring PGdkEventWindowState* = ptr TGdkEventWindowState - TGdkEventWindowState* {.final.} = object + TGdkEventWindowState* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -511,7 +511,7 @@ type new_window_state*: TGdkWindowState PGdkEventDND* = ptr TGdkEventDND - TGdkEventDND* {.final.} = object + TGdkEventDND* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -520,7 +520,7 @@ type x_root*: gshort y_root*: gshort - TGdkEvent* {.final.} = object + TGdkEvent* {.final, pure.} = object data*: array[0..255, char] # union of # `type`: TGdkEventType # any: TGdkEventAny @@ -584,12 +584,12 @@ type PGdkAxisUse* = ptr TGdkAxisUse TGdkAxisUse* = int32 PGdkDeviceKey* = ptr TGdkDeviceKey - TGdkDeviceKey* {.final.} = object + TGdkDeviceKey* {.final, pure.} = object keyval*: guint modifiers*: TGdkModifierType PGdkDeviceAxis* = ptr TGdkDeviceAxis - TGdkDeviceAxis* {.final.} = object + TGdkDeviceAxis* {.final, pure.} = object use*: TGdkAxisUse min*: gdouble max*: gdouble @@ -604,12 +604,12 @@ type num_keys*: gint keys*: PGdkDeviceKey - TGdkTimeCoord* {.final.} = object + TGdkTimeCoord* {.final, pure.} = object time*: guint32 axes*: array[0..(GDK_MAX_TIMECOORD_AXES) - 1, gdouble] PGdkKeymapKey* = ptr TGdkKeymapKey - TGdkKeymapKey* {.final.} = object + TGdkKeymapKey* {.final, pure.} = object keycode*: guint group*: gint level*: gint @@ -623,12 +623,12 @@ type direction_changed*: proc (keymap: PGdkKeymap){.cdecl.} PGdkPangoAttrStipple* = ptr TGdkPangoAttrStipple - TGdkPangoAttrStipple* {.final.} = object + TGdkPangoAttrStipple* {.final, pure.} = object attr*: TPangoAttribute stipple*: PGdkBitmap PGdkPangoAttrEmbossed* = ptr TGdkPangoAttrEmbossed - TGdkPangoAttrEmbossed* {.final.} = object + TGdkPangoAttrEmbossed* {.final, pure.} = object attr*: TPangoAttribute embossed*: gboolean @@ -652,7 +652,7 @@ type GDK_OVERLAP_RECTANGLE_PART TGdkSpanFunc* = proc (span: PGdkSpan, data: gpointer){.cdecl.} PGdkRgbCmap* = ptr TGdkRgbCmap - TGdkRgbCmap* {.final.} = object + TGdkRgbCmap* {.final, pure.} = object colors*: array[0..255, guint32] n_colors*: gint info_list*: PGSList @@ -697,7 +697,7 @@ type TGdkInputFunction* = proc (data: gpointer, source: gint, condition: TGdkInputCondition){.cdecl.} TGdkDestroyNotify* = proc (data: gpointer){.cdecl.} - TGdkSpan* {.final.} = object + TGdkSpan* {.final, pure.} = object x*: gint y*: gint width*: gint @@ -730,7 +730,7 @@ type GDK_WINDOW_EDGE_SOUTH_WEST, GDK_WINDOW_EDGE_SOUTH, GDK_WINDOW_EDGE_SOUTH_EAST PGdkWindowAttr* = ptr TGdkWindowAttr - TGdkWindowAttr* {.final.} = object + TGdkWindowAttr* {.final, pure.} = object title*: cstring event_mask*: gint x*: gint @@ -747,7 +747,7 @@ type override_redirect*: gboolean PGdkGeometry* = ptr TGdkGeometry - TGdkGeometry* {.final.} = object + TGdkGeometry* {.final, pure.} = object min_width*: gint min_height*: gint max_width*: gint @@ -761,7 +761,7 @@ type win_gravity*: TGdkGravity PGdkPointerHooks* = ptr TGdkPointerHooks - TGdkPointerHooks* {.final.} = object + TGdkPointerHooks* {.final, pure.} = object get_pointer*: proc (window: PGdkWindow, x: Pgint, y: Pgint, mask: PGdkModifierType): PGdkWindow{.cdecl.} window_at_pointer*: proc (screen: PGdkScreen, win_x: Pgint, win_y: Pgint): PGdkWindow{. diff --git a/lib/base/gtk/gdk2pixbuf.nim b/lib/base/gtk/gdk2pixbuf.nim index bcf9690e8b..8ef3ac0f92 100644 --- a/lib/base/gtk/gdk2pixbuf.nim +++ b/lib/base/gtk/gdk2pixbuf.nim @@ -187,12 +187,12 @@ proc gdk_pixbuf_get_option*(pixbuf: PGdkPixbuf, key: cstring): cstring{.cdecl, dynlib: gdkpixbuflib, importc: "gdk_pixbuf_get_option".} type PGdkPixbufLoader* = ptr TGdkPixbufLoader - TGdkPixbufLoader* {.final.} = object + TGdkPixbufLoader* {.final, pure.} = object parent_instance*: TGObject priv*: gpointer PGdkPixbufLoaderClass* = ptr TGdkPixbufLoaderClass - TGdkPixbufLoaderClass* {.final.} = object + TGdkPixbufLoaderClass* {.final, pure.} = object parent_class*: TGObjectClass area_prepared*: proc (loader: PGdkPixbufLoader){.cdecl.} area_updated*: proc (loader: PGdkPixbufLoader, x: int32, y: int32, diff --git a/lib/base/gtk/gtk2.nim b/lib/base/gtk/gtk2.nim index 81e09f85d6..22bbd3c6c7 100644 --- a/lib/base/gtk/gtk2.nim +++ b/lib/base/gtk/gtk2.nim @@ -155,17 +155,17 @@ type TGtkSignalFunc* = proc (para1: TGtkSignalFuncProc){.cdecl.} PGtkSignalMarshaller* = ptr TGtkSignalMarshaller TGtkSignalMarshaller* = TGSignalCMarshaller - TGtkArgSignalData* {.final.} = object + TGtkArgSignalData* {.final, pure.} = object f*: TGtkSignalFunc d*: gpointer - TGtkArg* {.final.} = object + TGtkArg* {.final, pure.} = object `type`*: TGtkType name*: cstring d*: gdouble # was a union type PGtkTypeInfo* = ptr TGtkTypeInfo - TGtkTypeInfo* {.final.} = object + TGtkTypeInfo* {.final, pure.} = object type_name*: cstring object_size*: guint class_size*: guint @@ -188,7 +188,7 @@ type TGtkAllocation* = TGdkRectangle TGtkCallback* = proc (widget: PGtkWidget, data: gpointer){.cdecl.} PGtkRequisition* = ptr TGtkRequisition - TGtkRequisition* {.final.} = object + TGtkRequisition* {.final, pure.} = object width*: gint height*: gint @@ -323,7 +323,7 @@ type gtk_reserved8*: proc (){.cdecl.} PGtkWidgetAuxInfo* = ptr TGtkWidgetAuxInfo - TGtkWidgetAuxInfo* {.final.} = object + TGtkWidgetAuxInfo* {.final, pure.} = object x*: gint y*: gint width*: gint @@ -331,7 +331,7 @@ type flag0*: guint16 PGtkWidgetShapeInfo* = ptr TGtkWidgetShapeInfo - TGtkWidgetShapeInfo* {.final.} = object + TGtkWidgetShapeInfo* {.final, pure.} = object offset_x*: gint16 offset_y*: gint16 shape_mask*: PGdkBitmap @@ -370,12 +370,12 @@ type gtk_reserved4: proc (){.cdecl.} PGtkAccelKey* = ptr TGtkAccelKey - TGtkAccelKey* {.final.} = object + TGtkAccelKey* {.final, pure.} = object accel_key*: guint accel_mods*: TGdkModifierType flag0*: guint16 - TGtkAccelGroupEntry* {.final.} = object + TGtkAccelGroupEntry* {.final, pure.} = object key*: TGtkAccelKey closure*: PGClosure accel_path_quark*: TGQuark @@ -595,7 +595,7 @@ type PGtkBindingSignal* = ptr TGtkBindingSignal PGtkBindingArg* = ptr TGtkBindingArg PGtkBindingSet* = ptr TGtkBindingSet - TGtkBindingSet* {.final.} = object + TGtkBindingSet* {.final, pure.} = object set_name*: cstring priority*: gint widget_path_pspecs*: PGSList @@ -605,7 +605,7 @@ type current*: PGtkBindingEntry flag0*: guint16 - TGtkBindingEntry* {.final.} = object + TGtkBindingEntry* {.final, pure.} = object keyval*: guint modifiers*: TGdkModifierType binding_set*: PGtkBindingSet @@ -614,13 +614,13 @@ type hash_next*: PGtkBindingEntry signals*: PGtkBindingSignal - TGtkBindingSignal* {.final.} = object + TGtkBindingSignal* {.final, pure.} = object next*: PGtkBindingSignal signal_name*: cstring n_args*: guint args*: PGtkBindingArg - TGtkBindingArg* {.final.} = object + TGtkBindingArg* {.final, pure.} = object arg_type*: TGtkType d*: gdouble @@ -634,7 +634,7 @@ type TGtkBoxClass* = object of TGtkContainerClass PGtkBoxChild* = ptr TGtkBoxChild - TGtkBoxChild* {.final.} = object + TGtkBoxChild* {.final, pure.} = object widget*: PGtkWidget padding*: guint16 flag0*: guint16 @@ -906,12 +906,12 @@ type TGtkCListCompareFunc* = proc (clist: PGtkCList, ptr1: gconstpointer, ptr2: gconstpointer): gint{.cdecl.} PGtkCListCellInfo* = ptr TGtkCListCellInfo - TGtkCListCellInfo* {.final.} = object + TGtkCListCellInfo* {.final, pure.} = object row*: gint column*: gint PGtkCListDestInfo* = ptr TGtkCListDestInfo - TGtkCListDestInfo* {.final.} = object + TGtkCListDestInfo* {.final, pure.} = object cell*: TGtkCListCellInfo insert_pos*: TGtkCListDragPos @@ -1014,7 +1014,7 @@ type PGPtrArray = pointer PGArray = pointer - TGtkCListColumn* {.final.} = object + TGtkCListColumn* {.final, pure.} = object title*: cstring area*: TGdkRectangle button*: PGtkWidget @@ -1025,7 +1025,7 @@ type justification*: TGtkJustification flag0*: guint16 - TGtkCListRow* {.final.} = object + TGtkCListRow* {.final, pure.} = object cell*: PGtkCell state*: TGtkStateType foreground*: TGdkColor @@ -1036,7 +1036,7 @@ type flag0*: guint16 PGtkCellText* = ptr TGtkCellText - TGtkCellText* {.final.} = object + TGtkCellText* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 @@ -1044,7 +1044,7 @@ type text*: cstring PGtkCellPixmap* = ptr TGtkCellPixmap - TGtkCellPixmap* {.final.} = object + TGtkCellPixmap* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 @@ -1053,7 +1053,7 @@ type mask*: PGdkBitmap PGtkCellPixText* = ptr TGtkCellPixText - TGtkCellPixText* {.final.} = object + TGtkCellPixText* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 @@ -1064,14 +1064,14 @@ type mask*: PGdkBitmap PGtkCellWidget* = ptr TGtkCellWidget - TGtkCellWidget* {.final.} = object + TGtkCellWidget* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 style*: PGtkStyle widget*: PGtkWidget - TGtkCell* {.final.} = object + TGtkCell* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 @@ -1212,7 +1212,7 @@ type action: TGtkCTreeExpansionType){.cdecl.} PGtkCTreeRow* = ptr TGtkCTreeRow - TGtkCTreeRow* {.final.} = object + TGtkCTreeRow* {.final, pure.} = object row*: TGtkCListRow parent*: PGtkCTreeNode sibling*: PGtkCTreeNode @@ -1224,7 +1224,7 @@ type level*: guint16 GtkCTreeRow_flag0*: guint16 - TGtkCTreeNode* {.final.} = object + TGtkCTreeNode* {.final, pure.} = object list*: TGList PGtkDrawingArea* = ptr TGtkDrawingArea @@ -1479,7 +1479,7 @@ type TGtkFixedClass* = object of TGtkContainerClass PGtkFixedChild* = ptr TGtkFixedChild - TGtkFixedChild* {.final.} = object + TGtkFixedChild* {.final, pure.} = object widget*: PGtkWidget x*: gint y*: gint @@ -1632,7 +1632,7 @@ type gtk_reserved363: proc (){.cdecl.} gtk_reserved364: proc (){.cdecl.} - TGtkRulerMetric* {.final.} = object + TGtkRulerMetric* {.final, pure.} = object metric_name*: cstring abbrev*: cstring pixels_per_unit*: gdouble @@ -1657,7 +1657,7 @@ type TGtkSettingsClass* = object of TGObjectClass PGtkSettingsValue* = ptr TGtkSettingsValue - TGtkSettingsValue* {.final.} = object + TGtkSettingsValue* {.final, pure.} = object origin*: cstring value*: TGValue @@ -1708,7 +1708,7 @@ type GTK_RC_TOKEN_IM_MODULE_FILE, GTK_RC_TOKEN_STOCK, GTK_RC_TOKEN_LTR, GTK_RC_TOKEN_RTL, GTK_RC_TOKEN_LAST PGtkRcProperty* = ptr TGtkRcProperty - TGtkRcProperty* {.final.} = object + TGtkRcProperty* {.final, pure.} = object type_name*: TGQuark property_name*: TGQuark origin*: cstring @@ -1877,7 +1877,7 @@ type gtk_reserved3812: proc (){.cdecl.} PGtkBorder* = ptr TGtkBorder - TGtkBorder* {.final.} = object + TGtkBorder* {.final, pure.} = object left*: gint right*: gint top*: gint @@ -1978,27 +1978,27 @@ type PGtkIconSet* = pointer PGtkImagePixmapData* = ptr TGtkImagePixmapData - TGtkImagePixmapData* {.final.} = object + TGtkImagePixmapData* {.final, pure.} = object pixmap*: PGdkPixmap PGtkImageImageData* = ptr TGtkImageImageData - TGtkImageImageData* {.final.} = object + TGtkImageImageData* {.final, pure.} = object image*: PGdkImage PGtkImagePixbufData* = ptr TGtkImagePixbufData - TGtkImagePixbufData* {.final.} = object + TGtkImagePixbufData* {.final, pure.} = object pixbuf*: PGdkPixbuf PGtkImageStockData* = ptr TGtkImageStockData - TGtkImageStockData* {.final.} = object + TGtkImageStockData* {.final, pure.} = object stock_id*: cstring PGtkImageIconSetData* = ptr TGtkImageIconSetData - TGtkImageIconSetData* {.final.} = object + TGtkImageIconSetData* {.final, pure.} = object icon_set*: PGtkIconSet PGtkImageAnimationData* = ptr TGtkImageAnimationData - TGtkImageAnimationData* {.final.} = object + TGtkImageAnimationData* {.final, pure.} = object anim*: PGdkPixbufAnimation iter*: PGdkPixbufAnimationIter frame_timeout*: guint @@ -2111,7 +2111,7 @@ type gtk_reserved474: proc (){.cdecl.} PGtkItemFactoryEntry* = ptr TGtkItemFactoryEntry - TGtkItemFactoryEntry* {.final.} = object + TGtkItemFactoryEntry* {.final, pure.} = object path*: cstring accelerator*: cstring callback*: TGtkItemFactoryCallback @@ -2120,7 +2120,7 @@ type extra_data*: gconstpointer PGtkItemFactoryItem* = ptr TGtkItemFactoryItem - TGtkItemFactoryItem* {.final.} = object + TGtkItemFactoryItem* {.final, pure.} = object path*: cstring widgets*: PGSList @@ -2173,7 +2173,7 @@ type cdecl.} PGtkTreeModelFlags* = ptr TGtkTreeModelFlags TGtkTreeModelFlags* = int32 - TGtkTreeIter* {.final.} = object + TGtkTreeIter* {.final, pure.} = object stamp*: gint user_data*: gpointer user_data2*: gpointer @@ -2435,12 +2435,12 @@ type GtkPreview_flag0*: guint16 PGtkPreviewInfo* = ptr TGtkPreviewInfo - TGtkPreviewInfo* {.final.} = object + TGtkPreviewInfo* {.final, pure.} = object lookup*: Pguchar gamma*: gdouble PGtkDitherInfo* = ptr TGtkDitherInfo - TGtkDitherInfo* {.final.} = object + TGtkDitherInfo* {.final, pure.} = object c*: array[0..3, guchar] PGtkPreviewClass* = ptr TGtkPreviewClass @@ -2533,7 +2533,7 @@ type gtk_reserved603: proc (){.cdecl.} gtk_reserved604: proc (){.cdecl.} - TGtkSelectionData* {.final.} = object + TGtkSelectionData* {.final, pure.} = object selection*: TGdkAtom target*: TGdkAtom thetype*: TGdkAtom @@ -2543,18 +2543,18 @@ type display*: PGdkDisplay PGtkTargetEntry* = ptr TGtkTargetEntry - TGtkTargetEntry* {.final.} = object + TGtkTargetEntry* {.final, pure.} = object target*: cstring flags*: guint info*: guint PGtkTargetList* = ptr TGtkTargetList - TGtkTargetList* {.final.} = object + TGtkTargetList* {.final, pure.} = object list*: PGList ref_count*: guint PGtkTargetPair* = ptr TGtkTargetPair - TGtkTargetPair* {.final.} = object + TGtkTargetPair* {.final, pure.} = object target*: TGdkAtom flags*: guint info*: guint @@ -2635,7 +2635,7 @@ type gtk_reserved634: proc (){.cdecl.} PGtkStockItem* = ptr TGtkStockItem - TGtkStockItem* {.final.} = object + TGtkStockItem* {.final, pure.} = object stock_id*: cstring label*: cstring modifier*: TGdkModifierType @@ -2681,7 +2681,7 @@ type TGtkTableClass* = object of TGtkContainerClass PGtkTableChild* = ptr TGtkTableChild - TGtkTableChild* {.final.} = object + TGtkTableChild* {.final, pure.} = object widget*: PGtkWidget left_attach*: guint16 right_attach*: guint16 @@ -2691,7 +2691,7 @@ type ypadding*: guint16 GtkTableChild_flag0*: guint16 - TGtkTableRowCol* {.final.} = object + TGtkTableRowCol* {.final, pure.} = object requisition*: guint16 allocation*: guint16 spacing*: guint16 @@ -2710,7 +2710,7 @@ type PGtkTextFont* = pointer PGtkPropertyMark* = ptr TGtkPropertyMark - TGtkPropertyMark* {.final.} = object + TGtkPropertyMark* {.final, pure.} = object `property`*: PGList offset*: guint index*: guint @@ -2764,7 +2764,7 @@ type PGtkTextSearchFlags* = ptr TGtkTextSearchFlags TGtkTextSearchFlags* = int32 PGtkTextIter* = ptr TGtkTextIter - TGtkTextIter* {.final.} = object + TGtkTextIter* {.final, pure.} = object dummy1*: gpointer dummy2*: gpointer dummy3*: gint @@ -2802,7 +2802,7 @@ type gtk_reserved664: proc (){.cdecl.} PGtkTextAppearance* = ptr TGtkTextAppearance - TGtkTextAppearance* {.final.} = object + TGtkTextAppearance* {.final, pure.} = object bg_color*: TGdkColor fg_color*: TGdkColor bg_stipple*: PGdkBitmap @@ -2811,7 +2811,7 @@ type padding1*: gpointer flag0*: guint16 - TGtkTextAttributes* {.final.} = object + TGtkTextAttributes* {.final, pure.} = object refcount*: guint appearance*: TGtkTextAppearance justification*: TGtkJustification @@ -2860,7 +2860,7 @@ type gtk_reserved4: proc (){.cdecl.} PGtkTextMarkBody* = ptr TGtkTextMarkBody - TGtkTextMarkBody* {.final.} = object + TGtkTextMarkBody* {.final, pure.} = object obj*: PGtkTextMark name*: cstring tree*: PGtkTextBTree @@ -2879,11 +2879,11 @@ type gtk_reserved4: proc (){.cdecl.} PGtkTextPixbuf* = ptr TGtkTextPixbuf - TGtkTextPixbuf* {.final.} = object + TGtkTextPixbuf* {.final, pure.} = object pixbuf*: PGdkPixbuf PGtkTextChildBody* = ptr TGtkTextChildBody - TGtkTextChildBody* {.final.} = object + TGtkTextChildBody* {.final, pure.} = object obj*: PGtkTextChildAnchor widgets*: PGSList tree*: PGtkTextBTree @@ -2892,17 +2892,17 @@ type PGtkTextLineSegment* = ptr TGtkTextLineSegment PGtkTextLineSegmentClass* = ptr TGtkTextLineSegmentClass PGtkTextTagInfo* = ptr TGtkTextTagInfo - TGtkTextTagInfo* {.final.} = object + TGtkTextTagInfo* {.final, pure.} = object tag*: PGtkTextTag tag_root*: PGtkTextBTreeNode toggle_count*: gint PGtkTextToggleBody* = ptr TGtkTextToggleBody - TGtkTextToggleBody* {.final.} = object + TGtkTextToggleBody* {.final, pure.} = object info*: PGtkTextTagInfo inNodeCounts*: gboolean - TGtkTextLineSegment* {.final.} = object + TGtkTextLineSegment* {.final, pure.} = object `type`*: PGtkTextLineSegmentClass next*: PGtkTextLineSegment char_count*: int32 @@ -2919,7 +2919,7 @@ type line: PGtkTextLine){.cdecl.} TGtkTextSegCheckFunc* = proc (seg: PGtkTextLineSegment, line: PGtkTextLine){. cdecl.} - TGtkTextLineSegmentClass* {.final.} = object + TGtkTextLineSegmentClass* {.final, pure.} = object name*: cstring leftGravity*: gboolean splitFunc*: TGtkTextSegSplitFunc @@ -2929,13 +2929,13 @@ type checkFunc*: TGtkTextSegCheckFunc PGtkTextLineData* = ptr TGtkTextLineData - TGtkTextLineData* {.final.} = object + TGtkTextLineData* {.final, pure.} = object view_id*: gpointer next*: PGtkTextLineData height*: gint flag0*: int32 - TGtkTextLine* {.final.} = object + TGtkTextLine* {.final, pure.} = object parent*: PGtkTextBTreeNode next*: PGtkTextLine segments*: PGtkTextLineSegment @@ -3020,18 +3020,18 @@ type gtk_reserved4: proc (){.cdecl.} PGtkTextAttrAppearance* = ptr TGtkTextAttrAppearance - TGtkTextAttrAppearance* {.final.} = object + TGtkTextAttrAppearance* {.final, pure.} = object attr*: TPangoAttribute appearance*: TGtkTextAppearance PGtkTextCursorDisplay* = ptr TGtkTextCursorDisplay - TGtkTextCursorDisplay* {.final.} = object + TGtkTextCursorDisplay* {.final, pure.} = object x*: gint y*: gint height*: gint flag0*: guint16 - TGtkTextLineDisplay* {.final.} = object + TGtkTextLineDisplay* {.final, pure.} = object layout*: PPangoLayout cursors*: PGSList shaped_objects*: PGSList @@ -3152,7 +3152,7 @@ type PGtkTooltips* = ptr TGtkTooltips PGtkTooltipsData* = ptr TGtkTooltipsData - TGtkTooltipsData* {.final.} = object + TGtkTooltipsData* {.final, pure.} = object tooltips*: PGtkTooltips widget*: PGtkWidget tip_text*: cstring @@ -3184,7 +3184,7 @@ type TGtkToolbarSpaceStyle* = enum GTK_TOOLBAR_SPACE_EMPTY, GTK_TOOLBAR_SPACE_LINE PGtkToolbarChild* = ptr TGtkToolbarChild - TGtkToolbarChild* {.final.} = object + TGtkToolbarChild* {.final, pure.} = object `type`*: TGtkToolbarChildType widget*: PGtkWidget icon*: PGtkWidget @@ -3365,13 +3365,13 @@ type PGtkRBNode* = ptr TGtkRBNode TGtkRBTreeTraverseFunc* = proc (tree: PGtkRBTree, node: PGtkRBNode, data: gpointer){.cdecl.} - TGtkRBTree* {.final.} = object + TGtkRBTree* {.final, pure.} = object root*: PGtkRBNode `nil`*: PGtkRBNode parent_tree*: PGtkRBTree parent_node*: PGtkRBNode - TGtkRBNode* {.final.} = object + TGtkRBNode* {.final, pure.} = object flag0*: guint16 left*: PGtkRBNode right*: PGtkRBNode @@ -3386,14 +3386,14 @@ type TGtkTreeViewSearchDialogPositionFunc* = proc (tree_view: PGtkTreeView, search_dialog: PGtkWidget){.cdecl.} PGtkTreeViewColumnReorder* = ptr TGtkTreeViewColumnReorder - TGtkTreeViewColumnReorder* {.final.} = object + TGtkTreeViewColumnReorder* {.final, pure.} = object left_align*: gint right_align*: gint left_column*: PGtkTreeViewColumn right_column*: PGtkTreeViewColumn PGtkTreeViewPrivate* = ptr TGtkTreeViewPrivate - TGtkTreeViewPrivate* {.final.} = object + TGtkTreeViewPrivate* {.final, pure.} = object model*: PGtkTreeModel flags*: guint tree*: PGtkRBTree @@ -4236,7 +4236,7 @@ proc GTK_IS_WINDOW_GROUP_CLASS*(klass: pointer): bool proc GTK_WINDOW_GROUP_GET_CLASS*(obj: pointer): PGtkWindowGroupClass proc gtk_window_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_window_get_type".} -proc gtk_window_new*(thetype: TGtkWindowType): PGtkWidget{.cdecl, +proc gtk_window_new*(thetype: TGtkWindowType): PGtkWindow {.cdecl, dynlib: gtklib, importc: "gtk_window_new".} proc gtk_window_set_title*(window: PGtkWindow, title: cstring){.cdecl, dynlib: gtklib, importc: "gtk_window_set_title".} @@ -4389,6 +4389,8 @@ proc gtk_window_group_add_window*(window_group: PGtkWindowGroup, proc gtk_window_group_remove_window*(window_group: PGtkWindowGroup, window: PGtkWindow){.cdecl, dynlib: gtklib, importc: "gtk_window_group_remove_window".} +proc gtk_window_set_default_icon_name*(name: cstring) {. + cdecl, dynlib: gtklib, importc.} proc gtk_window_internal_set_focus*(window: PGtkWindow, focus: PGtkWidget){. cdecl, dynlib: gtklib, importc: "_gtk_window_internal_set_focus".} proc gtk_window_remove_embedded_xid*(window: PGtkWindow, xid: guint){.cdecl, @@ -4437,9 +4439,9 @@ proc use_markup*(a: var TGtkLabel): guint proc set_use_markup*(a: var TGtkLabel, `use_markup`: guint) proc gtk_label_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_label_get_type".} -proc gtk_label_new*(str: cstring): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_label_new*(str: cstring): PGtkLabel {.cdecl, dynlib: gtklib, importc: "gtk_label_new".} -proc gtk_label_new_with_mnemonic*(str: cstring): PGtkWidget{.cdecl, +proc gtk_label_new_with_mnemonic*(str: cstring): PGtkLabel {.cdecl, dynlib: gtklib, importc: "gtk_label_new_with_mnemonic".} proc gtk_label_set_text*(`label`: PGtkLabel, str: cstring){.cdecl, dynlib: gtklib, importc: "gtk_label_set_text".} @@ -4511,7 +4513,7 @@ proc latin1_to_char*(a: var TGtkAccelLabelClass): guint proc set_latin1_to_char*(a: var TGtkAccelLabelClass, `latin1_to_char`: guint) proc gtk_accel_label_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_accel_label_get_type".} -proc gtk_accel_label_new*(`string`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_accel_label_new*(`string`: cstring): PGtkAccelLabel {.cdecl, dynlib: gtklib, importc: "gtk_accel_label_new".} proc gtk_accel_label_get_accel_widget*(accel_label: PGtkAccelLabel): PGtkWidget{. cdecl, dynlib: gtklib, importc: "gtk_accel_label_get_accel_widget".} @@ -4579,7 +4581,7 @@ proc gtk_adjustment_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_adjustment_get_type".} proc gtk_adjustment_new*(value: gdouble, lower: gdouble, upper: gdouble, step_increment: gdouble, page_increment: gdouble, - page_size: gdouble): PGtkObject{.cdecl, dynlib: gtklib, + page_size: gdouble): PGtkAdjustment {.cdecl, dynlib: gtklib, importc: "gtk_adjustment_new".} proc gtk_adjustment_changed*(adjustment: PGtkAdjustment){.cdecl, dynlib: gtklib, importc: "gtk_adjustment_changed".} @@ -4601,7 +4603,7 @@ proc GTK_ALIGNMENT_GET_CLASS*(obj: pointer): PGtkAlignmentClass proc gtk_alignment_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_alignment_get_type".} proc gtk_alignment_new*(xalign: gfloat, yalign: gfloat, xscale: gfloat, - yscale: gfloat): PGtkWidget{.cdecl, dynlib: gtklib, + yscale: gfloat): PGtkAlignment {.cdecl, dynlib: gtklib, importc: "gtk_alignment_new".} proc gtk_alignment_set*(alignment: PGtkAlignment, xalign: gfloat, yalign: gfloat, xscale: gfloat, yscale: gfloat){.cdecl, @@ -4614,7 +4616,7 @@ proc GTK_IS_FRAME_CLASS*(klass: pointer): bool proc GTK_FRAME_GET_CLASS*(obj: pointer): PGtkFrameClass proc gtk_frame_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_frame_get_type".} -proc gtk_frame_new*(`label`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_frame_new*(`label`: cstring): PGtkFrame {.cdecl, dynlib: gtklib, importc: "gtk_frame_new".} proc gtk_frame_set_label*(frame: PGtkFrame, `label`: cstring){.cdecl, dynlib: gtklib, importc: "gtk_frame_set_label".} @@ -4642,7 +4644,7 @@ proc GTK_ASPECT_FRAME_GET_CLASS*(obj: pointer): PGtkAspectFrameClass proc gtk_aspect_frame_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_aspect_frame_get_type".} proc gtk_aspect_frame_new*(`label`: cstring, xalign: gfloat, yalign: gfloat, - ratio: gfloat, obey_child: gboolean): PGtkWidget{. + ratio: gfloat, obey_child: gboolean): PGtkAspectFrame {. cdecl, dynlib: gtklib, importc: "gtk_aspect_frame_new".} proc gtk_aspect_frame_set*(aspect_frame: PGtkAspectFrame, xalign: gfloat, yalign: gfloat, ratio: gfloat, obey_child: gboolean){. @@ -4655,7 +4657,7 @@ proc GTK_IS_ARROW_CLASS*(klass: pointer): bool proc GTK_ARROW_GET_CLASS*(obj: pointer): PGtkArrowClass proc gtk_arrow_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_arrow_get_type".} -proc gtk_arrow_new*(arrow_type: TGtkArrowType, shadow_type: TGtkShadowType): PGtkWidget{. +proc gtk_arrow_new*(arrow_type: TGtkArrowType, shadow_type: TGtkShadowType): PGtkArrow{. cdecl, dynlib: gtklib, importc: "gtk_arrow_new".} proc gtk_arrow_set*(arrow: PGtkArrow, arrow_type: TGtkArrowType, shadow_type: TGtkShadowType){.cdecl, dynlib: gtklib, @@ -4831,13 +4833,13 @@ proc depress_on_activate*(a: var TGtkButton): guint proc set_depress_on_activate*(a: var TGtkButton, `depress_on_activate`: guint) proc gtk_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_button_get_type".} -proc gtk_button_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_button_new*(): PGtkButton {.cdecl, dynlib: gtklib, importc: "gtk_button_new".} -proc gtk_button_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_button_new_with_label*(`label`: cstring): PGtkButton {.cdecl, dynlib: gtklib, importc: "gtk_button_new_with_label".} -proc gtk_button_new_from_stock*(stock_id: cstring): PGtkWidget{.cdecl, +proc gtk_button_new_from_stock*(stock_id: cstring): PGtkButton {.cdecl, dynlib: gtklib, importc: "gtk_button_new_from_stock".} -proc gtk_button_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_button_new_with_mnemonic*(`label`: cstring): PGtkButton {.cdecl, dynlib: gtklib, importc: "gtk_button_new_with_mnemonic".} proc gtk_button_pressed*(button: PGtkButton){.cdecl, dynlib: gtklib, importc: "gtk_button_pressed".} @@ -4871,6 +4873,11 @@ proc gtk_button_paint*(button: PGtkButton, area: PGdkRectangle, state_type: TGtkStateType, shadow_type: TGtkShadowType, main_detail: cstring, default_detail: cstring){.cdecl, dynlib: gtklib, importc: "_gtk_button_paint".} +proc gtk_button_set_image*(button: PGtkButton, image: PGtkWidget) {.cdecl, + dynlib: gtklib, importc.} +proc gtk_button_get_image*(button: PGtkButton): PGtkWidget {.cdecl, + dynlib: gtklib, importc.} + const GTK_CALENDAR_SHOW_HEADING* = 1 shl 0 GTK_CALENDAR_SHOW_DAY_NAMES* = 1 shl 1 @@ -4886,7 +4893,7 @@ proc GTK_IS_CALENDAR_CLASS*(klass: pointer): bool proc GTK_CALENDAR_GET_CLASS*(obj: pointer): PGtkCalendarClass proc gtk_calendar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_calendar_get_type".} -proc gtk_calendar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_calendar_new*(): PGtkCalendar {.cdecl, dynlib: gtklib, importc: "gtk_calendar_new".} proc gtk_calendar_select_month*(calendar: PGtkCalendar, month: guint, year: guint): gboolean{.cdecl, dynlib: gtklib, @@ -5139,11 +5146,11 @@ proc hide_on_activate*(a: var TGtkMenuItemClass): guint proc set_hide_on_activate*(a: var TGtkMenuItemClass, `hide_on_activate`: guint) proc gtk_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_menu_item_get_type".} -proc gtk_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_menu_item_new*(): PGtkMenuItem {.cdecl, dynlib: gtklib, importc: "gtk_menu_item_new".} -proc gtk_menu_item_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_menu_item_new_with_label*(`label`: cstring): PGtkMenuItem {.cdecl, dynlib: gtklib, importc: "gtk_menu_item_new_with_label".} -proc gtk_menu_item_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_menu_item_new_with_mnemonic*(`label`: cstring): PGtkMenuItem {.cdecl, dynlib: gtklib, importc: "gtk_menu_item_new_with_mnemonic".} proc gtk_menu_item_set_submenu*(menu_item: PGtkMenuItem, submenu: PGtkWidget){. cdecl, dynlib: gtklib, importc: "gtk_menu_item_set_submenu".} @@ -5197,11 +5204,11 @@ proc inconsistent*(a: var TGtkToggleButton): guint proc set_inconsistent*(a: var TGtkToggleButton, `inconsistent`: guint) proc gtk_toggle_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_toggle_button_get_type".} -proc gtk_toggle_button_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_toggle_button_new*(): PGtkToggleButton {.cdecl, dynlib: gtklib, importc: "gtk_toggle_button_new".} -proc gtk_toggle_button_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_toggle_button_new_with_label*(`label`: cstring): PGtkToggleButton {.cdecl, dynlib: gtklib, importc: "gtk_toggle_button_new_with_label".} -proc gtk_toggle_button_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_toggle_button_new_with_mnemonic*(`label`: cstring): PGtkToggleButton {.cdecl, dynlib: gtklib, importc: "gtk_toggle_button_new_with_mnemonic".} proc gtk_toggle_button_set_mode*(toggle_button: PGtkToggleButton, draw_indicator: gboolean){.cdecl, @@ -5228,11 +5235,11 @@ proc GTK_IS_CHECK_BUTTON_CLASS*(klass: pointer): bool proc GTK_CHECK_BUTTON_GET_CLASS*(obj: pointer): PGtkCheckButtonClass proc gtk_check_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_check_button_get_type".} -proc gtk_check_button_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_check_button_new*(): PGtkCheckButton{.cdecl, dynlib: gtklib, importc: "gtk_check_button_new".} -proc gtk_check_button_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_check_button_new_with_label*(`label`: cstring): PGtkCheckButton{.cdecl, dynlib: gtklib, importc: "gtk_check_button_new_with_label".} -proc gtk_check_button_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_check_button_new_with_mnemonic*(`label`: cstring): PGtkCheckButton {.cdecl, dynlib: gtklib, importc: "gtk_check_button_new_with_mnemonic".} proc gtk_check_button_get_props*(check_button: PGtkCheckButton, indicator_size: Pgint, @@ -5391,7 +5398,7 @@ proc selectable*(a: var TGtkCListRow): guint proc set_selectable*(a: var TGtkCListRow, `selectable`: guint) proc gtk_clist_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_clist_get_type".} -proc gtk_clist_new*(columns: gint): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_clist_new*(columns: gint): PGtkCList {.cdecl, dynlib: gtklib, importc: "gtk_clist_new".} proc gtk_clist_set_hadjustment*(clist: PGtkCList, adjustment: PGtkAdjustment){. cdecl, dynlib: gtklib, importc: "gtk_clist_set_hadjustment".} @@ -5572,7 +5579,7 @@ proc GTK_IS_DIALOG_CLASS*(klass: pointer): bool proc GTK_DIALOG_GET_CLASS*(obj: pointer): PGtkDialogClass proc gtk_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_dialog_get_type".} -proc gtk_dialog_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_dialog_new*(): PGtkDialog {.cdecl, dynlib: gtklib, importc: "gtk_dialog_new".} proc gtk_dialog_add_action_widget*(dialog: PGtkDialog, child: PGtkWidget, response_id: gint){.cdecl, dynlib: gtklib, @@ -5593,6 +5600,9 @@ proc gtk_dialog_response*(dialog: PGtkDialog, response_id: gint){.cdecl, dynlib: gtklib, importc: "gtk_dialog_response".} proc gtk_dialog_run*(dialog: PGtkDialog): gint{.cdecl, dynlib: gtklib, importc: "gtk_dialog_run".} +proc gtk_show_about_dialog*(parent: PGtkWindow, firstPropertyName: cstring) {. + cdecl, dynlib: gtklib, importc: "gtk_show_about_dialog", varargs.} + proc GTK_TYPE_VBOX*(): GType proc GTK_VBOX*(obj: pointer): PGtkVBox proc GTK_VBOX_CLASS*(klass: pointer): PGtkVBoxClass @@ -5601,7 +5611,7 @@ proc GTK_IS_VBOX_CLASS*(klass: pointer): bool proc GTK_VBOX_GET_CLASS*(obj: pointer): PGtkVBoxClass proc gtk_vbox_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vbox_get_type".} -proc gtk_vbox_new*(homogeneous: gboolean, spacing: gint): PGtkWidget{.cdecl, +proc gtk_vbox_new*(homogeneous: gboolean, spacing: gint): PGtkVBox {.cdecl, dynlib: gtklib, importc: "gtk_vbox_new".} proc GTK_TYPE_COLOR_SELECTION*(): GType proc GTK_COLOR_SELECTION*(obj: pointer): PGtkColorSelection @@ -5611,7 +5621,7 @@ proc GTK_IS_COLOR_SELECTION_CLASS*(klass: pointer): bool proc GTK_COLOR_SELECTION_GET_CLASS*(obj: pointer): PGtkColorSelectionClass proc gtk_color_selection_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_color_selection_get_type".} -proc gtk_color_selection_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_color_selection_new*(): PGtkColorSelection {.cdecl, dynlib: gtklib, importc: "gtk_color_selection_new".} proc gtk_color_selection_get_has_opacity_control*(colorsel: PGtkColorSelection): gboolean{. cdecl, dynlib: gtklib, @@ -5664,7 +5674,7 @@ proc GTK_IS_COLOR_SELECTION_DIALOG_CLASS*(klass: pointer): bool proc GTK_COLOR_SELECTION_DIALOG_GET_CLASS*(obj: pointer): PGtkColorSelectionDialogClass proc gtk_color_selection_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_color_selection_dialog_get_type".} -proc gtk_color_selection_dialog_new*(title: cstring): PGtkWidget{.cdecl, +proc gtk_color_selection_dialog_new*(title: cstring): PGtkColorSelectionDialog {.cdecl, dynlib: gtklib, importc: "gtk_color_selection_dialog_new".} proc GTK_TYPE_HBOX*(): GType proc GTK_HBOX*(obj: pointer): PGtkHBox @@ -5674,7 +5684,7 @@ proc GTK_IS_HBOX_CLASS*(klass: pointer): bool proc GTK_HBOX_GET_CLASS*(obj: pointer): PGtkHBoxClass proc gtk_hbox_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hbox_get_type".} -proc gtk_hbox_new*(homogeneous: gboolean, spacing: gint): PGtkWidget{.cdecl, +proc gtk_hbox_new*(homogeneous: gboolean, spacing: gint): PGtkHBox {.cdecl, dynlib: gtklib, importc: "gtk_hbox_new".} const bm_TGtkCombo_value_in_list* = 0x00000001'i16 @@ -5706,7 +5716,7 @@ proc use_arrows_always*(a: var TGtkCombo): guint proc set_use_arrows_always*(a: var TGtkCombo, `use_arrows_always`: guint) proc gtk_combo_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_combo_get_type".} -proc gtk_combo_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_combo_new*(): PGtkCombo {.cdecl, dynlib: gtklib, importc: "gtk_combo_new".} proc gtk_combo_set_value_in_list*(combo: PGtkCombo, val: gboolean, ok_if_empty: gboolean){.cdecl, dynlib: gtklib, @@ -5760,7 +5770,7 @@ proc expanded*(a: var TGtkCTreeRow): guint proc set_expanded*(a: var TGtkCTreeRow, `expanded`: guint) proc gtk_ctree_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_ctree_get_type".} -proc gtk_ctree_new*(columns: gint, tree_column: gint): PGtkWidget{.cdecl, +proc gtk_ctree_new*(columns: gint, tree_column: gint): PGtkCTree {.cdecl, dynlib: gtklib, importc: "gtk_ctree_new".} proc gtk_ctree_insert_node*(ctree: PGtkCTree, parent: PGtkCTreeNode, sibling: PGtkCTreeNode, text: openarray[cstring], @@ -5947,7 +5957,7 @@ proc GTK_IS_DRAWING_AREA_CLASS*(klass: pointer): bool proc GTK_DRAWING_AREA_GET_CLASS*(obj: pointer): PGtkDrawingAreaClass proc gtk_drawing_area_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_drawing_area_get_type".} -proc gtk_drawing_area_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_drawing_area_new*(): PGtkDrawingArea {.cdecl, dynlib: gtklib, importc: "gtk_drawing_area_new".} proc GTK_TYPE_CURVE*(): GType proc GTK_CURVE*(obj: pointer): PGtkCurve @@ -5957,7 +5967,7 @@ proc GTK_IS_CURVE_CLASS*(klass: pointer): bool proc GTK_CURVE_GET_CLASS*(obj: pointer): PGtkCurveClass proc gtk_curve_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_curve_get_type".} -proc gtk_curve_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_curve_new*(): PGtkCurve {.cdecl, dynlib: gtklib, importc: "gtk_curve_new".} proc gtk_curve_reset*(curve: PGtkCurve){.cdecl, dynlib: gtklib, importc: "gtk_curve_reset".} @@ -6222,7 +6232,7 @@ proc lower_arrow_prelight*(a: var TGtkMenu): guint proc set_lower_arrow_prelight*(a: var TGtkMenu, `lower_arrow_prelight`: guint) proc gtk_menu_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_menu_get_type".} -proc gtk_menu_new*(): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_menu_new".} +proc gtk_menu_new*(): PGtkMenu {.cdecl, dynlib: gtklib, importc: "gtk_menu_new".} proc gtk_menu_popup*(menu: PGtkMenu, parent_menu_shell: PGtkWidget, parent_menu_item: PGtkWidget, func_: TGtkMenuPositionFunc, data: gpointer, button: guint, activate_time: guint32){. @@ -6323,7 +6333,7 @@ proc mouse_cursor_obscured*(a: var TGtkEntry): guint proc set_mouse_cursor_obscured*(a: var TGtkEntry, `mouse_cursor_obscured`: guint) proc gtk_entry_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_entry_get_type".} -proc gtk_entry_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_entry_new*(): PGtkEntry {.cdecl, dynlib: gtklib, importc: "gtk_entry_new".} proc gtk_entry_set_visibility*(entry: PGtkEntry, visible: gboolean){.cdecl, dynlib: gtklib, importc: "gtk_entry_set_visibility".} @@ -6536,8 +6546,8 @@ proc GTK_IS_EVENT_BOX_CLASS*(klass: pointer): bool proc GTK_EVENT_BOX_GET_CLASS*(obj: pointer): PGtkEventBoxClass proc gtk_event_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_event_box_get_type".} -proc gtk_event_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib, - importc: "gtk_event_box_new".} +proc gtk_event_box_new*(): PGtkEventBox {.cdecl, dynlib: gtklib, + importc: "gtk_event_box_new".} const FNM_PATHNAME* = 1 shl 0 FNM_NOESCAPE* = 1 shl 1 @@ -6561,7 +6571,7 @@ proc GTK_IS_FILE_SELECTION_CLASS*(klass: pointer): bool proc GTK_FILE_SELECTION_GET_CLASS*(obj: pointer): PGtkFileSelectionClass proc gtk_file_selection_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_file_selection_get_type".} -proc gtk_file_selection_new*(title: cstring): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_file_selection_new*(title: cstring): PGtkFileSelection {.cdecl, dynlib: gtklib, importc: "gtk_file_selection_new".} proc gtk_file_selection_set_filename*(filesel: PGtkFileSelection, filename: cstring){.cdecl, dynlib: gtklib, @@ -6588,7 +6598,7 @@ proc GTK_IS_FIXED_CLASS*(klass: pointer): bool proc GTK_FIXED_GET_CLASS*(obj: pointer): PGtkFixedClass proc gtk_fixed_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_fixed_get_type".} -proc gtk_fixed_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_fixed_new*(): PGtkFixed {.cdecl, dynlib: gtklib, importc: "gtk_fixed_new".} proc gtk_fixed_put*(fixed: PGtkFixed, widget: PGtkWidget, x: gint, y: gint){. cdecl, dynlib: gtklib, importc: "gtk_fixed_put".} @@ -6612,7 +6622,7 @@ proc GTK_IS_FONT_SELECTION_DIALOG_CLASS*(klass: pointer): bool proc GTK_FONT_SELECTION_DIALOG_GET_CLASS*(obj: pointer): PGtkFontSelectionDialogClass proc gtk_font_selection_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_font_selection_get_type".} -proc gtk_font_selection_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_font_selection_new*(): PGtkFontSelection{.cdecl, dynlib: gtklib, importc: "gtk_font_selection_new".} proc gtk_font_selection_get_font_name*(fontsel: PGtkFontSelection): cstring{. cdecl, dynlib: gtklib, importc: "gtk_font_selection_get_font_name".} @@ -6626,7 +6636,7 @@ proc gtk_font_selection_set_preview_text*(fontsel: PGtkFontSelection, importc: "gtk_font_selection_set_preview_text".} proc gtk_font_selection_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_font_selection_dialog_get_type".} -proc gtk_font_selection_dialog_new*(title: cstring): PGtkWidget{.cdecl, +proc gtk_font_selection_dialog_new*(title: cstring): PGtkFontSelectionDialog{.cdecl, dynlib: gtklib, importc: "gtk_font_selection_dialog_new".} proc gtk_font_selection_dialog_get_font_name*(fsd: PGtkFontSelectionDialog): cstring{. cdecl, dynlib: gtklib, importc: "gtk_font_selection_dialog_get_font_name".} @@ -6645,7 +6655,7 @@ proc GTK_IS_GAMMA_CURVE_CLASS*(klass: pointer): bool proc GTK_GAMMA_CURVE_GET_CLASS*(obj: pointer): PGtkGammaCurveClass proc gtk_gamma_curve_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_gamma_curve_get_type".} -proc gtk_gamma_curve_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_gamma_curve_new*(): PGtkGammaCurve{.cdecl, dynlib: gtklib, importc: "gtk_gamma_curve_new".} proc gtk_gc_get*(depth: gint, colormap: PGdkColormap, values: PGdkGCValues, values_mask: TGdkGCValuesMask): PGdkGC{.cdecl, dynlib: gtklib, @@ -6686,7 +6696,7 @@ proc snap_edge*(a: var TGtkHandleBox): gint proc set_snap_edge*(a: var TGtkHandleBox, `snap_edge`: gint) proc gtk_handle_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_handle_box_get_type".} -proc gtk_handle_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_handle_box_new*(): PGtkHandleBox{.cdecl, dynlib: gtklib, importc: "gtk_handle_box_new".} proc gtk_handle_box_set_shadow_type*(handle_box: PGtkHandleBox, thetype: TGtkShadowType){.cdecl, @@ -6774,7 +6784,7 @@ proc GTK_IS_HBUTTON_BOX_CLASS*(klass: pointer): bool proc GTK_HBUTTON_BOX_GET_CLASS*(obj: pointer): PGtkHButtonBoxClass proc gtk_hbutton_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hbutton_box_get_type".} -proc gtk_hbutton_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_hbutton_box_new*(): PGtkHButtonBox{.cdecl, dynlib: gtklib, importc: "gtk_hbutton_box_new".} proc GTK_TYPE_HPANED*(): GType proc GTK_HPANED*(obj: pointer): PGtkHPaned @@ -6784,7 +6794,7 @@ proc GTK_IS_HPANED_CLASS*(klass: pointer): bool proc GTK_HPANED_GET_CLASS*(obj: pointer): PGtkHPanedClass proc gtk_hpaned_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hpaned_get_type".} -proc gtk_hpaned_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_hpaned_new*(): PGtkHPaned{.cdecl, dynlib: gtklib, importc: "gtk_hpaned_new".} proc GTK_TYPE_RULER*(): GType proc GTK_RULER*(obj: pointer): PGtkRuler @@ -6816,7 +6826,7 @@ proc GTK_IS_HRULER_CLASS*(klass: pointer): bool proc GTK_HRULER_GET_CLASS*(obj: pointer): PGtkHRulerClass proc gtk_hruler_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hruler_get_type".} -proc gtk_hruler_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_hruler_new*(): PGtkHRuler{.cdecl, dynlib: gtklib, importc: "gtk_hruler_new".} proc GTK_TYPE_SETTINGS*(): GType proc GTK_SETTINGS*(obj: pointer): PGtkSettings @@ -7212,9 +7222,9 @@ proc GTK_IS_HSCALE_CLASS*(klass: pointer): bool proc GTK_HSCALE_GET_CLASS*(obj: pointer): PGtkHScaleClass proc gtk_hscale_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hscale_get_type".} -proc gtk_hscale_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl, +proc gtk_hscale_new*(adjustment: PGtkAdjustment): PGtkHScale{.cdecl, dynlib: gtklib, importc: "gtk_hscale_new".} -proc gtk_hscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkWidget{. +proc gtk_hscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkHScale{. cdecl, dynlib: gtklib, importc: "gtk_hscale_new_with_range".} proc GTK_TYPE_SCROLLBAR*(): GType proc GTK_SCROLLBAR*(obj: pointer): PGtkScrollbar @@ -7232,7 +7242,7 @@ proc GTK_IS_HSCROLLBAR_CLASS*(klass: pointer): bool proc GTK_HSCROLLBAR_GET_CLASS*(obj: pointer): PGtkHScrollbarClass proc gtk_hscrollbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hscrollbar_get_type".} -proc gtk_hscrollbar_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl, +proc gtk_hscrollbar_new*(adjustment: PGtkAdjustment): PGtkHScrollbar{.cdecl, dynlib: gtklib, importc: "gtk_hscrollbar_new".} proc GTK_TYPE_SEPARATOR*(): GType proc GTK_SEPARATOR*(obj: pointer): PGtkSeparator @@ -7250,7 +7260,7 @@ proc GTK_IS_HSEPARATOR_CLASS*(klass: pointer): bool proc GTK_HSEPARATOR_GET_CLASS*(obj: pointer): PGtkHSeparatorClass proc gtk_hseparator_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hseparator_get_type".} -proc gtk_hseparator_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_hseparator_new*(): PGtkHSeparator{.cdecl, dynlib: gtklib, importc: "gtk_hseparator_new".} proc GTK_TYPE_ICON_FACTORY*(): GType proc GTK_ICON_FACTORY*(anObject: pointer): PGtkIconFactory @@ -7363,21 +7373,21 @@ proc GTK_IS_IMAGE_CLASS*(klass: pointer): bool proc GTK_IMAGE_GET_CLASS*(obj: pointer): PGtkImageClass proc gtk_image_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_image_get_type".} -proc gtk_image_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_image_new*(): PGtkImage{.cdecl, dynlib: gtklib, importc: "gtk_image_new".} -proc gtk_image_new_from_pixmap*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkWidget{. +proc gtk_image_new_from_pixmap*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_pixmap".} -proc gtk_image_new_from_image*(image: PGdkImage, mask: PGdkBitmap): PGtkWidget{. +proc gtk_image_new_from_image*(image: PGdkImage, mask: PGdkBitmap): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_image".} -proc gtk_image_new_from_file*(filename: cstring): PGtkWidget{.cdecl, +proc gtk_image_new_from_file*(filename: cstring): PGtkImage{.cdecl, dynlib: gtklib, importc: "gtk_image_new_from_file".} -proc gtk_image_new_from_pixbuf*(pixbuf: PGdkPixbuf): PGtkWidget{.cdecl, +proc gtk_image_new_from_pixbuf*(pixbuf: PGdkPixbuf): PGtkImage{.cdecl, dynlib: gtklib, importc: "gtk_image_new_from_pixbuf".} -proc gtk_image_new_from_stock*(stock_id: cstring, size: TGtkIconSize): PGtkWidget{. +proc gtk_image_new_from_stock*(stock_id: cstring, size: TGtkIconSize): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_stock".} -proc gtk_image_new_from_icon_set*(icon_set: PGtkIconSet, size: TGtkIconSize): PGtkWidget{. +proc gtk_image_new_from_icon_set*(icon_set: PGtkIconSet, size: TGtkIconSize): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_icon_set".} -proc gtk_image_new_from_animation*(animation: PGdkPixbufAnimation): PGtkWidget{. +proc gtk_image_new_from_animation*(animation: PGdkPixbufAnimation): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_animation".} proc gtk_image_set_from_pixmap*(image: PGtkImage, pixmap: PGdkPixmap, mask: PGdkBitmap){.cdecl, dynlib: gtklib, @@ -7415,14 +7425,14 @@ proc GTK_IS_IMAGE_MENU_ITEM_CLASS*(klass: pointer): bool proc GTK_IMAGE_MENU_ITEM_GET_CLASS*(obj: pointer): PGtkImageMenuItemClass proc gtk_image_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_get_type".} -proc gtk_image_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_image_menu_item_new*(): PGtkImageMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_new".} -proc gtk_image_menu_item_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_image_menu_item_new_with_label*(`label`: cstring): PGtkImageMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_new_with_label".} -proc gtk_image_menu_item_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_image_menu_item_new_with_mnemonic*(`label`: cstring): PGtkImageMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_new_with_mnemonic".} proc gtk_image_menu_item_new_from_stock*(stock_id: cstring, - accel_group: PGtkAccelGroup): PGtkWidget{.cdecl, dynlib: gtklib, + accel_group: PGtkAccelGroup): PGtkImageMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_new_from_stock".} proc gtk_image_menu_item_set_image*(image_menu_item: PGtkImageMenuItem, image: PGtkWidget){.cdecl, dynlib: gtklib, @@ -7470,7 +7480,7 @@ proc GTK_IS_INPUT_DIALOG_CLASS*(klass: pointer): bool proc GTK_INPUT_DIALOG_GET_CLASS*(obj: pointer): PGtkInputDialogClass proc gtk_input_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_input_dialog_get_type".} -proc gtk_input_dialog_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_input_dialog_new*(): PGtkInputDialog{.cdecl, dynlib: gtklib, importc: "gtk_input_dialog_new".} proc GTK_TYPE_INVISIBLE*(): GType proc GTK_INVISIBLE*(obj: pointer): PGtkInvisible @@ -7480,9 +7490,9 @@ proc GTK_IS_INVISIBLE_CLASS*(klass: pointer): bool proc GTK_INVISIBLE_GET_CLASS*(obj: pointer): PGtkInvisibleClass proc gtk_invisible_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_invisible_get_type".} -proc gtk_invisible_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_invisible_new*(): PGtkInvisible{.cdecl, dynlib: gtklib, importc: "gtk_invisible_new".} -proc gtk_invisible_new_for_screen*(screen: PGdkScreen): PGtkWidget{.cdecl, +proc gtk_invisible_new_for_screen*(screen: PGdkScreen): PGtkInvisible{.cdecl, dynlib: gtklib, importc: "gtk_invisible_new_for_screen".} proc gtk_invisible_set_screen*(invisible: PGtkInvisible, screen: PGdkScreen){. cdecl, dynlib: gtklib, importc: "gtk_invisible_set_screen".} @@ -7561,7 +7571,7 @@ proc GTK_IS_LAYOUT_CLASS*(klass: pointer): bool proc GTK_LAYOUT_GET_CLASS*(obj: pointer): PGtkLayoutClass proc gtk_layout_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_layout_get_type".} -proc gtk_layout_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkWidget{. +proc gtk_layout_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkLayout{. cdecl, dynlib: gtklib, importc: "gtk_layout_new".} proc gtk_layout_put*(layout: PGtkLayout, child_widget: PGtkWidget, x: gint, y: gint){.cdecl, dynlib: gtklib, importc: "gtk_layout_put".} @@ -7602,7 +7612,7 @@ proc add_mode*(a: var TGtkList): guint proc set_add_mode*(a: var TGtkList, `add_mode`: guint) proc gtk_list_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_list_get_type".} -proc gtk_list_new*(): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_list_new".} +proc gtk_list_new*(): PGtkList{.cdecl, dynlib: gtklib, importc: "gtk_list_new".} proc gtk_list_insert_items*(list: PGtkList, items: PGList, position: gint){. cdecl, dynlib: gtklib, importc: "gtk_list_insert_items".} proc gtk_list_append_items*(list: PGtkList, items: PGList){.cdecl, @@ -7994,7 +8004,7 @@ proc GTK_IS_MENU_BAR_CLASS*(klass: pointer): bool proc GTK_MENU_BAR_GET_CLASS*(obj: pointer): PGtkMenuBarClass proc gtk_menu_bar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_menu_bar_get_type".} -proc gtk_menu_bar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_menu_bar_new*(): PGtkMenuBar{.cdecl, dynlib: gtklib, importc: "gtk_menu_bar_new".} proc gtk_menu_bar_cycle_focus*(menubar: PGtkMenuBar, dir: TGtkDirectionType){. cdecl, dynlib: gtklib, importc: "_gtk_menu_bar_cycle_focus".} @@ -8064,7 +8074,7 @@ proc focus_out*(a: var TGtkNotebook): guint proc set_focus_out*(a: var TGtkNotebook, `focus_out`: guint) proc gtk_notebook_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_notebook_get_type".} -proc gtk_notebook_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_notebook_new*(): PGtkNotebook{.cdecl, dynlib: gtklib, importc: "gtk_notebook_new".} proc gtk_notebook_append_page*(notebook: PGtkNotebook, child: PGtkWidget, tab_label: PGtkWidget): gint{.cdecl, @@ -8091,6 +8101,8 @@ proc gtk_notebook_remove_page*(notebook: PGtkNotebook, page_num: gint){.cdecl, dynlib: gtklib, importc: "gtk_notebook_remove_page".} proc gtk_notebook_get_current_page*(notebook: PGtkNotebook): gint{.cdecl, dynlib: gtklib, importc: "gtk_notebook_get_current_page".} +proc gtk_notebook_get_n_pages*(notebook: PGtkNotebook): gint {.cdecl, + dynlib: gtklib, importc.} proc gtk_notebook_get_nth_page*(notebook: PGtkNotebook, page_num: gint): PGtkWidget{. cdecl, dynlib: gtklib, importc: "gtk_notebook_get_nth_page".} proc gtk_notebook_page_num*(notebook: PGtkNotebook, child: PGtkWidget): gint{. @@ -8186,7 +8198,7 @@ proc GTK_IS_OPTION_MENU_CLASS*(klass: pointer): bool proc GTK_OPTION_MENU_GET_CLASS*(obj: pointer): PGtkOptionMenuClass proc gtk_option_menu_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_option_menu_get_type".} -proc gtk_option_menu_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_option_menu_new*(): PGtkOptionMenu{.cdecl, dynlib: gtklib, importc: "gtk_option_menu_new".} proc gtk_option_menu_get_menu*(option_menu: PGtkOptionMenu): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_option_menu_get_menu".} @@ -8212,7 +8224,7 @@ proc build_insensitive*(a: var TGtkPixmap): guint proc set_build_insensitive*(a: var TGtkPixmap, `build_insensitive`: guint) proc gtk_pixmap_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_pixmap_get_type".} -proc gtk_pixmap_new*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkWidget{.cdecl, +proc gtk_pixmap_new*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkPixmap{.cdecl, dynlib: gtklib, importc: "gtk_pixmap_new".} proc gtk_pixmap_set*(pixmap: PGtkPixmap, val: PGdkPixmap, mask: PGdkBitmap){. cdecl, dynlib: gtklib, importc: "gtk_pixmap_set".} @@ -8238,7 +8250,7 @@ proc gtk_plug_get_type*(): TGtkType{.cdecl, dynlib: gtklib, proc gtk_plug_construct_for_display*(plug: PGtkPlug, display: PGdkDisplay, socket_id: TGdkNativeWindow){.cdecl, dynlib: gtklib, importc: "gtk_plug_construct_for_display".} -proc gtk_plug_new_for_display*(display: PGdkDisplay, socket_id: TGdkNativeWindow): PGtkWidget{. +proc gtk_plug_new_for_display*(display: PGdkDisplay, socket_id: TGdkNativeWindow): PGtkPlug{. cdecl, dynlib: gtklib, importc: "gtk_plug_new_for_display".} proc gtk_plug_get_id*(plug: PGtkPlug): TGdkNativeWindow{.cdecl, dynlib: gtklib, importc: "gtk_plug_get_id".} @@ -8265,7 +8277,7 @@ proc set_expand*(a: var TGtkPreview, `expand`: guint) proc gtk_preview_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_preview_get_type".} proc gtk_preview_uninit*(){.cdecl, dynlib: gtklib, importc: "gtk_preview_uninit".} -proc gtk_preview_new*(thetype: TGtkPreviewClass): PGtkWidget{.cdecl, +proc gtk_preview_new*(thetype: TGtkPreviewClass): PGtkPreview{.cdecl, dynlib: gtklib, importc: "gtk_preview_new".} proc gtk_preview_size*(preview: PGtkPreview, width: gint, height: gint){.cdecl, dynlib: gtklib, importc: "gtk_preview_size".} @@ -8320,7 +8332,7 @@ proc activity_dir*(a: var TGtkProgressBar): guint proc set_activity_dir*(a: var TGtkProgressBar, `activity_dir`: guint) proc gtk_progress_bar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_progress_bar_get_type".} -proc gtk_progress_bar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_progress_bar_new*(): PGtkProgressBar{.cdecl, dynlib: gtklib, importc: "gtk_progress_bar_new".} proc gtk_progress_bar_pulse*(pbar: PGtkProgressBar){.cdecl, dynlib: gtklib, importc: "gtk_progress_bar_pulse".} @@ -8349,18 +8361,18 @@ proc GTK_IS_RADIO_BUTTON_CLASS*(klass: pointer): bool proc GTK_RADIO_BUTTON_GET_CLASS*(obj: pointer): PGtkRadioButtonClass proc gtk_radio_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_get_type".} -proc gtk_radio_button_new*(group: PGSList): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_radio_button_new*(group: PGSList): PGtkRadioButton{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new".} -proc gtk_radio_button_new_from_widget*(group: PGtkRadioButton): PGtkWidget{. +proc gtk_radio_button_new_from_widget*(group: PGtkRadioButton): PGtkRadioButton{. cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_from_widget".} -proc gtk_radio_button_new_with_label*(group: PGSList, `label`: cstring): PGtkWidget{. +proc gtk_radio_button_new_with_label*(group: PGSList, `label`: cstring): PGtkRadioButton{. cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_label".} proc gtk_radio_button_new_with_label_from_widget*(group: PGtkRadioButton, - `label`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_label_from_widget".} -proc gtk_radio_button_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkWidget{. + `label`: cstring): PGtkRadioButton{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_label_from_widget".} +proc gtk_radio_button_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkRadioButton{. cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_mnemonic".} proc gtk_radio_button_new_with_mnemonic_from_widget*(group: PGtkRadioButton, - `label`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_mnemonic_from_widget".} + `label`: cstring): PGtkRadioButton{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_mnemonic_from_widget".} proc gtk_radio_button_get_group*(radio_button: PGtkRadioButton): PGSList{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_get_group".} proc gtk_radio_button_set_group*(radio_button: PGtkRadioButton, group: PGSList){. @@ -8373,11 +8385,11 @@ proc GTK_IS_RADIO_MENU_ITEM_CLASS*(klass: pointer): bool proc GTK_RADIO_MENU_ITEM_GET_CLASS*(obj: pointer): PGtkRadioMenuItemClass proc gtk_radio_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_get_type".} -proc gtk_radio_menu_item_new*(group: PGSList): PGtkWidget{.cdecl, +proc gtk_radio_menu_item_new*(group: PGSList): PGtkRadioMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_new".} -proc gtk_radio_menu_item_new_with_label*(group: PGSList, `label`: cstring): PGtkWidget{. +proc gtk_radio_menu_item_new_with_label*(group: PGSList, `label`: cstring): PGtkRadioMenuItem{. cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_new_with_label".} -proc gtk_radio_menu_item_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkWidget{. +proc gtk_radio_menu_item_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkRadioMenuItem{. cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_new_with_mnemonic".} proc gtk_radio_menu_item_get_group*(radio_menu_item: PGtkRadioMenuItem): PGSList{. cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_get_group".} @@ -8423,7 +8435,7 @@ proc set_focus_out*(a: var TGtkScrolledWindow, `focus_out`: guint) proc gtk_scrolled_window_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_scrolled_window_get_type".} proc gtk_scrolled_window_new*(hadjustment: PGtkAdjustment, - vadjustment: PGtkAdjustment): PGtkWidget{.cdecl, + vadjustment: PGtkAdjustment): PGtkScrolledWindow{.cdecl, dynlib: gtklib, importc: "gtk_scrolled_window_new".} proc gtk_scrolled_window_set_hadjustment*(scrolled_window: PGtkScrolledWindow, hadjustment: PGtkAdjustment){.cdecl, dynlib: gtklib, importc: "gtk_scrolled_window_set_hadjustment".} @@ -8525,7 +8537,7 @@ proc GTK_IS_SEPARATOR_MENU_ITEM_CLASS*(klass: pointer): bool proc GTK_SEPARATOR_MENU_ITEM_GET_CLASS*(obj: pointer): PGtkSeparatorMenuItemClass proc gtk_separator_menu_item_get_type*(): GType{.cdecl, dynlib: gtklib, importc: "gtk_separator_menu_item_get_type".} -proc gtk_separator_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_separator_menu_item_new*(): PGtkSeparatorMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_separator_menu_item_new".} const bm_TGtkSizeGroup_have_width* = 0x00000001'i16 @@ -8589,7 +8601,7 @@ proc need_map*(a: var TGtkSocket): guint proc set_need_map*(a: var TGtkSocket, `need_map`: guint) proc is_mapped*(a: var TGtkSocket): guint proc set_is_mapped*(a: var TGtkSocket, `is_mapped`: guint) -proc gtk_socket_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_socket_new*(): PGtkSocket {.cdecl, dynlib: gtklib, importc: "gtk_socket_new".} proc gtk_socket_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_socket_get_type".} @@ -8649,9 +8661,9 @@ proc gtk_spin_button_configure*(spin_button: PGtkSpinButton, digits: guint){.cdecl, dynlib: gtklib, importc: "gtk_spin_button_configure".} proc gtk_spin_button_new*(adjustment: PGtkAdjustment, climb_rate: gdouble, - digits: guint): PGtkWidget{.cdecl, dynlib: gtklib, + digits: guint): PGtkSpinButton{.cdecl, dynlib: gtklib, importc: "gtk_spin_button_new".} -proc gtk_spin_button_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkWidget{. +proc gtk_spin_button_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkSpinButton{. cdecl, dynlib: gtklib, importc: "gtk_spin_button_new_with_range".} proc gtk_spin_button_set_adjustment*(spin_button: PGtkSpinButton, adjustment: PGtkAdjustment){.cdecl, @@ -8724,6 +8736,7 @@ const GTK_STOCK_COPY* = "gtk-copy" GTK_STOCK_CUT* = "gtk-cut" GTK_STOCK_DELETE* = "gtk-delete" + GTK_STOCK_EDIT* = "gtk-edit" GTK_STOCK_EXECUTE* = "gtk-execute" GTK_STOCK_FIND* = "gtk-find" GTK_STOCK_FIND_AND_REPLACE* = "gtk-find-and-replace" @@ -8812,7 +8825,7 @@ proc has_resize_grip*(a: var TGtkStatusbar): guint proc set_has_resize_grip*(a: var TGtkStatusbar, `has_resize_grip`: guint) proc gtk_statusbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_statusbar_get_type".} -proc gtk_statusbar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_statusbar_new*(): PGtkStatusbar{.cdecl, dynlib: gtklib, importc: "gtk_statusbar_new".} proc gtk_statusbar_get_context_id*(statusbar: PGtkStatusbar, context_description: cstring): guint{.cdecl, @@ -8888,7 +8901,7 @@ proc empty*(a: var TGtkTableRowCol): guint proc set_empty*(a: var TGtkTableRowCol, `empty`: guint) proc gtk_table_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_table_get_type".} -proc gtk_table_new*(rows: guint, columns: guint, homogeneous: gboolean): PGtkWidget{. +proc gtk_table_new*(rows: guint, columns: guint, homogeneous: gboolean): PGtkTable{. cdecl, dynlib: gtklib, importc: "gtk_table_new".} proc gtk_table_resize*(table: PGtkTable, rows: guint, columns: guint){.cdecl, dynlib: gtklib, importc: "gtk_table_resize".} @@ -8936,7 +8949,7 @@ proc torn_off*(a: var TGtkTearoffMenuItem): guint proc set_torn_off*(a: var TGtkTearoffMenuItem, `torn_off`: guint) proc gtk_tearoff_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tearoff_menu_item_get_type".} -proc gtk_tearoff_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_tearoff_menu_item_new*(): PGtkTearoffMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_tearoff_menu_item_new".} const bm_TGtkText_line_wrap* = 0x00000001'i16 @@ -8960,7 +8973,7 @@ proc use_wchar*(a: PGtkText): gboolean proc set_use_wchar*(a: PGtkText, `use_wchar`: gboolean) proc gtk_text_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_text_get_type".} -proc gtk_text_new*(hadj: PGtkAdjustment, vadj: PGtkAdjustment): PGtkWidget{. +proc gtk_text_new*(hadj: PGtkAdjustment, vadj: PGtkAdjustment): PGtkText{. cdecl, dynlib: gtklib, importc: "gtk_text_new".} proc gtk_text_set_editable*(text: PGtkText, editable: gboolean){.cdecl, dynlib: gtklib, importc: "gtk_text_set_editable".} @@ -10056,9 +10069,9 @@ proc set_mouse_cursor_obscured*(a: var TGtkTextView, `mouse_cursor_obscured`: guint) proc gtk_text_view_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_text_view_get_type".} -proc gtk_text_view_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_text_view_new*(): PGtkTextView{.cdecl, dynlib: gtklib, importc: "gtk_text_view_new".} -proc gtk_text_view_new_with_buffer*(buffer: PGtkTextBuffer): PGtkWidget{.cdecl, +proc gtk_text_view_new_with_buffer*(buffer: PGtkTextBuffer): PGtkTextView{.cdecl, dynlib: gtklib, importc: "gtk_text_view_new_with_buffer".} proc gtk_text_view_set_buffer*(text_view: PGtkTextView, buffer: PGtkTextBuffer){. cdecl, dynlib: gtklib, importc: "gtk_text_view_set_buffer".} @@ -10210,7 +10223,7 @@ proc in_query*(a: var TGtkTipsQuery): guint proc set_in_query*(a: var TGtkTipsQuery, `in_query`: guint) proc gtk_tips_query_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tips_query_get_type".} -proc gtk_tips_query_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_tips_query_new*(): PGtkTipsQuery{.cdecl, dynlib: gtklib, importc: "gtk_tips_query_new".} proc gtk_tips_query_start_query*(tips_query: PGtkTipsQuery){.cdecl, dynlib: gtklib, importc: "gtk_tips_query_start_query".} @@ -10280,7 +10293,7 @@ proc icon_size_set*(a: var TGtkToolbar): guint proc set_icon_size_set*(a: var TGtkToolbar, `icon_size_set`: guint) proc gtk_toolbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_toolbar_get_type".} -proc gtk_toolbar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_toolbar_new*(): PGtkToolbar{.cdecl, dynlib: gtklib, importc: "gtk_toolbar_new".} proc gtk_toolbar_append_item*(toolbar: PGtkToolbar, text: cstring, tooltip_text: cstring, @@ -10394,7 +10407,7 @@ proc view_line*(a: var TGtkTree): guint proc set_view_line*(a: var TGtkTree, `view_line`: guint) proc gtk_tree_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tree_get_type".} -proc gtk_tree_new*(): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_tree_new".} +proc gtk_tree_new*(): PGtkTree{.cdecl, dynlib: gtklib, importc: "gtk_tree_new".} proc gtk_tree_append*(tree: PGtkTree, tree_item: PGtkWidget){.cdecl, dynlib: gtklib, importc: "gtk_tree_append".} proc gtk_tree_prepend*(tree: PGtkTree, tree_item: PGtkWidget){.cdecl, @@ -10466,9 +10479,9 @@ proc expanded*(a: var TGtkTreeItem): guint proc set_expanded*(a: var TGtkTreeItem, `expanded`: guint) proc gtk_tree_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tree_item_get_type".} -proc gtk_tree_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_tree_item_new*(): PGtkTreeItem{.cdecl, dynlib: gtklib, importc: "gtk_tree_item_new".} -proc gtk_tree_item_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_tree_item_new_with_label*(`label`: cstring): PGtkTreeItem{.cdecl, dynlib: gtklib, importc: "gtk_tree_item_new_with_label".} proc gtk_tree_item_set_subtree*(tree_item: PGtkTreeItem, subtree: PGtkWidget){. cdecl, dynlib: gtklib, importc: "gtk_tree_item_set_subtree".} @@ -10973,9 +10986,9 @@ proc GTK_IS_TREE_VIEW_CLASS*(klass: pointer): bool proc GTK_TREE_VIEW_GET_CLASS*(obj: pointer): PGtkTreeViewClass proc gtk_tree_view_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tree_view_get_type".} -proc gtk_tree_view_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_tree_view_new*(): PGtkTreeView{.cdecl, dynlib: gtklib, importc: "gtk_tree_view_new".} -proc gtk_tree_view_new_with_model*(model: PGtkTreeModel): PGtkWidget{.cdecl, +proc gtk_tree_view_new_with_model*(model: PGtkTreeModel): PGtkTreeView{.cdecl, dynlib: gtklib, importc: "gtk_tree_view_new_with_model".} proc gtk_tree_view_get_model*(tree_view: PGtkTreeView): PGtkTreeModel{.cdecl, dynlib: gtklib, importc: "gtk_tree_view_get_model".} @@ -11137,7 +11150,7 @@ proc GTK_IS_VBUTTON_BOX_CLASS*(klass: pointer): bool proc GTK_VBUTTON_BOX_GET_CLASS*(obj: pointer): PGtkVButtonBoxClass proc gtk_vbutton_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vbutton_box_get_type".} -proc gtk_vbutton_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_vbutton_box_new*(): PGtkVButtonBox{.cdecl, dynlib: gtklib, importc: "gtk_vbutton_box_new".} proc GTK_TYPE_VIEWPORT*(): GType proc GTK_VIEWPORT*(obj: pointer): PGtkViewport @@ -11147,7 +11160,7 @@ proc GTK_IS_VIEWPORT_CLASS*(klass: pointer): bool proc GTK_VIEWPORT_GET_CLASS*(obj: pointer): PGtkViewportClass proc gtk_viewport_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_viewport_get_type".} -proc gtk_viewport_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkWidget{. +proc gtk_viewport_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkViewport{. cdecl, dynlib: gtklib, importc: "gtk_viewport_new".} proc gtk_viewport_get_hadjustment*(viewport: PGtkViewport): PGtkAdjustment{. cdecl, dynlib: gtklib, importc: "gtk_viewport_get_hadjustment".} @@ -11172,7 +11185,7 @@ proc GTK_IS_VPANED_CLASS*(klass: pointer): bool proc GTK_VPANED_GET_CLASS*(obj: pointer): PGtkVPanedClass proc gtk_vpaned_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vpaned_get_type".} -proc gtk_vpaned_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_vpaned_new*(): PGtkVPaned{.cdecl, dynlib: gtklib, importc: "gtk_vpaned_new".} proc GTK_TYPE_VRULER*(): GType proc GTK_VRULER*(obj: pointer): PGtkVRuler @@ -11182,7 +11195,7 @@ proc GTK_IS_VRULER_CLASS*(klass: pointer): bool proc GTK_VRULER_GET_CLASS*(obj: pointer): PGtkVRulerClass proc gtk_vruler_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vruler_get_type".} -proc gtk_vruler_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_vruler_new*(): PGtkVRuler{.cdecl, dynlib: gtklib, importc: "gtk_vruler_new".} proc GTK_TYPE_VSCALE*(): GType proc GTK_VSCALE*(obj: pointer): PGtkVScale @@ -11192,9 +11205,9 @@ proc GTK_IS_VSCALE_CLASS*(klass: pointer): bool proc GTK_VSCALE_GET_CLASS*(obj: pointer): PGtkVScaleClass proc gtk_vscale_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vscale_get_type".} -proc gtk_vscale_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl, +proc gtk_vscale_new*(adjustment: PGtkAdjustment): PGtkVScale{.cdecl, dynlib: gtklib, importc: "gtk_vscale_new".} -proc gtk_vscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkWidget{. +proc gtk_vscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkVScale{. cdecl, dynlib: gtklib, importc: "gtk_vscale_new_with_range".} proc GTK_TYPE_VSCROLLBAR*(): GType proc GTK_VSCROLLBAR*(obj: pointer): PGtkVScrollbar @@ -11204,7 +11217,7 @@ proc GTK_IS_VSCROLLBAR_CLASS*(klass: pointer): bool proc GTK_VSCROLLBAR_GET_CLASS*(obj: pointer): PGtkVScrollbarClass proc gtk_vscrollbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vscrollbar_get_type".} -proc gtk_vscrollbar_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl, +proc gtk_vscrollbar_new*(adjustment: PGtkAdjustment): PGtkVScrollbar{.cdecl, dynlib: gtklib, importc: "gtk_vscrollbar_new".} proc GTK_TYPE_VSEPARATOR*(): GType proc GTK_VSEPARATOR*(obj: pointer): PGtkVSeparator @@ -11214,7 +11227,7 @@ proc GTK_IS_VSEPARATOR_CLASS*(klass: pointer): bool proc GTK_VSEPARATOR_GET_CLASS*(obj: pointer): PGtkVSeparatorClass proc gtk_vseparator_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vseparator_get_type".} -proc gtk_vseparator_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_vseparator_new*(): PGtkVSeparator{.cdecl, dynlib: gtklib, importc: "gtk_vseparator_new".} proc GTK_TYPE_OBJECT*(): GType = result = gtk_object_get_type() @@ -16902,7 +16915,7 @@ proc gtk_binding_entry_add_signal*(binding_set: PGtkBindingSet, keyval: guint, modifiers: TGdkModifierType, signal_name: cstring, n_args: guint){.varargs, importc, cdecl, dynlib: gtklib.} -proc gtk_clist_new_with_titles*(columns: gint): PGtkWidget{.varargs, cdecl, +proc gtk_clist_new_with_titles*(columns: gint): PGtkCList{.varargs, cdecl, importc, dynlib: gtklib.} proc gtk_clist_prepend*(clist: PGtkCList): gint{.importc, varargs, cdecl, dynlib: gtklib.} proc gtk_clist_append*(clist: PGtkCList): gint{.importc, varargs, cdecl, dynlib: gtklib.} @@ -16929,7 +16942,7 @@ proc gtk_container_child_get_valist*(container: PGtkContainer, child: PGtkWidget, first_property_name: cstring){.varargs, importc, cdecl, dynlib: gtklib.} -proc gtk_ctree_new_with_titles*(columns: gint, tree_column: gint): PGtkWidget{. +proc gtk_ctree_new_with_titles*(columns: gint, tree_column: gint): PGtkCTree{. importc, varargs, cdecl, dynlib: gtklib.} proc gtk_curve_get_vector*(curve: PGtkCurve, veclen: int32){.varargs, cdecl, importc, dynlib: gtklib.} @@ -16939,7 +16952,7 @@ proc gtk_dialog_add_buttons*(dialog: PGtkDialog, first_button_text: cstring){. varargs, cdecl, importc, dynlib: gtklib.} proc gtk_dialog_new_with_buttons*(title: cstring, parent: PGtkWindow, flags: TGtkDialogFlags, - first_button_text: cstring): PGtkWidget{. + first_button_text: cstring): PGtkDialog{. varargs, cdecl, importc, dynlib: gtklib.} proc gtk_list_store_new*(n_columns: gint): PGtkListStore{.varargs, cdecl, importc, dynlib: gtklib.} @@ -16949,7 +16962,7 @@ proc gtk_list_store_set_valist*(list_store: PGtkListStore, iter: PGtkTreeIter){. varargs, cdecl, importc, dynlib: gtklib.} proc gtk_message_dialog_new*(parent: PGtkWindow, flags: TGtkDialogFlags, thetype: TGtkMessageType, buttons: TGtkButtonsType, - message_format: cstring): PGtkWidget{.varargs, + message_format: cstring): PGtkMessageDialog{.varargs, cdecl, importc, dynlib: gtklib.} proc gtk_signal_new*(name: cstring, signal_flags: TGtkSignalRunType, object_type: TGtkType, function_offset: guint, @@ -17014,11 +17027,11 @@ proc gtk_widget_style_get*(widget: PGtkWidget, first_property_name: cstring){. varargs, cdecl, importc, dynlib: gtklib.} proc gtk_file_chooser_dialog_new*(title: cstring, parent: PGtkWindow, action: TGtkFileChooserAction, - first_button_text: cstring): PGtkWidget{.cdecl, + first_button_text: cstring): PGtkDialog {.cdecl, varargs, dynlib: gtklib, importc: "gtk_file_chooser_dialog_new".} proc gtk_file_chooser_dialog_new_with_backend*(title: cstring, parent: PGtkWindow, action: TGtkFileChooserAction, backend: cstring, - first_button_text: cstring): PGtkWidget{.varargs, cdecl, dynlib: gtklib, + first_button_text: cstring): PGtkDialog {.varargs, cdecl, dynlib: gtklib, importc: "gtk_file_chooser_dialog_new_with_backend".} proc gtk_object_ref*(anObject: PGtkObject): PGtkObject{.cdecl,importc, dynlib: gtklib.} proc gtk_object_unref*(anObject: PGtkObject){.cdecl, importc, dynlib: gtklib.} @@ -17075,7 +17088,7 @@ type GTK_FILE_FILTER_FILENAME = 1 shl 0, GTK_FILE_FILTER_URI = 1 shl 1, GTK_FILE_FILTER_DISPLAY_NAME = 1 shl 2, GTK_FILE_FILTER_MIME_TYPE = 1 shl 3 PGtkFileFilterInfo* = ref TGtkFileFilterInfo - TGtkFileFilterInfo* {.final.} = object + TGtkFileFilterInfo* {.final, pure.} = object contains*: TGtkFileFilterFlags filename*: cstring uri*: cstring diff --git a/lib/base/gtk/gtkhtml.nim b/lib/base/gtk/gtkhtml.nim index ca1ce883d4..17d3ac56c6 100644 --- a/lib/base/gtk/gtkhtml.nim +++ b/lib/base/gtk/gtkhtml.nim @@ -68,12 +68,12 @@ type exc: PDomException): PDomString{.cdecl.} PDomDocument* = ptr TDomDocument - TDomDocument* {.final.} = object + TDomDocument* {.final, pure.} = object parent*: PDomNode iterators*: PGSList PDomDocumentClass* = ptr TDomDocumentClass - TDomDocumentClass* {.final.} = object + TDomDocumentClass* {.final, pure.} = object parent_class*: PDomNodeClass PHtmlFocusIterator* = ptr THtmlFocusIterator diff --git a/lib/base/gtk/pango.nim b/lib/base/gtk/pango.nim index 363d02cd6a..363650f1ff 100644 --- a/lib/base/gtk/pango.nim +++ b/lib/base/gtk/pango.nim @@ -47,7 +47,7 @@ type PPangoGlyph* = ptr TPangoGlyph TPangoGlyph* = guint32 PPangoRectangle* = ptr TPangoRectangle - TPangoRectangle* {.final.} = object + TPangoRectangle* {.final, pure.} = object x*: int32 y*: int32 width*: int32 @@ -58,7 +58,7 @@ type PANGO_DIRECTION_LTR, PANGO_DIRECTION_RTL, PANGO_DIRECTION_TTB_LTR, PANGO_DIRECTION_TTB_RTL PPangoColor* = ptr TPangoColor - TPangoColor* {.final.} = object + TPangoColor* {.final, pure.} = object red*: guint16 green*: guint16 blue*: guint16 @@ -69,12 +69,12 @@ type TPangoUnderline* = int32 PPangoAttribute* = ptr TPangoAttribute PPangoAttrClass* = ptr TPangoAttrClass - TPangoAttribute* {.final.} = object + TPangoAttribute* {.final, pure.} = object klass*: PPangoAttrClass start_index*: int end_index*: int - TPangoAttrClass* {.final.} = object + TPangoAttrClass* {.final, pure.} = object `type`*: TPangoAttrType copy*: proc (attr: PPangoAttribute): PPangoAttribute{.cdecl.} destroy*: proc (attr: PPangoAttribute){.cdecl.} @@ -82,43 +82,43 @@ type cdecl.} PPangoAttrString* = ptr TPangoAttrString - TPangoAttrString* {.final.} = object + TPangoAttrString* {.final, pure.} = object attr*: TPangoAttribute value*: cstring PPangoAttrLanguage* = ptr TPangoAttrLanguage - TPangoAttrLanguage* {.final.} = object + TPangoAttrLanguage* {.final, pure.} = object attr*: TPangoAttribute value*: PPangoLanguage PPangoAttrInt* = ptr TPangoAttrInt - TPangoAttrInt* {.final.} = object + TPangoAttrInt* {.final, pure.} = object attr*: TPangoAttribute value*: int32 PPangoAttrFloat* = ptr TPangoAttrFloat - TPangoAttrFloat* {.final.} = object + TPangoAttrFloat* {.final, pure.} = object attr*: TPangoAttribute value*: gdouble PPangoAttrColor* = ptr TPangoAttrColor - TPangoAttrColor* {.final.} = object + TPangoAttrColor* {.final, pure.} = object attr*: TPangoAttribute color*: TPangoColor PPangoAttrShape* = ptr TPangoAttrShape - TPangoAttrShape* {.final.} = object + TPangoAttrShape* {.final, pure.} = object attr*: TPangoAttribute ink_rect*: TPangoRectangle logical_rect*: TPangoRectangle PPangoAttrFontDesc* = ptr TPangoAttrFontDesc - TPangoAttrFontDesc* {.final.} = object + TPangoAttrFontDesc* {.final, pure.} = object attr*: TPangoAttribute desc*: PPangoFontDescription PPangoLogAttr* = ptr TPangoLogAttr - TPangoLogAttr* {.final.} = object + TPangoLogAttr* {.final, pure.} = object flag0*: guint16 PPangoCoverageLevel* = ptr TPangoCoverageLevel @@ -126,25 +126,25 @@ type PANGO_COVERAGE_NONE, PANGO_COVERAGE_FALLBACK, PANGO_COVERAGE_APPROXIMATE, PANGO_COVERAGE_EXACT PPangoBlockInfo* = ptr TPangoBlockInfo - TPangoBlockInfo* {.final.} = object + TPangoBlockInfo* {.final, pure.} = object data*: Pguchar level*: TPangoCoverageLevel PPangoCoverage* = ptr TPangoCoverage - TPangoCoverage* {.final.} = object + TPangoCoverage* {.final, pure.} = object ref_count*: int n_blocks*: int32 data_size*: int32 blocks*: PPangoBlockInfo PPangoEngineRange* = ptr TPangoEngineRange - TPangoEngineRange* {.final.} = object + TPangoEngineRange* {.final, pure.} = object start*: int32 theEnd*: int32 langs*: cstring PPangoEngineInfo* = ptr TPangoEngineInfo - TPangoEngineInfo* {.final.} = object + TPangoEngineInfo* {.final, pure.} = object id*: cstring engine_type*: cstring render_type*: cstring @@ -152,7 +152,7 @@ type n_ranges*: gint PPangoEngine* = ptr TPangoEngine - TPangoEngine* {.final.} = object + TPangoEngine* {.final, pure.} = object id*: cstring `type`*: cstring length*: gint @@ -162,7 +162,7 @@ type attrs: PPangoLogAttr, attrs_len: int32){. cdecl.} PPangoEngineLang* = ptr TPangoEngineLang - TPangoEngineLang* {.final.} = object + TPangoEngineLang* {.final, pure.} = object engine*: TPangoEngine script_break*: TPangoEngineLangScriptBreak @@ -173,7 +173,7 @@ type language: PPangoLanguage): PPangoCoverage{. cdecl.} PPangoEngineShape* = ptr TPangoEngineShape - TPangoEngineShape* {.final.} = object + TPangoEngineShape* {.final, pure.} = object engine*: TPangoEngine script_shape*: TPangoEngineShapeScript get_coverage*: TPangoEngineShapeGetCoverage @@ -191,28 +191,28 @@ type PPangoGlyphUnit* = ptr TPangoGlyphUnit TPangoGlyphUnit* = gint32 PPangoGlyphGeometry* = ptr TPangoGlyphGeometry - TPangoGlyphGeometry* {.final.} = object + TPangoGlyphGeometry* {.final, pure.} = object width*: TPangoGlyphUnit x_offset*: TPangoGlyphUnit y_offset*: TPangoGlyphUnit PPangoGlyphVisAttr* = ptr TPangoGlyphVisAttr - TPangoGlyphVisAttr* {.final.} = object + TPangoGlyphVisAttr* {.final, pure.} = object flag0*: int16 PPangoGlyphInfo* = ptr TPangoGlyphInfo - TPangoGlyphInfo* {.final.} = object + TPangoGlyphInfo* {.final, pure.} = object glyph*: TPangoGlyph geometry*: TPangoGlyphGeometry attr*: TPangoGlyphVisAttr - TPangoGlyphString* {.final.} = object + TPangoGlyphString* {.final, pure.} = object num_glyphs*: gint glyphs*: PPangoGlyphInfo log_clusters*: Pgint space*: gint - TPangoAnalysis* {.final.} = object + TPangoAnalysis* {.final, pure.} = object shape_engine*: PPangoEngineShape lang_engine*: PPangoEngineLang font*: PPangoFont @@ -220,7 +220,7 @@ type language*: PPangoLanguage extra_attrs*: PGSList - TPangoItem* {.final.} = object + TPangoItem* {.final, pure.} = object offset*: gint length*: gint num_chars*: gint @@ -233,14 +233,14 @@ type TPangoWrapMode* = enum PANGO_WRAP_WORD, PANGO_WRAP_CHAR PPangoLayoutLine* = ptr TPangoLayoutLine - TPangoLayoutLine* {.final.} = object + TPangoLayoutLine* {.final, pure.} = object layout*: PPangoLayout start_index*: gint length*: gint runs*: PGSList PPangoLayoutRun* = ptr TPangoLayoutRun - TPangoLayoutRun* {.final.} = object + TPangoLayoutRun* {.final, pure.} = object item*: PPangoItem glyphs*: PPangoGlyphString diff --git a/lib/base/x11/xcms.nim b/lib/base/x11/xcms.nim index ab535ffc39..57aad6ae06 100644 --- a/lib/base/x11/xcms.nim +++ b/lib/base/x11/xcms.nim @@ -350,31 +350,31 @@ proc XcmsVisualOfCCC*(para1: TXcmsCCC): PVisual{.cdecl, dynlib: libX11, importc. # implementation proc XcmsUndefinedFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000000) + result = 0x00000000'i32 proc XcmsCIEXYZFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000001) + result = 0x00000001'i32 proc XcmsCIEuvYFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000002) + result = 0x00000002'i32 proc XcmsCIExyYFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000003) + result = 0x00000003'i32 proc XcmsCIELabFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000004) + result = 0x00000004'i32 proc XcmsCIELuvFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000005) + result = 0x00000005'i32 proc XcmsTekHVCFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000006) + result = 0x00000006'i32 proc XcmsRGBFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x80000000) + result = 0x80000000'i32 proc XcmsRGBiFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x80000001) + result = 0x80000001'i32 when defined(MACROS): proc DisplayOfCCC(ccc: int32): int32 = diff --git a/lib/base/x11/xi.nim b/lib/base/x11/xi.nim index 194b0eff40..d1b9f78462 100644 --- a/lib/base/x11/xi.nim +++ b/lib/base/x11/xi.nim @@ -219,7 +219,7 @@ const DvLed* = int(1) shl 4 DvLedMode* = int(1) shl 5 DvKey* = int(1) shl 6 - DvAutoRepeatMode* = int(1) shl 7 + DvAutoRepeatMode* = 1 shl 7 const DvString* = int(1) shl 0 diff --git a/lib/cycle.h b/lib/cycle.h new file mode 100644 index 0000000000..4d714ba3f1 --- /dev/null +++ b/lib/cycle.h @@ -0,0 +1,514 @@ +/* + * Copyright (c) 2003, 2007 Matteo Frigo + * Copyright (c) 2003, 2007 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +/* machine-dependent cycle counters code. Needs to be inlined. */ + +/***************************************************************************/ +/* To use the cycle counters in your code, simply #include "cycle.h" (this + file), and then use the functions/macros: + + ticks getticks(void); + + ticks is an opaque typedef defined below, representing the current time. + You extract the elapsed time between two calls to gettick() via: + + double elapsed(ticks t1, ticks t0); + + which returns a double-precision variable in arbitrary units. You + are not expected to convert this into human units like seconds; it + is intended only for *comparisons* of time intervals. + + (In order to use some of the OS-dependent timer routines like + Solaris' gethrtime, you need to paste the autoconf snippet below + into your configure.ac file and #include "config.h" before cycle.h, + or define the relevant macros manually if you are not using autoconf.) +*/ + +/***************************************************************************/ +/* This file uses macros like HAVE_GETHRTIME that are assumed to be + defined according to whether the corresponding function/type/header + is available on your system. The necessary macros are most + conveniently defined if you are using GNU autoconf, via the tests: + + dnl --------------------------------------------------------------------- + + AC_C_INLINE + AC_HEADER_TIME + AC_CHECK_HEADERS([sys/time.h c_asm.h intrinsics.h mach/mach_time.h]) + + AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t is defined in ])],,[#if HAVE_SYS_TIME_H +#include +#endif]) + + AC_CHECK_FUNCS([gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time]) + + dnl Cray UNICOS _rtc() (real-time clock) intrinsic + AC_MSG_CHECKING([for _rtc intrinsic]) + rtc_ok=yes + AC_TRY_LINK([#ifdef HAVE_INTRINSICS_H +#include +#endif], [_rtc()], [AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])], [rtc_ok=no]) + AC_MSG_RESULT($rtc_ok) + + dnl --------------------------------------------------------------------- +*/ + +/***************************************************************************/ + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#define INLINE_ELAPSED(INL) static INL double elapsed(ticks t1, ticks t0) \ +{ \ + return (double)t1 - (double)t0; \ +} + +/*----------------------------------------------------------------*/ +/* Solaris */ +#if defined(HAVE_GETHRTIME) && defined(HAVE_HRTIME_T) && !defined(HAVE_TICK_COUNTER) +typedef hrtime_t ticks; + +#define getticks gethrtime + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* AIX v. 4+ routines to read the real-time clock or time-base register */ +#if defined(HAVE_READ_REAL_TIME) && defined(HAVE_TIME_BASE_TO_TIME) && !defined(HAVE_TICK_COUNTER) +typedef timebasestruct_t ticks; + +static __inline ticks getticks(void) +{ + ticks t; + read_real_time(&t, TIMEBASE_SZ); + return t; +} + +static __inline double elapsed(ticks t1, ticks t0) /* time in nanoseconds */ +{ + time_base_to_time(&t1, TIMEBASE_SZ); + time_base_to_time(&t0, TIMEBASE_SZ); + return (((double)t1.tb_high - (double)t0.tb_high) * 1.0e9 + + ((double)t1.tb_low - (double)t0.tb_low)); +} + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * PowerPC ``cycle'' counter using the time base register. + */ +#if ((((defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))) || (defined(__MWERKS__) && defined(macintosh)))) || (defined(__IBM_GCC_ASM) && (defined(__powerpc__) || defined(__ppc__)))) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + unsigned int tbl, tbu0, tbu1; + + do { + __asm__ __volatile__ ("mftbu %0" : "=r"(tbu0)); + __asm__ __volatile__ ("mftb %0" : "=r"(tbl)); + __asm__ __volatile__ ("mftbu %0" : "=r"(tbu1)); + } while (tbu0 != tbu1); + + return (((unsigned long long)tbu0) << 32) | tbl; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* MacOS/Mach (Darwin) time-base register interface (unlike UpTime, + from Carbon, requires no additional libraries to be linked). */ +#if defined(HAVE_MACH_ABSOLUTE_TIME) && defined(HAVE_MACH_MACH_TIME_H) && !defined(HAVE_TICK_COUNTER) +#include +typedef uint64_t ticks; +#define getticks mach_absolute_time +INLINE_ELAPSED(__inline__) +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * Pentium cycle counter + */ +#if (defined(__GNUC__) || defined(__ICC)) && defined(__i386__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__("rdtsc": "=A" (ret)); + /* no input, nothing else clobbered */ + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */ +#endif + +/* Visual C++ -- thanks to Morten Nissov for his help with this */ +#if _MSC_VER >= 1200 && _M_IX86 >= 500 && !defined(HAVE_TICK_COUNTER) +#include +typedef LARGE_INTEGER ticks; +#define RDTSC __asm __emit 0fh __asm __emit 031h /* hack for VC++ 5.0 */ + +static __inline ticks getticks(void) +{ + ticks retval; + + __asm { + RDTSC + mov retval.HighPart, edx + mov retval.LowPart, eax + } + return retval; +} + +static __inline double elapsed(ticks t1, ticks t0) +{ + return (double)t1.QuadPart - (double)t0.QuadPart; +} + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */ +#endif + +/*----------------------------------------------------------------*/ +/* + * X86-64 cycle counter + */ +#if (defined(__GNUC__) || defined(__ICC) || defined(__SUNPRO_C)) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + unsigned a, d; + asm volatile("rdtsc" : "=a" (a), "=d" (d)); + return ((ticks)a) | (((ticks)d) << 32); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* PGI compiler, courtesy Cristiano Calonaci, Andrea Tarsi, & Roberto Gori. + NOTE: this code will fail to link unless you use the -Masmkeyword compiler + option (grrr). */ +#if defined(__PGI) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; +static ticks getticks(void) +{ + asm(" rdtsc; shl $0x20,%rdx; mov %eax,%eax; or %rdx,%rax; "); +} +INLINE_ELAPSED(__inline__) +#define HAVE_TICK_COUNTER +#endif + +/* Visual C++, courtesy of Dirk Michaelis */ +#if _MSC_VER >= 1400 && (defined(_M_AMD64) || defined(_M_X64)) && !defined(HAVE_TICK_COUNTER) + +#include +#pragma intrinsic(__rdtsc) +typedef unsigned __int64 ticks; +#define getticks __rdtsc +INLINE_ELAPSED(__inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * IA64 cycle counter + */ + +/* intel's icc/ecc compiler */ +#if (defined(__EDG_VERSION) || defined(__ECC)) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; +#include + +static __inline__ ticks getticks(void) +{ + return __getReg(_IA64_REG_AR_ITC); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* gcc */ +#if defined(__GNUC__) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__ ("mov %0=ar.itc" : "=r"(ret)); + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* HP/UX IA64 compiler, courtesy Teresa L. Johnson: */ +#if defined(__hpux) && defined(__ia64) && !defined(HAVE_TICK_COUNTER) +#include +typedef unsigned long ticks; + +static inline ticks getticks(void) +{ + ticks ret; + + ret = _Asm_mov_from_ar (_AREG_ITC); + return ret; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/* Microsoft Visual C++ */ +#if defined(_MSC_VER) && defined(_M_IA64) && !defined(HAVE_TICK_COUNTER) +typedef unsigned __int64 ticks; + +# ifdef __cplusplus +extern "C" +# endif +ticks __getReg(int whichReg); +#pragma intrinsic(__getReg) + +static __inline ticks getticks(void) +{ + volatile ticks temp; + temp = __getReg(3116); + return temp; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * PA-RISC cycle counter + */ +#if defined(__hppa__) || defined(__hppa) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +# ifdef __GNUC__ +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__("mfctl 16, %0": "=r" (ret)); + /* no input, nothing else clobbered */ + return ret; +} +# else +# include +static inline unsigned long getticks(void) +{ + register ticks ret; + _MFCTL(16, ret); + return ret; +} +# endif + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* S390, courtesy of James Treacy */ +#if defined(__GNUC__) && defined(__s390__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + ticks cycles; + __asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc"); + return cycles; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif +/*----------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__alpha__) && !defined(HAVE_TICK_COUNTER) +/* + * The 32-bit cycle counter on alpha overflows pretty quickly, + * unfortunately. A 1GHz machine overflows in 4 seconds. + */ +typedef unsigned int ticks; + +static __inline__ ticks getticks(void) +{ + unsigned long cc; + __asm__ __volatile__ ("rpcc %0" : "=r"(cc)); + return (cc & 0xFFFFFFFF); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__sparc_v9__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + __asm__ __volatile__("rd %%tick, %0" : "=r" (ret)); + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +#if (defined(__DECC) || defined(__DECCXX)) && defined(__alpha) && defined(HAVE_C_ASM_H) && !defined(HAVE_TICK_COUNTER) +# include +typedef unsigned int ticks; + +static __inline ticks getticks(void) +{ + unsigned long cc; + cc = asm("rpcc %v0"); + return (cc & 0xFFFFFFFF); +} + +INLINE_ELAPSED(__inline) + +#define HAVE_TICK_COUNTER +#endif +/*----------------------------------------------------------------*/ +/* SGI/Irix */ +#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_SGI_CYCLE) && !defined(HAVE_TICK_COUNTER) +typedef struct timespec ticks; + +static inline ticks getticks(void) +{ + struct timespec t; + clock_gettime(CLOCK_SGI_CYCLE, &t); + return t; +} + +static inline double elapsed(ticks t1, ticks t0) +{ + return ((double)t1.tv_sec - (double)t0.tv_sec) * 1.0E9 + + ((double)t1.tv_nsec - (double)t0.tv_nsec); +} +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* Cray UNICOS _rtc() intrinsic function */ +#if defined(HAVE__RTC) && !defined(HAVE_TICK_COUNTER) +#ifdef HAVE_INTRINSICS_H +# include +#endif + +typedef long long ticks; + +#define getticks _rtc + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* MIPS ZBus */ +#if HAVE_MIPS_ZBUS_TIMER +#if defined(__mips__) && !defined(HAVE_TICK_COUNTER) +#include +#include +#include + +typedef uint64_t ticks; + +static inline ticks getticks(void) +{ + static uint64_t* addr = 0; + + if (addr == 0) + { + uint32_t rq_addr = 0x10030000; + int fd; + int pgsize; + + pgsize = getpagesize(); + fd = open ("/dev/mem", O_RDONLY | O_SYNC, 0); + if (fd < 0) { + perror("open"); + return NULL; + } + addr = mmap(0, pgsize, PROT_READ, MAP_SHARED, fd, rq_addr); + close(fd); + if (addr == (uint64_t *)-1) { + perror("mmap"); + return NULL; + } + } + + return *addr; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif +#endif /* HAVE_MIPS_ZBUS_TIMER */ + diff --git a/lib/gc.nim b/lib/gc.nim index 680256a93a..344aa33f33 100644 --- a/lib/gc.nim +++ b/lib/gc.nim @@ -54,19 +54,6 @@ proc getTotalMem(): int = return tlsfMax() # --------------------------------------------------------------------------- -# After several attempts, we now use a novel approach for cycle detection: -# increments/decrements of the reference counters are enqued into a buffer -# and not immediately performed. The reason is that increments may introduce -# new garbage cycles. The cycle detector only scans the changed subgraph. This -# provides superior performance. Of course only cells that may be part of -# a cycle are considered. However, reallocation does not work with this scheme! -# Because the queue may contain references to the old cell. -# The queue is thread-local storage, so that no synchronization is needed for -# reference counting. - -# With this scheme, the entire heap is never searched and there is no need for -# the AT. - const debugGC = false # we wish to debug the GC... logGC = false @@ -89,7 +76,7 @@ const # this seems to be a good value const - MemAlignment = sizeof(pointer)*2 # minimal memory block that can be allocated + MemAlignment = 8 # BUGFIX: on AMD64, dlmalloc aligns at 8 byte boundary BitsPerUnit = sizeof(int)*8 # a "unit" is a word, i.e. 4 bytes # on a 32 bit system; I do not use the term "word" because under 32-bit @@ -255,8 +242,14 @@ proc inOperator(s: TCellSeq, c: PCell): bool {.inline.} = proc add(s: var TCellSeq, c: PCell) {.inline.} = if s.len >= s.cap: s.cap = s.cap * 3 div 2 - s.d = cast[PCellArray](tlsf_realloc(s.d, s.cap * sizeof(PCell))) - if s.d == nil: raiseOutOfMem() + var d = cast[PCellArray](tlsf_malloc(s.cap * sizeof(PCell))) + if d == nil: raiseOutOfMem() + copyMem(d, s.d, s.len * sizeof(PCell)) + tlsf_free(s.d) + s.d = d + # BUGFIX: realloc failes on AMD64, sigh... + #s.d = cast[PCellArray](tlsf_realloc(s.d, s.cap * sizeof(PCell))) + #if s.d == nil: raiseOutOfMem() s.d[s.len] = c inc(s.len) @@ -383,7 +376,7 @@ iterator elements(t: TCellSet): PCell {.inline.} = # --------------- end of Cellset routines ------------------------------------- -when logGC or traceGC: +when debugGC: proc writeCell(msg: CString, c: PCell) = var kind = -1 if c.typ != nil: kind = ord(c.typ.kind) @@ -707,7 +700,6 @@ proc collectCycles(gch: var TGcHeap) = var tabSize = 0 for c in elements(gch.cycleRoots): inc(tabSize) - assert(c.typ != nil) forallChildren(c, waCycleDecRef) gch.cycleTableSize = max(gch.cycleTableSize, tabSize) diff --git a/lib/macros.nim b/lib/macros.nim index 809531c4ce..b307c00cba 100644 --- a/lib/macros.nim +++ b/lib/macros.nim @@ -30,59 +30,59 @@ # if key[-4:] == "Flag": continue # cog.out(toEnum(key, val)) #]]] -type - TNimrodTypeKind* = enum - ntyNone, ntyBool, ntyChar, ntyEmpty, - ntyArrayConstr, ntyNil, ntyGeneric, ntyGenericInst, - ntyGenericParam, ntyEnum, ntyAnyEnum, ntyArray, - ntyObject, ntyTuple, ntySet, ntyRange, - ntyPtr, ntyRef, ntyVar, ntySequence, - ntyProc, ntyPointer, ntyOpenArray, ntyString, - ntyCString, ntyForward, ntyInt, ntyInt8, - ntyInt16, ntyInt32, ntyInt64, ntyFloat, - ntyFloat32, ntyFloat64, ntyFloat128 - TNimTypeKinds* = set[TNimrodTypeKind] - TNimrodSymKind* = enum - nskUnknownSym, nskConditional, nskDynLib, nskParam, - nskTypeParam, nskTemp, nskType, nskConst, - nskVar, nskProc, nskIterator, nskConverter, - nskMacro, nskTemplate, nskField, nskEnumField, - nskForVar, nskModule, nskLabel, nskStub - TNimSymKinds* = set[TNimrodSymKind] - TNimrodNodeKind* = enum - nnkNone, nnkEmpty, nnkIdent, nnkSym, - nnkType, nnkCharLit, nnkIntLit, nnkInt8Lit, - nnkInt16Lit, nnkInt32Lit, nnkInt64Lit, nnkFloatLit, - nnkFloat32Lit, nnkFloat64Lit, nnkStrLit, nnkRStrLit, - nnkTripleStrLit, nnkMetaNode, nnkNilLit, nnkDotCall, - nnkCommand, nnkCall, nnkGenericCall, nnkExplicitTypeListCall, - nnkExprEqExpr, nnkExprColonExpr, nnkIdentDefs, nnkInfix, - nnkPrefix, nnkPostfix, nnkPar, nnkCurly, - nnkBracket, nnkBracketExpr, nnkPragmaExpr, nnkRange, - nnkDotExpr, nnkCheckedFieldExpr, nnkDerefExpr, nnkIfExpr, - nnkElifExpr, nnkElseExpr, nnkLambda, nnkAccQuoted, - nnkHeaderQuoted, nnkTableConstr, nnkQualified, nnkHiddenStdConv, - nnkHiddenSubConv, nnkHiddenCallConv, nnkConv, nnkCast, - nnkAddr, nnkHiddenAddr, nnkHiddenDeref, nnkObjDownConv, - nnkObjUpConv, nnkChckRangeF, nnkChckRange64, nnkChckRange, - nnkStringToCString, nnkCStringToString, nnkPassAsOpenArray, nnkAsgn, - nnkDefaultTypeParam, nnkGenericParams, nnkFormalParams, nnkOfInherit, - nnkModule, nnkProcDef, nnkConverterDef, nnkMacroDef, - nnkTemplateDef, nnkIteratorDef, nnkOfBranch, nnkElifBranch, - nnkExceptBranch, nnkElse, nnkMacroStmt, nnkAsmStmt, - nnkPragma, nnkIfStmt, nnkWhenStmt, nnkForStmt, - nnkWhileStmt, nnkCaseStmt, nnkVarSection, nnkConstSection, - nnkConstDef, nnkTypeSection, nnkTypeDef, nnkYieldStmt, - nnkTryStmt, nnkFinally, nnkRaiseStmt, nnkReturnStmt, - nnkBreakStmt, nnkContinueStmt, nnkBlockStmt, nnkDiscardStmt, - nnkStmtList, nnkImportStmt, nnkFromStmt, nnkImportAs, - nnkIncludeStmt, nnkAccessStmt, nnkCommentStmt, nnkStmtListExpr, - nnkBlockExpr, nnkStmtListType, nnkBlockType, nnkVm, - nnkTypeOfExpr, nnkObjectTy, nnkTupleTy, nnkRecList, - nnkRecCase, nnkRecWhen, nnkRefTy, nnkPtrTy, - nnkVarTy, nnkProcTy, nnkEnumTy, nnkEnumFieldDef, - nnkReturnToken - TNimNodeKinds* = set[TNimrodNodeKind] +type + TNimrodNodeKind* = enum + nnkNone, nnkEmpty, nnkIdent, nnkSym, + nnkType, nnkCharLit, nnkIntLit, nnkInt8Lit, + nnkInt16Lit, nnkInt32Lit, nnkInt64Lit, nnkFloatLit, + nnkFloat32Lit, nnkFloat64Lit, nnkStrLit, nnkRStrLit, + nnkTripleStrLit, nnkMetaNode, nnkNilLit, nnkDotCall, + nnkCommand, nnkCall, nnkGenericCall, nnkExplicitTypeListCall, + nnkExprEqExpr, nnkExprColonExpr, nnkIdentDefs, nnkInfix, + nnkPrefix, nnkPostfix, nnkPar, nnkCurly, + nnkBracket, nnkBracketExpr, nnkPragmaExpr, nnkRange, + nnkDotExpr, nnkCheckedFieldExpr, nnkDerefExpr, nnkIfExpr, + nnkElifExpr, nnkElseExpr, nnkLambda, nnkAccQuoted, + nnkHeaderQuoted, nnkTableConstr, nnkQualified, nnkHiddenStdConv, + nnkHiddenSubConv, nnkHiddenCallConv, nnkConv, nnkCast, + nnkAddr, nnkHiddenAddr, nnkHiddenDeref, nnkObjDownConv, + nnkObjUpConv, nnkChckRangeF, nnkChckRange64, nnkChckRange, + nnkStringToCString, nnkCStringToString, nnkPassAsOpenArray, nnkAsgn, + nnkDefaultTypeParam, nnkGenericParams, nnkFormalParams, nnkOfInherit, + nnkModule, nnkProcDef, nnkConverterDef, nnkMacroDef, + nnkTemplateDef, nnkIteratorDef, nnkOfBranch, nnkElifBranch, + nnkExceptBranch, nnkElse, nnkMacroStmt, nnkAsmStmt, + nnkPragma, nnkIfStmt, nnkWhenStmt, nnkForStmt, + nnkWhileStmt, nnkCaseStmt, nnkVarSection, nnkConstSection, + nnkConstDef, nnkTypeSection, nnkTypeDef, nnkYieldStmt, + nnkTryStmt, nnkFinally, nnkRaiseStmt, nnkReturnStmt, + nnkBreakStmt, nnkContinueStmt, nnkBlockStmt, nnkDiscardStmt, + nnkStmtList, nnkImportStmt, nnkFromStmt, nnkImportAs, + nnkIncludeStmt, nnkAccessStmt, nnkCommentStmt, nnkStmtListExpr, + nnkBlockExpr, nnkStmtListType, nnkBlockType, nnkVm, + nnkTypeOfExpr, nnkObjectTy, nnkTupleTy, nnkRecList, + nnkRecCase, nnkRecWhen, nnkRefTy, nnkPtrTy, + nnkVarTy, nnkProcTy, nnkEnumTy, nnkEnumFieldDef, + nnkReturnToken + TNimNodeKinds* = set[TNimrodNodeKind] + TNimrodTypeKind* = enum + ntyNone, ntyBool, ntyChar, ntyEmpty, + ntyArrayConstr, ntyNil, ntyGeneric, ntyGenericInst, + ntyGenericParam, ntyEnum, ntyAnyEnum, ntyArray, + ntyObject, ntyTuple, ntySet, ntyRange, + ntyPtr, ntyRef, ntyVar, ntySequence, + ntyProc, ntyPointer, ntyOpenArray, ntyString, + ntyCString, ntyForward, ntyInt, ntyInt8, + ntyInt16, ntyInt32, ntyInt64, ntyFloat, + ntyFloat32, ntyFloat64, ntyFloat128 + TNimTypeKinds* = set[TNimrodTypeKind] + TNimrodSymKind* = enum + nskUnknownSym, nskConditional, nskDynLib, nskParam, + nskTypeParam, nskTemp, nskType, nskConst, + nskVar, nskProc, nskIterator, nskConverter, + nskMacro, nskTemplate, nskField, nskEnumField, + nskForVar, nskModule, nskLabel, nskStub + TNimSymKinds* = set[TNimrodSymKind] #[[[end]]] type diff --git a/lib/os.nim b/lib/os.nim index 8ec781000d..fa53fa3e2c 100644 --- a/lib/os.nim +++ b/lib/os.nim @@ -1062,14 +1062,14 @@ proc cmpPaths(pathA, pathB: string): int = result = cmpIgnoreCase(pathA, pathB) proc extractDir(path: string): string = - if path[path.len-1] in {dirSep, altSep}: + if path.len == 0 or path[path.len-1] in {dirSep, altSep}: result = path else: var tail: string splitPath(path, result, tail) proc extractFilename(path: string): string = - if path[path.len-1] in {dirSep, altSep}: + if path.len == 0 or path[path.len-1] in {dirSep, altSep}: result = "" else: var head: string diff --git a/lib/osproc.nim b/lib/osproc.nim new file mode 100644 index 0000000000..2282e802d5 --- /dev/null +++ b/lib/osproc.nim @@ -0,0 +1,395 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This module implements an advanced facility for executing OS processes. +## On Windows this module is currently broken. Please help! + +import + os, strtabs, streams + +when defined(windows): + import windows + +type + TProcess = object of TObject + when defined(windows): + FProcessHandle: Thandle + FThreadHandle: Thandle + inputHandle, outputHandle, errorHandle: TFileHandle + else: + inputHandle, outputHandle, errorHandle: TFileHandle + id: cint + exitCode: cint + + PProcess* = ref TProcess ## represents an operating system process + + TProcessOption* = enum ## options that can be passed `startProcess` + poNone, ## none option + poUseShell, ## use the shell to execute the command; NOTE: This + ## often creates a security whole! + poStdErrToStdOut ## merge stdout and stderr to the stdout stream + +proc executeProcess*(command: string, + options: set[TProcessOption] = {poStdErrToStdOut, + poUseShell}): string + ## A convience procedure that executes ``command`` with ``startProcess`` + ## and returns its output as a string. + +proc startProcess*(command: string, + workingDir: string = "", + args: openarray[string] = [], + env: PStringTable = nil, + options: set[TProcessOption] = {poStdErrToStdOut}): PProcess + ## Starts a process. `Command` is the executable file, `workingDir` is the + ## process's working directory. If ``workingDir == ""`` the current directory + ## is used. `args` are the command line arguments that are passed to the + ## process. On many operating systems, the first command line argument is the + ## name of the executable. `args` should not contain this argument! + ## `startProcess` takes care of that. `env` is the environment that will be + ## passed to the process. If ``env == nil`` the environment is inherited of + ## the parent process. `options` are additional flags that may be passed + ## to `startProcess`. See the documentation of ``TProcessOption`` for the + ## meaning of these flags. + ## Return value: The newly created process object. Nil is never returned, + ## but ``EOS`` is raised in case of an error. + +when true: + nil +else: + proc startGUIProcess*(command: string, + workingDir: string = "", + args: openarray[string] = [], + env: PStringTable = nil, + x = -1, + y = -1, + width = -1, + height = -1): PProcess + +proc suspend*(p: PProcess) + ## Suspends the process `p`. + +proc resume*(p: PProcess) + ## Resumes the process `p`. + +proc terminate*(p: PProcess) + ## Terminates the process `p`. + +proc running*(p: PProcess): bool + ## Returns true iff the process `p` is still running. Returns immediately. + +proc processID*(p: PProcess): int = + ## returns `p`'s process ID. + return p.id + +proc waitForExit*(p: PProcess): int + ## waits for the process to finish and returns `p`'s error code. + +proc inputStream*(p: PProcess): PStream + ## returns ``p``'s input stream for writing to + +proc outputStream*(p: PProcess): PStream + ## returns ``p``'s output stream for reading from + +proc errorStream*(p: PProcess): PStream + ## returns ``p``'s output stream for reading from + +proc executeProcess*(command: string, + options: set[TProcessOption] = {poStdErrToStdOut, + poUseShell}): string = + var c = parseCmdLine(command) + var a: seq[string] = @[] # slicing is not yet implemented :-( + for i in 1 .. c.len-1: add(a, c[i]) + var p = startProcess(command=c[0], args=a, options=options) + var outp = outputStream(p) + result = "" + while running(p) or not outp.atEnd(outp): + result.add(outp.readLine()) + result.add("\n") + +when false: + proc deallocCStringArray(a: cstringArray) = + var i = 0 + while a[i] != nil: + dealloc(a[i]) + inc(i) + dealloc(a) + +when defined(Windows): + # We need to implement a handle stream for Windows: + type + PFileHandleStream = ref TFileHandleStream + TFileHandleStream = object of TStream + handle: THandle + atTheEnd: bool + + proc hsClose(s: PFileHandleStream) = nil # nothing to do here + proc hsAtEnd(s: PFileHandleStream): bool = return true + + proc hsReadData(s: PFileHandleStream, buffer: pointer, bufLen: int): int = + var br: int32 + var a = windows.ReadFile(s.handle, buffer, bufLen, br, nil) + if a == 0: OSError() + result = br + #atEnd = bytesRead < bufLen + + proc hsWriteData(s: PFileHandleStream, buffer: pointer, bufLen: int) = + var bytesWritten: int32 + var a = windows.writeFile(s.handle, buffer, bufLen, bytesWritten, nil) + if a == 0: OSError() + + proc newFileHandleStream(handle: THandle): PFileHandleStream = + new(result) + result.handle = handle + result.close = hsClose + result.atEnd = hsAtEnd + result.readData = hsReadData + result.writeData = hsWriteData + + proc buildCommandLine(a: string, args: openarray[string]): cstring = + var L = a.len + for i in 0..high(args): inc(L, args[i].len+1) + result = cast[cstring](alloc0(L+1)) + copyMem(result, cstring(a), a.len) + L = a.len + for i in 0..high(args): + result[L] = ' ' + inc(L) + copyMem(addr(result[L]), cstring(args[i]), args[i].len) + inc(L, args[i].len) + + proc buildEnv(env: PStringTable): cstring = + var L = 0 + for key, val in pairs(env): inc(L, key.len + val.len + 2) + result = cast[cstring](alloc0(L+2)) + L = 0 + for key, val in pairs(env): + var x = key & "=" & val + copyMem(addr(result[L]), cstring(x), x.len+1) # copy \0 + inc(L, x.len+1) + + #proc open_osfhandle(osh: THandle, mode: int): int {. + # importc: "_open_osfhandle", header: "".} + + #var + # O_WRONLY {.importc: "_O_WRONLY", header: "".}: int + # O_RDONLY {.importc: "_O_RDONLY", header: "".}: int + + proc CreatePipeHandles(Inhandle, OutHandle: ptr THandle) = + var piInheritablePipe: TSecurityAttributes + piInheritablePipe.nlength = SizeOF(TSecurityAttributes) + piInheritablePipe.lpSecurityDescriptor = Nil + piInheritablePipe.Binherithandle = 1 + if CreatePipe(Inhandle, Outhandle, addr(piInheritablePipe), 0) == 0'i32: + OSError() + + proc startProcess*(command: string, + workingDir: string = "", + args: openarray[string] = [], + env: PStringTable = nil, + options: set[TProcessOption] = {poStdErrToStdOut}): PProcess = + new(result) + var + SI: TStartupInfo + ProcInfo: TProcessInformation + success: int + hi, ho, he: THandle + SI.cb = SizeOf(SI) + SI.dwFlags = STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES + CreatePipeHandles(addr(SI.hStdInput), addr(HI)) + CreatePipeHandles(addr(HO), addr(Si.hStdOutput)) + #SI.hStdInput = GetStdHandle(STD_INPUT_HANDLE()) + #SI.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE()) + if poStdErrToStdOut in options: + SI.hStdError = SI.hStdOutput + HE = HO + else: + CreatePipeHandles(addr(HE), addr(Si.hStdError)) + #SI.hStdError = GetStdHandle(STD_ERROR_HANDLE()) + #result.inputHandle = open_osfhandle(HI, O_WRONLY) + #if result.inputHandle == -1'i32: OSError() + result.inputHandle = hi + result.outputHandle = ho + result.errorHandle = he + #result.outputHandle = open_osfhandle(HO, O_RDONLY) + #if result.outputHandle == -1'i32: OSError() + #result.errorHandle = open_osfhandle(HE, O_RDONLY) + #if result.errorHandle == -1'i32: OSError() + var cmdl = buildCommandLine(command, args) + var wd: cstring = nil + if len(workingDir) > 0: wd = workingDir + if env == nil: + success = Windows.CreateProcess(nil, + cmdl, nil, nil, 0, + NORMAL_PRIORITY_CLASS, nil, wd, + addr(SI), addr(ProcInfo)) + else: + var e = buildEnv(env) + success = Windows.CreateProcess(nil, + cmdl, nil, nil, 0, + NORMAL_PRIORITY_CLASS, e, wd, + addr(SI), addr(ProcInfo)) + dealloc(e) + dealloc(cmdl) + if success == 0: + OSError() + result.FProcessHandle = procInfo.hProcess + result.FThreadHandle = procInfo.hThread + result.id = procInfo.dwProcessID + + proc suspend(p: PProcess) = + discard SuspendThread(p.FThreadHandle) + + proc resume(p: PProcess) = + discard ResumeThread(p.FThreadHandle) + + proc running(p: PProcess): bool = + var x = waitForSingleObject(p.FThreadHandle, 50) + return x == WAIT_TIMEOUT + + proc terminate(p: PProcess) = + if running(p): + discard TerminateProcess(p.FProcessHandle, 0) + + proc waitForExit(p: PProcess): int = + discard WaitForSingleObject(p.FThreadHandle, Infinite) + var res: dword + discard GetExitCodeProcess(p.FProcessHandle, res) + result = res + discard CloseHandle(p.FThreadHandle) + discard CloseHandle(p.FProcessHandle) + + proc inputStream(p: PProcess): PStream = + result = newFileHandleStream(p.inputHandle) + + proc outputStream(p: PProcess): PStream = + result = newFileHandleStream(p.outputHandle) + + proc errorStream(p: PProcess): PStream = + result = newFileHandleStream(p.errorHandle) + +else: + import posix + + const + readIdx = 0 + writeIdx = 1 + + proc addCmdArgs(command: string, args: openarray[string]): string = + result = command + for i in 0 .. high(args): + add(result, " ") + add(result, args[i]) + + proc toCStringArray(b, a: openarray[string]): cstringArray = + result = cast[cstringArray](alloc0((a.len + b.len + 1) * sizeof(cstring))) + for i in 0..high(b): + result[i] = cast[cstring](alloc(b[i].len+1)) + copyMem(result[i], cstring(b[i]), b[i].len+1) + for i in 0..high(a): + result[i+b.len] = cast[cstring](alloc(a[i].len+1)) + copyMem(result[i+b.len], cstring(a[i]), a[i].len+1) + + proc ToCStringArray(t: PStringTable): cstringArray = + result = cast[cstringArray](alloc0((t.len + 1) * sizeof(cstring))) + var i = 0 + for key, val in pairs(t): + var x = key & "=" & val + result[i] = cast[cstring](alloc(x.len+1)) + copyMem(result[i], addr(x[0]), x.len+1) + inc(i) + + proc startProcess*(command: string, + workingDir: string = "", + args: openarray[string] = [], + env: PStringTable = nil, + options: set[TProcessOption] = {poStdErrToStdOut}): PProcess = + new(result) + var + p_stdin, p_stdout, p_stderr: array [0..1, cint] + if pipe(p_stdin) != 0'i32 or pipe(p_stdout) != 0'i32: + OSError("failed to create a pipe") + var Pid = fork() + if Pid < 0: + OSError("failed to fork process") + + if pid == 0: + ## child process: + discard close(p_stdin[writeIdx]) + discard dup2(p_stdin[readIdx], readIdx) + discard close(p_stdout[readIdx]) + discard dup2(p_stdout[writeIdx], writeIdx) + if poStdErrToStdOut in options: + discard dup2(p_stdout[writeIdx], 2) + else: + if pipe(p_stderr) != 0'i32: OSError("failed to create a pipe") + discard close(p_stderr[readIdx]) + discard dup2(p_stderr[writeIdx], 2) + + if workingDir.len > 0: + os.setCurrentDir(workingDir) + if poUseShell notin options: + var a = toCStringArray([extractFilename(command)], args) + if env == nil: + discard execv(command, a) + else: + discard execve(command, a, ToCStringArray(env)) + else: + var x = addCmdArgs(command, args) + var a = toCStringArray(["sh", "-c"], [x]) + if env == nil: + discard execv("/bin/sh", a) + else: + discard execve("/bin/sh", a, ToCStringArray(env)) + # too risky to raise an exception here: + echo("execve call failed: " & $strerror(errno)) + quit(1) + # Parent process. Copy process information. + result.id = pid + + result.inputHandle = p_stdin[writeIdx] + result.outputHandle = p_stdout[readIdx] + if poStdErrToStdOut in options: + result.errorHandle = result.outputHandle + else: + result.errorHandle = p_stderr[readIdx] + discard close(p_stderr[writeIdx]) + discard close(p_stdin[readIdx]) + discard close(p_stdout[writeIdx]) + + proc suspend(p: PProcess) = + discard kill(p.id, SIGSTOP) + + proc resume(p: PProcess) = + discard kill(p.id, SIGCONT) + + proc running(p: PProcess): bool = + result = waitPid(p.id, p.exitCode, WNOHANG) == int(p.id) + + proc terminate(p: PProcess) = + if kill(p.id, SIGTERM) == 0'i32: + if running(p): discard kill(p.id, SIGKILL) + + proc waitForExit(p: PProcess): int = + if waitPid(p.id, p.exitCode, 0) == int(p.id): + result = p.exitCode + + proc inputStream(p: PProcess): PStream = + var f: TFile + if not openFile(f, p.inputHandle, fmWrite): OSError() + result = newFileStream(f) + + proc outputStream(p: PProcess): PStream = + var f: TFile + if not openFile(f, p.outputHandle, fmRead): OSError() + result = newFileStream(f) + + proc errorStream(p: PProcess): PStream = + var f: TFile + if not openFile(f, p.errorHandle, fmRead): OSError() + result = newFileStream(f) diff --git a/lib/profiler.nim b/lib/profiler.nim new file mode 100644 index 0000000000..97c7dcfeb1 --- /dev/null +++ b/lib/profiler.nim @@ -0,0 +1,61 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +# This file implements the Nimrod profiler. The profiler needs support by the +# code generator. + +type + TProfileData {.compilerproc, final.} = object + procname: cstring + total: float + +var + profileData {.compilerproc.}: array [0..64*1024-1, TProfileData] + +proc sortProfile(a: var array[0..64*1024-1, TProfileData], N: int) = + # we use shellsort here; fast enough and simple + var h = 1 + while true: + h = 3 * h + 1 + if h > N: break + while true: + h = h div 3 + for i in countup(h, N - 1): + var v = a[i] + var j = i + while a[j-h].total <= v.total: + a[j] = a[j-h] + j = j-h + if j < h: break + a[j] = v + if h == 1: break + +proc writeProfile() {.noconv.} = + const filename = "profile_results" + var i = 0 + var f: TFile + var j = 1 + while openFile(f, filename & $j & ".txt"): + closeFile(f) + inc(j) + if openFile(f, filename & $j & ".txt", fmWrite): + var N = 0 + # we have to compute the actual length of the array: + while profileData[N].procname != nil: inc(N) + sortProfile(profileData, N) + writeln(f, "total running time of each proc" & + " (interpret these numbers relatively)") + while profileData[i].procname != nil: + write(f, profileData[i].procname) + write(f, ": ") + writeln(f, profileData[i].total) + inc(i) + closeFile(f) + +addQuitProc(writeProfile) diff --git a/lib/streams.nim b/lib/streams.nim new file mode 100644 index 0000000000..f09b91625b --- /dev/null +++ b/lib/streams.nim @@ -0,0 +1,244 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This module provides a stream interface and two implementations thereof: +## the `PFileStream` and the `PStringStream` which implement the stream +## interface for Nimrod file objects (`TFile`) and strings. Other modules +## may provide other implementations for this standard stream interface. + +proc newEIO(msg: string): ref EIO = + new(result) + result.msg = msg + +type + PStream* = ref TStream + TStream* = object of TObject ## Stream interface that supports + ## writing or reading. + close*: proc (s: PStream) + atEnd*: proc (s: PStream): bool + setPosition*: proc (s: PStream, pos: int) + getPosition*: proc (s: PStream): int + readData*: proc (s: PStream, buffer: pointer, bufLen: int): int + writeData*: proc (s: PStream, buffer: pointer, bufLen: int) + +proc write*[T](s: PStream, x: T) = + ## generic write procedure. Writes `x` to the stream `s`. Implementation: + ## + ## .. code-block:: Nimrod + ## + ## s.writeData(s, addr(x), sizeof(x)) + var x = x + s.writeData(s, addr(x), sizeof(x)) + +proc write*(s: PStream, x: string) = + ## writes the string `x` to the the stream `s`. No length field or + ## terminating zero is written. + s.writeData(s, cstring(x), x.len) + +proc read[T](s: PStream, result: var T) = + ## generic write procedure. Reads `result` from the stream `s`. + if s.readData(s, addr(result), sizeof(T)) != sizeof(T): + raise newEIO("cannot read from stream") + +proc readChar*(s: PStream): char = + ## reads a char from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readBool*(s: PStream): bool = + ## reads a bool from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readInt8*(s: PStream): int8 = + ## reads an int8 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readInt16*(s: PStream): int16 = + ## reads an int16 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readInt32*(s: PStream): int32 = + ## reads an int32 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readInt64*(s: PStream): int64 = + ## reads an int64 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readFloat32*(s: PStream): float32 = + ## reads a float32 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readFloat64*(s: PStream): float64 = + ## reads a float64 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readStr*(s: PStream, length: int): string = + ## reads a string of length `length` from the stream `s`. Raises `EIO` if + ## an error occured. + result = newString(length) + var L = s.readData(s, addr(result[0]), length) + if L != length: setLen(result, L) + +proc readLine*(s: PStream): string = + ## Reads a line from a stream `s`. Note: This is not very efficient. Raises + ## `EIO` if an error occured. + result = "" + while not s.atEnd(s): + var c = readChar(s) + if c == '\c': + c = readChar(s) + break + elif c == '\L': break + result.add(c) + +type + PStringStream* = ref TStringStream ## a stream that encapsulates a string + TStringStream* = object of TStream + data: string + pos: int + +proc ssAtEnd(s: PStringStream): bool = + return s.pos >= s.data.len + +proc ssSetPosition(s: PStringStream, pos: int) = + s.pos = min(pos, s.data.len-1) + +proc ssGetPosition(s: PStringStream): int = + return s.pos + +proc ssReadData(s: PStringStream, buffer: pointer, bufLen: int): int = + result = min(bufLen, s.data.len - s.pos) + if result > 0: + copyMem(buffer, addr(s.data[s.pos]), result) + inc(s.pos, result) + +proc ssWriteData(s: PStringStream, buffer: pointer, bufLen: int) = + if bufLen > 0: + setLen(s.data, s.data.len + bufLen) + copyMem(addr(s.data[s.pos]), buffer, bufLen) + inc(s.pos, bufLen) + +proc ssClose(s: PStringStream) = + s.data = nil + +proc newStringStream*(s: string = ""): PStringStream = + ## creates a new stream from the string `s`. + new(result) + result.data = s + result.pos = 0 + result.close = ssClose + result.atEnd = ssAtEnd + result.setPosition = ssSetPosition + result.getPosition = ssGetPosition + result.readData = ssReadData + result.writeData = ssWriteData + +type + PFileStream* = ref TFileStream ## a stream that encapsulates a `TFile` + TFileStream* = object of TStream + f: TFile + +proc fsClose(s: PFileStream) = closeFile(s.f) +proc fsAtEnd(s: PFileStream): bool = return EndOfFile(s.f) +proc fsSetPosition(s: PFileStream, pos: int) = setFilePos(s.f, pos) +proc fsGetPosition(s: PFileStream): int = return int(getFilePos(s.f)) + +proc fsReadData(s: PFileStream, buffer: pointer, bufLen: int): int = + result = readBuffer(s.f, buffer, bufLen) + +proc fsWriteData(s: PFileStream, buffer: pointer, bufLen: int) = + if writeBuffer(s.f, buffer, bufLen) != bufLen: + raise newEIO("cannot write to stream") + +proc newFileStream*(f: TFile): PFileStream = + ## creates a new stream from the file `f`. + new(result) + result.f = f + result.close = fsClose + result.atEnd = fsAtEnd + result.setPosition = fsSetPosition + result.getPosition = fsGetPosition + result.readData = fsReadData + result.writeData = fsWriteData + +proc newFileStream*(filename: string, mode: TFileMode): PFileStream = + ## creates a new stream from the file named `filename` with the mode `mode`. + ## If the file cannot be opened, nil is returned. + var f: TFile + if OpenFile(f, filename, mode): result = newFileStream(f) + + +when true: + nil +else: + type + TFileHandle* = cint ## Operating system file handle + PFileHandleStream* = ref TFileHandleStream + TFileHandleStream* = object of TStream + handle*: TFileHandle + pos: int + + proc newEOS(msg: string): ref EOS = + new(result) + result.msg = msg + + proc hsGetPosition(s: PFileHandleStream): int = + return s.pos + + when defined(windows): + # do not import windows as this increases compile times: + nil + else: + import posix + + proc hsSetPosition(s: PFileHandleStream, pos: int) = + discard lseek(s.handle, pos, SEEK_SET) + + proc hsClose(s: PFileHandleStream) = discard close(s.handle) + proc hsAtEnd(s: PFileHandleStream): bool = + var pos = hsGetPosition(s) + var theEnd = lseek(s.handle, 0, SEEK_END) + result = pos >= theEnd + hsSetPosition(s, pos) # set position back + + proc hsReadData(s: PFileHandleStream, buffer: pointer, bufLen: int): int = + result = posix.read(s.handle, buffer, bufLen) + inc(s.pos, result) + + proc hsWriteData(s: PFileHandleStream, buffer: pointer, bufLen: int) = + if posix.write(s.handle, buffer, bufLen) != bufLen: + raise newEIO("cannot write to stream") + inc(s.pos, bufLen) + + proc newFileHandleStream*(handle: TFileHandle): PFileHandleStream = + new(result) + result.handle = handle + result.pos = 0 + result.close = hsClose + result.atEnd = hsAtEnd + result.setPosition = hsSetPosition + result.getPosition = hsGetPosition + result.readData = hsReadData + result.writeData = hsWriteData + + proc newFileHandleStream*(filename: string, + mode: TFileMode): PFileHandleStream = + when defined(windows): + nil + else: + var flags: cint + case mode + of fmRead: flags = posix.O_RDONLY + of fmWrite: flags = O_WRONLY or int(O_CREAT) + of fmReadWrite: flags = O_RDWR or int(O_CREAT) + of fmReadWriteExisting: flags = O_RDWR + of fmAppend: flags = O_WRONLY or int(O_CREAT) or O_APPEND + var handle = open(filename, flags) + if handle < 0: raise newEOS("posix.open() call failed") + result = newFileHandleStream(handle) diff --git a/lib/sysio.nim b/lib/sysio.nim index 8887effa83..c178ff559a 100644 --- a/lib/sysio.nim +++ b/lib/sysio.nim @@ -53,6 +53,16 @@ proc readLine(f: TFile): string = result = "" rawReadLine(f, result) +proc write(f: TFile, s: string) = fputs(s, f) +proc write(f: TFile, i: int) = fprintf(f, "%ld", i) +proc write(f: TFile, b: bool) = + if b: write(f, "true") + else: write(f, "false") +proc write(f: TFile, r: float) = fprintf(f, "%g", r) +proc write(f: TFile, c: Char) = putc(c, f) +proc write(f: TFile, a: openArray[string]) = + for x in items(a): write(f, x) + proc readFile(filename: string): string = var f: TFile try: @@ -68,16 +78,6 @@ proc readFile(filename: string): string = except EIO: result = nil -proc write(f: TFile, s: string) = fputs(s, f) -proc write(f: TFile, i: int) = fprintf(f, "%ld", i) -proc write(f: TFile, b: bool) = - if b: write(f, "true") - else: write(f, "false") -proc write(f: TFile, r: float) = fprintf(f, "%g", r) -proc write(f: TFile, c: Char) = putc(c, f) -proc write(f: TFile, a: openArray[string]) = - for x in items(a): write(f, x) - proc EndOfFile(f: TFile): bool = # do not blame me; blame the ANSI C standard this is so brain-damaged var diff --git a/lib/target.h b/lib/target.h new file mode 100644 index 0000000000..1afd62aef2 --- /dev/null +++ b/lib/target.h @@ -0,0 +1,12 @@ +#ifndef _TARGET_H_ +#define _TARGET_H_ + +#include + +#define TLSF_MLOCK_T pthread_mutex_t +#define TLSF_CREATE_LOCK(l) pthread_mutex_init (l, NULL) +#define TLSF_DESTROY_LOCK(l) pthread_mutex_destroy(l) +#define TLSF_ACQUIRE_LOCK(l) pthread_mutex_lock(l) +#define TLSF_RELEASE_LOCK(l) pthread_mutex_unlock(l) + +#endif diff --git a/lib/tlsf.c b/lib/tlsf.c new file mode 100644 index 0000000000..767299ed68 --- /dev/null +++ b/lib/tlsf.c @@ -0,0 +1,1005 @@ +/* + * Two Levels Segregate Fit memory allocator (TLSF) + * Version 2.4.3 + * + * Written by Miguel Masmano Tello + * + * Thanks to Ismael Ripoll for his suggestions and reviews + * + * Copyright (C) 2008, 2007, 2006, 2005, 2004 + * + * This code is released using a dual license strategy: GPL/LGPL + * You can choose the licence that better fits your requirements. + * + * Released under the terms of the GNU General Public License Version 2.0 + * Released under the terms of the GNU Lesser General Public License Version 2.1 + * + */ + +/* + * Code contributions: + * + * (Jul 28 2007) Herman ten Brugge : + * + * - Add 64 bit support. It now runs on x86_64 and solaris64. + * - I also tested this on vxworks/32and solaris/32 and i386/32 processors. + * - Remove assembly code. I could not measure any performance difference + * on my core2 processor. This also makes the code more portable. + * - Moved defines/typedefs from tlsf.h to tlsf.c + * - Changed MIN_BLOCK_SIZE to sizeof (free_ptr_t) and BHDR_OVERHEAD to + * (sizeof (bhdr_t) - MIN_BLOCK_SIZE). This does not change the fact + * that the minumum size is still sizeof + * (bhdr_t). + * - Changed all C++ comment style to C style. (// -> /.* ... *./) + * - Used ls_bit instead of ffs and ms_bit instead of fls. I did this to + * avoid confusion with the standard ffs function which returns + * different values. + * - Created set_bit/clear_bit fuctions because they are not present + * on x86_64. + * - Added locking support + extra file target.h to show how to use it. + * - Added get_used_size function (REMOVED in 2.4) + * - Added rtl_realloc and rtl_calloc function + * - Implemented realloc clever support. + * - Added some test code in the example directory. + * + * + * (Oct 23 2006) Adam Scislowicz: + * + * - Support for ARMv5 implemented + * + */ + +/************************************************************************/ + +#define USE_SBRK (1) +#define USE_MMAP (1) +#define TLSF_STATISTIC (1) + +#include +#include + +#ifndef TLSF_USE_LOCKS +#define TLSF_USE_LOCKS (0) +#endif + +#ifndef TLSF_STATISTIC +#define TLSF_STATISTIC (0) +#endif + +#ifndef USE_MMAP +#define USE_MMAP (0) +#endif + +#ifndef USE_SBRK +#define USE_SBRK (0) +#endif + + +#if TLSF_USE_LOCKS +#include "target.h" +#else +#define TLSF_CREATE_LOCK(_unused_) do {} while(0) +#define TLSF_DESTROY_LOCK(_unused_) do {} while(0) +#define TLSF_ACQUIRE_LOCK(_unused_) do {} while(0) +#define TLSF_RELEASE_LOCK(_unused_) do {} while(0) +#endif + +#if TLSF_STATISTIC +#define TLSF_ADD_SIZE(tlsf, b) do { \ + tlsf->used_size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; \ + if (tlsf->used_size > tlsf->max_size) \ + tlsf->max_size = tlsf->used_size; \ + } while(0) + +#define TLSF_REMOVE_SIZE(tlsf, b) do { \ + tlsf->used_size -= (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; \ + } while(0) +#else +#define TLSF_ADD_SIZE(tlsf, b) do{}while(0) +#define TLSF_REMOVE_SIZE(tlsf, b) do{}while(0) +#endif + +#if USE_MMAP || USE_SBRK +#include +#endif + +#if USE_MMAP +#include +#endif + +#include "tlsf.h" + +#if !defined(__GNUC__) +#ifndef __inline__ +#define __inline__ +#endif +#endif + +/* The debug functions only can be used when _DEBUG_TLSF_ is set. */ +#ifndef _DEBUG_TLSF_ +#define _DEBUG_TLSF_ (0) +#endif + +/*************************************************************************/ +/* Definition of the structures used by TLSF */ + + +/* Some IMPORTANT TLSF parameters */ +/* Unlike the preview TLSF versions, now they are statics */ +#define BLOCK_ALIGN (sizeof(void *) * 2) + +#define MAX_FLI (30) +#define MAX_LOG2_SLI (5) +#define MAX_SLI (1 << MAX_LOG2_SLI) /* MAX_SLI = 2^MAX_LOG2_SLI */ + +#define FLI_OFFSET (6) /* tlsf structure just will manage blocks bigger */ +/* than 128 bytes */ +#define SMALL_BLOCK (128) +#define REAL_FLI (MAX_FLI - FLI_OFFSET) +#define MIN_BLOCK_SIZE (sizeof (free_ptr_t)) +#define BHDR_OVERHEAD (sizeof (bhdr_t) - MIN_BLOCK_SIZE) +#define TLSF_SIGNATURE (0x2A59FA59) + +#define PTR_MASK (sizeof(void *) - 1) +#define BLOCK_SIZE (0xFFFFFFFF - PTR_MASK) + +#define GET_NEXT_BLOCK(_addr, _r) ((bhdr_t *) ((char *) (_addr) + (_r))) +#define MEM_ALIGN ((BLOCK_ALIGN) - 1) +#define ROUNDUP_SIZE(_r) (((_r) + MEM_ALIGN) & ~MEM_ALIGN) +#define ROUNDDOWN_SIZE(_r) ((_r) & ~MEM_ALIGN) +#define ROUNDUP(_x, _v) ((((~(_x)) + 1) & ((_v)-1)) + (_x)) + +#define BLOCK_STATE (0x1) +#define PREV_STATE (0x2) + +/* bit 0 of the block size */ +#define FREE_BLOCK (0x1) +#define USED_BLOCK (0x0) + +/* bit 1 of the block size */ +#define PREV_FREE (0x2) +#define PREV_USED (0x0) + + +#define DEFAULT_AREA_SIZE (1024*10) + +#ifdef USE_MMAP +#define PAGE_SIZE (getpagesize()) +#endif + +#define PRINT_MSG(fmt, args...) printf(fmt, ## args) +#define ERROR_MSG(fmt, args...) printf(fmt, ## args) + +typedef unsigned int u32_t; /* NOTE: Make sure that this type is 4 bytes long on your computer */ +typedef unsigned char u8_t; /* NOTE: Make sure that this type is 1 byte on your computer */ + +typedef struct free_ptr_struct { + struct bhdr_struct *prev; + struct bhdr_struct *next; +} free_ptr_t; + +typedef struct bhdr_struct { + /* This pointer is just valid if the first bit of size is set */ + struct bhdr_struct *prev_hdr; + /* The size is stored in bytes */ + size_t size; /* bit 0 indicates whether the block is used and */ + /* bit 1 allows to know whether the previous block is free */ + union { + struct free_ptr_struct free_ptr; + u8_t buffer[1]; /*sizeof(struct free_ptr_struct)]; */ + } ptr; +} bhdr_t; + +/* This structure is embedded at the beginning of each area, giving us + * enough information to cope with a set of areas */ + +typedef struct area_info_struct { + bhdr_t *end; + struct area_info_struct *next; +} area_info_t; + +typedef struct TLSF_struct { + /* the TLSF's structure signature */ + u32_t tlsf_signature; + +#if TLSF_USE_LOCKS + TLSF_MLOCK_T lock; +#endif + +#if TLSF_STATISTIC + /* These can not be calculated outside tlsf because we + * do not know the sizes when freeing/reallocing memory. */ + size_t used_size; + size_t max_size; +#endif + + /* A linked list holding all the existing areas */ + area_info_t *area_head; + + /* the first-level bitmap */ + /* This array should have a size of REAL_FLI bits */ + u32_t fl_bitmap; + + /* the second-level bitmap */ + u32_t sl_bitmap[REAL_FLI]; + + bhdr_t *matrix[REAL_FLI][MAX_SLI]; +} tlsf_t; + + +/******************************************************************/ +/************** Helping functions **************************/ +/******************************************************************/ +static __inline__ void set_bit(int nr, u32_t * addr); +static __inline__ void clear_bit(int nr, u32_t * addr); +static __inline__ int ls_bit(int x); +static __inline__ int ms_bit(int x); +static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl); +static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl); +static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl); +static __inline__ bhdr_t *process_area(void *area, size_t size); +#if USE_SBRK || USE_MMAP +static __inline__ void *get_new_area(size_t * size); +#endif + +static const int table[] = { + -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, + 4, 4, + 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, + 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, + 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, + 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + 7, 7, 7, 7, 7, 7, 7 +}; + +static __inline__ int ls_bit(int i) +{ + unsigned int a; + unsigned int x = i & -i; + + a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); + return table[x >> a] + a; +} + +static __inline__ int ms_bit(int i) +{ + unsigned int a; + unsigned int x = (unsigned int) i; + + a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); + return table[x >> a] + a; +} + +static __inline__ void set_bit(int nr, u32_t * addr) +{ + addr[nr >> 5] |= 1 << (nr & 0x1f); +} + +static __inline__ void clear_bit(int nr, u32_t * addr) +{ + addr[nr >> 5] &= ~(1 << (nr & 0x1f)); +} + +static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl) +{ + int _t; + + if (*_r < SMALL_BLOCK) { + *_fl = 0; + *_sl = *_r / (SMALL_BLOCK / MAX_SLI); + } else { + _t = (1 << (ms_bit(*_r) - MAX_LOG2_SLI)) - 1; + *_r = *_r + _t; + *_fl = ms_bit(*_r); + *_sl = (*_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI; + *_fl -= FLI_OFFSET; + /*if ((*_fl -= FLI_OFFSET) < 0) // FL wil be always >0! + *_fl = *_sl = 0; + */ + *_r &= ~_t; + } +} + +static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl) +{ + if (_r < SMALL_BLOCK) { + *_fl = 0; + *_sl = _r / (SMALL_BLOCK / MAX_SLI); + } else { + *_fl = ms_bit(_r); + *_sl = (_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI; + *_fl -= FLI_OFFSET; + } +} + + +static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl) +{ + u32_t _tmp = _tlsf->sl_bitmap[*_fl] & (~0 << *_sl); + bhdr_t *_b = NULL; + + if (_tmp) { + *_sl = ls_bit(_tmp); + _b = _tlsf->matrix[*_fl][*_sl]; + } else { + *_fl = ls_bit(_tlsf->fl_bitmap & (~0 << (*_fl + 1))); + if (*_fl > 0) { /* likely */ + *_sl = ls_bit(_tlsf->sl_bitmap[*_fl]); + _b = _tlsf->matrix[*_fl][*_sl]; + } + } + return _b; +} + + +#define EXTRACT_BLOCK_HDR(_b, _tlsf, _fl, _sl) do { \ + _tlsf -> matrix [_fl] [_sl] = _b -> ptr.free_ptr.next; \ + if (_tlsf -> matrix[_fl][_sl]) \ + _tlsf -> matrix[_fl][_sl] -> ptr.free_ptr.prev = NULL; \ + else { \ + clear_bit (_sl, &_tlsf -> sl_bitmap [_fl]); \ + if (!_tlsf -> sl_bitmap [_fl]) \ + clear_bit (_fl, &_tlsf -> fl_bitmap); \ + } \ + _b -> ptr.free_ptr.prev = NULL; \ + _b -> ptr.free_ptr.next = NULL; \ + }while(0) + + +#define EXTRACT_BLOCK(_b, _tlsf, _fl, _sl) do { \ + if (_b -> ptr.free_ptr.next) \ + _b -> ptr.free_ptr.next -> ptr.free_ptr.prev = _b -> ptr.free_ptr.prev; \ + if (_b -> ptr.free_ptr.prev) \ + _b -> ptr.free_ptr.prev -> ptr.free_ptr.next = _b -> ptr.free_ptr.next; \ + if (_tlsf -> matrix [_fl][_sl] == _b) { \ + _tlsf -> matrix [_fl][_sl] = _b -> ptr.free_ptr.next; \ + if (!_tlsf -> matrix [_fl][_sl]) { \ + clear_bit (_sl, &_tlsf -> sl_bitmap[_fl]); \ + if (!_tlsf -> sl_bitmap [_fl]) \ + clear_bit (_fl, &_tlsf -> fl_bitmap); \ + } \ + } \ + _b -> ptr.free_ptr.prev = NULL; \ + _b -> ptr.free_ptr.next = NULL; \ + } while(0) + +#define INSERT_BLOCK(_b, _tlsf, _fl, _sl) do { \ + _b -> ptr.free_ptr.prev = NULL; \ + _b -> ptr.free_ptr.next = _tlsf -> matrix [_fl][_sl]; \ + if (_tlsf -> matrix [_fl][_sl]) \ + _tlsf -> matrix [_fl][_sl] -> ptr.free_ptr.prev = _b; \ + _tlsf -> matrix [_fl][_sl] = _b; \ + set_bit (_sl, &_tlsf -> sl_bitmap [_fl]); \ + set_bit (_fl, &_tlsf -> fl_bitmap); \ + } while(0) + +#ifndef MAP_ANONYMOUS +# ifdef MAP_ANON +# define MAP_ANONYMOUS MAP_ANON +# else +# define MAP_ANONYMOUS 0x20 +# endif +#endif + +#if USE_SBRK || USE_MMAP +static __inline__ void *get_new_area(size_t * size) +{ + void *area; + +#if USE_SBRK + area = (void *)sbrk(0); + if (((void *)sbrk(*size)) != ((void *) -1)) + return area; +#endif + +#if USE_MMAP + *size = ROUNDUP(*size, PAGE_SIZE); + if ((area = mmap(0, *size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)) != MAP_FAILED) + return area; +#endif + return ((void *) ~0); +} +#endif + +static __inline__ bhdr_t *process_area(void *area, size_t size) +{ + bhdr_t *b, *lb, *ib; + area_info_t *ai; + + ib = (bhdr_t *) area; + ib->size = + (sizeof(area_info_t) < + MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(sizeof(area_info_t)) | USED_BLOCK | PREV_USED; + b = (bhdr_t *) GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE); + b->size = ROUNDDOWN_SIZE(size - 3 * BHDR_OVERHEAD - (ib->size & BLOCK_SIZE)) | USED_BLOCK | PREV_USED; + b->ptr.free_ptr.prev = b->ptr.free_ptr.next = 0; + lb = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + lb->prev_hdr = b; + lb->size = 0 | USED_BLOCK | PREV_FREE; + ai = (area_info_t *) ib->ptr.buffer; + ai->next = 0; + ai->end = lb; + return ib; +} + +/******************************************************************/ +/******************** Begin of the allocator code *****************/ +/******************************************************************/ + +static char *mp = NULL; /* Default memory pool. */ + +/******************************************************************/ +size_t init_memory_pool(size_t mem_pool_size, void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf; + bhdr_t *b, *ib; + + if (!mem_pool || !mem_pool_size || mem_pool_size < sizeof(tlsf_t) + BHDR_OVERHEAD * 8) { + ERROR_MSG("init_memory_pool (): memory_pool invalid\n"); + return -1; + } + + if (((unsigned long) mem_pool & PTR_MASK)) { + ERROR_MSG("init_memory_pool (): mem_pool must be aligned to a word\n"); + return -1; + } + tlsf = (tlsf_t *) mem_pool; + /* Check if already initialised */ + if (tlsf->tlsf_signature == TLSF_SIGNATURE) { + mp = mem_pool; + b = GET_NEXT_BLOCK(mp, ROUNDUP_SIZE(sizeof(tlsf_t))); + return b->size & BLOCK_SIZE; + } + + mp = mem_pool; + + /* Zeroing the memory pool */ + memset(mem_pool, 0, sizeof(tlsf_t)); + + tlsf->tlsf_signature = TLSF_SIGNATURE; + + TLSF_CREATE_LOCK(&tlsf->lock); + + ib = process_area(GET_NEXT_BLOCK + (mem_pool, ROUNDUP_SIZE(sizeof(tlsf_t))), ROUNDDOWN_SIZE(mem_pool_size - sizeof(tlsf_t))); + b = GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE); + free_ex(b->ptr.buffer, tlsf); + tlsf->area_head = (area_info_t *) ib->ptr.buffer; + +#if TLSF_STATISTIC + tlsf->used_size = mem_pool_size - (b->size & BLOCK_SIZE); + tlsf->max_size = tlsf->used_size; +#endif + + return (b->size & BLOCK_SIZE); +} + +/******************************************************************/ +size_t add_new_area(void *area, size_t area_size, void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf = (tlsf_t *) mem_pool; + area_info_t *ptr, *ptr_prev, *ai; + bhdr_t *ib0, *b0, *lb0, *ib1, *b1, *lb1, *next_b; + + memset(area, 0, area_size); + ptr = tlsf->area_head; + ptr_prev = 0; + + ib0 = process_area(area, area_size); + b0 = GET_NEXT_BLOCK(ib0->ptr.buffer, ib0->size & BLOCK_SIZE); + lb0 = GET_NEXT_BLOCK(b0->ptr.buffer, b0->size & BLOCK_SIZE); + + /* Before inserting the new area, we have to merge this area with the + already existing ones */ + + while (ptr) { + ib1 = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD); + b1 = GET_NEXT_BLOCK(ib1->ptr.buffer, ib1->size & BLOCK_SIZE); + lb1 = ptr->end; + + /* Merging the new area with the next physically contigous one */ + if ((unsigned long) ib1 == (unsigned long) lb0 + BHDR_OVERHEAD) { + if (tlsf->area_head == ptr) { + tlsf->area_head = ptr->next; + ptr = ptr->next; + } else { + ptr_prev->next = ptr->next; + ptr = ptr->next; + } + + b0->size = + ROUNDDOWN_SIZE((b0->size & BLOCK_SIZE) + + (ib1->size & BLOCK_SIZE) + 2 * BHDR_OVERHEAD) | USED_BLOCK | PREV_USED; + + b1->prev_hdr = b0; + lb0 = lb1; + + continue; + } + + /* Merging the new area with the previous physically contigous + one */ + if ((unsigned long) lb1->ptr.buffer == (unsigned long) ib0) { + if (tlsf->area_head == ptr) { + tlsf->area_head = ptr->next; + ptr = ptr->next; + } else { + ptr_prev->next = ptr->next; + ptr = ptr->next; + } + + lb1->size = + ROUNDDOWN_SIZE((b0->size & BLOCK_SIZE) + + (ib0->size & BLOCK_SIZE) + 2 * BHDR_OVERHEAD) | USED_BLOCK | (lb1->size & PREV_STATE); + next_b = GET_NEXT_BLOCK(lb1->ptr.buffer, lb1->size & BLOCK_SIZE); + next_b->prev_hdr = lb1; + b0 = lb1; + ib0 = ib1; + + continue; + } + ptr_prev = ptr; + ptr = ptr->next; + } + + /* Inserting the area in the list of linked areas */ + ai = (area_info_t *) ib0->ptr.buffer; + ai->next = tlsf->area_head; + ai->end = lb0; + tlsf->area_head = ai; + free_ex(b0->ptr.buffer, mem_pool); + return (b0->size & BLOCK_SIZE); +} + + +/******************************************************************/ +size_t get_used_size(void *mem_pool) +{ +/******************************************************************/ +#if TLSF_STATISTIC + return ((tlsf_t *) mem_pool)->used_size; +#else + return 0; +#endif +} + +/******************************************************************/ +size_t get_max_size(void *mem_pool) +{ +/******************************************************************/ +#if TLSF_STATISTIC + return ((tlsf_t *) mem_pool)->max_size; +#else + return 0; +#endif +} + +/******************************************************************/ +void destroy_memory_pool(void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf = (tlsf_t *) mem_pool; + + tlsf->tlsf_signature = 0; + + TLSF_DESTROY_LOCK(&tlsf->lock); + +} + + +/******************************************************************/ +void *tlsf_malloc(size_t size) +{ +/******************************************************************/ + void *ret; + +#if USE_MMAP || USE_SBRK + if (!mp) { + size_t area_size; + void *area; + + area_size = sizeof(tlsf_t) + BHDR_OVERHEAD * 8; /* Just a safety constant */ + area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE; + area = get_new_area(&area_size); + if (area == ((void *) ~0)) + return NULL; /* Not enough system memory */ + init_memory_pool(area_size, area); + } +#endif + + TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); + + ret = malloc_ex(size, mp); + + TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); + + return ret; +} + +/******************************************************************/ +void tlsf_free(void *ptr) +{ +/******************************************************************/ + + TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); + + free_ex(ptr, mp); + + TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); + +} + +/******************************************************************/ +void *tlsf_realloc(void *ptr, size_t size) +{ +/******************************************************************/ + void *ret; + +#if USE_MMAP || USE_SBRK + if (!mp) { + return tlsf_malloc(size); + } +#endif + + TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); + + ret = realloc_ex(ptr, size, mp); + + TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); + + return ret; +} + +/******************************************************************/ +void *tlsf_calloc(size_t nelem, size_t elem_size) +{ +/******************************************************************/ + void *ret; + + TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); + + ret = calloc_ex(nelem, elem_size, mp); + + TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); + + return ret; +} + +/******************************************************************/ +void *malloc_ex(size_t size, void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf = (tlsf_t *) mem_pool; + bhdr_t *b, *b2, *next_b; + int fl, sl; + size_t tmp_size; + + size = (size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(size); + + /* Rounding up the requested size and calculating fl and sl */ + MAPPING_SEARCH(&size, &fl, &sl); + + /* Searching a free block, recall that this function changes the values of fl and sl, + so they are not longer valid when the function fails */ + b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl); +#if USE_MMAP || USE_SBRK + if (!b) { + size_t area_size; + void *area; + /* Growing the pool size when needed */ + area_size = size + BHDR_OVERHEAD * 8; /* size plus enough room for the requered headers. */ + area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE; + area = get_new_area(&area_size); /* Call sbrk or mmap */ + if (area == ((void *) ~0)) + return NULL; /* Not enough system memory */ + add_new_area(area, area_size, mem_pool); + /* Rounding up the requested size and calculating fl and sl */ + MAPPING_SEARCH(&size, &fl, &sl); + /* Searching a free block */ + b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl); + } +#endif + if (!b) + return NULL; /* Not found */ + + EXTRACT_BLOCK_HDR(b, tlsf, fl, sl); + + /*-- found: */ + next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + /* Should the block be split? */ + tmp_size = (b->size & BLOCK_SIZE) - size; + if (tmp_size >= sizeof(bhdr_t)) { + tmp_size -= BHDR_OVERHEAD; + b2 = GET_NEXT_BLOCK(b->ptr.buffer, size); + b2->size = tmp_size | FREE_BLOCK | PREV_USED; + next_b->prev_hdr = b2; + MAPPING_INSERT(tmp_size, &fl, &sl); + INSERT_BLOCK(b2, tlsf, fl, sl); + + b->size = size | (b->size & PREV_STATE); + } else { + next_b->size &= (~PREV_FREE); + b->size &= (~FREE_BLOCK); /* Now it's used */ + } + + TLSF_ADD_SIZE(tlsf, b); + + return (void *) b->ptr.buffer; +} + +extern void free_ex(void *ptr, void *mem_pool) { + tlsf_t *tlsf = (tlsf_t *) mem_pool; + bhdr_t *b, *tmp_b; + int fl = 0, sl = 0; + + if (!ptr) { + return; + } + b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD); + b->size |= FREE_BLOCK; + + TLSF_REMOVE_SIZE(tlsf, b); + + b->ptr.free_ptr.prev = NULL; + b->ptr.free_ptr.next = NULL; + tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + if (tmp_b->size & FREE_BLOCK) { + MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl); + EXTRACT_BLOCK(tmp_b, tlsf, fl, sl); + b->size += (tmp_b->size & BLOCK_SIZE) + BHDR_OVERHEAD; + } + if (b->size & PREV_FREE) { + tmp_b = b->prev_hdr; + MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl); + EXTRACT_BLOCK(tmp_b, tlsf, fl, sl); + tmp_b->size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; + b = tmp_b; + } + MAPPING_INSERT(b->size & BLOCK_SIZE, &fl, &sl); + INSERT_BLOCK(b, tlsf, fl, sl); + + tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + tmp_b->size |= PREV_FREE; + tmp_b->prev_hdr = b; +} + +/******************************************************************/ +void *realloc_ex(void *ptr, size_t new_size, void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf = (tlsf_t *) mem_pool; + void *ptr_aux; + unsigned int cpsize; + bhdr_t *b, *tmp_b, *next_b; + int fl, sl; + size_t tmp_size; + + if (!ptr) { + if (new_size) + return (void *) malloc_ex(new_size, mem_pool); + if (!new_size) + return NULL; + } else if (!new_size) { + free_ex(ptr, mem_pool); + return NULL; + } + + b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD); + next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + new_size = (new_size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(new_size); + tmp_size = (b->size & BLOCK_SIZE); + if (new_size <= tmp_size) { + TLSF_REMOVE_SIZE(tlsf, b); + if (next_b->size & FREE_BLOCK) { + MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl); + EXTRACT_BLOCK(next_b, tlsf, fl, sl); + tmp_size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD; + next_b = GET_NEXT_BLOCK(next_b->ptr.buffer, next_b->size & BLOCK_SIZE); + /* We allways reenter this free block because tmp_size will + be greater then sizeof (bhdr_t) */ + } + tmp_size -= new_size; + if (tmp_size >= sizeof(bhdr_t)) { + tmp_size -= BHDR_OVERHEAD; + tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size); + tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED; + next_b->prev_hdr = tmp_b; + next_b->size |= PREV_FREE; + MAPPING_INSERT(tmp_size, &fl, &sl); + INSERT_BLOCK(tmp_b, tlsf, fl, sl); + b->size = new_size | (b->size & PREV_STATE); + } + TLSF_ADD_SIZE(tlsf, b); + return (void *) b->ptr.buffer; + } + if ((next_b->size & FREE_BLOCK)) { + if (new_size <= (tmp_size + (next_b->size & BLOCK_SIZE))) { + TLSF_REMOVE_SIZE(tlsf, b); + MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl); + EXTRACT_BLOCK(next_b, tlsf, fl, sl); + b->size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD; + next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + next_b->prev_hdr = b; + next_b->size &= ~PREV_FREE; + tmp_size = (b->size & BLOCK_SIZE) - new_size; + if (tmp_size >= sizeof(bhdr_t)) { + tmp_size -= BHDR_OVERHEAD; + tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size); + tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED; + next_b->prev_hdr = tmp_b; + next_b->size |= PREV_FREE; + MAPPING_INSERT(tmp_size, &fl, &sl); + INSERT_BLOCK(tmp_b, tlsf, fl, sl); + b->size = new_size | (b->size & PREV_STATE); + } + TLSF_ADD_SIZE(tlsf, b); + return (void *) b->ptr.buffer; + } + } + + ptr_aux = malloc_ex(new_size, mem_pool); + + cpsize = ((b->size & BLOCK_SIZE) > new_size) ? new_size : (b->size & BLOCK_SIZE); + + memcpy(ptr_aux, ptr, cpsize); + + free_ex(ptr, mem_pool); + return ptr_aux; +} + + +/******************************************************************/ +void *calloc_ex(size_t nelem, size_t elem_size, void *mem_pool) +{ +/******************************************************************/ + void *ptr; + + if (nelem <= 0 || elem_size <= 0) + return NULL; + + if (!(ptr = malloc_ex(nelem * elem_size, mem_pool))) + return NULL; + memset(ptr, 0, nelem * elem_size); + + return ptr; +} + +/* for Nimrod: */ +size_t TLSF_GET_USED_SIZE(void) { return (((tlsf_t *)mp)->used_size); } +size_t TLSF_GET_MAX_SIZE(void) { return (((tlsf_t *)mp)->max_size); } + + +#if _DEBUG_TLSF_ + +/*************** DEBUG FUNCTIONS **************/ + +/* The following functions have been designed to ease the debugging of */ +/* the TLSF structure. For non-developing purposes, it may be they */ +/* haven't too much worth. To enable them, _DEBUG_TLSF_ must be set. */ + +extern void dump_memory_region(unsigned char *mem_ptr, unsigned int size); +extern void print_block(bhdr_t * b); +extern void print_tlsf(tlsf_t * tlsf); +void print_all_blocks(tlsf_t * tlsf); + +void dump_memory_region(unsigned char *mem_ptr, unsigned int size) +{ + + unsigned long begin = (unsigned long) mem_ptr; + unsigned long end = (unsigned long) mem_ptr + size; + int column = 0; + + begin >>= 2; + begin <<= 2; + + end >>= 2; + end++; + end <<= 2; + + PRINT_MSG("\nMemory region dumped: 0x%lx - 0x%lx\n\n", begin, end); + + column = 0; + PRINT_MSG("0x%lx ", begin); + + while (begin < end) { + if (((unsigned char *) begin)[0] == 0) + PRINT_MSG("00"); + else + PRINT_MSG("%02x", ((unsigned char *) begin)[0]); + if (((unsigned char *) begin)[1] == 0) + PRINT_MSG("00 "); + else + PRINT_MSG("%02x ", ((unsigned char *) begin)[1]); + begin += 2; + column++; + if (column == 8) { + PRINT_MSG("\n0x%lx ", begin); + column = 0; + } + + } + PRINT_MSG("\n\n"); +} + +void print_block(bhdr_t * b) +{ + if (!b) + return; + PRINT_MSG(">> [%p] (", b); + if ((b->size & BLOCK_SIZE)) + PRINT_MSG("%lu bytes, ", (unsigned long) (b->size & BLOCK_SIZE)); + else + PRINT_MSG("sentinel, "); + if ((b->size & BLOCK_STATE) == FREE_BLOCK) + PRINT_MSG("free [%p, %p], ", b->ptr.free_ptr.prev, b->ptr.free_ptr.next); + else + PRINT_MSG("used, "); + if ((b->size & PREV_STATE) == PREV_FREE) + PRINT_MSG("prev. free [%p])\n", b->prev_hdr); + else + PRINT_MSG("prev used)\n"); +} + +void print_tlsf(tlsf_t * tlsf) +{ + bhdr_t *next; + int i, j; + + PRINT_MSG("\nTLSF at %p\n", tlsf); + + PRINT_MSG("FL bitmap: 0x%x\n\n", (unsigned) tlsf->fl_bitmap); + + for (i = 0; i < REAL_FLI; i++) { + if (tlsf->sl_bitmap[i]) + PRINT_MSG("SL bitmap 0x%x\n", (unsigned) tlsf->sl_bitmap[i]); + for (j = 0; j < MAX_SLI; j++) { + next = tlsf->matrix[i][j]; + if (next) + PRINT_MSG("-> [%d][%d]\n", i, j); + while (next) { + print_block(next); + next = next->ptr.free_ptr.next; + } + } + } +} + +void print_all_blocks(tlsf_t * tlsf) +{ + area_info_t *ai; + bhdr_t *next; + PRINT_MSG("\nTLSF at %p\nALL BLOCKS\n\n", tlsf); + ai = tlsf->area_head; + while (ai) { + next = (bhdr_t *) ((char *) ai - BHDR_OVERHEAD); + while (next) { + print_block(next); + if ((next->size & BLOCK_SIZE)) + next = GET_NEXT_BLOCK(next->ptr.buffer, next->size & BLOCK_SIZE); + else + next = NULL; + } + ai = ai->next; + } +} + +#endif diff --git a/lib/tlsf.h b/lib/tlsf.h new file mode 100644 index 0000000000..7c8e2ad669 --- /dev/null +++ b/lib/tlsf.h @@ -0,0 +1,39 @@ +/* + * Two Levels Segregate Fit memory allocator (TLSF) + * Version 2.4.3 + * + * Written by Miguel Masmano Tello + * + * Thanks to Ismael Ripoll for his suggestions and reviews + * + * Copyright (C) 2008, 2007, 2006, 2005, 2004 + * + * This code is released using a dual license strategy: GPL/LGPL + * You can choose the licence that better fits your requirements. + * + * Released under the terms of the GNU General Public License Version 2.0 + * Released under the terms of the GNU Lesser General Public License Version 2.1 + * + */ + +#ifndef _TLSF_H_ +#define _TLSF_H_ + +#include + +extern size_t init_memory_pool(size_t, void *); +extern size_t get_used_size(void *); +extern size_t get_max_size(void *); +extern void destroy_memory_pool(void *); +extern size_t add_new_area(void *, size_t, void *); +extern void *malloc_ex(size_t, void *); +extern void free_ex(void *, void *); +extern void *realloc_ex(void *, size_t, void *); +extern void *calloc_ex(size_t, size_t, void *); + +extern void *tlsf_malloc(size_t size); +extern void tlsf_free(void *ptr); +extern void *tlsf_realloc(void *ptr, size_t size); +extern void *tlsf_calloc(size_t nelem, size_t elem_size); + +#endif diff --git a/lib/ucmaps/8859-1.txt b/lib/ucmaps/8859-1.txt new file mode 100644 index 0000000000..473ecabc17 --- /dev/null +++ b/lib/ucmaps/8859-1.txt @@ -0,0 +1,303 @@ +# +# Name: ISO/IEC 8859-1:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-1:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-1 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x00A1 # INVERTED EXCLAMATION MARK +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00AA # FEMININE ORDINAL INDICATOR +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00BA # MASCULINE ORDINAL INDICATOR +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF # INVERTED QUESTION MARK +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic) +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic) +0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic) +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic) +0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/ucmaps/8859-10.txt b/lib/ucmaps/8859-10.txt new file mode 100644 index 0000000000..374a42b1a5 --- /dev/null +++ b/lib/ucmaps/8859-10.txt @@ -0,0 +1,303 @@ +# +# Name: ISO/IEC 8859-10:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.1 +# Table format: Format A +# Date: 1999 October 11 +# Authors: Ken Whistler +# +# Copyright (c) 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-10:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-10 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-10 order. +# +# Version history +# 1.0 version new. +# 1.1 corrected mistake in mapping of 0xA4 +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xA2 0x0112 # LATIN CAPITAL LETTER E WITH MACRON +0xA3 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA +0xA4 0x012A # LATIN CAPITAL LETTER I WITH MACRON +0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE +0xA6 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA +0xA7 0x00A7 # SECTION SIGN +0xA8 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA +0xA9 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0xAA 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xAB 0x0166 # LATIN CAPITAL LETTER T WITH STROKE +0xAC 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x016A # LATIN CAPITAL LETTER U WITH MACRON +0xAF 0x014A # LATIN CAPITAL LETTER ENG +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xB2 0x0113 # LATIN SMALL LETTER E WITH MACRON +0xB3 0x0123 # LATIN SMALL LETTER G WITH CEDILLA +0xB4 0x012B # LATIN SMALL LETTER I WITH MACRON +0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE +0xB6 0x0137 # LATIN SMALL LETTER K WITH CEDILLA +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x013C # LATIN SMALL LETTER L WITH CEDILLA +0xB9 0x0111 # LATIN SMALL LETTER D WITH STROKE +0xBA 0x0161 # LATIN SMALL LETTER S WITH CARON +0xBB 0x0167 # LATIN SMALL LETTER T WITH STROKE +0xBC 0x017E # LATIN SMALL LETTER Z WITH CARON +0xBD 0x2015 # HORIZONTAL BAR +0xBE 0x016B # LATIN SMALL LETTER U WITH MACRON +0xBF 0x014B # LATIN SMALL LETTER ENG +0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic) +0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA +0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x0168 # LATIN CAPITAL LETTER U WITH TILDE +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic) +0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) +0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic) +0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA +0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x0169 # LATIN SMALL LETTER U WITH TILDE +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic) +0xFF 0x0138 # LATIN SMALL LETTER KRA diff --git a/lib/ucmaps/8859-13.txt b/lib/ucmaps/8859-13.txt new file mode 100644 index 0000000000..cd11b53fd7 --- /dev/null +++ b/lib/ucmaps/8859-13.txt @@ -0,0 +1,299 @@ +# +# Name: ISO/IEC 8859-13:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-13:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-13 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-13 order. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x201D # RIGHT DOUBLE QUOTATION MARK +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00C6 # LATIN CAPITAL LETTER AE +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x201C # LEFT DOUBLE QUOTATION MARK +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x0157 # LATIN SMALL LETTER R WITH CEDILLA +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xBF 0x00E6 # LATIN SMALL LETTER AE +0xC0 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xC1 0x012E # LATIN CAPITAL LETTER I WITH OGONEK +0xC2 0x0100 # LATIN CAPITAL LETTER A WITH MACRON +0xC3 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xC7 0x0112 # LATIN CAPITAL LETTER E WITH MACRON +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE +0xCB 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCC 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA +0xCD 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA +0xCE 0x012A # LATIN CAPITAL LETTER I WITH MACRON +0xCF 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA +0xD0 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x014C # LATIN CAPITAL LETTER O WITH MACRON +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK +0xD9 0x0141 # LATIN CAPITAL LETTER L WITH STROKE +0xDA 0x015A # LATIN CAPITAL LETTER S WITH ACUTE +0xDB 0x016A # LATIN CAPITAL LETTER U WITH MACRON +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xDE 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) +0xE0 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xE1 0x012F # LATIN SMALL LETTER I WITH OGONEK +0xE2 0x0101 # LATIN SMALL LETTER A WITH MACRON +0xE3 0x0107 # LATIN SMALL LETTER C WITH ACUTE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xE7 0x0113 # LATIN SMALL LETTER E WITH MACRON +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x017A # LATIN SMALL LETTER Z WITH ACUTE +0xEB 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE +0xEC 0x0123 # LATIN SMALL LETTER G WITH CEDILLA +0xED 0x0137 # LATIN SMALL LETTER K WITH CEDILLA +0xEE 0x012B # LATIN SMALL LETTER I WITH MACRON +0xEF 0x013C # LATIN SMALL LETTER L WITH CEDILLA +0xF0 0x0161 # LATIN SMALL LETTER S WITH CARON +0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0146 # LATIN SMALL LETTER N WITH CEDILLA +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x014D # LATIN SMALL LETTER O WITH MACRON +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x0173 # LATIN SMALL LETTER U WITH OGONEK +0xF9 0x0142 # LATIN SMALL LETTER L WITH STROKE +0xFA 0x015B # LATIN SMALL LETTER S WITH ACUTE +0xFB 0x016B # LATIN SMALL LETTER U WITH MACRON +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE +0xFE 0x017E # LATIN SMALL LETTER Z WITH CARON +0xFF 0x2019 # RIGHT SINGLE QUOTATION MARK diff --git a/lib/ucmaps/8859-14.txt b/lib/ucmaps/8859-14.txt new file mode 100644 index 0000000000..36038f413a --- /dev/null +++ b/lib/ucmaps/8859-14.txt @@ -0,0 +1,301 @@ +# +# Name: ISO/IEC 8859-14:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Markus Kuhn +# Ken Whistler +# +# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-14:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-14 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-14 order. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE +0xA2 0x1E03 # LATIN SMALL LETTER B WITH DOT ABOVE +0xA3 0x00A3 # POUND SIGN +0xA4 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE +0xA5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE +0xA6 0x1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE +0xA7 0x00A7 # SECTION SIGN +0xA8 0x1E80 # LATIN CAPITAL LETTER W WITH GRAVE +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x1E82 # LATIN CAPITAL LETTER W WITH ACUTE +0xAB 0x1E0B # LATIN SMALL LETTER D WITH DOT ABOVE +0xAC 0x1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS +0xB0 0x1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE +0xB1 0x1E1F # LATIN SMALL LETTER F WITH DOT ABOVE +0xB2 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE +0xB3 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE +0xB4 0x1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE +0xB5 0x1E41 # LATIN SMALL LETTER M WITH DOT ABOVE +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE +0xB8 0x1E81 # LATIN SMALL LETTER W WITH GRAVE +0xB9 0x1E57 # LATIN SMALL LETTER P WITH DOT ABOVE +0xBA 0x1E83 # LATIN SMALL LETTER W WITH ACUTE +0xBB 0x1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE +0xBC 0x1EF3 # LATIN SMALL LETTER Y WITH GRAVE +0xBD 0x1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS +0xBE 0x1E85 # LATIN SMALL LETTER W WITH DIAERESIS +0xBF 0x1E61 # LATIN SMALL LETTER S WITH DOT ABOVE +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x1E6B # LATIN SMALL LETTER T WITH DOT ABOVE +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX +0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS + diff --git a/lib/ucmaps/8859-15.txt b/lib/ucmaps/8859-15.txt new file mode 100644 index 0000000000..1e319707d4 --- /dev/null +++ b/lib/ucmaps/8859-15.txt @@ -0,0 +1,303 @@ +# +# Name: ISO/IEC 8859-15:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Markus Kuhn +# Ken Whistler +# +# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-15:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-15 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-15 order. +# +# Version history +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x00A1 # INVERTED EXCLAMATION MARK +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x20AC # EURO SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xA7 0x00A7 # SECTION SIGN +0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00AA # FEMININE ORDINAL INDICATOR +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00BA # MASCULINE ORDINAL INDICATOR +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x0152 # LATIN CAPITAL LIGATURE OE +0xBD 0x0153 # LATIN SMALL LIGATURE OE +0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS +0xBF 0x00BF # INVERTED QUESTION MARK +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x00D0 # LATIN CAPITAL LETTER ETH +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x00DE # LATIN CAPITAL LETTER THORN +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x00F0 # LATIN SMALL LETTER ETH +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x00FE # LATIN SMALL LETTER THORN +0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS + diff --git a/lib/ucmaps/8859-2.txt b/lib/ucmaps/8859-2.txt new file mode 100644 index 0000000000..e45df25eb8 --- /dev/null +++ b/lib/ucmaps/8859-2.txt @@ -0,0 +1,303 @@ +# +# Name: ISO 8859-2:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-2:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-2 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xA2 0x02D8 # BREVE +0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x013D # LATIN CAPITAL LETTER L WITH CARON +0xA6 0x015A # LATIN CAPITAL LETTER S WITH ACUTE +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0xAB 0x0164 # LATIN CAPITAL LETTER T WITH CARON +0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xB2 0x02DB # OGONEK +0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x013E # LATIN SMALL LETTER L WITH CARON +0xB6 0x015B # LATIN SMALL LETTER S WITH ACUTE +0xB7 0x02C7 # CARON +0xB8 0x00B8 # CEDILLA +0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON +0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0xBB 0x0165 # LATIN SMALL LETTER T WITH CARON +0xBC 0x017A # LATIN SMALL LETTER Z WITH ACUTE +0xBD 0x02DD # DOUBLE ACUTE ACCENT +0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON +0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE +0xC0 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE +0xC6 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x011A # LATIN CAPITAL LETTER E WITH CARON +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x010E # LATIN CAPITAL LETTER D WITH CARON +0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0147 # LATIN CAPITAL LETTER N WITH CARON +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x0158 # LATIN CAPITAL LETTER R WITH CARON +0xD9 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x0155 # LATIN SMALL LETTER R WITH ACUTE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x013A # LATIN SMALL LETTER L WITH ACUTE +0xE6 0x0107 # LATIN SMALL LETTER C WITH ACUTE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x011B # LATIN SMALL LETTER E WITH CARON +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x010F # LATIN SMALL LETTER D WITH CARON +0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE +0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0148 # LATIN SMALL LETTER N WITH CARON +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x0159 # LATIN SMALL LETTER R WITH CARON +0xF9 0x016F # LATIN SMALL LETTER U WITH RING ABOVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x0163 # LATIN SMALL LETTER T WITH CEDILLA +0xFF 0x02D9 # DOT ABOVE diff --git a/lib/ucmaps/8859-3.txt b/lib/ucmaps/8859-3.txt new file mode 100644 index 0000000000..9b6ac69dd8 --- /dev/null +++ b/lib/ucmaps/8859-3.txt @@ -0,0 +1,296 @@ +# +# Name: ISO/IEC 8859-3:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-3:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-3 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0126 # LATIN CAPITAL LETTER H WITH STROKE +0xA2 0x02D8 # BREVE +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA6 0x0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE +0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0xAB 0x011E # LATIN CAPITAL LETTER G WITH BREVE +0xAC 0x0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0xAD 0x00AD # SOFT HYPHEN +0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0127 # LATIN SMALL LETTER H WITH STROKE +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x0131 # LATIN SMALL LETTER DOTLESS I +0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0xBB 0x011F # LATIN SMALL LETTER G WITH BREVE +0xBC 0x0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE +0xC6 0x0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x016C # LATIN CAPITAL LETTER U WITH BREVE +0xDE 0x015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE +0xE6 0x0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x011D # LATIN SMALL LETTER G WITH CIRCUMFLEX +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x016D # LATIN SMALL LETTER U WITH BREVE +0xFE 0x015D # LATIN SMALL LETTER S WITH CIRCUMFLEX +0xFF 0x02D9 # DOT ABOVE diff --git a/lib/ucmaps/8859-4.txt b/lib/ucmaps/8859-4.txt new file mode 100644 index 0000000000..662e698ab2 --- /dev/null +++ b/lib/ucmaps/8859-4.txt @@ -0,0 +1,303 @@ +# +# Name: ISO/IEC 8859-4:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-4:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-4 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xA2 0x0138 # LATIN SMALL LETTER KRA +0xA3 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE +0xA6 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xAA 0x0112 # LATIN CAPITAL LETTER E WITH MACRON +0xAB 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA +0xAC 0x0166 # LATIN CAPITAL LETTER T WITH STROKE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xB2 0x02DB # OGONEK +0xB3 0x0157 # LATIN SMALL LETTER R WITH CEDILLA +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE +0xB6 0x013C # LATIN SMALL LETTER L WITH CEDILLA +0xB7 0x02C7 # CARON +0xB8 0x00B8 # CEDILLA +0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON +0xBA 0x0113 # LATIN SMALL LETTER E WITH MACRON +0xBB 0x0123 # LATIN SMALL LETTER G WITH CEDILLA +0xBC 0x0167 # LATIN SMALL LETTER T WITH STROKE +0xBD 0x014A # LATIN CAPITAL LETTER ENG +0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON +0xBF 0x014B # LATIN SMALL LETTER ENG +0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x012A # LATIN CAPITAL LETTER I WITH MACRON +0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA +0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON +0xD3 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x0168 # LATIN CAPITAL LETTER U WITH TILDE +0xDE 0x016A # LATIN CAPITAL LETTER U WITH MACRON +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x012B # LATIN SMALL LETTER I WITH MACRON +0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE +0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA +0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON +0xF3 0x0137 # LATIN SMALL LETTER K WITH CEDILLA +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x0169 # LATIN SMALL LETTER U WITH TILDE +0xFE 0x016B # LATIN SMALL LETTER U WITH MACRON +0xFF 0x02D9 # DOT ABOVE diff --git a/lib/ucmaps/8859-5.txt b/lib/ucmaps/8859-5.txt new file mode 100644 index 0000000000..a7ed1ce2ab --- /dev/null +++ b/lib/ucmaps/8859-5.txt @@ -0,0 +1,303 @@ +# +# Name: ISO 8859-5:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-5:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-5 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0401 # CYRILLIC CAPITAL LETTER IO +0xA2 0x0402 # CYRILLIC CAPITAL LETTER DJE +0xA3 0x0403 # CYRILLIC CAPITAL LETTER GJE +0xA4 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0xA5 0x0405 # CYRILLIC CAPITAL LETTER DZE +0xA6 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0xA7 0x0407 # CYRILLIC CAPITAL LETTER YI +0xA8 0x0408 # CYRILLIC CAPITAL LETTER JE +0xA9 0x0409 # CYRILLIC CAPITAL LETTER LJE +0xAA 0x040A # CYRILLIC CAPITAL LETTER NJE +0xAB 0x040B # CYRILLIC CAPITAL LETTER TSHE +0xAC 0x040C # CYRILLIC CAPITAL LETTER KJE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x040E # CYRILLIC CAPITAL LETTER SHORT U +0xAF 0x040F # CYRILLIC CAPITAL LETTER DZHE +0xB0 0x0410 # CYRILLIC CAPITAL LETTER A +0xB1 0x0411 # CYRILLIC CAPITAL LETTER BE +0xB2 0x0412 # CYRILLIC CAPITAL LETTER VE +0xB3 0x0413 # CYRILLIC CAPITAL LETTER GHE +0xB4 0x0414 # CYRILLIC CAPITAL LETTER DE +0xB5 0x0415 # CYRILLIC CAPITAL LETTER IE +0xB6 0x0416 # CYRILLIC CAPITAL LETTER ZHE +0xB7 0x0417 # CYRILLIC CAPITAL LETTER ZE +0xB8 0x0418 # CYRILLIC CAPITAL LETTER I +0xB9 0x0419 # CYRILLIC CAPITAL LETTER SHORT I +0xBA 0x041A # CYRILLIC CAPITAL LETTER KA +0xBB 0x041B # CYRILLIC CAPITAL LETTER EL +0xBC 0x041C # CYRILLIC CAPITAL LETTER EM +0xBD 0x041D # CYRILLIC CAPITAL LETTER EN +0xBE 0x041E # CYRILLIC CAPITAL LETTER O +0xBF 0x041F # CYRILLIC CAPITAL LETTER PE +0xC0 0x0420 # CYRILLIC CAPITAL LETTER ER +0xC1 0x0421 # CYRILLIC CAPITAL LETTER ES +0xC2 0x0422 # CYRILLIC CAPITAL LETTER TE +0xC3 0x0423 # CYRILLIC CAPITAL LETTER U +0xC4 0x0424 # CYRILLIC CAPITAL LETTER EF +0xC5 0x0425 # CYRILLIC CAPITAL LETTER HA +0xC6 0x0426 # CYRILLIC CAPITAL LETTER TSE +0xC7 0x0427 # CYRILLIC CAPITAL LETTER CHE +0xC8 0x0428 # CYRILLIC CAPITAL LETTER SHA +0xC9 0x0429 # CYRILLIC CAPITAL LETTER SHCHA +0xCA 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN +0xCB 0x042B # CYRILLIC CAPITAL LETTER YERU +0xCC 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN +0xCD 0x042D # CYRILLIC CAPITAL LETTER E +0xCE 0x042E # CYRILLIC CAPITAL LETTER YU +0xCF 0x042F # CYRILLIC CAPITAL LETTER YA +0xD0 0x0430 # CYRILLIC SMALL LETTER A +0xD1 0x0431 # CYRILLIC SMALL LETTER BE +0xD2 0x0432 # CYRILLIC SMALL LETTER VE +0xD3 0x0433 # CYRILLIC SMALL LETTER GHE +0xD4 0x0434 # CYRILLIC SMALL LETTER DE +0xD5 0x0435 # CYRILLIC SMALL LETTER IE +0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE +0xD7 0x0437 # CYRILLIC SMALL LETTER ZE +0xD8 0x0438 # CYRILLIC SMALL LETTER I +0xD9 0x0439 # CYRILLIC SMALL LETTER SHORT I +0xDA 0x043A # CYRILLIC SMALL LETTER KA +0xDB 0x043B # CYRILLIC SMALL LETTER EL +0xDC 0x043C # CYRILLIC SMALL LETTER EM +0xDD 0x043D # CYRILLIC SMALL LETTER EN +0xDE 0x043E # CYRILLIC SMALL LETTER O +0xDF 0x043F # CYRILLIC SMALL LETTER PE +0xE0 0x0440 # CYRILLIC SMALL LETTER ER +0xE1 0x0441 # CYRILLIC SMALL LETTER ES +0xE2 0x0442 # CYRILLIC SMALL LETTER TE +0xE3 0x0443 # CYRILLIC SMALL LETTER U +0xE4 0x0444 # CYRILLIC SMALL LETTER EF +0xE5 0x0445 # CYRILLIC SMALL LETTER HA +0xE6 0x0446 # CYRILLIC SMALL LETTER TSE +0xE7 0x0447 # CYRILLIC SMALL LETTER CHE +0xE8 0x0448 # CYRILLIC SMALL LETTER SHA +0xE9 0x0449 # CYRILLIC SMALL LETTER SHCHA +0xEA 0x044A # CYRILLIC SMALL LETTER HARD SIGN +0xEB 0x044B # CYRILLIC SMALL LETTER YERU +0xEC 0x044C # CYRILLIC SMALL LETTER SOFT SIGN +0xED 0x044D # CYRILLIC SMALL LETTER E +0xEE 0x044E # CYRILLIC SMALL LETTER YU +0xEF 0x044F # CYRILLIC SMALL LETTER YA +0xF0 0x2116 # NUMERO SIGN +0xF1 0x0451 # CYRILLIC SMALL LETTER IO +0xF2 0x0452 # CYRILLIC SMALL LETTER DJE +0xF3 0x0453 # CYRILLIC SMALL LETTER GJE +0xF4 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE +0xF5 0x0455 # CYRILLIC SMALL LETTER DZE +0xF6 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0xF7 0x0457 # CYRILLIC SMALL LETTER YI +0xF8 0x0458 # CYRILLIC SMALL LETTER JE +0xF9 0x0459 # CYRILLIC SMALL LETTER LJE +0xFA 0x045A # CYRILLIC SMALL LETTER NJE +0xFB 0x045B # CYRILLIC SMALL LETTER TSHE +0xFC 0x045C # CYRILLIC SMALL LETTER KJE +0xFD 0x00A7 # SECTION SIGN +0xFE 0x045E # CYRILLIC SMALL LETTER SHORT U +0xFF 0x045F # CYRILLIC SMALL LETTER DZHE diff --git a/lib/ucmaps/8859-6.txt b/lib/ucmaps/8859-6.txt new file mode 100644 index 0000000000..69ac7f5894 --- /dev/null +++ b/lib/ucmaps/8859-6.txt @@ -0,0 +1,260 @@ +# +# Name: ISO 8859-6:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-6:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-6 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-6 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# 0x30..0x39 remapped to the ASCII digits (U+0030..U+0039) instead +# of the Arabic digits (U+0660..U+0669). +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA4 0x00A4 # CURRENCY SIGN +0xAC 0x060C # ARABIC COMMA +0xAD 0x00AD # SOFT HYPHEN +0xBB 0x061B # ARABIC SEMICOLON +0xBF 0x061F # ARABIC QUESTION MARK +0xC1 0x0621 # ARABIC LETTER HAMZA +0xC2 0x0622 # ARABIC LETTER ALEF WITH MADDA ABOVE +0xC3 0x0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE +0xC4 0x0624 # ARABIC LETTER WAW WITH HAMZA ABOVE +0xC5 0x0625 # ARABIC LETTER ALEF WITH HAMZA BELOW +0xC6 0x0626 # ARABIC LETTER YEH WITH HAMZA ABOVE +0xC7 0x0627 # ARABIC LETTER ALEF +0xC8 0x0628 # ARABIC LETTER BEH +0xC9 0x0629 # ARABIC LETTER TEH MARBUTA +0xCA 0x062A # ARABIC LETTER TEH +0xCB 0x062B # ARABIC LETTER THEH +0xCC 0x062C # ARABIC LETTER JEEM +0xCD 0x062D # ARABIC LETTER HAH +0xCE 0x062E # ARABIC LETTER KHAH +0xCF 0x062F # ARABIC LETTER DAL +0xD0 0x0630 # ARABIC LETTER THAL +0xD1 0x0631 # ARABIC LETTER REH +0xD2 0x0632 # ARABIC LETTER ZAIN +0xD3 0x0633 # ARABIC LETTER SEEN +0xD4 0x0634 # ARABIC LETTER SHEEN +0xD5 0x0635 # ARABIC LETTER SAD +0xD6 0x0636 # ARABIC LETTER DAD +0xD7 0x0637 # ARABIC LETTER TAH +0xD8 0x0638 # ARABIC LETTER ZAH +0xD9 0x0639 # ARABIC LETTER AIN +0xDA 0x063A # ARABIC LETTER GHAIN +0xE0 0x0640 # ARABIC TATWEEL +0xE1 0x0641 # ARABIC LETTER FEH +0xE2 0x0642 # ARABIC LETTER QAF +0xE3 0x0643 # ARABIC LETTER KAF +0xE4 0x0644 # ARABIC LETTER LAM +0xE5 0x0645 # ARABIC LETTER MEEM +0xE6 0x0646 # ARABIC LETTER NOON +0xE7 0x0647 # ARABIC LETTER HEH +0xE8 0x0648 # ARABIC LETTER WAW +0xE9 0x0649 # ARABIC LETTER ALEF MAKSURA +0xEA 0x064A # ARABIC LETTER YEH +0xEB 0x064B # ARABIC FATHATAN +0xEC 0x064C # ARABIC DAMMATAN +0xED 0x064D # ARABIC KASRATAN +0xEE 0x064E # ARABIC FATHA +0xEF 0x064F # ARABIC DAMMA +0xF0 0x0650 # ARABIC KASRA +0xF1 0x0651 # ARABIC SHADDA +0xF2 0x0652 # ARABIC SUKUN diff --git a/lib/ucmaps/8859-7.txt b/lib/ucmaps/8859-7.txt new file mode 100644 index 0000000000..52c42d08a7 --- /dev/null +++ b/lib/ucmaps/8859-7.txt @@ -0,0 +1,302 @@ +# +# Name: ISO 8859-7:1987 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO 8859-7:1987 characters map into Unicode. +# +# ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928, +# and ECMA 118. +# +# Format: Three tab-separated columns +# Column #1 is the ISO 8859-7 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO 8859-7 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7 +# Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7 +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x2018 # LEFT SINGLE QUOTATION MARK +0xA2 0x2019 # RIGHT SINGLE QUOTATION MARK +0xA3 0x00A3 # POUND SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAF 0x2015 # HORIZONTAL BAR +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x0384 # GREEK TONOS +0xB5 0x0385 # GREEK DIALYTIKA TONOS +0xB6 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS +0xB9 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS +0xBA 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS +0xBF 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS +0xC0 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0xC1 0x0391 # GREEK CAPITAL LETTER ALPHA +0xC2 0x0392 # GREEK CAPITAL LETTER BETA +0xC3 0x0393 # GREEK CAPITAL LETTER GAMMA +0xC4 0x0394 # GREEK CAPITAL LETTER DELTA +0xC5 0x0395 # GREEK CAPITAL LETTER EPSILON +0xC6 0x0396 # GREEK CAPITAL LETTER ZETA +0xC7 0x0397 # GREEK CAPITAL LETTER ETA +0xC8 0x0398 # GREEK CAPITAL LETTER THETA +0xC9 0x0399 # GREEK CAPITAL LETTER IOTA +0xCA 0x039A # GREEK CAPITAL LETTER KAPPA +0xCB 0x039B # GREEK CAPITAL LETTER LAMDA +0xCC 0x039C # GREEK CAPITAL LETTER MU +0xCD 0x039D # GREEK CAPITAL LETTER NU +0xCE 0x039E # GREEK CAPITAL LETTER XI +0xCF 0x039F # GREEK CAPITAL LETTER OMICRON +0xD0 0x03A0 # GREEK CAPITAL LETTER PI +0xD1 0x03A1 # GREEK CAPITAL LETTER RHO +0xD3 0x03A3 # GREEK CAPITAL LETTER SIGMA +0xD4 0x03A4 # GREEK CAPITAL LETTER TAU +0xD5 0x03A5 # GREEK CAPITAL LETTER UPSILON +0xD6 0x03A6 # GREEK CAPITAL LETTER PHI +0xD7 0x03A7 # GREEK CAPITAL LETTER CHI +0xD8 0x03A8 # GREEK CAPITAL LETTER PSI +0xD9 0x03A9 # GREEK CAPITAL LETTER OMEGA +0xDA 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0xDB 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0xDC 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS +0xDD 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS +0xDE 0x03AE # GREEK SMALL LETTER ETA WITH TONOS +0xDF 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS +0xE0 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +0xE1 0x03B1 # GREEK SMALL LETTER ALPHA +0xE2 0x03B2 # GREEK SMALL LETTER BETA +0xE3 0x03B3 # GREEK SMALL LETTER GAMMA +0xE4 0x03B4 # GREEK SMALL LETTER DELTA +0xE5 0x03B5 # GREEK SMALL LETTER EPSILON +0xE6 0x03B6 # GREEK SMALL LETTER ZETA +0xE7 0x03B7 # GREEK SMALL LETTER ETA +0xE8 0x03B8 # GREEK SMALL LETTER THETA +0xE9 0x03B9 # GREEK SMALL LETTER IOTA +0xEA 0x03BA # GREEK SMALL LETTER KAPPA +0xEB 0x03BB # GREEK SMALL LETTER LAMDA +0xEC 0x03BC # GREEK SMALL LETTER MU +0xED 0x03BD # GREEK SMALL LETTER NU +0xEE 0x03BE # GREEK SMALL LETTER XI +0xEF 0x03BF # GREEK SMALL LETTER OMICRON +0xF0 0x03C0 # GREEK SMALL LETTER PI +0xF1 0x03C1 # GREEK SMALL LETTER RHO +0xF2 0x03C2 # GREEK SMALL LETTER FINAL SIGMA +0xF3 0x03C3 # GREEK SMALL LETTER SIGMA +0xF4 0x03C4 # GREEK SMALL LETTER TAU +0xF5 0x03C5 # GREEK SMALL LETTER UPSILON +0xF6 0x03C6 # GREEK SMALL LETTER PHI +0xF7 0x03C7 # GREEK SMALL LETTER CHI +0xF8 0x03C8 # GREEK SMALL LETTER PSI +0xF9 0x03C9 # GREEK SMALL LETTER OMEGA +0xFA 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xFB 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xFC 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS +0xFD 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS +0xFE 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS diff --git a/lib/ucmaps/8859-8.txt b/lib/ucmaps/8859-8.txt new file mode 100644 index 0000000000..bc8da4c7fd --- /dev/null +++ b/lib/ucmaps/8859-8.txt @@ -0,0 +1,270 @@ +# +# Name: ISO/IEC 8859-8:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.1 +# Table format: Format A +# Date: 2000-Jan-03 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-8:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-8 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# 1.1 version updates to the published 8859-8:1999, correcting +# the mapping of 0xAF and adding mappings for LRM and RLM. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00D7 # MULTIPLICATION SIGN +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00F7 # DIVISION SIGN +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xDF 0x2017 # DOUBLE LOW LINE +0xE0 0x05D0 # HEBREW LETTER ALEF +0xE1 0x05D1 # HEBREW LETTER BET +0xE2 0x05D2 # HEBREW LETTER GIMEL +0xE3 0x05D3 # HEBREW LETTER DALET +0xE4 0x05D4 # HEBREW LETTER HE +0xE5 0x05D5 # HEBREW LETTER VAV +0xE6 0x05D6 # HEBREW LETTER ZAYIN +0xE7 0x05D7 # HEBREW LETTER HET +0xE8 0x05D8 # HEBREW LETTER TET +0xE9 0x05D9 # HEBREW LETTER YOD +0xEA 0x05DA # HEBREW LETTER FINAL KAF +0xEB 0x05DB # HEBREW LETTER KAF +0xEC 0x05DC # HEBREW LETTER LAMED +0xED 0x05DD # HEBREW LETTER FINAL MEM +0xEE 0x05DE # HEBREW LETTER MEM +0xEF 0x05DF # HEBREW LETTER FINAL NUN +0xF0 0x05E0 # HEBREW LETTER NUN +0xF1 0x05E1 # HEBREW LETTER SAMEKH +0xF2 0x05E2 # HEBREW LETTER AYIN +0xF3 0x05E3 # HEBREW LETTER FINAL PE +0xF4 0x05E4 # HEBREW LETTER PE +0xF5 0x05E5 # HEBREW LETTER FINAL TSADI +0xF6 0x05E6 # HEBREW LETTER TSADI +0xF7 0x05E7 # HEBREW LETTER QOF +0xF8 0x05E8 # HEBREW LETTER RESH +0xF9 0x05E9 # HEBREW LETTER SHIN +0xFA 0x05EA # HEBREW LETTER TAV +0xFD 0x200E # LEFT-TO-RIGHT MARK +0xFE 0x200F # RIGHT-TO-LEFT MARK + diff --git a/lib/ucmaps/8859-9.txt b/lib/ucmaps/8859-9.txt new file mode 100644 index 0000000000..22901f1077 --- /dev/null +++ b/lib/ucmaps/8859-9.txt @@ -0,0 +1,307 @@ +# +# Name: ISO/IEC 8859-9:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on magnetic media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-9:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-9 order. +# +# ISO/IEC 8859-9 is also equivalent to ISO-IR-148. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x00A1 # INVERTED EXCLAMATION MARK +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00AA # FEMININE ORDINAL INDICATOR +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00BA # MASCULINE ORDINAL INDICATOR +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF # INVERTED QUESTION MARK +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x011E # LATIN CAPITAL LETTER G WITH BREVE +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE +0xDE 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x011F # LATIN SMALL LETTER G WITH BREVE +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x0131 # LATIN SMALL LETTER DOTLESS I +0xFE 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS + + diff --git a/lib/ucmaps/cp1250.txt b/lib/ucmaps/cp1250.txt new file mode 100644 index 0000000000..081d7763b3 --- /dev/null +++ b/lib/ucmaps/cp1250.txt @@ -0,0 +1,274 @@ +# +# Name: cp1250 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1250 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1250 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 #UNDEFINED +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 #UNDEFINED +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x015A #LATIN CAPITAL LETTER S WITH ACUTE +0x8D 0x0164 #LATIN CAPITAL LETTER T WITH CARON +0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON +0x8F 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x015B #LATIN SMALL LETTER S WITH ACUTE +0x9D 0x0165 #LATIN SMALL LETTER T WITH CARON +0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON +0x9F 0x017A #LATIN SMALL LETTER Z WITH ACUTE +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x02C7 #CARON +0xA2 0x02D8 #BREVE +0xA3 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x02DB #OGONEK +0xB3 0x0142 #LATIN SMALL LETTER L WITH STROKE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xBA 0x015F #LATIN SMALL LETTER S WITH CEDILLA +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x013D #LATIN CAPITAL LETTER L WITH CARON +0xBD 0x02DD #DOUBLE ACUTE ACCENT +0xBE 0x013E #LATIN SMALL LETTER L WITH CARON +0xBF 0x017C #LATIN SMALL LETTER Z WITH DOT ABOVE +0xC0 0x0154 #LATIN CAPITAL LETTER R WITH ACUTE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x0102 #LATIN CAPITAL LETTER A WITH BREVE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x0139 #LATIN CAPITAL LETTER L WITH ACUTE +0xC6 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x010C #LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x011A #LATIN CAPITAL LETTER E WITH CARON +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x010E #LATIN CAPITAL LETTER D WITH CARON +0xD0 0x0110 #LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0147 #LATIN CAPITAL LETTER N WITH CARON +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x0150 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x0158 #LATIN CAPITAL LETTER R WITH CARON +0xD9 0x016E #LATIN CAPITAL LETTER U WITH RING ABOVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x0170 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x0162 #LATIN CAPITAL LETTER T WITH CEDILLA +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x0155 #LATIN SMALL LETTER R WITH ACUTE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0103 #LATIN SMALL LETTER A WITH BREVE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x013A #LATIN SMALL LETTER L WITH ACUTE +0xE6 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x010D #LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x011B #LATIN SMALL LETTER E WITH CARON +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x010F #LATIN SMALL LETTER D WITH CARON +0xF0 0x0111 #LATIN SMALL LETTER D WITH STROKE +0xF1 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0148 #LATIN SMALL LETTER N WITH CARON +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x0151 #LATIN SMALL LETTER O WITH DOUBLE ACUTE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x0159 #LATIN SMALL LETTER R WITH CARON +0xF9 0x016F #LATIN SMALL LETTER U WITH RING ABOVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x0171 #LATIN SMALL LETTER U WITH DOUBLE ACUTE +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x0163 #LATIN SMALL LETTER T WITH CEDILLA +0xFF 0x02D9 #DOT ABOVE diff --git a/lib/ucmaps/cp1251.txt b/lib/ucmaps/cp1251.txt new file mode 100644 index 0000000000..37eadbdbc9 --- /dev/null +++ b/lib/ucmaps/cp1251.txt @@ -0,0 +1,274 @@ +# +# Name: cp1251 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1251 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1251 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x0402 #CYRILLIC CAPITAL LETTER DJE +0x81 0x0403 #CYRILLIC CAPITAL LETTER GJE +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0453 #CYRILLIC SMALL LETTER GJE +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x20AC #EURO SIGN +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0409 #CYRILLIC CAPITAL LETTER LJE +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x040A #CYRILLIC CAPITAL LETTER NJE +0x8D 0x040C #CYRILLIC CAPITAL LETTER KJE +0x8E 0x040B #CYRILLIC CAPITAL LETTER TSHE +0x8F 0x040F #CYRILLIC CAPITAL LETTER DZHE +0x90 0x0452 #CYRILLIC SMALL LETTER DJE +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0459 #CYRILLIC SMALL LETTER LJE +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x045A #CYRILLIC SMALL LETTER NJE +0x9D 0x045C #CYRILLIC SMALL LETTER KJE +0x9E 0x045B #CYRILLIC SMALL LETTER TSHE +0x9F 0x045F #CYRILLIC SMALL LETTER DZHE +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x040E #CYRILLIC CAPITAL LETTER SHORT U +0xA2 0x045E #CYRILLIC SMALL LETTER SHORT U +0xA3 0x0408 #CYRILLIC CAPITAL LETTER JE +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x0490 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x0401 #CYRILLIC CAPITAL LETTER IO +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x0407 #CYRILLIC CAPITAL LETTER YI +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0xB3 0x0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0xB4 0x0491 #CYRILLIC SMALL LETTER GHE WITH UPTURN +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x0451 #CYRILLIC SMALL LETTER IO +0xB9 0x2116 #NUMERO SIGN +0xBA 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x0458 #CYRILLIC SMALL LETTER JE +0xBD 0x0405 #CYRILLIC CAPITAL LETTER DZE +0xBE 0x0455 #CYRILLIC SMALL LETTER DZE +0xBF 0x0457 #CYRILLIC SMALL LETTER YI +0xC0 0x0410 #CYRILLIC CAPITAL LETTER A +0xC1 0x0411 #CYRILLIC CAPITAL LETTER BE +0xC2 0x0412 #CYRILLIC CAPITAL LETTER VE +0xC3 0x0413 #CYRILLIC CAPITAL LETTER GHE +0xC4 0x0414 #CYRILLIC CAPITAL LETTER DE +0xC5 0x0415 #CYRILLIC CAPITAL LETTER IE +0xC6 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0xC7 0x0417 #CYRILLIC CAPITAL LETTER ZE +0xC8 0x0418 #CYRILLIC CAPITAL LETTER I +0xC9 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0xCA 0x041A #CYRILLIC CAPITAL LETTER KA +0xCB 0x041B #CYRILLIC CAPITAL LETTER EL +0xCC 0x041C #CYRILLIC CAPITAL LETTER EM +0xCD 0x041D #CYRILLIC CAPITAL LETTER EN +0xCE 0x041E #CYRILLIC CAPITAL LETTER O +0xCF 0x041F #CYRILLIC CAPITAL LETTER PE +0xD0 0x0420 #CYRILLIC CAPITAL LETTER ER +0xD1 0x0421 #CYRILLIC CAPITAL LETTER ES +0xD2 0x0422 #CYRILLIC CAPITAL LETTER TE +0xD3 0x0423 #CYRILLIC CAPITAL LETTER U +0xD4 0x0424 #CYRILLIC CAPITAL LETTER EF +0xD5 0x0425 #CYRILLIC CAPITAL LETTER HA +0xD6 0x0426 #CYRILLIC CAPITAL LETTER TSE +0xD7 0x0427 #CYRILLIC CAPITAL LETTER CHE +0xD8 0x0428 #CYRILLIC CAPITAL LETTER SHA +0xD9 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0xDA 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN +0xDB 0x042B #CYRILLIC CAPITAL LETTER YERU +0xDC 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN +0xDD 0x042D #CYRILLIC CAPITAL LETTER E +0xDE 0x042E #CYRILLIC CAPITAL LETTER YU +0xDF 0x042F #CYRILLIC CAPITAL LETTER YA +0xE0 0x0430 #CYRILLIC SMALL LETTER A +0xE1 0x0431 #CYRILLIC SMALL LETTER BE +0xE2 0x0432 #CYRILLIC SMALL LETTER VE +0xE3 0x0433 #CYRILLIC SMALL LETTER GHE +0xE4 0x0434 #CYRILLIC SMALL LETTER DE +0xE5 0x0435 #CYRILLIC SMALL LETTER IE +0xE6 0x0436 #CYRILLIC SMALL LETTER ZHE +0xE7 0x0437 #CYRILLIC SMALL LETTER ZE +0xE8 0x0438 #CYRILLIC SMALL LETTER I +0xE9 0x0439 #CYRILLIC SMALL LETTER SHORT I +0xEA 0x043A #CYRILLIC SMALL LETTER KA +0xEB 0x043B #CYRILLIC SMALL LETTER EL +0xEC 0x043C #CYRILLIC SMALL LETTER EM +0xED 0x043D #CYRILLIC SMALL LETTER EN +0xEE 0x043E #CYRILLIC SMALL LETTER O +0xEF 0x043F #CYRILLIC SMALL LETTER PE +0xF0 0x0440 #CYRILLIC SMALL LETTER ER +0xF1 0x0441 #CYRILLIC SMALL LETTER ES +0xF2 0x0442 #CYRILLIC SMALL LETTER TE +0xF3 0x0443 #CYRILLIC SMALL LETTER U +0xF4 0x0444 #CYRILLIC SMALL LETTER EF +0xF5 0x0445 #CYRILLIC SMALL LETTER HA +0xF6 0x0446 #CYRILLIC SMALL LETTER TSE +0xF7 0x0447 #CYRILLIC SMALL LETTER CHE +0xF8 0x0448 #CYRILLIC SMALL LETTER SHA +0xF9 0x0449 #CYRILLIC SMALL LETTER SHCHA +0xFA 0x044A #CYRILLIC SMALL LETTER HARD SIGN +0xFB 0x044B #CYRILLIC SMALL LETTER YERU +0xFC 0x044C #CYRILLIC SMALL LETTER SOFT SIGN +0xFD 0x044D #CYRILLIC SMALL LETTER E +0xFE 0x044E #CYRILLIC SMALL LETTER YU +0xFF 0x044F #CYRILLIC SMALL LETTER YA diff --git a/lib/ucmaps/cp1252.txt b/lib/ucmaps/cp1252.txt new file mode 100644 index 0000000000..2ca4486eb8 --- /dev/null +++ b/lib/ucmaps/cp1252.txt @@ -0,0 +1,274 @@ +# +# Name: cp1252 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1252 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1252 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D #UNDEFINED +0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D #UNDEFINED +0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON +0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00AA #FEMININE ORDINAL INDICATOR +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00BA #MASCULINE ORDINAL INDICATOR +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 #LATIN CAPITAL LETTER AE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x00D0 #LATIN CAPITAL LETTER ETH +0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x00DE #LATIN CAPITAL LETTER THORN +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 #LATIN SMALL LETTER AE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x00F0 #LATIN SMALL LETTER ETH +0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x00FE #LATIN SMALL LETTER THORN +0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/ucmaps/cp1253.txt b/lib/ucmaps/cp1253.txt new file mode 100644 index 0000000000..2ba51a0c8f --- /dev/null +++ b/lib/ucmaps/cp1253.txt @@ -0,0 +1,274 @@ +# +# Name: cp1253 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1253 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1253 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 #UNDEFINED +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C #UNDEFINED +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C #UNDEFINED +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x0385 #GREEK DIALYTIKA TONOS +0xA2 0x0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA #UNDEFINED +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x2015 #HORIZONTAL BAR +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x0384 #GREEK TONOS +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS +0xB9 0x0389 #GREEK CAPITAL LETTER ETA WITH TONOS +0xBA 0x038A #GREEK CAPITAL LETTER IOTA WITH TONOS +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x038C #GREEK CAPITAL LETTER OMICRON WITH TONOS +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x038E #GREEK CAPITAL LETTER UPSILON WITH TONOS +0xBF 0x038F #GREEK CAPITAL LETTER OMEGA WITH TONOS +0xC0 0x0390 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0xC1 0x0391 #GREEK CAPITAL LETTER ALPHA +0xC2 0x0392 #GREEK CAPITAL LETTER BETA +0xC3 0x0393 #GREEK CAPITAL LETTER GAMMA +0xC4 0x0394 #GREEK CAPITAL LETTER DELTA +0xC5 0x0395 #GREEK CAPITAL LETTER EPSILON +0xC6 0x0396 #GREEK CAPITAL LETTER ZETA +0xC7 0x0397 #GREEK CAPITAL LETTER ETA +0xC8 0x0398 #GREEK CAPITAL LETTER THETA +0xC9 0x0399 #GREEK CAPITAL LETTER IOTA +0xCA 0x039A #GREEK CAPITAL LETTER KAPPA +0xCB 0x039B #GREEK CAPITAL LETTER LAMDA +0xCC 0x039C #GREEK CAPITAL LETTER MU +0xCD 0x039D #GREEK CAPITAL LETTER NU +0xCE 0x039E #GREEK CAPITAL LETTER XI +0xCF 0x039F #GREEK CAPITAL LETTER OMICRON +0xD0 0x03A0 #GREEK CAPITAL LETTER PI +0xD1 0x03A1 #GREEK CAPITAL LETTER RHO +0xD2 #UNDEFINED +0xD3 0x03A3 #GREEK CAPITAL LETTER SIGMA +0xD4 0x03A4 #GREEK CAPITAL LETTER TAU +0xD5 0x03A5 #GREEK CAPITAL LETTER UPSILON +0xD6 0x03A6 #GREEK CAPITAL LETTER PHI +0xD7 0x03A7 #GREEK CAPITAL LETTER CHI +0xD8 0x03A8 #GREEK CAPITAL LETTER PSI +0xD9 0x03A9 #GREEK CAPITAL LETTER OMEGA +0xDA 0x03AA #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0xDB 0x03AB #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0xDC 0x03AC #GREEK SMALL LETTER ALPHA WITH TONOS +0xDD 0x03AD #GREEK SMALL LETTER EPSILON WITH TONOS +0xDE 0x03AE #GREEK SMALL LETTER ETA WITH TONOS +0xDF 0x03AF #GREEK SMALL LETTER IOTA WITH TONOS +0xE0 0x03B0 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +0xE1 0x03B1 #GREEK SMALL LETTER ALPHA +0xE2 0x03B2 #GREEK SMALL LETTER BETA +0xE3 0x03B3 #GREEK SMALL LETTER GAMMA +0xE4 0x03B4 #GREEK SMALL LETTER DELTA +0xE5 0x03B5 #GREEK SMALL LETTER EPSILON +0xE6 0x03B6 #GREEK SMALL LETTER ZETA +0xE7 0x03B7 #GREEK SMALL LETTER ETA +0xE8 0x03B8 #GREEK SMALL LETTER THETA +0xE9 0x03B9 #GREEK SMALL LETTER IOTA +0xEA 0x03BA #GREEK SMALL LETTER KAPPA +0xEB 0x03BB #GREEK SMALL LETTER LAMDA +0xEC 0x03BC #GREEK SMALL LETTER MU +0xED 0x03BD #GREEK SMALL LETTER NU +0xEE 0x03BE #GREEK SMALL LETTER XI +0xEF 0x03BF #GREEK SMALL LETTER OMICRON +0xF0 0x03C0 #GREEK SMALL LETTER PI +0xF1 0x03C1 #GREEK SMALL LETTER RHO +0xF2 0x03C2 #GREEK SMALL LETTER FINAL SIGMA +0xF3 0x03C3 #GREEK SMALL LETTER SIGMA +0xF4 0x03C4 #GREEK SMALL LETTER TAU +0xF5 0x03C5 #GREEK SMALL LETTER UPSILON +0xF6 0x03C6 #GREEK SMALL LETTER PHI +0xF7 0x03C7 #GREEK SMALL LETTER CHI +0xF8 0x03C8 #GREEK SMALL LETTER PSI +0xF9 0x03C9 #GREEK SMALL LETTER OMEGA +0xFA 0x03CA #GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xFB 0x03CB #GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xFC 0x03CC #GREEK SMALL LETTER OMICRON WITH TONOS +0xFD 0x03CD #GREEK SMALL LETTER UPSILON WITH TONOS +0xFE 0x03CE #GREEK SMALL LETTER OMEGA WITH TONOS +0xFF #UNDEFINED diff --git a/lib/ucmaps/cp1254.txt b/lib/ucmaps/cp1254.txt new file mode 100644 index 0000000000..ca1a1ebdb8 --- /dev/null +++ b/lib/ucmaps/cp1254.txt @@ -0,0 +1,274 @@ +# +# Name: cp1254 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1254 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1254 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00AA #FEMININE ORDINAL INDICATOR +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00BA #MASCULINE ORDINAL INDICATOR +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 #LATIN CAPITAL LETTER AE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x011E #LATIN CAPITAL LETTER G WITH BREVE +0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x0130 #LATIN CAPITAL LETTER I WITH DOT ABOVE +0xDE 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 #LATIN SMALL LETTER AE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x011F #LATIN SMALL LETTER G WITH BREVE +0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x0131 #LATIN SMALL LETTER DOTLESS I +0xFE 0x015F #LATIN SMALL LETTER S WITH CEDILLA +0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/ucmaps/cp1255.txt b/lib/ucmaps/cp1255.txt new file mode 100644 index 0000000000..341517f119 --- /dev/null +++ b/lib/ucmaps/cp1255.txt @@ -0,0 +1,274 @@ +# +# Name: cp1255 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 1/7/2000 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1255 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1255 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C #UNDEFINED +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C #UNDEFINED +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x20AA #NEW SHEQEL SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00D7 #MULTIPLICATION SIGN +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00F7 #DIVISION SIGN +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x05B0 #HEBREW POINT SHEVA +0xC1 0x05B1 #HEBREW POINT HATAF SEGOL +0xC2 0x05B2 #HEBREW POINT HATAF PATAH +0xC3 0x05B3 #HEBREW POINT HATAF QAMATS +0xC4 0x05B4 #HEBREW POINT HIRIQ +0xC5 0x05B5 #HEBREW POINT TSERE +0xC6 0x05B6 #HEBREW POINT SEGOL +0xC7 0x05B7 #HEBREW POINT PATAH +0xC8 0x05B8 #HEBREW POINT QAMATS +0xC9 0x05B9 #HEBREW POINT HOLAM +0xCA #UNDEFINED +0xCB 0x05BB #HEBREW POINT QUBUTS +0xCC 0x05BC #HEBREW POINT DAGESH OR MAPIQ +0xCD 0x05BD #HEBREW POINT METEG +0xCE 0x05BE #HEBREW PUNCTUATION MAQAF +0xCF 0x05BF #HEBREW POINT RAFE +0xD0 0x05C0 #HEBREW PUNCTUATION PASEQ +0xD1 0x05C1 #HEBREW POINT SHIN DOT +0xD2 0x05C2 #HEBREW POINT SIN DOT +0xD3 0x05C3 #HEBREW PUNCTUATION SOF PASUQ +0xD4 0x05F0 #HEBREW LIGATURE YIDDISH DOUBLE VAV +0xD5 0x05F1 #HEBREW LIGATURE YIDDISH VAV YOD +0xD6 0x05F2 #HEBREW LIGATURE YIDDISH DOUBLE YOD +0xD7 0x05F3 #HEBREW PUNCTUATION GERESH +0xD8 0x05F4 #HEBREW PUNCTUATION GERSHAYIM +0xD9 #UNDEFINED +0xDA #UNDEFINED +0xDB #UNDEFINED +0xDC #UNDEFINED +0xDD #UNDEFINED +0xDE #UNDEFINED +0xDF #UNDEFINED +0xE0 0x05D0 #HEBREW LETTER ALEF +0xE1 0x05D1 #HEBREW LETTER BET +0xE2 0x05D2 #HEBREW LETTER GIMEL +0xE3 0x05D3 #HEBREW LETTER DALET +0xE4 0x05D4 #HEBREW LETTER HE +0xE5 0x05D5 #HEBREW LETTER VAV +0xE6 0x05D6 #HEBREW LETTER ZAYIN +0xE7 0x05D7 #HEBREW LETTER HET +0xE8 0x05D8 #HEBREW LETTER TET +0xE9 0x05D9 #HEBREW LETTER YOD +0xEA 0x05DA #HEBREW LETTER FINAL KAF +0xEB 0x05DB #HEBREW LETTER KAF +0xEC 0x05DC #HEBREW LETTER LAMED +0xED 0x05DD #HEBREW LETTER FINAL MEM +0xEE 0x05DE #HEBREW LETTER MEM +0xEF 0x05DF #HEBREW LETTER FINAL NUN +0xF0 0x05E0 #HEBREW LETTER NUN +0xF1 0x05E1 #HEBREW LETTER SAMEKH +0xF2 0x05E2 #HEBREW LETTER AYIN +0xF3 0x05E3 #HEBREW LETTER FINAL PE +0xF4 0x05E4 #HEBREW LETTER PE +0xF5 0x05E5 #HEBREW LETTER FINAL TSADI +0xF6 0x05E6 #HEBREW LETTER TSADI +0xF7 0x05E7 #HEBREW LETTER QOF +0xF8 0x05E8 #HEBREW LETTER RESH +0xF9 0x05E9 #HEBREW LETTER SHIN +0xFA 0x05EA #HEBREW LETTER TAV +0xFB #UNDEFINED +0xFC #UNDEFINED +0xFD 0x200E #LEFT-TO-RIGHT MARK +0xFE 0x200F #RIGHT-TO-LEFT MARK +0xFF #UNDEFINED diff --git a/lib/ucmaps/cp1256.txt b/lib/ucmaps/cp1256.txt new file mode 100644 index 0000000000..0edd081b92 --- /dev/null +++ b/lib/ucmaps/cp1256.txt @@ -0,0 +1,274 @@ +# +# Name: cp1256 to Unicode table +# Unicode version: 2.1 +# Table version: 2.01 +# Table format: Format A +# Date: 01/5/99 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1256 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1256 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 0x067E #ARABIC LETTER PEH +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0679 #ARABIC LETTER TTEH +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D 0x0686 #ARABIC LETTER TCHEH +0x8E 0x0698 #ARABIC LETTER JEH +0x8F 0x0688 #ARABIC LETTER DDAL +0x90 0x06AF #ARABIC LETTER GAF +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x06A9 #ARABIC LETTER KEHEH +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0691 #ARABIC LETTER RREH +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D 0x200C #ZERO WIDTH NON-JOINER +0x9E 0x200D #ZERO WIDTH JOINER +0x9F 0x06BA #ARABIC LETTER NOON GHUNNA +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x060C #ARABIC COMMA +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x06BE #ARABIC LETTER HEH DOACHASHMEE +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x061B #ARABIC SEMICOLON +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x061F #ARABIC QUESTION MARK +0xC0 0x06C1 #ARABIC LETTER HEH GOAL +0xC1 0x0621 #ARABIC LETTER HAMZA +0xC2 0x0622 #ARABIC LETTER ALEF WITH MADDA ABOVE +0xC3 0x0623 #ARABIC LETTER ALEF WITH HAMZA ABOVE +0xC4 0x0624 #ARABIC LETTER WAW WITH HAMZA ABOVE +0xC5 0x0625 #ARABIC LETTER ALEF WITH HAMZA BELOW +0xC6 0x0626 #ARABIC LETTER YEH WITH HAMZA ABOVE +0xC7 0x0627 #ARABIC LETTER ALEF +0xC8 0x0628 #ARABIC LETTER BEH +0xC9 0x0629 #ARABIC LETTER TEH MARBUTA +0xCA 0x062A #ARABIC LETTER TEH +0xCB 0x062B #ARABIC LETTER THEH +0xCC 0x062C #ARABIC LETTER JEEM +0xCD 0x062D #ARABIC LETTER HAH +0xCE 0x062E #ARABIC LETTER KHAH +0xCF 0x062F #ARABIC LETTER DAL +0xD0 0x0630 #ARABIC LETTER THAL +0xD1 0x0631 #ARABIC LETTER REH +0xD2 0x0632 #ARABIC LETTER ZAIN +0xD3 0x0633 #ARABIC LETTER SEEN +0xD4 0x0634 #ARABIC LETTER SHEEN +0xD5 0x0635 #ARABIC LETTER SAD +0xD6 0x0636 #ARABIC LETTER DAD +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x0637 #ARABIC LETTER TAH +0xD9 0x0638 #ARABIC LETTER ZAH +0xDA 0x0639 #ARABIC LETTER AIN +0xDB 0x063A #ARABIC LETTER GHAIN +0xDC 0x0640 #ARABIC TATWEEL +0xDD 0x0641 #ARABIC LETTER FEH +0xDE 0x0642 #ARABIC LETTER QAF +0xDF 0x0643 #ARABIC LETTER KAF +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x0644 #ARABIC LETTER LAM +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0645 #ARABIC LETTER MEEM +0xE4 0x0646 #ARABIC LETTER NOON +0xE5 0x0647 #ARABIC LETTER HEH +0xE6 0x0648 #ARABIC LETTER WAW +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0649 #ARABIC LETTER ALEF MAKSURA +0xED 0x064A #ARABIC LETTER YEH +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x064B #ARABIC FATHATAN +0xF1 0x064C #ARABIC DAMMATAN +0xF2 0x064D #ARABIC KASRATAN +0xF3 0x064E #ARABIC FATHA +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x064F #ARABIC DAMMA +0xF6 0x0650 #ARABIC KASRA +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x0651 #ARABIC SHADDA +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x0652 #ARABIC SUKUN +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x200E #LEFT-TO-RIGHT MARK +0xFE 0x200F #RIGHT-TO-LEFT MARK +0xFF 0x06D2 #ARABIC LETTER YEH BARREE diff --git a/lib/ucmaps/cp1257.txt b/lib/ucmaps/cp1257.txt new file mode 100644 index 0000000000..97979d9319 --- /dev/null +++ b/lib/ucmaps/cp1257.txt @@ -0,0 +1,274 @@ +# +# Name: cp1257 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1257 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1257 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 #UNDEFINED +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 #UNDEFINED +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C #UNDEFINED +0x8D 0x00A8 #DIAERESIS +0x8E 0x02C7 #CARON +0x8F 0x00B8 #CEDILLA +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C #UNDEFINED +0x9D 0x00AF #MACRON +0x9E 0x02DB #OGONEK +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 #UNDEFINED +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 #UNDEFINED +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x0156 #LATIN CAPITAL LETTER R WITH CEDILLA +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00C6 #LATIN CAPITAL LETTER AE +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x0157 #LATIN SMALL LETTER R WITH CEDILLA +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00E6 #LATIN SMALL LETTER AE +0xC0 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xC1 0x012E #LATIN CAPITAL LETTER I WITH OGONEK +0xC2 0x0100 #LATIN CAPITAL LETTER A WITH MACRON +0xC3 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xC7 0x0112 #LATIN CAPITAL LETTER E WITH MACRON +0xC8 0x010C #LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0xCB 0x0116 #LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCC 0x0122 #LATIN CAPITAL LETTER G WITH CEDILLA +0xCD 0x0136 #LATIN CAPITAL LETTER K WITH CEDILLA +0xCE 0x012A #LATIN CAPITAL LETTER I WITH MACRON +0xCF 0x013B #LATIN CAPITAL LETTER L WITH CEDILLA +0xD0 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0145 #LATIN CAPITAL LETTER N WITH CEDILLA +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x014C #LATIN CAPITAL LETTER O WITH MACRON +0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x0172 #LATIN CAPITAL LETTER U WITH OGONEK +0xD9 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0xDA 0x015A #LATIN CAPITAL LETTER S WITH ACUTE +0xDB 0x016A #LATIN CAPITAL LETTER U WITH MACRON +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xDE 0x017D #LATIN CAPITAL LETTER Z WITH CARON +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xE1 0x012F #LATIN SMALL LETTER I WITH OGONEK +0xE2 0x0101 #LATIN SMALL LETTER A WITH MACRON +0xE3 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xE7 0x0113 #LATIN SMALL LETTER E WITH MACRON +0xE8 0x010D #LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x017A #LATIN SMALL LETTER Z WITH ACUTE +0xEB 0x0117 #LATIN SMALL LETTER E WITH DOT ABOVE +0xEC 0x0123 #LATIN SMALL LETTER G WITH CEDILLA +0xED 0x0137 #LATIN SMALL LETTER K WITH CEDILLA +0xEE 0x012B #LATIN SMALL LETTER I WITH MACRON +0xEF 0x013C #LATIN SMALL LETTER L WITH CEDILLA +0xF0 0x0161 #LATIN SMALL LETTER S WITH CARON +0xF1 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0146 #LATIN SMALL LETTER N WITH CEDILLA +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x014D #LATIN SMALL LETTER O WITH MACRON +0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x0173 #LATIN SMALL LETTER U WITH OGONEK +0xF9 0x0142 #LATIN SMALL LETTER L WITH STROKE +0xFA 0x015B #LATIN SMALL LETTER S WITH ACUTE +0xFB 0x016B #LATIN SMALL LETTER U WITH MACRON +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x017C #LATIN SMALL LETTER Z WITH DOT ABOVE +0xFE 0x017E #LATIN SMALL LETTER Z WITH CARON +0xFF 0x02D9 #DOT ABOVE diff --git a/lib/ucmaps/cp1258.txt b/lib/ucmaps/cp1258.txt new file mode 100644 index 0000000000..392310a8ca --- /dev/null +++ b/lib/ucmaps/cp1258.txt @@ -0,0 +1,274 @@ +# +# Name: cp1258 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1258 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1258 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00AA #FEMININE ORDINAL INDICATOR +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00BA #MASCULINE ORDINAL INDICATOR +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x0102 #LATIN CAPITAL LETTER A WITH BREVE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 #LATIN CAPITAL LETTER AE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x0300 #COMBINING GRAVE ACCENT +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x0110 #LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x0309 #COMBINING HOOK ABOVE +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x01A0 #LATIN CAPITAL LETTER O WITH HORN +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x01AF #LATIN CAPITAL LETTER U WITH HORN +0xDE 0x0303 #COMBINING TILDE +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0103 #LATIN SMALL LETTER A WITH BREVE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 #LATIN SMALL LETTER AE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0301 #COMBINING ACUTE ACCENT +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x0111 #LATIN SMALL LETTER D WITH STROKE +0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE +0xF2 0x0323 #COMBINING DOT BELOW +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x01A1 #LATIN SMALL LETTER O WITH HORN +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x01B0 #LATIN SMALL LETTER U WITH HORN +0xFE 0x20AB #DONG SIGN +0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/ucmaps/cp437.txt b/lib/ucmaps/cp437.txt new file mode 100644 index 0000000000..ae38e17ab9 --- /dev/null +++ b/lib/ucmaps/cp437.txt @@ -0,0 +1,273 @@ +# +# Name: cp437_DOSLatinUS to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp437_DOSLatinUS code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp437_DOSLatinUS order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00a2 #CENT SIGN +0x9c 0x00a3 #POUND SIGN +0x9d 0x00a5 #YEN SIGN +0x9e 0x20a7 #PESETA SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE diff --git a/lib/ucmaps/cp737.txt b/lib/ucmaps/cp737.txt new file mode 100644 index 0000000000..0fc572fc35 --- /dev/null +++ b/lib/ucmaps/cp737.txt @@ -0,0 +1,273 @@ +# +# Name: cp737_DOSGreek to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp737_DOSGreek code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp737_DOSGreek order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x0391 #GREEK CAPITAL LETTER ALPHA +0x81 0x0392 #GREEK CAPITAL LETTER BETA +0x82 0x0393 #GREEK CAPITAL LETTER GAMMA +0x83 0x0394 #GREEK CAPITAL LETTER DELTA +0x84 0x0395 #GREEK CAPITAL LETTER EPSILON +0x85 0x0396 #GREEK CAPITAL LETTER ZETA +0x86 0x0397 #GREEK CAPITAL LETTER ETA +0x87 0x0398 #GREEK CAPITAL LETTER THETA +0x88 0x0399 #GREEK CAPITAL LETTER IOTA +0x89 0x039a #GREEK CAPITAL LETTER KAPPA +0x8a 0x039b #GREEK CAPITAL LETTER LAMDA +0x8b 0x039c #GREEK CAPITAL LETTER MU +0x8c 0x039d #GREEK CAPITAL LETTER NU +0x8d 0x039e #GREEK CAPITAL LETTER XI +0x8e 0x039f #GREEK CAPITAL LETTER OMICRON +0x8f 0x03a0 #GREEK CAPITAL LETTER PI +0x90 0x03a1 #GREEK CAPITAL LETTER RHO +0x91 0x03a3 #GREEK CAPITAL LETTER SIGMA +0x92 0x03a4 #GREEK CAPITAL LETTER TAU +0x93 0x03a5 #GREEK CAPITAL LETTER UPSILON +0x94 0x03a6 #GREEK CAPITAL LETTER PHI +0x95 0x03a7 #GREEK CAPITAL LETTER CHI +0x96 0x03a8 #GREEK CAPITAL LETTER PSI +0x97 0x03a9 #GREEK CAPITAL LETTER OMEGA +0x98 0x03b1 #GREEK SMALL LETTER ALPHA +0x99 0x03b2 #GREEK SMALL LETTER BETA +0x9a 0x03b3 #GREEK SMALL LETTER GAMMA +0x9b 0x03b4 #GREEK SMALL LETTER DELTA +0x9c 0x03b5 #GREEK SMALL LETTER EPSILON +0x9d 0x03b6 #GREEK SMALL LETTER ZETA +0x9e 0x03b7 #GREEK SMALL LETTER ETA +0x9f 0x03b8 #GREEK SMALL LETTER THETA +0xa0 0x03b9 #GREEK SMALL LETTER IOTA +0xa1 0x03ba #GREEK SMALL LETTER KAPPA +0xa2 0x03bb #GREEK SMALL LETTER LAMDA +0xa3 0x03bc #GREEK SMALL LETTER MU +0xa4 0x03bd #GREEK SMALL LETTER NU +0xa5 0x03be #GREEK SMALL LETTER XI +0xa6 0x03bf #GREEK SMALL LETTER OMICRON +0xa7 0x03c0 #GREEK SMALL LETTER PI +0xa8 0x03c1 #GREEK SMALL LETTER RHO +0xa9 0x03c3 #GREEK SMALL LETTER SIGMA +0xaa 0x03c2 #GREEK SMALL LETTER FINAL SIGMA +0xab 0x03c4 #GREEK SMALL LETTER TAU +0xac 0x03c5 #GREEK SMALL LETTER UPSILON +0xad 0x03c6 #GREEK SMALL LETTER PHI +0xae 0x03c7 #GREEK SMALL LETTER CHI +0xaf 0x03c8 #GREEK SMALL LETTER PSI +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03c9 #GREEK SMALL LETTER OMEGA +0xe1 0x03ac #GREEK SMALL LETTER ALPHA WITH TONOS +0xe2 0x03ad #GREEK SMALL LETTER EPSILON WITH TONOS +0xe3 0x03ae #GREEK SMALL LETTER ETA WITH TONOS +0xe4 0x03ca #GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xe5 0x03af #GREEK SMALL LETTER IOTA WITH TONOS +0xe6 0x03cc #GREEK SMALL LETTER OMICRON WITH TONOS +0xe7 0x03cd #GREEK SMALL LETTER UPSILON WITH TONOS +0xe8 0x03cb #GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xe9 0x03ce #GREEK SMALL LETTER OMEGA WITH TONOS +0xea 0x0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS +0xeb 0x0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS +0xec 0x0389 #GREEK CAPITAL LETTER ETA WITH TONOS +0xed 0x038a #GREEK CAPITAL LETTER IOTA WITH TONOS +0xee 0x038c #GREEK CAPITAL LETTER OMICRON WITH TONOS +0xef 0x038e #GREEK CAPITAL LETTER UPSILON WITH TONOS +0xf0 0x038f #GREEK CAPITAL LETTER OMEGA WITH TONOS +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x03aa #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0xf5 0x03ab #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE diff --git a/lib/ucmaps/cp775.txt b/lib/ucmaps/cp775.txt new file mode 100644 index 0000000000..1ad4e4e58c --- /dev/null +++ b/lib/ucmaps/cp775.txt @@ -0,0 +1,274 @@ +# +# Name: cp775_DOSBaltRim to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp775_DOSBaltRim code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp775_DOSBaltRim order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x0101 #LATIN SMALL LETTER A WITH MACRON +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x0123 #LATIN SMALL LETTER G WITH CEDILLA +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0x88 0x0142 #LATIN SMALL LETTER L WITH STROKE +0x89 0x0113 #LATIN SMALL LETTER E WITH MACRON +0x8a 0x0156 #LATIN CAPITAL LETTER R WITH CEDILLA +0x8b 0x0157 #LATIN SMALL LETTER R WITH CEDILLA +0x8c 0x012b #LATIN SMALL LETTER I WITH MACRON +0x8d 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x014d #LATIN SMALL LETTER O WITH MACRON +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x0122 #LATIN CAPITAL LETTER G WITH CEDILLA +0x96 0x00a2 #CENT SIGN +0x97 0x015a #LATIN CAPITAL LETTER S WITH ACUTE +0x98 0x015b #LATIN SMALL LETTER S WITH ACUTE +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x00d7 #MULTIPLICATION SIGN +0x9f 0x00a4 #CURRENCY SIGN +0xa0 0x0100 #LATIN CAPITAL LETTER A WITH MACRON +0xa1 0x012a #LATIN CAPITAL LETTER I WITH MACRON +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x017b #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xa4 0x017c #LATIN SMALL LETTER Z WITH DOT ABOVE +0xa5 0x017a #LATIN SMALL LETTER Z WITH ACUTE +0xa6 0x201d #RIGHT DOUBLE QUOTATION MARK +0xa7 0x00a6 #BROKEN BAR +0xa8 0x00a9 #COPYRIGHT SIGN +0xa9 0x00ae #REGISTERED SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xb6 0x010c #LATIN CAPITAL LETTER C WITH CARON +0xb7 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xb8 0x0116 #LATIN CAPITAL LETTER E WITH DOT ABOVE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x012e #LATIN CAPITAL LETTER I WITH OGONEK +0xbe 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x0172 #LATIN CAPITAL LETTER U WITH OGONEK +0xc7 0x016a #LATIN CAPITAL LETTER U WITH MACRON +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x017d #LATIN CAPITAL LETTER Z WITH CARON +0xd0 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xd1 0x010d #LATIN SMALL LETTER C WITH CARON +0xd2 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xd3 0x0117 #LATIN SMALL LETTER E WITH DOT ABOVE +0xd4 0x012f #LATIN SMALL LETTER I WITH OGONEK +0xd5 0x0161 #LATIN SMALL LETTER S WITH CARON +0xd6 0x0173 #LATIN SMALL LETTER U WITH OGONEK +0xd7 0x016b #LATIN SMALL LETTER U WITH MACRON +0xd8 0x017e #LATIN SMALL LETTER Z WITH CARON +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xe1 0x00df #LATIN SMALL LETTER SHARP S (GERMAN) +0xe2 0x014c #LATIN CAPITAL LETTER O WITH MACRON +0xe3 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xe4 0x00f5 #LATIN SMALL LETTER O WITH TILDE +0xe5 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE +0xe6 0x00b5 #MICRO SIGN +0xe7 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xe8 0x0136 #LATIN CAPITAL LETTER K WITH CEDILLA +0xe9 0x0137 #LATIN SMALL LETTER K WITH CEDILLA +0xea 0x013b #LATIN CAPITAL LETTER L WITH CEDILLA +0xeb 0x013c #LATIN SMALL LETTER L WITH CEDILLA +0xec 0x0146 #LATIN SMALL LETTER N WITH CEDILLA +0xed 0x0112 #LATIN CAPITAL LETTER E WITH MACRON +0xee 0x0145 #LATIN CAPITAL LETTER N WITH CEDILLA +0xef 0x2019 #RIGHT SINGLE QUOTATION MARK +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x201c #LEFT DOUBLE QUOTATION MARK +0xf3 0x00be #VULGAR FRACTION THREE QUARTERS +0xf4 0x00b6 #PILCROW SIGN +0xf5 0x00a7 #SECTION SIGN +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x201e #DOUBLE LOW-9 QUOTATION MARK +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x00b9 #SUPERSCRIPT ONE +0xfc 0x00b3 #SUPERSCRIPT THREE +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp850.txt b/lib/ucmaps/cp850.txt new file mode 100644 index 0000000000..590b1afe50 --- /dev/null +++ b/lib/ucmaps/cp850.txt @@ -0,0 +1,273 @@ +# +# Name: cp850_DOSLatin1 to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp850_DOSLatin1 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp850_DOSLatin1 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x00d7 #MULTIPLICATION SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x00ae #REGISTERED SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0xb6 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xb7 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE +0xb8 0x00a9 #COPYRIGHT SIGN +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x00a2 #CENT SIGN +0xbe 0x00a5 #YEN SIGN +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x00e3 #LATIN SMALL LETTER A WITH TILDE +0xc7 0x00c3 #LATIN CAPITAL LETTER A WITH TILDE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x00a4 #CURRENCY SIGN +0xd0 0x00f0 #LATIN SMALL LETTER ETH +0xd1 0x00d0 #LATIN CAPITAL LETTER ETH +0xd2 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xd3 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS +0xd4 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE +0xd5 0x0131 #LATIN SMALL LETTER DOTLESS I +0xd6 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0xd7 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xd8 0x00cf #LATIN CAPITAL LETTER I WITH DIAERESIS +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x00a6 #BROKEN BAR +0xde 0x00cc #LATIN CAPITAL LETTER I WITH GRAVE +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xe3 0x00d2 #LATIN CAPITAL LETTER O WITH GRAVE +0xe4 0x00f5 #LATIN SMALL LETTER O WITH TILDE +0xe5 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE +0xe6 0x00b5 #MICRO SIGN +0xe7 0x00fe #LATIN SMALL LETTER THORN +0xe8 0x00de #LATIN CAPITAL LETTER THORN +0xe9 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0xea 0x00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xeb 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE +0xec 0x00fd #LATIN SMALL LETTER Y WITH ACUTE +0xed 0x00dd #LATIN CAPITAL LETTER Y WITH ACUTE +0xee 0x00af #MACRON +0xef 0x00b4 #ACUTE ACCENT +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2017 #DOUBLE LOW LINE +0xf3 0x00be #VULGAR FRACTION THREE QUARTERS +0xf4 0x00b6 #PILCROW SIGN +0xf5 0x00a7 #SECTION SIGN +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x00b8 #CEDILLA +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x00a8 #DIAERESIS +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x00b9 #SUPERSCRIPT ONE +0xfc 0x00b3 #SUPERSCRIPT THREE +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE diff --git a/lib/ucmaps/cp852.txt b/lib/ucmaps/cp852.txt new file mode 100644 index 0000000000..2f2dabaeb9 --- /dev/null +++ b/lib/ucmaps/cp852.txt @@ -0,0 +1,273 @@ +# +# Name: cp852_DOSLatin2 to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp852_DOSLatin2 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp852_DOSLatin2 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x016f #LATIN SMALL LETTER U WITH RING ABOVE +0x86 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x0142 #LATIN SMALL LETTER L WITH STROKE +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x0150 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0x8b 0x0151 #LATIN SMALL LETTER O WITH DOUBLE ACUTE +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x0139 #LATIN CAPITAL LETTER L WITH ACUTE +0x92 0x013a #LATIN SMALL LETTER L WITH ACUTE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x013d #LATIN CAPITAL LETTER L WITH CARON +0x96 0x013e #LATIN SMALL LETTER L WITH CARON +0x97 0x015a #LATIN CAPITAL LETTER S WITH ACUTE +0x98 0x015b #LATIN SMALL LETTER S WITH ACUTE +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x0164 #LATIN CAPITAL LETTER T WITH CARON +0x9c 0x0165 #LATIN SMALL LETTER T WITH CARON +0x9d 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0x9e 0x00d7 #MULTIPLICATION SIGN +0x9f 0x010d #LATIN SMALL LETTER C WITH CARON +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xa5 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xa6 0x017d #LATIN CAPITAL LETTER Z WITH CARON +0xa7 0x017e #LATIN SMALL LETTER Z WITH CARON +0xa8 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xa9 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xaa 0x00ac #NOT SIGN +0xab 0x017a #LATIN SMALL LETTER Z WITH ACUTE +0xac 0x010c #LATIN CAPITAL LETTER C WITH CARON +0xad 0x015f #LATIN SMALL LETTER S WITH CEDILLA +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0xb6 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xb7 0x011a #LATIN CAPITAL LETTER E WITH CARON +0xb8 0x015e #LATIN CAPITAL LETTER S WITH CEDILLA +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x017b #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xbe 0x017c #LATIN SMALL LETTER Z WITH DOT ABOVE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x0102 #LATIN CAPITAL LETTER A WITH BREVE +0xc7 0x0103 #LATIN SMALL LETTER A WITH BREVE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x00a4 #CURRENCY SIGN +0xd0 0x0111 #LATIN SMALL LETTER D WITH STROKE +0xd1 0x0110 #LATIN CAPITAL LETTER D WITH STROKE +0xd2 0x010e #LATIN CAPITAL LETTER D WITH CARON +0xd3 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS +0xd4 0x010f #LATIN SMALL LETTER D WITH CARON +0xd5 0x0147 #LATIN CAPITAL LETTER N WITH CARON +0xd6 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0xd7 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xd8 0x011b #LATIN SMALL LETTER E WITH CARON +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x0162 #LATIN CAPITAL LETTER T WITH CEDILLA +0xde 0x016e #LATIN CAPITAL LETTER U WITH RING ABOVE +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xe3 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xe4 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xe5 0x0148 #LATIN SMALL LETTER N WITH CARON +0xe6 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0xe7 0x0161 #LATIN SMALL LETTER S WITH CARON +0xe8 0x0154 #LATIN CAPITAL LETTER R WITH ACUTE +0xe9 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0xea 0x0155 #LATIN SMALL LETTER R WITH ACUTE +0xeb 0x0170 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0xec 0x00fd #LATIN SMALL LETTER Y WITH ACUTE +0xed 0x00dd #LATIN CAPITAL LETTER Y WITH ACUTE +0xee 0x0163 #LATIN SMALL LETTER T WITH CEDILLA +0xef 0x00b4 #ACUTE ACCENT +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x02dd #DOUBLE ACUTE ACCENT +0xf2 0x02db #OGONEK +0xf3 0x02c7 #CARON +0xf4 0x02d8 #BREVE +0xf5 0x00a7 #SECTION SIGN +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x00b8 #CEDILLA +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x00a8 #DIAERESIS +0xfa 0x02d9 #DOT ABOVE +0xfb 0x0171 #LATIN SMALL LETTER U WITH DOUBLE ACUTE +0xfc 0x0158 #LATIN CAPITAL LETTER R WITH CARON +0xfd 0x0159 #LATIN SMALL LETTER R WITH CARON +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE diff --git a/lib/ucmaps/cp855.txt b/lib/ucmaps/cp855.txt new file mode 100644 index 0000000000..d43daf039a --- /dev/null +++ b/lib/ucmaps/cp855.txt @@ -0,0 +1,274 @@ +# +# Name: cp855_DOSCyrillic to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp855_DOSCyrillic code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp855_DOSCyrillic order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x0452 #CYRILLIC SMALL LETTER DJE +0x81 0x0402 #CYRILLIC CAPITAL LETTER DJE +0x82 0x0453 #CYRILLIC SMALL LETTER GJE +0x83 0x0403 #CYRILLIC CAPITAL LETTER GJE +0x84 0x0451 #CYRILLIC SMALL LETTER IO +0x85 0x0401 #CYRILLIC CAPITAL LETTER IO +0x86 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE +0x87 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE +0x88 0x0455 #CYRILLIC SMALL LETTER DZE +0x89 0x0405 #CYRILLIC CAPITAL LETTER DZE +0x8a 0x0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0x8b 0x0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0x8c 0x0457 #CYRILLIC SMALL LETTER YI +0x8d 0x0407 #CYRILLIC CAPITAL LETTER YI +0x8e 0x0458 #CYRILLIC SMALL LETTER JE +0x8f 0x0408 #CYRILLIC CAPITAL LETTER JE +0x90 0x0459 #CYRILLIC SMALL LETTER LJE +0x91 0x0409 #CYRILLIC CAPITAL LETTER LJE +0x92 0x045a #CYRILLIC SMALL LETTER NJE +0x93 0x040a #CYRILLIC CAPITAL LETTER NJE +0x94 0x045b #CYRILLIC SMALL LETTER TSHE +0x95 0x040b #CYRILLIC CAPITAL LETTER TSHE +0x96 0x045c #CYRILLIC SMALL LETTER KJE +0x97 0x040c #CYRILLIC CAPITAL LETTER KJE +0x98 0x045e #CYRILLIC SMALL LETTER SHORT U +0x99 0x040e #CYRILLIC CAPITAL LETTER SHORT U +0x9a 0x045f #CYRILLIC SMALL LETTER DZHE +0x9b 0x040f #CYRILLIC CAPITAL LETTER DZHE +0x9c 0x044e #CYRILLIC SMALL LETTER YU +0x9d 0x042e #CYRILLIC CAPITAL LETTER YU +0x9e 0x044a #CYRILLIC SMALL LETTER HARD SIGN +0x9f 0x042a #CYRILLIC CAPITAL LETTER HARD SIGN +0xa0 0x0430 #CYRILLIC SMALL LETTER A +0xa1 0x0410 #CYRILLIC CAPITAL LETTER A +0xa2 0x0431 #CYRILLIC SMALL LETTER BE +0xa3 0x0411 #CYRILLIC CAPITAL LETTER BE +0xa4 0x0446 #CYRILLIC SMALL LETTER TSE +0xa5 0x0426 #CYRILLIC CAPITAL LETTER TSE +0xa6 0x0434 #CYRILLIC SMALL LETTER DE +0xa7 0x0414 #CYRILLIC CAPITAL LETTER DE +0xa8 0x0435 #CYRILLIC SMALL LETTER IE +0xa9 0x0415 #CYRILLIC CAPITAL LETTER IE +0xaa 0x0444 #CYRILLIC SMALL LETTER EF +0xab 0x0424 #CYRILLIC CAPITAL LETTER EF +0xac 0x0433 #CYRILLIC SMALL LETTER GHE +0xad 0x0413 #CYRILLIC CAPITAL LETTER GHE +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x0445 #CYRILLIC SMALL LETTER HA +0xb6 0x0425 #CYRILLIC CAPITAL LETTER HA +0xb7 0x0438 #CYRILLIC SMALL LETTER I +0xb8 0x0418 #CYRILLIC CAPITAL LETTER I +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x0439 #CYRILLIC SMALL LETTER SHORT I +0xbe 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x043a #CYRILLIC SMALL LETTER KA +0xc7 0x041a #CYRILLIC CAPITAL LETTER KA +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x00a4 #CURRENCY SIGN +0xd0 0x043b #CYRILLIC SMALL LETTER EL +0xd1 0x041b #CYRILLIC CAPITAL LETTER EL +0xd2 0x043c #CYRILLIC SMALL LETTER EM +0xd3 0x041c #CYRILLIC CAPITAL LETTER EM +0xd4 0x043d #CYRILLIC SMALL LETTER EN +0xd5 0x041d #CYRILLIC CAPITAL LETTER EN +0xd6 0x043e #CYRILLIC SMALL LETTER O +0xd7 0x041e #CYRILLIC CAPITAL LETTER O +0xd8 0x043f #CYRILLIC SMALL LETTER PE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x041f #CYRILLIC CAPITAL LETTER PE +0xde 0x044f #CYRILLIC SMALL LETTER YA +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x042f #CYRILLIC CAPITAL LETTER YA +0xe1 0x0440 #CYRILLIC SMALL LETTER ER +0xe2 0x0420 #CYRILLIC CAPITAL LETTER ER +0xe3 0x0441 #CYRILLIC SMALL LETTER ES +0xe4 0x0421 #CYRILLIC CAPITAL LETTER ES +0xe5 0x0442 #CYRILLIC SMALL LETTER TE +0xe6 0x0422 #CYRILLIC CAPITAL LETTER TE +0xe7 0x0443 #CYRILLIC SMALL LETTER U +0xe8 0x0423 #CYRILLIC CAPITAL LETTER U +0xe9 0x0436 #CYRILLIC SMALL LETTER ZHE +0xea 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0xeb 0x0432 #CYRILLIC SMALL LETTER VE +0xec 0x0412 #CYRILLIC CAPITAL LETTER VE +0xed 0x044c #CYRILLIC SMALL LETTER SOFT SIGN +0xee 0x042c #CYRILLIC CAPITAL LETTER SOFT SIGN +0xef 0x2116 #NUMERO SIGN +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x044b #CYRILLIC SMALL LETTER YERU +0xf2 0x042b #CYRILLIC CAPITAL LETTER YERU +0xf3 0x0437 #CYRILLIC SMALL LETTER ZE +0xf4 0x0417 #CYRILLIC CAPITAL LETTER ZE +0xf5 0x0448 #CYRILLIC SMALL LETTER SHA +0xf6 0x0428 #CYRILLIC CAPITAL LETTER SHA +0xf7 0x044d #CYRILLIC SMALL LETTER E +0xf8 0x042d #CYRILLIC CAPITAL LETTER E +0xf9 0x0449 #CYRILLIC SMALL LETTER SHCHA +0xfa 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0xfb 0x0447 #CYRILLIC SMALL LETTER CHE +0xfc 0x0427 #CYRILLIC CAPITAL LETTER CHE +0xfd 0x00a7 #SECTION SIGN +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp856.txt b/lib/ucmaps/cp856.txt new file mode 100644 index 0000000000..3a6000bcb7 --- /dev/null +++ b/lib/ucmaps/cp856.txt @@ -0,0 +1,303 @@ +# +# Name: cp856_Hebrew_PC to Unicode table +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler (kenw@sybase.com) +# +# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# CP424 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the cp856_Hebrew_PC code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp856_Hebrew_PC order +# +# Version history +# 1.0 version new. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x05D0 #HEBREW LETTER ALEF +0x81 0x05D1 #HEBREW LETTER BET +0x82 0x05D2 #HEBREW LETTER GIMEL +0x83 0x05D3 #HEBREW LETTER DALET +0x84 0x05D4 #HEBREW LETTER HE +0x85 0x05D5 #HEBREW LETTER VAV +0x86 0x05D6 #HEBREW LETTER ZAYIN +0x87 0x05D7 #HEBREW LETTER HET +0x88 0x05D8 #HEBREW LETTER TET +0x89 0x05D9 #HEBREW LETTER YOD +0x8A 0x05DA #HEBREW LETTER FINAL KAF +0x8B 0x05DB #HEBREW LETTER KAF +0x8C 0x05DC #HEBREW LETTER LAMED +0x8D 0x05DD #HEBREW LETTER FINAL MEM +0x8E 0x05DE #HEBREW LETTER MEM +0x8F 0x05DF #HEBREW LETTER FINAL NUN +0x90 0x05E0 #HEBREW LETTER NUN +0x91 0x05E1 #HEBREW LETTER SAMEKH +0x92 0x05E2 #HEBREW LETTER AYIN +0x93 0x05E3 #HEBREW LETTER FINAL PE +0x94 0x05E4 #HEBREW LETTER PE +0x95 0x05E5 #HEBREW LETTER FINAL TSADI +0x96 0x05E6 #HEBREW LETTER TSADI +0x97 0x05E7 #HEBREW LETTER QOF +0x98 0x05E8 #HEBREW LETTER RESH +0x99 0x05E9 #HEBREW LETTER SHIN +0x9A 0x05EA #HEBREW LETTER TAV +0x9B #UNDEFINED +0x9C 0x00A3 #POUND SIGN +0x9D #UNDEFINED +0x9E 0x00D7 #MULTIPLICATION SIGN +0x9F #UNDEFINED +0xA0 #UNDEFINED +0xA1 #UNDEFINED +0xA2 #UNDEFINED +0xA3 #UNDEFINED +0xA4 #UNDEFINED +0xA5 #UNDEFINED +0xA6 #UNDEFINED +0xA7 #UNDEFINED +0xA8 #UNDEFINED +0xA9 0x00AE #REGISTERED SIGN +0xAA 0x00AC #NOT SIGN +0xAB 0x00BD #VULGAR FRACTION ONE HALF +0xAC 0x00BC #VULGAR FRACTION ONE QUARTER +0xAD #UNDEFINED +0xAE 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAF 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xB0 0x2591 #LIGHT SHADE +0xB1 0x2592 #MEDIUM SHADE +0xB2 0x2593 #DARK SHADE +0xB3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xB4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xB5 #UNDEFINED +0xB6 #UNDEFINED +0xB7 #UNDEFINED +0xB8 0x00A9 #COPYRIGHT SIGN +0xB9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xBA 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xBB 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xBC 0x255D #BOX DRAWINGS DOUBLE UP AND LEFT +0xBD 0x00A2 #CENT SIGN +0xBE 0x00A5 #YEN SIGN +0xBF 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xC0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xC1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xC2 0x252C #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xC3 0x251C #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xC4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xC5 0x253C #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xC6 #UNDEFINED +0xC7 #UNDEFINED +0xC8 0x255A #BOX DRAWINGS DOUBLE UP AND RIGHT +0xC9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xCA 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xCB 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xCC 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xCD 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xCE 0x256C #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xCF 0x00A4 #CURRENCY SIGN +0xD0 #UNDEFINED +0xD1 #UNDEFINED +0xD2 #UNDEFINED +0xD3 #UNDEFINEDS +0xD4 #UNDEFINED +0xD5 #UNDEFINED +0xD6 #UNDEFINEDE +0xD7 #UNDEFINED +0xD8 #UNDEFINED +0xD9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xDA 0x250C #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xDB 0x2588 #FULL BLOCK +0xDC 0x2584 #LOWER HALF BLOCK +0xDD 0x00A6 #BROKEN BAR +0xDE #UNDEFINED +0xDF 0x2580 #UPPER HALF BLOCK +0xE0 #UNDEFINED +0xE1 #UNDEFINED +0xE2 #UNDEFINED +0xE3 #UNDEFINED +0xE4 #UNDEFINED +0xE5 #UNDEFINED +0xE6 0x00B5 #MICRO SIGN +0xE7 #UNDEFINED +0xE8 #UNDEFINED +0xE9 #UNDEFINED +0xEA #UNDEFINED +0xEB #UNDEFINED +0xEC #UNDEFINED +0xED #UNDEFINED +0xEE 0x00AF #MACRON +0xEF 0x00B4 #ACUTE ACCENT +0xF0 0x00AD #SOFT HYPHEN +0xF1 0x00B1 #PLUS-MINUS SIGN +0xF2 0x2017 #DOUBLE LOW LINE +0xF3 0x00BE #VULGAR FRACTION THREE QUARTERS +0xF4 0x00B6 #PILCROW SIGN +0xF5 0x00A7 #SECTION SIGN +0xF6 0x00F7 #DIVISION SIGN +0xF7 0x00B8 #CEDILLA +0xF8 0x00B0 #DEGREE SIGN +0xF9 0x00A8 #DIAERESIS +0xFA 0x00B7 #MIDDLE DOT +0xFB 0x00B9 #SUPERSCRIPT ONE +0xFC 0x00B3 #SUPERSCRIPT THREE +0xFD 0x00B2 #SUPERSCRIPT TWO +0xFE 0x25A0 #BLACK SQUARE +0xFF 0x00A0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp857.txt b/lib/ucmaps/cp857.txt new file mode 100644 index 0000000000..3059383960 --- /dev/null +++ b/lib/ucmaps/cp857.txt @@ -0,0 +1,274 @@ +# +# Name: cp857_DOSTurkish to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp857_DOSTurkish code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp857_DOSTurkish order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x0131 #LATIN SMALL LETTER DOTLESS I +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x0130 #LATIN CAPITAL LETTER I WITH DOT ABOVE +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x015e #LATIN CAPITAL LETTER S WITH CEDILLA +0x9f 0x015f #LATIN SMALL LETTER S WITH CEDILLA +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x011e #LATIN CAPITAL LETTER G WITH BREVE +0xa7 0x011f #LATIN SMALL LETTER G WITH BREVE +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x00ae #REGISTERED SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0xb6 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xb7 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE +0xb8 0x00a9 #COPYRIGHT SIGN +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x00a2 #CENT SIGN +0xbe 0x00a5 #YEN SIGN +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x00e3 #LATIN SMALL LETTER A WITH TILDE +0xc7 0x00c3 #LATIN CAPITAL LETTER A WITH TILDE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x00a4 #CURRENCY SIGN +0xd0 0x00ba #MASCULINE ORDINAL INDICATOR +0xd1 0x00aa #FEMININE ORDINAL INDICATOR +0xd2 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xd3 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS +0xd4 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE +0xd5 #UNDEFINED +0xd6 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0xd7 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xd8 0x00cf #LATIN CAPITAL LETTER I WITH DIAERESIS +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x00a6 #BROKEN BAR +0xde 0x00cc #LATIN CAPITAL LETTER I WITH GRAVE +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xe3 0x00d2 #LATIN CAPITAL LETTER O WITH GRAVE +0xe4 0x00f5 #LATIN SMALL LETTER O WITH TILDE +0xe5 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE +0xe6 0x00b5 #MICRO SIGN +0xe7 #UNDEFINED +0xe8 0x00d7 #MULTIPLICATION SIGN +0xe9 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0xea 0x00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xeb 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE +0xec 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0xed 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS +0xee 0x00af #MACRON +0xef 0x00b4 #ACUTE ACCENT +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 #UNDEFINED +0xf3 0x00be #VULGAR FRACTION THREE QUARTERS +0xf4 0x00b6 #PILCROW SIGN +0xf5 0x00a7 #SECTION SIGN +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x00b8 #CEDILLA +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x00a8 #DIAERESIS +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x00b9 #SUPERSCRIPT ONE +0xfc 0x00b3 #SUPERSCRIPT THREE +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp860.txt b/lib/ucmaps/cp860.txt new file mode 100644 index 0000000000..d7f2cb7374 --- /dev/null +++ b/lib/ucmaps/cp860.txt @@ -0,0 +1,274 @@ +# +# Name: cp860_DOSPortuguese to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp860_DOSPortuguese code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp860_DOSPortuguese order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e3 #LATIN SMALL LETTER A WITH TILDE +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0x8c 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0x8e 0x00c3 #LATIN CAPITAL LETTER A WITH TILDE +0x8f 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE +0x92 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f5 #LATIN SMALL LETTER O WITH TILDE +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00cc #LATIN CAPITAL LETTER I WITH GRAVE +0x99 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00a2 #CENT SIGN +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE +0x9e 0x20a7 #PESETA SIGN +0x9f 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x00d2 #LATIN CAPITAL LETTER O WITH GRAVE +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp861.txt b/lib/ucmaps/cp861.txt new file mode 100644 index 0000000000..fe0f02bb51 --- /dev/null +++ b/lib/ucmaps/cp861.txt @@ -0,0 +1,274 @@ +# +# Name: cp861_DOSIcelandic to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp861_DOSIcelandic code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp861_DOSIcelandic order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00d0 #LATIN CAPITAL LETTER ETH +0x8c 0x00f0 #LATIN SMALL LETTER ETH +0x8d 0x00de #LATIN CAPITAL LETTER THORN +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00fe #LATIN SMALL LETTER THORN +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00dd #LATIN CAPITAL LETTER Y WITH ACUTE +0x98 0x00fd #LATIN SMALL LETTER Y WITH ACUTE +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x20a7 #PESETA SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0xa5 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0xa6 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xa7 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp862.txt b/lib/ucmaps/cp862.txt new file mode 100644 index 0000000000..963110518a --- /dev/null +++ b/lib/ucmaps/cp862.txt @@ -0,0 +1,274 @@ +# +# Name: cp862_DOSHebrew to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp862_DOSHebrew code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp862_DOSHebrew order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x05d0 #HEBREW LETTER ALEF +0x81 0x05d1 #HEBREW LETTER BET +0x82 0x05d2 #HEBREW LETTER GIMEL +0x83 0x05d3 #HEBREW LETTER DALET +0x84 0x05d4 #HEBREW LETTER HE +0x85 0x05d5 #HEBREW LETTER VAV +0x86 0x05d6 #HEBREW LETTER ZAYIN +0x87 0x05d7 #HEBREW LETTER HET +0x88 0x05d8 #HEBREW LETTER TET +0x89 0x05d9 #HEBREW LETTER YOD +0x8a 0x05da #HEBREW LETTER FINAL KAF +0x8b 0x05db #HEBREW LETTER KAF +0x8c 0x05dc #HEBREW LETTER LAMED +0x8d 0x05dd #HEBREW LETTER FINAL MEM +0x8e 0x05de #HEBREW LETTER MEM +0x8f 0x05df #HEBREW LETTER FINAL NUN +0x90 0x05e0 #HEBREW LETTER NUN +0x91 0x05e1 #HEBREW LETTER SAMEKH +0x92 0x05e2 #HEBREW LETTER AYIN +0x93 0x05e3 #HEBREW LETTER FINAL PE +0x94 0x05e4 #HEBREW LETTER PE +0x95 0x05e5 #HEBREW LETTER FINAL TSADI +0x96 0x05e6 #HEBREW LETTER TSADI +0x97 0x05e7 #HEBREW LETTER QOF +0x98 0x05e8 #HEBREW LETTER RESH +0x99 0x05e9 #HEBREW LETTER SHIN +0x9a 0x05ea #HEBREW LETTER TAV +0x9b 0x00a2 #CENT SIGN +0x9c 0x00a3 #POUND SIGN +0x9d 0x00a5 #YEN SIGN +0x9e 0x20a7 #PESETA SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S (GERMAN) +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp863.txt b/lib/ucmaps/cp863.txt new file mode 100644 index 0000000000..cc4eae1863 --- /dev/null +++ b/lib/ucmaps/cp863.txt @@ -0,0 +1,274 @@ +# +# Name: cp863_DOSCanadaF to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp863_DOSCanadaF code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp863_DOSCanadaF order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00b6 #PILCROW SIGN +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x2017 #DOUBLE LOW LINE +0x8e 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE +0x8f 0x00a7 #SECTION SIGN +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE +0x92 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS +0x95 0x00cf #LATIN CAPITAL LETTER I WITH DIAERESIS +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00a4 #CURRENCY SIGN +0x99 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00a2 #CENT SIGN +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE +0x9e 0x00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00a6 #BROKEN BAR +0xa1 0x00b4 #ACUTE ACCENT +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00a8 #DIAERESIS +0xa5 0x00b8 #CEDILLA +0xa6 0x00b3 #SUPERSCRIPT THREE +0xa7 0x00af #MACRON +0xa8 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00be #VULGAR FRACTION THREE QUARTERS +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp864.txt b/lib/ucmaps/cp864.txt new file mode 100644 index 0000000000..7aa055fbaf --- /dev/null +++ b/lib/ucmaps/cp864.txt @@ -0,0 +1,274 @@ +# +# Name: cp864_DOSArabic to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp864_DOSArabic code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp864_DOSArabic order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x066a #ARABIC PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00b0 #DEGREE SIGN +0x81 0x00b7 #MIDDLE DOT +0x82 0x2219 #BULLET OPERATOR +0x83 0x221a #SQUARE ROOT +0x84 0x2592 #MEDIUM SHADE +0x85 0x2500 #FORMS LIGHT HORIZONTAL +0x86 0x2502 #FORMS LIGHT VERTICAL +0x87 0x253c #FORMS LIGHT VERTICAL AND HORIZONTAL +0x88 0x2524 #FORMS LIGHT VERTICAL AND LEFT +0x89 0x252c #FORMS LIGHT DOWN AND HORIZONTAL +0x8a 0x251c #FORMS LIGHT VERTICAL AND RIGHT +0x8b 0x2534 #FORMS LIGHT UP AND HORIZONTAL +0x8c 0x2510 #FORMS LIGHT DOWN AND LEFT +0x8d 0x250c #FORMS LIGHT DOWN AND RIGHT +0x8e 0x2514 #FORMS LIGHT UP AND RIGHT +0x8f 0x2518 #FORMS LIGHT UP AND LEFT +0x90 0x03b2 #GREEK SMALL BETA +0x91 0x221e #INFINITY +0x92 0x03c6 #GREEK SMALL PHI +0x93 0x00b1 #PLUS-OR-MINUS SIGN +0x94 0x00bd #FRACTION 1/2 +0x95 0x00bc #FRACTION 1/4 +0x96 0x2248 #ALMOST EQUAL TO +0x97 0x00ab #LEFT POINTING GUILLEMET +0x98 0x00bb #RIGHT POINTING GUILLEMET +0x99 0xfef7 #ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +0x9a 0xfef8 #ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +0x9b #UNDEFINED +0x9c #UNDEFINED +0x9d 0xfefb #ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +0x9e 0xfefc #ARABIC LIGATURE LAM WITH ALEF FINAL FORM +0x9f #UNDEFINED +0xa0 0x00a0 #NON-BREAKING SPACE +0xa1 0x00ad #SOFT HYPHEN +0xa2 0xfe82 #ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +0xa3 0x00a3 #POUND SIGN +0xa4 0x00a4 #CURRENCY SIGN +0xa5 0xfe84 #ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +0xa6 #UNDEFINED +0xa7 #UNDEFINED +0xa8 0xfe8e #ARABIC LETTER ALEF FINAL FORM +0xa9 0xfe8f #ARABIC LETTER BEH ISOLATED FORM +0xaa 0xfe95 #ARABIC LETTER TEH ISOLATED FORM +0xab 0xfe99 #ARABIC LETTER THEH ISOLATED FORM +0xac 0x060c #ARABIC COMMA +0xad 0xfe9d #ARABIC LETTER JEEM ISOLATED FORM +0xae 0xfea1 #ARABIC LETTER HAH ISOLATED FORM +0xaf 0xfea5 #ARABIC LETTER KHAH ISOLATED FORM +0xb0 0x0660 #ARABIC-INDIC DIGIT ZERO +0xb1 0x0661 #ARABIC-INDIC DIGIT ONE +0xb2 0x0662 #ARABIC-INDIC DIGIT TWO +0xb3 0x0663 #ARABIC-INDIC DIGIT THREE +0xb4 0x0664 #ARABIC-INDIC DIGIT FOUR +0xb5 0x0665 #ARABIC-INDIC DIGIT FIVE +0xb6 0x0666 #ARABIC-INDIC DIGIT SIX +0xb7 0x0667 #ARABIC-INDIC DIGIT SEVEN +0xb8 0x0668 #ARABIC-INDIC DIGIT EIGHT +0xb9 0x0669 #ARABIC-INDIC DIGIT NINE +0xba 0xfed1 #ARABIC LETTER FEH ISOLATED FORM +0xbb 0x061b #ARABIC SEMICOLON +0xbc 0xfeb1 #ARABIC LETTER SEEN ISOLATED FORM +0xbd 0xfeb5 #ARABIC LETTER SHEEN ISOLATED FORM +0xbe 0xfeb9 #ARABIC LETTER SAD ISOLATED FORM +0xbf 0x061f #ARABIC QUESTION MARK +0xc0 0x00a2 #CENT SIGN +0xc1 0xfe80 #ARABIC LETTER HAMZA ISOLATED FORM +0xc2 0xfe81 #ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +0xc3 0xfe83 #ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +0xc4 0xfe85 #ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +0xc5 0xfeca #ARABIC LETTER AIN FINAL FORM +0xc6 0xfe8b #ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +0xc7 0xfe8d #ARABIC LETTER ALEF ISOLATED FORM +0xc8 0xfe91 #ARABIC LETTER BEH INITIAL FORM +0xc9 0xfe93 #ARABIC LETTER TEH MARBUTA ISOLATED FORM +0xca 0xfe97 #ARABIC LETTER TEH INITIAL FORM +0xcb 0xfe9b #ARABIC LETTER THEH INITIAL FORM +0xcc 0xfe9f #ARABIC LETTER JEEM INITIAL FORM +0xcd 0xfea3 #ARABIC LETTER HAH INITIAL FORM +0xce 0xfea7 #ARABIC LETTER KHAH INITIAL FORM +0xcf 0xfea9 #ARABIC LETTER DAL ISOLATED FORM +0xd0 0xfeab #ARABIC LETTER THAL ISOLATED FORM +0xd1 0xfead #ARABIC LETTER REH ISOLATED FORM +0xd2 0xfeaf #ARABIC LETTER ZAIN ISOLATED FORM +0xd3 0xfeb3 #ARABIC LETTER SEEN INITIAL FORM +0xd4 0xfeb7 #ARABIC LETTER SHEEN INITIAL FORM +0xd5 0xfebb #ARABIC LETTER SAD INITIAL FORM +0xd6 0xfebf #ARABIC LETTER DAD INITIAL FORM +0xd7 0xfec1 #ARABIC LETTER TAH ISOLATED FORM +0xd8 0xfec5 #ARABIC LETTER ZAH ISOLATED FORM +0xd9 0xfecb #ARABIC LETTER AIN INITIAL FORM +0xda 0xfecf #ARABIC LETTER GHAIN INITIAL FORM +0xdb 0x00a6 #BROKEN VERTICAL BAR +0xdc 0x00ac #NOT SIGN +0xdd 0x00f7 #DIVISION SIGN +0xde 0x00d7 #MULTIPLICATION SIGN +0xdf 0xfec9 #ARABIC LETTER AIN ISOLATED FORM +0xe0 0x0640 #ARABIC TATWEEL +0xe1 0xfed3 #ARABIC LETTER FEH INITIAL FORM +0xe2 0xfed7 #ARABIC LETTER QAF INITIAL FORM +0xe3 0xfedb #ARABIC LETTER KAF INITIAL FORM +0xe4 0xfedf #ARABIC LETTER LAM INITIAL FORM +0xe5 0xfee3 #ARABIC LETTER MEEM INITIAL FORM +0xe6 0xfee7 #ARABIC LETTER NOON INITIAL FORM +0xe7 0xfeeb #ARABIC LETTER HEH INITIAL FORM +0xe8 0xfeed #ARABIC LETTER WAW ISOLATED FORM +0xe9 0xfeef #ARABIC LETTER ALEF MAKSURA ISOLATED FORM +0xea 0xfef3 #ARABIC LETTER YEH INITIAL FORM +0xeb 0xfebd #ARABIC LETTER DAD ISOLATED FORM +0xec 0xfecc #ARABIC LETTER AIN MEDIAL FORM +0xed 0xfece #ARABIC LETTER GHAIN FINAL FORM +0xee 0xfecd #ARABIC LETTER GHAIN ISOLATED FORM +0xef 0xfee1 #ARABIC LETTER MEEM ISOLATED FORM +0xf0 0xfe7d #ARABIC SHADDA MEDIAL FORM +0xf1 0x0651 #ARABIC SHADDAH +0xf2 0xfee5 #ARABIC LETTER NOON ISOLATED FORM +0xf3 0xfee9 #ARABIC LETTER HEH ISOLATED FORM +0xf4 0xfeec #ARABIC LETTER HEH MEDIAL FORM +0xf5 0xfef0 #ARABIC LETTER ALEF MAKSURA FINAL FORM +0xf6 0xfef2 #ARABIC LETTER YEH FINAL FORM +0xf7 0xfed0 #ARABIC LETTER GHAIN MEDIAL FORM +0xf8 0xfed5 #ARABIC LETTER QAF ISOLATED FORM +0xf9 0xfef5 #ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +0xfa 0xfef6 #ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +0xfb 0xfedd #ARABIC LETTER LAM ISOLATED FORM +0xfc 0xfed9 #ARABIC LETTER KAF ISOLATED FORM +0xfd 0xfef1 #ARABIC LETTER YEH ISOLATED FORM +0xfe 0x25a0 #BLACK SQUARE +0xff #UNDEFINED + diff --git a/lib/ucmaps/cp865.txt b/lib/ucmaps/cp865.txt new file mode 100644 index 0000000000..67705f46af --- /dev/null +++ b/lib/ucmaps/cp865.txt @@ -0,0 +1,274 @@ +# +# Name: cp865_DOSNordic to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp865_DOSNordic code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp865_DOSNordic order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x20a7 #PESETA SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00a4 #CURRENCY SIGN +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp866.txt b/lib/ucmaps/cp866.txt new file mode 100644 index 0000000000..880fb70e36 --- /dev/null +++ b/lib/ucmaps/cp866.txt @@ -0,0 +1,274 @@ +# +# Name: cp866_DOSCyrillicRussian to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp866_DOSCyrillicRussian code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp866_DOSCyrillicRussian order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x0410 #CYRILLIC CAPITAL LETTER A +0x81 0x0411 #CYRILLIC CAPITAL LETTER BE +0x82 0x0412 #CYRILLIC CAPITAL LETTER VE +0x83 0x0413 #CYRILLIC CAPITAL LETTER GHE +0x84 0x0414 #CYRILLIC CAPITAL LETTER DE +0x85 0x0415 #CYRILLIC CAPITAL LETTER IE +0x86 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0x87 0x0417 #CYRILLIC CAPITAL LETTER ZE +0x88 0x0418 #CYRILLIC CAPITAL LETTER I +0x89 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0x8a 0x041a #CYRILLIC CAPITAL LETTER KA +0x8b 0x041b #CYRILLIC CAPITAL LETTER EL +0x8c 0x041c #CYRILLIC CAPITAL LETTER EM +0x8d 0x041d #CYRILLIC CAPITAL LETTER EN +0x8e 0x041e #CYRILLIC CAPITAL LETTER O +0x8f 0x041f #CYRILLIC CAPITAL LETTER PE +0x90 0x0420 #CYRILLIC CAPITAL LETTER ER +0x91 0x0421 #CYRILLIC CAPITAL LETTER ES +0x92 0x0422 #CYRILLIC CAPITAL LETTER TE +0x93 0x0423 #CYRILLIC CAPITAL LETTER U +0x94 0x0424 #CYRILLIC CAPITAL LETTER EF +0x95 0x0425 #CYRILLIC CAPITAL LETTER HA +0x96 0x0426 #CYRILLIC CAPITAL LETTER TSE +0x97 0x0427 #CYRILLIC CAPITAL LETTER CHE +0x98 0x0428 #CYRILLIC CAPITAL LETTER SHA +0x99 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0x9a 0x042a #CYRILLIC CAPITAL LETTER HARD SIGN +0x9b 0x042b #CYRILLIC CAPITAL LETTER YERU +0x9c 0x042c #CYRILLIC CAPITAL LETTER SOFT SIGN +0x9d 0x042d #CYRILLIC CAPITAL LETTER E +0x9e 0x042e #CYRILLIC CAPITAL LETTER YU +0x9f 0x042f #CYRILLIC CAPITAL LETTER YA +0xa0 0x0430 #CYRILLIC SMALL LETTER A +0xa1 0x0431 #CYRILLIC SMALL LETTER BE +0xa2 0x0432 #CYRILLIC SMALL LETTER VE +0xa3 0x0433 #CYRILLIC SMALL LETTER GHE +0xa4 0x0434 #CYRILLIC SMALL LETTER DE +0xa5 0x0435 #CYRILLIC SMALL LETTER IE +0xa6 0x0436 #CYRILLIC SMALL LETTER ZHE +0xa7 0x0437 #CYRILLIC SMALL LETTER ZE +0xa8 0x0438 #CYRILLIC SMALL LETTER I +0xa9 0x0439 #CYRILLIC SMALL LETTER SHORT I +0xaa 0x043a #CYRILLIC SMALL LETTER KA +0xab 0x043b #CYRILLIC SMALL LETTER EL +0xac 0x043c #CYRILLIC SMALL LETTER EM +0xad 0x043d #CYRILLIC SMALL LETTER EN +0xae 0x043e #CYRILLIC SMALL LETTER O +0xaf 0x043f #CYRILLIC SMALL LETTER PE +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x0440 #CYRILLIC SMALL LETTER ER +0xe1 0x0441 #CYRILLIC SMALL LETTER ES +0xe2 0x0442 #CYRILLIC SMALL LETTER TE +0xe3 0x0443 #CYRILLIC SMALL LETTER U +0xe4 0x0444 #CYRILLIC SMALL LETTER EF +0xe5 0x0445 #CYRILLIC SMALL LETTER HA +0xe6 0x0446 #CYRILLIC SMALL LETTER TSE +0xe7 0x0447 #CYRILLIC SMALL LETTER CHE +0xe8 0x0448 #CYRILLIC SMALL LETTER SHA +0xe9 0x0449 #CYRILLIC SMALL LETTER SHCHA +0xea 0x044a #CYRILLIC SMALL LETTER HARD SIGN +0xeb 0x044b #CYRILLIC SMALL LETTER YERU +0xec 0x044c #CYRILLIC SMALL LETTER SOFT SIGN +0xed 0x044d #CYRILLIC SMALL LETTER E +0xee 0x044e #CYRILLIC SMALL LETTER YU +0xef 0x044f #CYRILLIC SMALL LETTER YA +0xf0 0x0401 #CYRILLIC CAPITAL LETTER IO +0xf1 0x0451 #CYRILLIC SMALL LETTER IO +0xf2 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE +0xf3 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE +0xf4 0x0407 #CYRILLIC CAPITAL LETTER YI +0xf5 0x0457 #CYRILLIC SMALL LETTER YI +0xf6 0x040e #CYRILLIC CAPITAL LETTER SHORT U +0xf7 0x045e #CYRILLIC SMALL LETTER SHORT U +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x2116 #NUMERO SIGN +0xfd 0x00a4 #CURRENCY SIGN +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp869.txt b/lib/ucmaps/cp869.txt new file mode 100644 index 0000000000..4c77ffd6c7 --- /dev/null +++ b/lib/ucmaps/cp869.txt @@ -0,0 +1,274 @@ +# +# Name: cp869_DOSGreek2 to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell +# K.D. Chang +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp869_DOSGreek2 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp869_DOSGreek2 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 #UNDEFINED +0x81 #UNDEFINED +0x82 #UNDEFINED +0x83 #UNDEFINED +0x84 #UNDEFINED +0x85 #UNDEFINED +0x86 0x0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS +0x87 #UNDEFINED +0x88 0x00b7 #MIDDLE DOT +0x89 0x00ac #NOT SIGN +0x8a 0x00a6 #BROKEN BAR +0x8b 0x2018 #LEFT SINGLE QUOTATION MARK +0x8c 0x2019 #RIGHT SINGLE QUOTATION MARK +0x8d 0x0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS +0x8e 0x2015 #HORIZONTAL BAR +0x8f 0x0389 #GREEK CAPITAL LETTER ETA WITH TONOS +0x90 0x038a #GREEK CAPITAL LETTER IOTA WITH TONOS +0x91 0x03aa #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0x92 0x038c #GREEK CAPITAL LETTER OMICRON WITH TONOS +0x93 #UNDEFINED +0x94 #UNDEFINED +0x95 0x038e #GREEK CAPITAL LETTER UPSILON WITH TONOS +0x96 0x03ab #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0x97 0x00a9 #COPYRIGHT SIGN +0x98 0x038f #GREEK CAPITAL LETTER OMEGA WITH TONOS +0x99 0x00b2 #SUPERSCRIPT TWO +0x9a 0x00b3 #SUPERSCRIPT THREE +0x9b 0x03ac #GREEK SMALL LETTER ALPHA WITH TONOS +0x9c 0x00a3 #POUND SIGN +0x9d 0x03ad #GREEK SMALL LETTER EPSILON WITH TONOS +0x9e 0x03ae #GREEK SMALL LETTER ETA WITH TONOS +0x9f 0x03af #GREEK SMALL LETTER IOTA WITH TONOS +0xa0 0x03ca #GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xa1 0x0390 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0xa2 0x03cc #GREEK SMALL LETTER OMICRON WITH TONOS +0xa3 0x03cd #GREEK SMALL LETTER UPSILON WITH TONOS +0xa4 0x0391 #GREEK CAPITAL LETTER ALPHA +0xa5 0x0392 #GREEK CAPITAL LETTER BETA +0xa6 0x0393 #GREEK CAPITAL LETTER GAMMA +0xa7 0x0394 #GREEK CAPITAL LETTER DELTA +0xa8 0x0395 #GREEK CAPITAL LETTER EPSILON +0xa9 0x0396 #GREEK CAPITAL LETTER ZETA +0xaa 0x0397 #GREEK CAPITAL LETTER ETA +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x0398 #GREEK CAPITAL LETTER THETA +0xad 0x0399 #GREEK CAPITAL LETTER IOTA +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x039a #GREEK CAPITAL LETTER KAPPA +0xb6 0x039b #GREEK CAPITAL LETTER LAMDA +0xb7 0x039c #GREEK CAPITAL LETTER MU +0xb8 0x039d #GREEK CAPITAL LETTER NU +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x039e #GREEK CAPITAL LETTER XI +0xbe 0x039f #GREEK CAPITAL LETTER OMICRON +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x03a0 #GREEK CAPITAL LETTER PI +0xc7 0x03a1 #GREEK CAPITAL LETTER RHO +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xd0 0x03a4 #GREEK CAPITAL LETTER TAU +0xd1 0x03a5 #GREEK CAPITAL LETTER UPSILON +0xd2 0x03a6 #GREEK CAPITAL LETTER PHI +0xd3 0x03a7 #GREEK CAPITAL LETTER CHI +0xd4 0x03a8 #GREEK CAPITAL LETTER PSI +0xd5 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xd6 0x03b1 #GREEK SMALL LETTER ALPHA +0xd7 0x03b2 #GREEK SMALL LETTER BETA +0xd8 0x03b3 #GREEK SMALL LETTER GAMMA +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x03b4 #GREEK SMALL LETTER DELTA +0xde 0x03b5 #GREEK SMALL LETTER EPSILON +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b6 #GREEK SMALL LETTER ZETA +0xe1 0x03b7 #GREEK SMALL LETTER ETA +0xe2 0x03b8 #GREEK SMALL LETTER THETA +0xe3 0x03b9 #GREEK SMALL LETTER IOTA +0xe4 0x03ba #GREEK SMALL LETTER KAPPA +0xe5 0x03bb #GREEK SMALL LETTER LAMDA +0xe6 0x03bc #GREEK SMALL LETTER MU +0xe7 0x03bd #GREEK SMALL LETTER NU +0xe8 0x03be #GREEK SMALL LETTER XI +0xe9 0x03bf #GREEK SMALL LETTER OMICRON +0xea 0x03c0 #GREEK SMALL LETTER PI +0xeb 0x03c1 #GREEK SMALL LETTER RHO +0xec 0x03c3 #GREEK SMALL LETTER SIGMA +0xed 0x03c2 #GREEK SMALL LETTER FINAL SIGMA +0xee 0x03c4 #GREEK SMALL LETTER TAU +0xef 0x0384 #GREEK TONOS +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x03c5 #GREEK SMALL LETTER UPSILON +0xf3 0x03c6 #GREEK SMALL LETTER PHI +0xf4 0x03c7 #GREEK SMALL LETTER CHI +0xf5 0x00a7 #SECTION SIGN +0xf6 0x03c8 #GREEK SMALL LETTER PSI +0xf7 0x0385 #GREEK DIALYTIKA TONOS +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x00a8 #DIAERESIS +0xfa 0x03c9 #GREEK SMALL LETTER OMEGA +0xfb 0x03cb #GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xfc 0x03b0 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +0xfd 0x03ce #GREEK SMALL LETTER OMEGA WITH TONOS +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp874.txt b/lib/ucmaps/cp874.txt new file mode 100644 index 0000000000..1eb71dfe1b --- /dev/null +++ b/lib/ucmaps/cp874.txt @@ -0,0 +1,274 @@ +# +# Name: cp874 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 02/28/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp874 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp874 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 #UNDEFINED +0x83 #UNDEFINED +0x84 #UNDEFINED +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 #UNDEFINED +0x87 #UNDEFINED +0x88 #UNDEFINED +0x89 #UNDEFINED +0x8A #UNDEFINED +0x8B #UNDEFINED +0x8C #UNDEFINED +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 #UNDEFINED +0x9A #UNDEFINED +0x9B #UNDEFINED +0x9C #UNDEFINED +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x0E01 #THAI CHARACTER KO KAI +0xA2 0x0E02 #THAI CHARACTER KHO KHAI +0xA3 0x0E03 #THAI CHARACTER KHO KHUAT +0xA4 0x0E04 #THAI CHARACTER KHO KHWAI +0xA5 0x0E05 #THAI CHARACTER KHO KHON +0xA6 0x0E06 #THAI CHARACTER KHO RAKHANG +0xA7 0x0E07 #THAI CHARACTER NGO NGU +0xA8 0x0E08 #THAI CHARACTER CHO CHAN +0xA9 0x0E09 #THAI CHARACTER CHO CHING +0xAA 0x0E0A #THAI CHARACTER CHO CHANG +0xAB 0x0E0B #THAI CHARACTER SO SO +0xAC 0x0E0C #THAI CHARACTER CHO CHOE +0xAD 0x0E0D #THAI CHARACTER YO YING +0xAE 0x0E0E #THAI CHARACTER DO CHADA +0xAF 0x0E0F #THAI CHARACTER TO PATAK +0xB0 0x0E10 #THAI CHARACTER THO THAN +0xB1 0x0E11 #THAI CHARACTER THO NANGMONTHO +0xB2 0x0E12 #THAI CHARACTER THO PHUTHAO +0xB3 0x0E13 #THAI CHARACTER NO NEN +0xB4 0x0E14 #THAI CHARACTER DO DEK +0xB5 0x0E15 #THAI CHARACTER TO TAO +0xB6 0x0E16 #THAI CHARACTER THO THUNG +0xB7 0x0E17 #THAI CHARACTER THO THAHAN +0xB8 0x0E18 #THAI CHARACTER THO THONG +0xB9 0x0E19 #THAI CHARACTER NO NU +0xBA 0x0E1A #THAI CHARACTER BO BAIMAI +0xBB 0x0E1B #THAI CHARACTER PO PLA +0xBC 0x0E1C #THAI CHARACTER PHO PHUNG +0xBD 0x0E1D #THAI CHARACTER FO FA +0xBE 0x0E1E #THAI CHARACTER PHO PHAN +0xBF 0x0E1F #THAI CHARACTER FO FAN +0xC0 0x0E20 #THAI CHARACTER PHO SAMPHAO +0xC1 0x0E21 #THAI CHARACTER MO MA +0xC2 0x0E22 #THAI CHARACTER YO YAK +0xC3 0x0E23 #THAI CHARACTER RO RUA +0xC4 0x0E24 #THAI CHARACTER RU +0xC5 0x0E25 #THAI CHARACTER LO LING +0xC6 0x0E26 #THAI CHARACTER LU +0xC7 0x0E27 #THAI CHARACTER WO WAEN +0xC8 0x0E28 #THAI CHARACTER SO SALA +0xC9 0x0E29 #THAI CHARACTER SO RUSI +0xCA 0x0E2A #THAI CHARACTER SO SUA +0xCB 0x0E2B #THAI CHARACTER HO HIP +0xCC 0x0E2C #THAI CHARACTER LO CHULA +0xCD 0x0E2D #THAI CHARACTER O ANG +0xCE 0x0E2E #THAI CHARACTER HO NOKHUK +0xCF 0x0E2F #THAI CHARACTER PAIYANNOI +0xD0 0x0E30 #THAI CHARACTER SARA A +0xD1 0x0E31 #THAI CHARACTER MAI HAN-AKAT +0xD2 0x0E32 #THAI CHARACTER SARA AA +0xD3 0x0E33 #THAI CHARACTER SARA AM +0xD4 0x0E34 #THAI CHARACTER SARA I +0xD5 0x0E35 #THAI CHARACTER SARA II +0xD6 0x0E36 #THAI CHARACTER SARA UE +0xD7 0x0E37 #THAI CHARACTER SARA UEE +0xD8 0x0E38 #THAI CHARACTER SARA U +0xD9 0x0E39 #THAI CHARACTER SARA UU +0xDA 0x0E3A #THAI CHARACTER PHINTHU +0xDB #UNDEFINED +0xDC #UNDEFINED +0xDD #UNDEFINED +0xDE #UNDEFINED +0xDF 0x0E3F #THAI CURRENCY SYMBOL BAHT +0xE0 0x0E40 #THAI CHARACTER SARA E +0xE1 0x0E41 #THAI CHARACTER SARA AE +0xE2 0x0E42 #THAI CHARACTER SARA O +0xE3 0x0E43 #THAI CHARACTER SARA AI MAIMUAN +0xE4 0x0E44 #THAI CHARACTER SARA AI MAIMALAI +0xE5 0x0E45 #THAI CHARACTER LAKKHANGYAO +0xE6 0x0E46 #THAI CHARACTER MAIYAMOK +0xE7 0x0E47 #THAI CHARACTER MAITAIKHU +0xE8 0x0E48 #THAI CHARACTER MAI EK +0xE9 0x0E49 #THAI CHARACTER MAI THO +0xEA 0x0E4A #THAI CHARACTER MAI TRI +0xEB 0x0E4B #THAI CHARACTER MAI CHATTAWA +0xEC 0x0E4C #THAI CHARACTER THANTHAKHAT +0xED 0x0E4D #THAI CHARACTER NIKHAHIT +0xEE 0x0E4E #THAI CHARACTER YAMAKKAN +0xEF 0x0E4F #THAI CHARACTER FONGMAN +0xF0 0x0E50 #THAI DIGIT ZERO +0xF1 0x0E51 #THAI DIGIT ONE +0xF2 0x0E52 #THAI DIGIT TWO +0xF3 0x0E53 #THAI DIGIT THREE +0xF4 0x0E54 #THAI DIGIT FOUR +0xF5 0x0E55 #THAI DIGIT FIVE +0xF6 0x0E56 #THAI DIGIT SIX +0xF7 0x0E57 #THAI DIGIT SEVEN +0xF8 0x0E58 #THAI DIGIT EIGHT +0xF9 0x0E59 #THAI DIGIT NINE +0xFA 0x0E5A #THAI CHARACTER ANGKHANKHU +0xFB 0x0E5B #THAI CHARACTER KHOMUT +0xFC #UNDEFINED +0xFD #UNDEFINED +0xFE #UNDEFINED +0xFF #UNDEFINED diff --git a/lib/ucmaps/cp932.txt b/lib/ucmaps/cp932.txt new file mode 100644 index 0000000000..36bfdbfaba --- /dev/null +++ b/lib/ucmaps/cp932.txt @@ -0,0 +1,7998 @@ +# +# Name: cp932 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp932 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp932 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 #UNDEFINED +0x81 #DBCS LEAD BYTE +0x82 #DBCS LEAD BYTE +0x83 #DBCS LEAD BYTE +0x84 #DBCS LEAD BYTE +0x85 #DBCS LEAD BYTE +0x86 #DBCS LEAD BYTE +0x87 #DBCS LEAD BYTE +0x88 #DBCS LEAD BYTE +0x89 #DBCS LEAD BYTE +0x8A #DBCS LEAD BYTE +0x8B #DBCS LEAD BYTE +0x8C #DBCS LEAD BYTE +0x8D #DBCS LEAD BYTE +0x8E #DBCS LEAD BYTE +0x8F #DBCS LEAD BYTE +0x90 #DBCS LEAD BYTE +0x91 #DBCS LEAD BYTE +0x92 #DBCS LEAD BYTE +0x93 #DBCS LEAD BYTE +0x94 #DBCS LEAD BYTE +0x95 #DBCS LEAD BYTE +0x96 #DBCS LEAD BYTE +0x97 #DBCS LEAD BYTE +0x98 #DBCS LEAD BYTE +0x99 #DBCS LEAD BYTE +0x9A #DBCS LEAD BYTE +0x9B #DBCS LEAD BYTE +0x9C #DBCS LEAD BYTE +0x9D #DBCS LEAD BYTE +0x9E #DBCS LEAD BYTE +0x9F #DBCS LEAD BYTE +0xA0 #UNDEFINED +0xA1 0xFF61 #HALFWIDTH IDEOGRAPHIC FULL STOP +0xA2 0xFF62 #HALFWIDTH LEFT CORNER BRACKET +0xA3 0xFF63 #HALFWIDTH RIGHT CORNER BRACKET +0xA4 0xFF64 #HALFWIDTH IDEOGRAPHIC COMMA +0xA5 0xFF65 #HALFWIDTH KATAKANA MIDDLE DOT +0xA6 0xFF66 #HALFWIDTH KATAKANA LETTER WO +0xA7 0xFF67 #HALFWIDTH KATAKANA LETTER SMALL A +0xA8 0xFF68 #HALFWIDTH KATAKANA LETTER SMALL I +0xA9 0xFF69 #HALFWIDTH KATAKANA LETTER SMALL U +0xAA 0xFF6A #HALFWIDTH KATAKANA LETTER SMALL E +0xAB 0xFF6B #HALFWIDTH KATAKANA LETTER SMALL O +0xAC 0xFF6C #HALFWIDTH KATAKANA LETTER SMALL YA +0xAD 0xFF6D #HALFWIDTH KATAKANA LETTER SMALL YU +0xAE 0xFF6E #HALFWIDTH KATAKANA LETTER SMALL YO +0xAF 0xFF6F #HALFWIDTH KATAKANA LETTER SMALL TU +0xB0 0xFF70 #HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +0xB1 0xFF71 #HALFWIDTH KATAKANA LETTER A +0xB2 0xFF72 #HALFWIDTH KATAKANA LETTER I +0xB3 0xFF73 #HALFWIDTH KATAKANA LETTER U +0xB4 0xFF74 #HALFWIDTH KATAKANA LETTER E +0xB5 0xFF75 #HALFWIDTH KATAKANA LETTER O +0xB6 0xFF76 #HALFWIDTH KATAKANA LETTER KA +0xB7 0xFF77 #HALFWIDTH KATAKANA LETTER KI +0xB8 0xFF78 #HALFWIDTH KATAKANA LETTER KU +0xB9 0xFF79 #HALFWIDTH KATAKANA LETTER KE +0xBA 0xFF7A #HALFWIDTH KATAKANA LETTER KO +0xBB 0xFF7B #HALFWIDTH KATAKANA LETTER SA +0xBC 0xFF7C #HALFWIDTH KATAKANA LETTER SI +0xBD 0xFF7D #HALFWIDTH KATAKANA LETTER SU +0xBE 0xFF7E #HALFWIDTH KATAKANA LETTER SE +0xBF 0xFF7F #HALFWIDTH KATAKANA LETTER SO +0xC0 0xFF80 #HALFWIDTH KATAKANA LETTER TA +0xC1 0xFF81 #HALFWIDTH KATAKANA LETTER TI +0xC2 0xFF82 #HALFWIDTH KATAKANA LETTER TU +0xC3 0xFF83 #HALFWIDTH KATAKANA LETTER TE +0xC4 0xFF84 #HALFWIDTH KATAKANA LETTER TO +0xC5 0xFF85 #HALFWIDTH KATAKANA LETTER NA +0xC6 0xFF86 #HALFWIDTH KATAKANA LETTER NI +0xC7 0xFF87 #HALFWIDTH KATAKANA LETTER NU +0xC8 0xFF88 #HALFWIDTH KATAKANA LETTER NE +0xC9 0xFF89 #HALFWIDTH KATAKANA LETTER NO +0xCA 0xFF8A #HALFWIDTH KATAKANA LETTER HA +0xCB 0xFF8B #HALFWIDTH KATAKANA LETTER HI +0xCC 0xFF8C #HALFWIDTH KATAKANA LETTER HU +0xCD 0xFF8D #HALFWIDTH KATAKANA LETTER HE +0xCE 0xFF8E #HALFWIDTH KATAKANA LETTER HO +0xCF 0xFF8F #HALFWIDTH KATAKANA LETTER MA +0xD0 0xFF90 #HALFWIDTH KATAKANA LETTER MI +0xD1 0xFF91 #HALFWIDTH KATAKANA LETTER MU +0xD2 0xFF92 #HALFWIDTH KATAKANA LETTER ME +0xD3 0xFF93 #HALFWIDTH KATAKANA LETTER MO +0xD4 0xFF94 #HALFWIDTH KATAKANA LETTER YA +0xD5 0xFF95 #HALFWIDTH KATAKANA LETTER YU +0xD6 0xFF96 #HALFWIDTH KATAKANA LETTER YO +0xD7 0xFF97 #HALFWIDTH KATAKANA LETTER RA +0xD8 0xFF98 #HALFWIDTH KATAKANA LETTER RI +0xD9 0xFF99 #HALFWIDTH KATAKANA LETTER RU +0xDA 0xFF9A #HALFWIDTH KATAKANA LETTER RE +0xDB 0xFF9B #HALFWIDTH KATAKANA LETTER RO +0xDC 0xFF9C #HALFWIDTH KATAKANA LETTER WA +0xDD 0xFF9D #HALFWIDTH KATAKANA LETTER N +0xDE 0xFF9E #HALFWIDTH KATAKANA VOICED SOUND MARK +0xDF 0xFF9F #HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +0xE0 #DBCS LEAD BYTE +0xE1 #DBCS LEAD BYTE +0xE2 #DBCS LEAD BYTE +0xE3 #DBCS LEAD BYTE +0xE4 #DBCS LEAD BYTE +0xE5 #DBCS LEAD BYTE +0xE6 #DBCS LEAD BYTE +0xE7 #DBCS LEAD BYTE +0xE8 #DBCS LEAD BYTE +0xE9 #DBCS LEAD BYTE +0xEA #DBCS LEAD BYTE +0xEB #DBCS LEAD BYTE +0xEC #DBCS LEAD BYTE +0xED #DBCS LEAD BYTE +0xEE #DBCS LEAD BYTE +0xEF #DBCS LEAD BYTE +0xF0 #DBCS LEAD BYTE +0xF1 #DBCS LEAD BYTE +0xF2 #DBCS LEAD BYTE +0xF3 #DBCS LEAD BYTE +0xF4 #DBCS LEAD BYTE +0xF5 #DBCS LEAD BYTE +0xF6 #DBCS LEAD BYTE +0xF7 #DBCS LEAD BYTE +0xF8 #DBCS LEAD BYTE +0xF9 #DBCS LEAD BYTE +0xFA #DBCS LEAD BYTE +0xFB #DBCS LEAD BYTE +0xFC #DBCS LEAD BYTE +0xFD #UNDEFINED +0xFE #UNDEFINED +0xFF #UNDEFINED +0x8140 0x3000 #IDEOGRAPHIC SPACE +0x8141 0x3001 #IDEOGRAPHIC COMMA +0x8142 0x3002 #IDEOGRAPHIC FULL STOP +0x8143 0xFF0C #FULLWIDTH COMMA +0x8144 0xFF0E #FULLWIDTH FULL STOP +0x8145 0x30FB #KATAKANA MIDDLE DOT +0x8146 0xFF1A #FULLWIDTH COLON +0x8147 0xFF1B #FULLWIDTH SEMICOLON +0x8148 0xFF1F #FULLWIDTH QUESTION MARK +0x8149 0xFF01 #FULLWIDTH EXCLAMATION MARK +0x814A 0x309B #KATAKANA-HIRAGANA VOICED SOUND MARK +0x814B 0x309C #KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +0x814C 0x00B4 #ACUTE ACCENT +0x814D 0xFF40 #FULLWIDTH GRAVE ACCENT +0x814E 0x00A8 #DIAERESIS +0x814F 0xFF3E #FULLWIDTH CIRCUMFLEX ACCENT +0x8150 0xFFE3 #FULLWIDTH MACRON +0x8151 0xFF3F #FULLWIDTH LOW LINE +0x8152 0x30FD #KATAKANA ITERATION MARK +0x8153 0x30FE #KATAKANA VOICED ITERATION MARK +0x8154 0x309D #HIRAGANA ITERATION MARK +0x8155 0x309E #HIRAGANA VOICED ITERATION MARK +0x8156 0x3003 #DITTO MARK +0x8157 0x4EDD #CJK UNIFIED IDEOGRAPH +0x8158 0x3005 #IDEOGRAPHIC ITERATION MARK +0x8159 0x3006 #IDEOGRAPHIC CLOSING MARK +0x815A 0x3007 #IDEOGRAPHIC NUMBER ZERO +0x815B 0x30FC #KATAKANA-HIRAGANA PROLONGED SOUND MARK +0x815C 0x2015 #HORIZONTAL BAR +0x815D 0x2010 #HYPHEN +0x815E 0xFF0F #FULLWIDTH SOLIDUS +0x815F 0xFF3C #FULLWIDTH REVERSE SOLIDUS +0x8160 0xFF5E #FULLWIDTH TILDE +0x8161 0x2225 #PARALLEL TO +0x8162 0xFF5C #FULLWIDTH VERTICAL LINE +0x8163 0x2026 #HORIZONTAL ELLIPSIS +0x8164 0x2025 #TWO DOT LEADER +0x8165 0x2018 #LEFT SINGLE QUOTATION MARK +0x8166 0x2019 #RIGHT SINGLE QUOTATION MARK +0x8167 0x201C #LEFT DOUBLE QUOTATION MARK +0x8168 0x201D #RIGHT DOUBLE QUOTATION MARK +0x8169 0xFF08 #FULLWIDTH LEFT PARENTHESIS +0x816A 0xFF09 #FULLWIDTH RIGHT PARENTHESIS +0x816B 0x3014 #LEFT TORTOISE SHELL BRACKET +0x816C 0x3015 #RIGHT TORTOISE SHELL BRACKET +0x816D 0xFF3B #FULLWIDTH LEFT SQUARE BRACKET +0x816E 0xFF3D #FULLWIDTH RIGHT SQUARE BRACKET +0x816F 0xFF5B #FULLWIDTH LEFT CURLY BRACKET +0x8170 0xFF5D #FULLWIDTH RIGHT CURLY BRACKET +0x8171 0x3008 #LEFT ANGLE BRACKET +0x8172 0x3009 #RIGHT ANGLE BRACKET +0x8173 0x300A #LEFT DOUBLE ANGLE BRACKET +0x8174 0x300B #RIGHT DOUBLE ANGLE BRACKET +0x8175 0x300C #LEFT CORNER BRACKET +0x8176 0x300D #RIGHT CORNER BRACKET +0x8177 0x300E #LEFT WHITE CORNER BRACKET +0x8178 0x300F #RIGHT WHITE CORNER BRACKET +0x8179 0x3010 #LEFT BLACK LENTICULAR BRACKET +0x817A 0x3011 #RIGHT BLACK LENTICULAR BRACKET +0x817B 0xFF0B #FULLWIDTH PLUS SIGN +0x817C 0xFF0D #FULLWIDTH HYPHEN-MINUS +0x817D 0x00B1 #PLUS-MINUS SIGN +0x817E 0x00D7 #MULTIPLICATION SIGN +0x8180 0x00F7 #DIVISION SIGN +0x8181 0xFF1D #FULLWIDTH EQUALS SIGN +0x8182 0x2260 #NOT EQUAL TO +0x8183 0xFF1C #FULLWIDTH LESS-THAN SIGN +0x8184 0xFF1E #FULLWIDTH GREATER-THAN SIGN +0x8185 0x2266 #LESS-THAN OVER EQUAL TO +0x8186 0x2267 #GREATER-THAN OVER EQUAL TO +0x8187 0x221E #INFINITY +0x8188 0x2234 #THEREFORE +0x8189 0x2642 #MALE SIGN +0x818A 0x2640 #FEMALE SIGN +0x818B 0x00B0 #DEGREE SIGN +0x818C 0x2032 #PRIME +0x818D 0x2033 #DOUBLE PRIME +0x818E 0x2103 #DEGREE CELSIUS +0x818F 0xFFE5 #FULLWIDTH YEN SIGN +0x8190 0xFF04 #FULLWIDTH DOLLAR SIGN +0x8191 0xFFE0 #FULLWIDTH CENT SIGN +0x8192 0xFFE1 #FULLWIDTH POUND SIGN +0x8193 0xFF05 #FULLWIDTH PERCENT SIGN +0x8194 0xFF03 #FULLWIDTH NUMBER SIGN +0x8195 0xFF06 #FULLWIDTH AMPERSAND +0x8196 0xFF0A #FULLWIDTH ASTERISK +0x8197 0xFF20 #FULLWIDTH COMMERCIAL AT +0x8198 0x00A7 #SECTION SIGN +0x8199 0x2606 #WHITE STAR +0x819A 0x2605 #BLACK STAR +0x819B 0x25CB #WHITE CIRCLE +0x819C 0x25CF #BLACK CIRCLE +0x819D 0x25CE #BULLSEYE +0x819E 0x25C7 #WHITE DIAMOND +0x819F 0x25C6 #BLACK DIAMOND +0x81A0 0x25A1 #WHITE SQUARE +0x81A1 0x25A0 #BLACK SQUARE +0x81A2 0x25B3 #WHITE UP-POINTING TRIANGLE +0x81A3 0x25B2 #BLACK UP-POINTING TRIANGLE +0x81A4 0x25BD #WHITE DOWN-POINTING TRIANGLE +0x81A5 0x25BC #BLACK DOWN-POINTING TRIANGLE +0x81A6 0x203B #REFERENCE MARK +0x81A7 0x3012 #POSTAL MARK +0x81A8 0x2192 #RIGHTWARDS ARROW +0x81A9 0x2190 #LEFTWARDS ARROW +0x81AA 0x2191 #UPWARDS ARROW +0x81AB 0x2193 #DOWNWARDS ARROW +0x81AC 0x3013 #GETA MARK +0x81B8 0x2208 #ELEMENT OF +0x81B9 0x220B #CONTAINS AS MEMBER +0x81BA 0x2286 #SUBSET OF OR EQUAL TO +0x81BB 0x2287 #SUPERSET OF OR EQUAL TO +0x81BC 0x2282 #SUBSET OF +0x81BD 0x2283 #SUPERSET OF +0x81BE 0x222A #UNION +0x81BF 0x2229 #INTERSECTION +0x81C8 0x2227 #LOGICAL AND +0x81C9 0x2228 #LOGICAL OR +0x81CA 0xFFE2 #FULLWIDTH NOT SIGN +0x81CB 0x21D2 #RIGHTWARDS DOUBLE ARROW +0x81CC 0x21D4 #LEFT RIGHT DOUBLE ARROW +0x81CD 0x2200 #FOR ALL +0x81CE 0x2203 #THERE EXISTS +0x81DA 0x2220 #ANGLE +0x81DB 0x22A5 #UP TACK +0x81DC 0x2312 #ARC +0x81DD 0x2202 #PARTIAL DIFFERENTIAL +0x81DE 0x2207 #NABLA +0x81DF 0x2261 #IDENTICAL TO +0x81E0 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF +0x81E1 0x226A #MUCH LESS-THAN +0x81E2 0x226B #MUCH GREATER-THAN +0x81E3 0x221A #SQUARE ROOT +0x81E4 0x223D #REVERSED TILDE +0x81E5 0x221D #PROPORTIONAL TO +0x81E6 0x2235 #BECAUSE +0x81E7 0x222B #INTEGRAL +0x81E8 0x222C #DOUBLE INTEGRAL +0x81F0 0x212B #ANGSTROM SIGN +0x81F1 0x2030 #PER MILLE SIGN +0x81F2 0x266F #MUSIC SHARP SIGN +0x81F3 0x266D #MUSIC FLAT SIGN +0x81F4 0x266A #EIGHTH NOTE +0x81F5 0x2020 #DAGGER +0x81F6 0x2021 #DOUBLE DAGGER +0x81F7 0x00B6 #PILCROW SIGN +0x81FC 0x25EF #LARGE CIRCLE +0x824F 0xFF10 #FULLWIDTH DIGIT ZERO +0x8250 0xFF11 #FULLWIDTH DIGIT ONE +0x8251 0xFF12 #FULLWIDTH DIGIT TWO +0x8252 0xFF13 #FULLWIDTH DIGIT THREE +0x8253 0xFF14 #FULLWIDTH DIGIT FOUR +0x8254 0xFF15 #FULLWIDTH DIGIT FIVE +0x8255 0xFF16 #FULLWIDTH DIGIT SIX +0x8256 0xFF17 #FULLWIDTH DIGIT SEVEN +0x8257 0xFF18 #FULLWIDTH DIGIT EIGHT +0x8258 0xFF19 #FULLWIDTH DIGIT NINE +0x8260 0xFF21 #FULLWIDTH LATIN CAPITAL LETTER A +0x8261 0xFF22 #FULLWIDTH LATIN CAPITAL LETTER B +0x8262 0xFF23 #FULLWIDTH LATIN CAPITAL LETTER C +0x8263 0xFF24 #FULLWIDTH LATIN CAPITAL LETTER D +0x8264 0xFF25 #FULLWIDTH LATIN CAPITAL LETTER E +0x8265 0xFF26 #FULLWIDTH LATIN CAPITAL LETTER F +0x8266 0xFF27 #FULLWIDTH LATIN CAPITAL LETTER G +0x8267 0xFF28 #FULLWIDTH LATIN CAPITAL LETTER H +0x8268 0xFF29 #FULLWIDTH LATIN CAPITAL LETTER I +0x8269 0xFF2A #FULLWIDTH LATIN CAPITAL LETTER J +0x826A 0xFF2B #FULLWIDTH LATIN CAPITAL LETTER K +0x826B 0xFF2C #FULLWIDTH LATIN CAPITAL LETTER L +0x826C 0xFF2D #FULLWIDTH LATIN CAPITAL LETTER M +0x826D 0xFF2E #FULLWIDTH LATIN CAPITAL LETTER N +0x826E 0xFF2F #FULLWIDTH LATIN CAPITAL LETTER O +0x826F 0xFF30 #FULLWIDTH LATIN CAPITAL LETTER P +0x8270 0xFF31 #FULLWIDTH LATIN CAPITAL LETTER Q +0x8271 0xFF32 #FULLWIDTH LATIN CAPITAL LETTER R +0x8272 0xFF33 #FULLWIDTH LATIN CAPITAL LETTER S +0x8273 0xFF34 #FULLWIDTH LATIN CAPITAL LETTER T +0x8274 0xFF35 #FULLWIDTH LATIN CAPITAL LETTER U +0x8275 0xFF36 #FULLWIDTH LATIN CAPITAL LETTER V +0x8276 0xFF37 #FULLWIDTH LATIN CAPITAL LETTER W +0x8277 0xFF38 #FULLWIDTH LATIN CAPITAL LETTER X +0x8278 0xFF39 #FULLWIDTH LATIN CAPITAL LETTER Y +0x8279 0xFF3A #FULLWIDTH LATIN CAPITAL LETTER Z +0x8281 0xFF41 #FULLWIDTH LATIN SMALL LETTER A +0x8282 0xFF42 #FULLWIDTH LATIN SMALL LETTER B +0x8283 0xFF43 #FULLWIDTH LATIN SMALL LETTER C +0x8284 0xFF44 #FULLWIDTH LATIN SMALL LETTER D +0x8285 0xFF45 #FULLWIDTH LATIN SMALL LETTER E +0x8286 0xFF46 #FULLWIDTH LATIN SMALL LETTER F +0x8287 0xFF47 #FULLWIDTH LATIN SMALL LETTER G +0x8288 0xFF48 #FULLWIDTH LATIN SMALL LETTER H +0x8289 0xFF49 #FULLWIDTH LATIN SMALL LETTER I +0x828A 0xFF4A #FULLWIDTH LATIN SMALL LETTER J +0x828B 0xFF4B #FULLWIDTH LATIN SMALL LETTER K +0x828C 0xFF4C #FULLWIDTH LATIN SMALL LETTER L +0x828D 0xFF4D #FULLWIDTH LATIN SMALL LETTER M +0x828E 0xFF4E #FULLWIDTH LATIN SMALL LETTER N +0x828F 0xFF4F #FULLWIDTH LATIN SMALL LETTER O +0x8290 0xFF50 #FULLWIDTH LATIN SMALL LETTER P +0x8291 0xFF51 #FULLWIDTH LATIN SMALL LETTER Q +0x8292 0xFF52 #FULLWIDTH LATIN SMALL LETTER R +0x8293 0xFF53 #FULLWIDTH LATIN SMALL LETTER S +0x8294 0xFF54 #FULLWIDTH LATIN SMALL LETTER T +0x8295 0xFF55 #FULLWIDTH LATIN SMALL LETTER U +0x8296 0xFF56 #FULLWIDTH LATIN SMALL LETTER V +0x8297 0xFF57 #FULLWIDTH LATIN SMALL LETTER W +0x8298 0xFF58 #FULLWIDTH LATIN SMALL LETTER X +0x8299 0xFF59 #FULLWIDTH LATIN SMALL LETTER Y +0x829A 0xFF5A #FULLWIDTH LATIN SMALL LETTER Z +0x829F 0x3041 #HIRAGANA LETTER SMALL A +0x82A0 0x3042 #HIRAGANA LETTER A +0x82A1 0x3043 #HIRAGANA LETTER SMALL I +0x82A2 0x3044 #HIRAGANA LETTER I +0x82A3 0x3045 #HIRAGANA LETTER SMALL U +0x82A4 0x3046 #HIRAGANA LETTER U +0x82A5 0x3047 #HIRAGANA LETTER SMALL E +0x82A6 0x3048 #HIRAGANA LETTER E +0x82A7 0x3049 #HIRAGANA LETTER SMALL O +0x82A8 0x304A #HIRAGANA LETTER O +0x82A9 0x304B #HIRAGANA LETTER KA +0x82AA 0x304C #HIRAGANA LETTER GA +0x82AB 0x304D #HIRAGANA LETTER KI +0x82AC 0x304E #HIRAGANA LETTER GI +0x82AD 0x304F #HIRAGANA LETTER KU +0x82AE 0x3050 #HIRAGANA LETTER GU +0x82AF 0x3051 #HIRAGANA LETTER KE +0x82B0 0x3052 #HIRAGANA LETTER GE +0x82B1 0x3053 #HIRAGANA LETTER KO +0x82B2 0x3054 #HIRAGANA LETTER GO +0x82B3 0x3055 #HIRAGANA LETTER SA +0x82B4 0x3056 #HIRAGANA LETTER ZA +0x82B5 0x3057 #HIRAGANA LETTER SI +0x82B6 0x3058 #HIRAGANA LETTER ZI +0x82B7 0x3059 #HIRAGANA LETTER SU +0x82B8 0x305A #HIRAGANA LETTER ZU +0x82B9 0x305B #HIRAGANA LETTER SE +0x82BA 0x305C #HIRAGANA LETTER ZE +0x82BB 0x305D #HIRAGANA LETTER SO +0x82BC 0x305E #HIRAGANA LETTER ZO +0x82BD 0x305F #HIRAGANA LETTER TA +0x82BE 0x3060 #HIRAGANA LETTER DA +0x82BF 0x3061 #HIRAGANA LETTER TI +0x82C0 0x3062 #HIRAGANA LETTER DI +0x82C1 0x3063 #HIRAGANA LETTER SMALL TU +0x82C2 0x3064 #HIRAGANA LETTER TU +0x82C3 0x3065 #HIRAGANA LETTER DU +0x82C4 0x3066 #HIRAGANA LETTER TE +0x82C5 0x3067 #HIRAGANA LETTER DE +0x82C6 0x3068 #HIRAGANA LETTER TO +0x82C7 0x3069 #HIRAGANA LETTER DO +0x82C8 0x306A #HIRAGANA LETTER NA +0x82C9 0x306B #HIRAGANA LETTER NI +0x82CA 0x306C #HIRAGANA LETTER NU +0x82CB 0x306D #HIRAGANA LETTER NE +0x82CC 0x306E #HIRAGANA LETTER NO +0x82CD 0x306F #HIRAGANA LETTER HA +0x82CE 0x3070 #HIRAGANA LETTER BA +0x82CF 0x3071 #HIRAGANA LETTER PA +0x82D0 0x3072 #HIRAGANA LETTER HI +0x82D1 0x3073 #HIRAGANA LETTER BI +0x82D2 0x3074 #HIRAGANA LETTER PI +0x82D3 0x3075 #HIRAGANA LETTER HU +0x82D4 0x3076 #HIRAGANA LETTER BU +0x82D5 0x3077 #HIRAGANA LETTER PU +0x82D6 0x3078 #HIRAGANA LETTER HE +0x82D7 0x3079 #HIRAGANA LETTER BE +0x82D8 0x307A #HIRAGANA LETTER PE +0x82D9 0x307B #HIRAGANA LETTER HO +0x82DA 0x307C #HIRAGANA LETTER BO +0x82DB 0x307D #HIRAGANA LETTER PO +0x82DC 0x307E #HIRAGANA LETTER MA +0x82DD 0x307F #HIRAGANA LETTER MI +0x82DE 0x3080 #HIRAGANA LETTER MU +0x82DF 0x3081 #HIRAGANA LETTER ME +0x82E0 0x3082 #HIRAGANA LETTER MO +0x82E1 0x3083 #HIRAGANA LETTER SMALL YA +0x82E2 0x3084 #HIRAGANA LETTER YA +0x82E3 0x3085 #HIRAGANA LETTER SMALL YU +0x82E4 0x3086 #HIRAGANA LETTER YU +0x82E5 0x3087 #HIRAGANA LETTER SMALL YO +0x82E6 0x3088 #HIRAGANA LETTER YO +0x82E7 0x3089 #HIRAGANA LETTER RA +0x82E8 0x308A #HIRAGANA LETTER RI +0x82E9 0x308B #HIRAGANA LETTER RU +0x82EA 0x308C #HIRAGANA LETTER RE +0x82EB 0x308D #HIRAGANA LETTER RO +0x82EC 0x308E #HIRAGANA LETTER SMALL WA +0x82ED 0x308F #HIRAGANA LETTER WA +0x82EE 0x3090 #HIRAGANA LETTER WI +0x82EF 0x3091 #HIRAGANA LETTER WE +0x82F0 0x3092 #HIRAGANA LETTER WO +0x82F1 0x3093 #HIRAGANA LETTER N +0x8340 0x30A1 #KATAKANA LETTER SMALL A +0x8341 0x30A2 #KATAKANA LETTER A +0x8342 0x30A3 #KATAKANA LETTER SMALL I +0x8343 0x30A4 #KATAKANA LETTER I +0x8344 0x30A5 #KATAKANA LETTER SMALL U +0x8345 0x30A6 #KATAKANA LETTER U +0x8346 0x30A7 #KATAKANA LETTER SMALL E +0x8347 0x30A8 #KATAKANA LETTER E +0x8348 0x30A9 #KATAKANA LETTER SMALL O +0x8349 0x30AA #KATAKANA LETTER O +0x834A 0x30AB #KATAKANA LETTER KA +0x834B 0x30AC #KATAKANA LETTER GA +0x834C 0x30AD #KATAKANA LETTER KI +0x834D 0x30AE #KATAKANA LETTER GI +0x834E 0x30AF #KATAKANA LETTER KU +0x834F 0x30B0 #KATAKANA LETTER GU +0x8350 0x30B1 #KATAKANA LETTER KE +0x8351 0x30B2 #KATAKANA LETTER GE +0x8352 0x30B3 #KATAKANA LETTER KO +0x8353 0x30B4 #KATAKANA LETTER GO +0x8354 0x30B5 #KATAKANA LETTER SA +0x8355 0x30B6 #KATAKANA LETTER ZA +0x8356 0x30B7 #KATAKANA LETTER SI +0x8357 0x30B8 #KATAKANA LETTER ZI +0x8358 0x30B9 #KATAKANA LETTER SU +0x8359 0x30BA #KATAKANA LETTER ZU +0x835A 0x30BB #KATAKANA LETTER SE +0x835B 0x30BC #KATAKANA LETTER ZE +0x835C 0x30BD #KATAKANA LETTER SO +0x835D 0x30BE #KATAKANA LETTER ZO +0x835E 0x30BF #KATAKANA LETTER TA +0x835F 0x30C0 #KATAKANA LETTER DA +0x8360 0x30C1 #KATAKANA LETTER TI +0x8361 0x30C2 #KATAKANA LETTER DI +0x8362 0x30C3 #KATAKANA LETTER SMALL TU +0x8363 0x30C4 #KATAKANA LETTER TU +0x8364 0x30C5 #KATAKANA LETTER DU +0x8365 0x30C6 #KATAKANA LETTER TE +0x8366 0x30C7 #KATAKANA LETTER DE +0x8367 0x30C8 #KATAKANA LETTER TO +0x8368 0x30C9 #KATAKANA LETTER DO +0x8369 0x30CA #KATAKANA LETTER NA +0x836A 0x30CB #KATAKANA LETTER NI +0x836B 0x30CC #KATAKANA LETTER NU +0x836C 0x30CD #KATAKANA LETTER NE +0x836D 0x30CE #KATAKANA LETTER NO +0x836E 0x30CF #KATAKANA LETTER HA +0x836F 0x30D0 #KATAKANA LETTER BA +0x8370 0x30D1 #KATAKANA LETTER PA +0x8371 0x30D2 #KATAKANA LETTER HI +0x8372 0x30D3 #KATAKANA LETTER BI +0x8373 0x30D4 #KATAKANA LETTER PI +0x8374 0x30D5 #KATAKANA LETTER HU +0x8375 0x30D6 #KATAKANA LETTER BU +0x8376 0x30D7 #KATAKANA LETTER PU +0x8377 0x30D8 #KATAKANA LETTER HE +0x8378 0x30D9 #KATAKANA LETTER BE +0x8379 0x30DA #KATAKANA LETTER PE +0x837A 0x30DB #KATAKANA LETTER HO +0x837B 0x30DC #KATAKANA LETTER BO +0x837C 0x30DD #KATAKANA LETTER PO +0x837D 0x30DE #KATAKANA LETTER MA +0x837E 0x30DF #KATAKANA LETTER MI +0x8380 0x30E0 #KATAKANA LETTER MU +0x8381 0x30E1 #KATAKANA LETTER ME +0x8382 0x30E2 #KATAKANA LETTER MO +0x8383 0x30E3 #KATAKANA LETTER SMALL YA +0x8384 0x30E4 #KATAKANA LETTER YA +0x8385 0x30E5 #KATAKANA LETTER SMALL YU +0x8386 0x30E6 #KATAKANA LETTER YU +0x8387 0x30E7 #KATAKANA LETTER SMALL YO +0x8388 0x30E8 #KATAKANA LETTER YO +0x8389 0x30E9 #KATAKANA LETTER RA +0x838A 0x30EA #KATAKANA LETTER RI +0x838B 0x30EB #KATAKANA LETTER RU +0x838C 0x30EC #KATAKANA LETTER RE +0x838D 0x30ED #KATAKANA LETTER RO +0x838E 0x30EE #KATAKANA LETTER SMALL WA +0x838F 0x30EF #KATAKANA LETTER WA +0x8390 0x30F0 #KATAKANA LETTER WI +0x8391 0x30F1 #KATAKANA LETTER WE +0x8392 0x30F2 #KATAKANA LETTER WO +0x8393 0x30F3 #KATAKANA LETTER N +0x8394 0x30F4 #KATAKANA LETTER VU +0x8395 0x30F5 #KATAKANA LETTER SMALL KA +0x8396 0x30F6 #KATAKANA LETTER SMALL KE +0x839F 0x0391 #GREEK CAPITAL LETTER ALPHA +0x83A0 0x0392 #GREEK CAPITAL LETTER BETA +0x83A1 0x0393 #GREEK CAPITAL LETTER GAMMA +0x83A2 0x0394 #GREEK CAPITAL LETTER DELTA +0x83A3 0x0395 #GREEK CAPITAL LETTER EPSILON +0x83A4 0x0396 #GREEK CAPITAL LETTER ZETA +0x83A5 0x0397 #GREEK CAPITAL LETTER ETA +0x83A6 0x0398 #GREEK CAPITAL LETTER THETA +0x83A7 0x0399 #GREEK CAPITAL LETTER IOTA +0x83A8 0x039A #GREEK CAPITAL LETTER KAPPA +0x83A9 0x039B #GREEK CAPITAL LETTER LAMDA +0x83AA 0x039C #GREEK CAPITAL LETTER MU +0x83AB 0x039D #GREEK CAPITAL LETTER NU +0x83AC 0x039E #GREEK CAPITAL LETTER XI +0x83AD 0x039F #GREEK CAPITAL LETTER OMICRON +0x83AE 0x03A0 #GREEK CAPITAL LETTER PI +0x83AF 0x03A1 #GREEK CAPITAL LETTER RHO +0x83B0 0x03A3 #GREEK CAPITAL LETTER SIGMA +0x83B1 0x03A4 #GREEK CAPITAL LETTER TAU +0x83B2 0x03A5 #GREEK CAPITAL LETTER UPSILON +0x83B3 0x03A6 #GREEK CAPITAL LETTER PHI +0x83B4 0x03A7 #GREEK CAPITAL LETTER CHI +0x83B5 0x03A8 #GREEK CAPITAL LETTER PSI +0x83B6 0x03A9 #GREEK CAPITAL LETTER OMEGA +0x83BF 0x03B1 #GREEK SMALL LETTER ALPHA +0x83C0 0x03B2 #GREEK SMALL LETTER BETA +0x83C1 0x03B3 #GREEK SMALL LETTER GAMMA +0x83C2 0x03B4 #GREEK SMALL LETTER DELTA +0x83C3 0x03B5 #GREEK SMALL LETTER EPSILON +0x83C4 0x03B6 #GREEK SMALL LETTER ZETA +0x83C5 0x03B7 #GREEK SMALL LETTER ETA +0x83C6 0x03B8 #GREEK SMALL LETTER THETA +0x83C7 0x03B9 #GREEK SMALL LETTER IOTA +0x83C8 0x03BA #GREEK SMALL LETTER KAPPA +0x83C9 0x03BB #GREEK SMALL LETTER LAMDA +0x83CA 0x03BC #GREEK SMALL LETTER MU +0x83CB 0x03BD #GREEK SMALL LETTER NU +0x83CC 0x03BE #GREEK SMALL LETTER XI +0x83CD 0x03BF #GREEK SMALL LETTER OMICRON +0x83CE 0x03C0 #GREEK SMALL LETTER PI +0x83CF 0x03C1 #GREEK SMALL LETTER RHO +0x83D0 0x03C3 #GREEK SMALL LETTER SIGMA +0x83D1 0x03C4 #GREEK SMALL LETTER TAU +0x83D2 0x03C5 #GREEK SMALL LETTER UPSILON +0x83D3 0x03C6 #GREEK SMALL LETTER PHI +0x83D4 0x03C7 #GREEK SMALL LETTER CHI +0x83D5 0x03C8 #GREEK SMALL LETTER PSI +0x83D6 0x03C9 #GREEK SMALL LETTER OMEGA +0x8440 0x0410 #CYRILLIC CAPITAL LETTER A +0x8441 0x0411 #CYRILLIC CAPITAL LETTER BE +0x8442 0x0412 #CYRILLIC CAPITAL LETTER VE +0x8443 0x0413 #CYRILLIC CAPITAL LETTER GHE +0x8444 0x0414 #CYRILLIC CAPITAL LETTER DE +0x8445 0x0415 #CYRILLIC CAPITAL LETTER IE +0x8446 0x0401 #CYRILLIC CAPITAL LETTER IO +0x8447 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0x8448 0x0417 #CYRILLIC CAPITAL LETTER ZE +0x8449 0x0418 #CYRILLIC CAPITAL LETTER I +0x844A 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0x844B 0x041A #CYRILLIC CAPITAL LETTER KA +0x844C 0x041B #CYRILLIC CAPITAL LETTER EL +0x844D 0x041C #CYRILLIC CAPITAL LETTER EM +0x844E 0x041D #CYRILLIC CAPITAL LETTER EN +0x844F 0x041E #CYRILLIC CAPITAL LETTER O +0x8450 0x041F #CYRILLIC CAPITAL LETTER PE +0x8451 0x0420 #CYRILLIC CAPITAL LETTER ER +0x8452 0x0421 #CYRILLIC CAPITAL LETTER ES +0x8453 0x0422 #CYRILLIC CAPITAL LETTER TE +0x8454 0x0423 #CYRILLIC CAPITAL LETTER U +0x8455 0x0424 #CYRILLIC CAPITAL LETTER EF +0x8456 0x0425 #CYRILLIC CAPITAL LETTER HA +0x8457 0x0426 #CYRILLIC CAPITAL LETTER TSE +0x8458 0x0427 #CYRILLIC CAPITAL LETTER CHE +0x8459 0x0428 #CYRILLIC CAPITAL LETTER SHA +0x845A 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0x845B 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN +0x845C 0x042B #CYRILLIC CAPITAL LETTER YERU +0x845D 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN +0x845E 0x042D #CYRILLIC CAPITAL LETTER E +0x845F 0x042E #CYRILLIC CAPITAL LETTER YU +0x8460 0x042F #CYRILLIC CAPITAL LETTER YA +0x8470 0x0430 #CYRILLIC SMALL LETTER A +0x8471 0x0431 #CYRILLIC SMALL LETTER BE +0x8472 0x0432 #CYRILLIC SMALL LETTER VE +0x8473 0x0433 #CYRILLIC SMALL LETTER GHE +0x8474 0x0434 #CYRILLIC SMALL LETTER DE +0x8475 0x0435 #CYRILLIC SMALL LETTER IE +0x8476 0x0451 #CYRILLIC SMALL LETTER IO +0x8477 0x0436 #CYRILLIC SMALL LETTER ZHE +0x8478 0x0437 #CYRILLIC SMALL LETTER ZE +0x8479 0x0438 #CYRILLIC SMALL LETTER I +0x847A 0x0439 #CYRILLIC SMALL LETTER SHORT I +0x847B 0x043A #CYRILLIC SMALL LETTER KA +0x847C 0x043B #CYRILLIC SMALL LETTER EL +0x847D 0x043C #CYRILLIC SMALL LETTER EM +0x847E 0x043D #CYRILLIC SMALL LETTER EN +0x8480 0x043E #CYRILLIC SMALL LETTER O +0x8481 0x043F #CYRILLIC SMALL LETTER PE +0x8482 0x0440 #CYRILLIC SMALL LETTER ER +0x8483 0x0441 #CYRILLIC SMALL LETTER ES +0x8484 0x0442 #CYRILLIC SMALL LETTER TE +0x8485 0x0443 #CYRILLIC SMALL LETTER U +0x8486 0x0444 #CYRILLIC SMALL LETTER EF +0x8487 0x0445 #CYRILLIC SMALL LETTER HA +0x8488 0x0446 #CYRILLIC SMALL LETTER TSE +0x8489 0x0447 #CYRILLIC SMALL LETTER CHE +0x848A 0x0448 #CYRILLIC SMALL LETTER SHA +0x848B 0x0449 #CYRILLIC SMALL LETTER SHCHA +0x848C 0x044A #CYRILLIC SMALL LETTER HARD SIGN +0x848D 0x044B #CYRILLIC SMALL LETTER YERU +0x848E 0x044C #CYRILLIC SMALL LETTER SOFT SIGN +0x848F 0x044D #CYRILLIC SMALL LETTER E +0x8490 0x044E #CYRILLIC SMALL LETTER YU +0x8491 0x044F #CYRILLIC SMALL LETTER YA +0x849F 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0x84A0 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0x84A1 0x250C #BOX DRAWINGS LIGHT DOWN AND RIGHT +0x84A2 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0x84A3 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0x84A4 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0x84A5 0x251C #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0x84A6 0x252C #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0x84A7 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0x84A8 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0x84A9 0x253C #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0x84AA 0x2501 #BOX DRAWINGS HEAVY HORIZONTAL +0x84AB 0x2503 #BOX DRAWINGS HEAVY VERTICAL +0x84AC 0x250F #BOX DRAWINGS HEAVY DOWN AND RIGHT +0x84AD 0x2513 #BOX DRAWINGS HEAVY DOWN AND LEFT +0x84AE 0x251B #BOX DRAWINGS HEAVY UP AND LEFT +0x84AF 0x2517 #BOX DRAWINGS HEAVY UP AND RIGHT +0x84B0 0x2523 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT +0x84B1 0x2533 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +0x84B2 0x252B #BOX DRAWINGS HEAVY VERTICAL AND LEFT +0x84B3 0x253B #BOX DRAWINGS HEAVY UP AND HORIZONTAL +0x84B4 0x254B #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +0x84B5 0x2520 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +0x84B6 0x252F #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +0x84B7 0x2528 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +0x84B8 0x2537 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +0x84B9 0x253F #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +0x84BA 0x251D #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +0x84BB 0x2530 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +0x84BC 0x2525 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +0x84BD 0x2538 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +0x84BE 0x2542 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +0x8740 0x2460 #CIRCLED DIGIT ONE +0x8741 0x2461 #CIRCLED DIGIT TWO +0x8742 0x2462 #CIRCLED DIGIT THREE +0x8743 0x2463 #CIRCLED DIGIT FOUR +0x8744 0x2464 #CIRCLED DIGIT FIVE +0x8745 0x2465 #CIRCLED DIGIT SIX +0x8746 0x2466 #CIRCLED DIGIT SEVEN +0x8747 0x2467 #CIRCLED DIGIT EIGHT +0x8748 0x2468 #CIRCLED DIGIT NINE +0x8749 0x2469 #CIRCLED NUMBER TEN +0x874A 0x246A #CIRCLED NUMBER ELEVEN +0x874B 0x246B #CIRCLED NUMBER TWELVE +0x874C 0x246C #CIRCLED NUMBER THIRTEEN +0x874D 0x246D #CIRCLED NUMBER FOURTEEN +0x874E 0x246E #CIRCLED NUMBER FIFTEEN +0x874F 0x246F #CIRCLED NUMBER SIXTEEN +0x8750 0x2470 #CIRCLED NUMBER SEVENTEEN +0x8751 0x2471 #CIRCLED NUMBER EIGHTEEN +0x8752 0x2472 #CIRCLED NUMBER NINETEEN +0x8753 0x2473 #CIRCLED NUMBER TWENTY +0x8754 0x2160 #ROMAN NUMERAL ONE +0x8755 0x2161 #ROMAN NUMERAL TWO +0x8756 0x2162 #ROMAN NUMERAL THREE +0x8757 0x2163 #ROMAN NUMERAL FOUR +0x8758 0x2164 #ROMAN NUMERAL FIVE +0x8759 0x2165 #ROMAN NUMERAL SIX +0x875A 0x2166 #ROMAN NUMERAL SEVEN +0x875B 0x2167 #ROMAN NUMERAL EIGHT +0x875C 0x2168 #ROMAN NUMERAL NINE +0x875D 0x2169 #ROMAN NUMERAL TEN +0x875F 0x3349 #SQUARE MIRI +0x8760 0x3314 #SQUARE KIRO +0x8761 0x3322 #SQUARE SENTI +0x8762 0x334D #SQUARE MEETORU +0x8763 0x3318 #SQUARE GURAMU +0x8764 0x3327 #SQUARE TON +0x8765 0x3303 #SQUARE AARU +0x8766 0x3336 #SQUARE HEKUTAARU +0x8767 0x3351 #SQUARE RITTORU +0x8768 0x3357 #SQUARE WATTO +0x8769 0x330D #SQUARE KARORII +0x876A 0x3326 #SQUARE DORU +0x876B 0x3323 #SQUARE SENTO +0x876C 0x332B #SQUARE PAASENTO +0x876D 0x334A #SQUARE MIRIBAARU +0x876E 0x333B #SQUARE PEEZI +0x876F 0x339C #SQUARE MM +0x8770 0x339D #SQUARE CM +0x8771 0x339E #SQUARE KM +0x8772 0x338E #SQUARE MG +0x8773 0x338F #SQUARE KG +0x8774 0x33C4 #SQUARE CC +0x8775 0x33A1 #SQUARE M SQUARED +0x877E 0x337B #SQUARE ERA NAME HEISEI +0x8780 0x301D #REVERSED DOUBLE PRIME QUOTATION MARK +0x8781 0x301F #LOW DOUBLE PRIME QUOTATION MARK +0x8782 0x2116 #NUMERO SIGN +0x8783 0x33CD #SQUARE KK +0x8784 0x2121 #TELEPHONE SIGN +0x8785 0x32A4 #CIRCLED IDEOGRAPH HIGH +0x8786 0x32A5 #CIRCLED IDEOGRAPH CENTRE +0x8787 0x32A6 #CIRCLED IDEOGRAPH LOW +0x8788 0x32A7 #CIRCLED IDEOGRAPH LEFT +0x8789 0x32A8 #CIRCLED IDEOGRAPH RIGHT +0x878A 0x3231 #PARENTHESIZED IDEOGRAPH STOCK +0x878B 0x3232 #PARENTHESIZED IDEOGRAPH HAVE +0x878C 0x3239 #PARENTHESIZED IDEOGRAPH REPRESENT +0x878D 0x337E #SQUARE ERA NAME MEIZI +0x878E 0x337D #SQUARE ERA NAME TAISYOU +0x878F 0x337C #SQUARE ERA NAME SYOUWA +0x8790 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF +0x8791 0x2261 #IDENTICAL TO +0x8792 0x222B #INTEGRAL +0x8793 0x222E #CONTOUR INTEGRAL +0x8794 0x2211 #N-ARY SUMMATION +0x8795 0x221A #SQUARE ROOT +0x8796 0x22A5 #UP TACK +0x8797 0x2220 #ANGLE +0x8798 0x221F #RIGHT ANGLE +0x8799 0x22BF #RIGHT TRIANGLE +0x879A 0x2235 #BECAUSE +0x879B 0x2229 #INTERSECTION +0x879C 0x222A #UNION +0x889F 0x4E9C #CJK UNIFIED IDEOGRAPH +0x88A0 0x5516 #CJK UNIFIED IDEOGRAPH +0x88A1 0x5A03 #CJK UNIFIED IDEOGRAPH +0x88A2 0x963F #CJK UNIFIED IDEOGRAPH +0x88A3 0x54C0 #CJK UNIFIED IDEOGRAPH +0x88A4 0x611B #CJK UNIFIED IDEOGRAPH +0x88A5 0x6328 #CJK UNIFIED IDEOGRAPH +0x88A6 0x59F6 #CJK UNIFIED IDEOGRAPH +0x88A7 0x9022 #CJK UNIFIED IDEOGRAPH +0x88A8 0x8475 #CJK UNIFIED IDEOGRAPH +0x88A9 0x831C #CJK UNIFIED IDEOGRAPH +0x88AA 0x7A50 #CJK UNIFIED IDEOGRAPH +0x88AB 0x60AA #CJK UNIFIED IDEOGRAPH +0x88AC 0x63E1 #CJK UNIFIED IDEOGRAPH +0x88AD 0x6E25 #CJK UNIFIED IDEOGRAPH +0x88AE 0x65ED #CJK UNIFIED IDEOGRAPH +0x88AF 0x8466 #CJK UNIFIED IDEOGRAPH +0x88B0 0x82A6 #CJK UNIFIED IDEOGRAPH +0x88B1 0x9BF5 #CJK UNIFIED IDEOGRAPH +0x88B2 0x6893 #CJK UNIFIED IDEOGRAPH +0x88B3 0x5727 #CJK UNIFIED IDEOGRAPH +0x88B4 0x65A1 #CJK UNIFIED IDEOGRAPH +0x88B5 0x6271 #CJK UNIFIED IDEOGRAPH +0x88B6 0x5B9B #CJK UNIFIED IDEOGRAPH +0x88B7 0x59D0 #CJK UNIFIED IDEOGRAPH +0x88B8 0x867B #CJK UNIFIED IDEOGRAPH +0x88B9 0x98F4 #CJK UNIFIED IDEOGRAPH +0x88BA 0x7D62 #CJK UNIFIED IDEOGRAPH +0x88BB 0x7DBE #CJK UNIFIED IDEOGRAPH +0x88BC 0x9B8E #CJK UNIFIED IDEOGRAPH +0x88BD 0x6216 #CJK UNIFIED IDEOGRAPH +0x88BE 0x7C9F #CJK UNIFIED IDEOGRAPH +0x88BF 0x88B7 #CJK UNIFIED IDEOGRAPH +0x88C0 0x5B89 #CJK UNIFIED IDEOGRAPH +0x88C1 0x5EB5 #CJK UNIFIED IDEOGRAPH +0x88C2 0x6309 #CJK UNIFIED IDEOGRAPH +0x88C3 0x6697 #CJK UNIFIED IDEOGRAPH +0x88C4 0x6848 #CJK UNIFIED IDEOGRAPH +0x88C5 0x95C7 #CJK UNIFIED IDEOGRAPH +0x88C6 0x978D #CJK UNIFIED IDEOGRAPH +0x88C7 0x674F #CJK UNIFIED IDEOGRAPH +0x88C8 0x4EE5 #CJK UNIFIED IDEOGRAPH +0x88C9 0x4F0A #CJK UNIFIED IDEOGRAPH +0x88CA 0x4F4D #CJK UNIFIED IDEOGRAPH +0x88CB 0x4F9D #CJK UNIFIED IDEOGRAPH +0x88CC 0x5049 #CJK UNIFIED IDEOGRAPH +0x88CD 0x56F2 #CJK UNIFIED IDEOGRAPH +0x88CE 0x5937 #CJK UNIFIED IDEOGRAPH +0x88CF 0x59D4 #CJK UNIFIED IDEOGRAPH +0x88D0 0x5A01 #CJK UNIFIED IDEOGRAPH +0x88D1 0x5C09 #CJK UNIFIED IDEOGRAPH +0x88D2 0x60DF #CJK UNIFIED IDEOGRAPH +0x88D3 0x610F #CJK UNIFIED IDEOGRAPH +0x88D4 0x6170 #CJK UNIFIED IDEOGRAPH +0x88D5 0x6613 #CJK UNIFIED IDEOGRAPH +0x88D6 0x6905 #CJK UNIFIED IDEOGRAPH +0x88D7 0x70BA #CJK UNIFIED IDEOGRAPH +0x88D8 0x754F #CJK UNIFIED IDEOGRAPH +0x88D9 0x7570 #CJK UNIFIED IDEOGRAPH +0x88DA 0x79FB #CJK UNIFIED IDEOGRAPH +0x88DB 0x7DAD #CJK UNIFIED IDEOGRAPH +0x88DC 0x7DEF #CJK UNIFIED IDEOGRAPH +0x88DD 0x80C3 #CJK UNIFIED IDEOGRAPH +0x88DE 0x840E #CJK UNIFIED IDEOGRAPH +0x88DF 0x8863 #CJK UNIFIED IDEOGRAPH +0x88E0 0x8B02 #CJK UNIFIED IDEOGRAPH +0x88E1 0x9055 #CJK UNIFIED IDEOGRAPH +0x88E2 0x907A #CJK UNIFIED IDEOGRAPH +0x88E3 0x533B #CJK UNIFIED IDEOGRAPH +0x88E4 0x4E95 #CJK UNIFIED IDEOGRAPH +0x88E5 0x4EA5 #CJK UNIFIED IDEOGRAPH +0x88E6 0x57DF #CJK UNIFIED IDEOGRAPH +0x88E7 0x80B2 #CJK UNIFIED IDEOGRAPH +0x88E8 0x90C1 #CJK UNIFIED IDEOGRAPH +0x88E9 0x78EF #CJK UNIFIED IDEOGRAPH +0x88EA 0x4E00 #CJK UNIFIED IDEOGRAPH +0x88EB 0x58F1 #CJK UNIFIED IDEOGRAPH +0x88EC 0x6EA2 #CJK UNIFIED IDEOGRAPH +0x88ED 0x9038 #CJK UNIFIED IDEOGRAPH +0x88EE 0x7A32 #CJK UNIFIED IDEOGRAPH +0x88EF 0x8328 #CJK UNIFIED IDEOGRAPH +0x88F0 0x828B #CJK UNIFIED IDEOGRAPH +0x88F1 0x9C2F #CJK UNIFIED IDEOGRAPH +0x88F2 0x5141 #CJK UNIFIED IDEOGRAPH +0x88F3 0x5370 #CJK UNIFIED IDEOGRAPH +0x88F4 0x54BD #CJK UNIFIED IDEOGRAPH +0x88F5 0x54E1 #CJK UNIFIED IDEOGRAPH +0x88F6 0x56E0 #CJK UNIFIED IDEOGRAPH +0x88F7 0x59FB #CJK UNIFIED IDEOGRAPH +0x88F8 0x5F15 #CJK UNIFIED IDEOGRAPH +0x88F9 0x98F2 #CJK UNIFIED IDEOGRAPH +0x88FA 0x6DEB #CJK UNIFIED IDEOGRAPH +0x88FB 0x80E4 #CJK UNIFIED IDEOGRAPH +0x88FC 0x852D #CJK UNIFIED IDEOGRAPH +0x8940 0x9662 #CJK UNIFIED IDEOGRAPH +0x8941 0x9670 #CJK UNIFIED IDEOGRAPH +0x8942 0x96A0 #CJK UNIFIED IDEOGRAPH +0x8943 0x97FB #CJK UNIFIED IDEOGRAPH +0x8944 0x540B #CJK UNIFIED IDEOGRAPH +0x8945 0x53F3 #CJK UNIFIED IDEOGRAPH +0x8946 0x5B87 #CJK UNIFIED IDEOGRAPH +0x8947 0x70CF #CJK UNIFIED IDEOGRAPH +0x8948 0x7FBD #CJK UNIFIED IDEOGRAPH +0x8949 0x8FC2 #CJK UNIFIED IDEOGRAPH +0x894A 0x96E8 #CJK UNIFIED IDEOGRAPH +0x894B 0x536F #CJK UNIFIED IDEOGRAPH +0x894C 0x9D5C #CJK UNIFIED IDEOGRAPH +0x894D 0x7ABA #CJK UNIFIED IDEOGRAPH +0x894E 0x4E11 #CJK UNIFIED IDEOGRAPH +0x894F 0x7893 #CJK UNIFIED IDEOGRAPH +0x8950 0x81FC #CJK UNIFIED IDEOGRAPH +0x8951 0x6E26 #CJK UNIFIED IDEOGRAPH +0x8952 0x5618 #CJK UNIFIED IDEOGRAPH +0x8953 0x5504 #CJK UNIFIED IDEOGRAPH +0x8954 0x6B1D #CJK UNIFIED IDEOGRAPH +0x8955 0x851A #CJK UNIFIED IDEOGRAPH +0x8956 0x9C3B #CJK UNIFIED IDEOGRAPH +0x8957 0x59E5 #CJK UNIFIED IDEOGRAPH +0x8958 0x53A9 #CJK UNIFIED IDEOGRAPH +0x8959 0x6D66 #CJK UNIFIED IDEOGRAPH +0x895A 0x74DC #CJK UNIFIED IDEOGRAPH +0x895B 0x958F #CJK UNIFIED IDEOGRAPH +0x895C 0x5642 #CJK UNIFIED IDEOGRAPH +0x895D 0x4E91 #CJK UNIFIED IDEOGRAPH +0x895E 0x904B #CJK UNIFIED IDEOGRAPH +0x895F 0x96F2 #CJK UNIFIED IDEOGRAPH +0x8960 0x834F #CJK UNIFIED IDEOGRAPH +0x8961 0x990C #CJK UNIFIED IDEOGRAPH +0x8962 0x53E1 #CJK UNIFIED IDEOGRAPH +0x8963 0x55B6 #CJK UNIFIED IDEOGRAPH +0x8964 0x5B30 #CJK UNIFIED IDEOGRAPH +0x8965 0x5F71 #CJK UNIFIED IDEOGRAPH +0x8966 0x6620 #CJK UNIFIED IDEOGRAPH +0x8967 0x66F3 #CJK UNIFIED IDEOGRAPH +0x8968 0x6804 #CJK UNIFIED IDEOGRAPH +0x8969 0x6C38 #CJK UNIFIED IDEOGRAPH +0x896A 0x6CF3 #CJK UNIFIED IDEOGRAPH +0x896B 0x6D29 #CJK UNIFIED IDEOGRAPH +0x896C 0x745B #CJK UNIFIED IDEOGRAPH +0x896D 0x76C8 #CJK UNIFIED IDEOGRAPH +0x896E 0x7A4E #CJK UNIFIED IDEOGRAPH +0x896F 0x9834 #CJK UNIFIED IDEOGRAPH +0x8970 0x82F1 #CJK UNIFIED IDEOGRAPH +0x8971 0x885B #CJK UNIFIED IDEOGRAPH +0x8972 0x8A60 #CJK UNIFIED IDEOGRAPH +0x8973 0x92ED #CJK UNIFIED IDEOGRAPH +0x8974 0x6DB2 #CJK UNIFIED IDEOGRAPH +0x8975 0x75AB #CJK UNIFIED IDEOGRAPH +0x8976 0x76CA #CJK UNIFIED IDEOGRAPH +0x8977 0x99C5 #CJK UNIFIED IDEOGRAPH +0x8978 0x60A6 #CJK UNIFIED IDEOGRAPH +0x8979 0x8B01 #CJK UNIFIED IDEOGRAPH +0x897A 0x8D8A #CJK UNIFIED IDEOGRAPH +0x897B 0x95B2 #CJK UNIFIED IDEOGRAPH +0x897C 0x698E #CJK UNIFIED IDEOGRAPH +0x897D 0x53AD #CJK UNIFIED IDEOGRAPH +0x897E 0x5186 #CJK UNIFIED IDEOGRAPH +0x8980 0x5712 #CJK UNIFIED IDEOGRAPH +0x8981 0x5830 #CJK UNIFIED IDEOGRAPH +0x8982 0x5944 #CJK UNIFIED IDEOGRAPH +0x8983 0x5BB4 #CJK UNIFIED IDEOGRAPH +0x8984 0x5EF6 #CJK UNIFIED IDEOGRAPH +0x8985 0x6028 #CJK UNIFIED IDEOGRAPH +0x8986 0x63A9 #CJK UNIFIED IDEOGRAPH +0x8987 0x63F4 #CJK UNIFIED IDEOGRAPH +0x8988 0x6CBF #CJK UNIFIED IDEOGRAPH +0x8989 0x6F14 #CJK UNIFIED IDEOGRAPH +0x898A 0x708E #CJK UNIFIED IDEOGRAPH +0x898B 0x7114 #CJK UNIFIED IDEOGRAPH +0x898C 0x7159 #CJK UNIFIED IDEOGRAPH +0x898D 0x71D5 #CJK UNIFIED IDEOGRAPH +0x898E 0x733F #CJK UNIFIED IDEOGRAPH +0x898F 0x7E01 #CJK UNIFIED IDEOGRAPH +0x8990 0x8276 #CJK UNIFIED IDEOGRAPH +0x8991 0x82D1 #CJK UNIFIED IDEOGRAPH +0x8992 0x8597 #CJK UNIFIED IDEOGRAPH +0x8993 0x9060 #CJK UNIFIED IDEOGRAPH +0x8994 0x925B #CJK UNIFIED IDEOGRAPH +0x8995 0x9D1B #CJK UNIFIED IDEOGRAPH +0x8996 0x5869 #CJK UNIFIED IDEOGRAPH +0x8997 0x65BC #CJK UNIFIED IDEOGRAPH +0x8998 0x6C5A #CJK UNIFIED IDEOGRAPH +0x8999 0x7525 #CJK UNIFIED IDEOGRAPH +0x899A 0x51F9 #CJK UNIFIED IDEOGRAPH +0x899B 0x592E #CJK UNIFIED IDEOGRAPH +0x899C 0x5965 #CJK UNIFIED IDEOGRAPH +0x899D 0x5F80 #CJK UNIFIED IDEOGRAPH +0x899E 0x5FDC #CJK UNIFIED IDEOGRAPH +0x899F 0x62BC #CJK UNIFIED IDEOGRAPH +0x89A0 0x65FA #CJK UNIFIED IDEOGRAPH +0x89A1 0x6A2A #CJK UNIFIED IDEOGRAPH +0x89A2 0x6B27 #CJK UNIFIED IDEOGRAPH +0x89A3 0x6BB4 #CJK UNIFIED IDEOGRAPH +0x89A4 0x738B #CJK UNIFIED IDEOGRAPH +0x89A5 0x7FC1 #CJK UNIFIED IDEOGRAPH +0x89A6 0x8956 #CJK UNIFIED IDEOGRAPH +0x89A7 0x9D2C #CJK UNIFIED IDEOGRAPH +0x89A8 0x9D0E #CJK UNIFIED IDEOGRAPH +0x89A9 0x9EC4 #CJK UNIFIED IDEOGRAPH +0x89AA 0x5CA1 #CJK UNIFIED IDEOGRAPH +0x89AB 0x6C96 #CJK UNIFIED IDEOGRAPH +0x89AC 0x837B #CJK UNIFIED IDEOGRAPH +0x89AD 0x5104 #CJK UNIFIED IDEOGRAPH +0x89AE 0x5C4B #CJK UNIFIED IDEOGRAPH +0x89AF 0x61B6 #CJK UNIFIED IDEOGRAPH +0x89B0 0x81C6 #CJK UNIFIED IDEOGRAPH +0x89B1 0x6876 #CJK UNIFIED IDEOGRAPH +0x89B2 0x7261 #CJK UNIFIED IDEOGRAPH +0x89B3 0x4E59 #CJK UNIFIED IDEOGRAPH +0x89B4 0x4FFA #CJK UNIFIED IDEOGRAPH +0x89B5 0x5378 #CJK UNIFIED IDEOGRAPH +0x89B6 0x6069 #CJK UNIFIED IDEOGRAPH +0x89B7 0x6E29 #CJK UNIFIED IDEOGRAPH +0x89B8 0x7A4F #CJK UNIFIED IDEOGRAPH +0x89B9 0x97F3 #CJK UNIFIED IDEOGRAPH +0x89BA 0x4E0B #CJK UNIFIED IDEOGRAPH +0x89BB 0x5316 #CJK UNIFIED IDEOGRAPH +0x89BC 0x4EEE #CJK UNIFIED IDEOGRAPH +0x89BD 0x4F55 #CJK UNIFIED IDEOGRAPH +0x89BE 0x4F3D #CJK UNIFIED IDEOGRAPH +0x89BF 0x4FA1 #CJK UNIFIED IDEOGRAPH +0x89C0 0x4F73 #CJK UNIFIED IDEOGRAPH +0x89C1 0x52A0 #CJK UNIFIED IDEOGRAPH +0x89C2 0x53EF #CJK UNIFIED IDEOGRAPH +0x89C3 0x5609 #CJK UNIFIED IDEOGRAPH +0x89C4 0x590F #CJK UNIFIED IDEOGRAPH +0x89C5 0x5AC1 #CJK UNIFIED IDEOGRAPH +0x89C6 0x5BB6 #CJK UNIFIED IDEOGRAPH +0x89C7 0x5BE1 #CJK UNIFIED IDEOGRAPH +0x89C8 0x79D1 #CJK UNIFIED IDEOGRAPH +0x89C9 0x6687 #CJK UNIFIED IDEOGRAPH +0x89CA 0x679C #CJK UNIFIED IDEOGRAPH +0x89CB 0x67B6 #CJK UNIFIED IDEOGRAPH +0x89CC 0x6B4C #CJK UNIFIED IDEOGRAPH +0x89CD 0x6CB3 #CJK UNIFIED IDEOGRAPH +0x89CE 0x706B #CJK UNIFIED IDEOGRAPH +0x89CF 0x73C2 #CJK UNIFIED IDEOGRAPH +0x89D0 0x798D #CJK UNIFIED IDEOGRAPH +0x89D1 0x79BE #CJK UNIFIED IDEOGRAPH +0x89D2 0x7A3C #CJK UNIFIED IDEOGRAPH +0x89D3 0x7B87 #CJK UNIFIED IDEOGRAPH +0x89D4 0x82B1 #CJK UNIFIED IDEOGRAPH +0x89D5 0x82DB #CJK UNIFIED IDEOGRAPH +0x89D6 0x8304 #CJK UNIFIED IDEOGRAPH +0x89D7 0x8377 #CJK UNIFIED IDEOGRAPH +0x89D8 0x83EF #CJK UNIFIED IDEOGRAPH +0x89D9 0x83D3 #CJK UNIFIED IDEOGRAPH +0x89DA 0x8766 #CJK UNIFIED IDEOGRAPH +0x89DB 0x8AB2 #CJK UNIFIED IDEOGRAPH +0x89DC 0x5629 #CJK UNIFIED IDEOGRAPH +0x89DD 0x8CA8 #CJK UNIFIED IDEOGRAPH +0x89DE 0x8FE6 #CJK UNIFIED IDEOGRAPH +0x89DF 0x904E #CJK UNIFIED IDEOGRAPH +0x89E0 0x971E #CJK UNIFIED IDEOGRAPH +0x89E1 0x868A #CJK UNIFIED IDEOGRAPH +0x89E2 0x4FC4 #CJK UNIFIED IDEOGRAPH +0x89E3 0x5CE8 #CJK UNIFIED IDEOGRAPH +0x89E4 0x6211 #CJK UNIFIED IDEOGRAPH +0x89E5 0x7259 #CJK UNIFIED IDEOGRAPH +0x89E6 0x753B #CJK UNIFIED IDEOGRAPH +0x89E7 0x81E5 #CJK UNIFIED IDEOGRAPH +0x89E8 0x82BD #CJK UNIFIED IDEOGRAPH +0x89E9 0x86FE #CJK UNIFIED IDEOGRAPH +0x89EA 0x8CC0 #CJK UNIFIED IDEOGRAPH +0x89EB 0x96C5 #CJK UNIFIED IDEOGRAPH +0x89EC 0x9913 #CJK UNIFIED IDEOGRAPH +0x89ED 0x99D5 #CJK UNIFIED IDEOGRAPH +0x89EE 0x4ECB #CJK UNIFIED IDEOGRAPH +0x89EF 0x4F1A #CJK UNIFIED IDEOGRAPH +0x89F0 0x89E3 #CJK UNIFIED IDEOGRAPH +0x89F1 0x56DE #CJK UNIFIED IDEOGRAPH +0x89F2 0x584A #CJK UNIFIED IDEOGRAPH +0x89F3 0x58CA #CJK UNIFIED IDEOGRAPH +0x89F4 0x5EFB #CJK UNIFIED IDEOGRAPH +0x89F5 0x5FEB #CJK UNIFIED IDEOGRAPH +0x89F6 0x602A #CJK UNIFIED IDEOGRAPH +0x89F7 0x6094 #CJK UNIFIED IDEOGRAPH +0x89F8 0x6062 #CJK UNIFIED IDEOGRAPH +0x89F9 0x61D0 #CJK UNIFIED IDEOGRAPH +0x89FA 0x6212 #CJK UNIFIED IDEOGRAPH +0x89FB 0x62D0 #CJK UNIFIED IDEOGRAPH +0x89FC 0x6539 #CJK UNIFIED IDEOGRAPH +0x8A40 0x9B41 #CJK UNIFIED IDEOGRAPH +0x8A41 0x6666 #CJK UNIFIED IDEOGRAPH +0x8A42 0x68B0 #CJK UNIFIED IDEOGRAPH +0x8A43 0x6D77 #CJK UNIFIED IDEOGRAPH +0x8A44 0x7070 #CJK UNIFIED IDEOGRAPH +0x8A45 0x754C #CJK UNIFIED IDEOGRAPH +0x8A46 0x7686 #CJK UNIFIED IDEOGRAPH +0x8A47 0x7D75 #CJK UNIFIED IDEOGRAPH +0x8A48 0x82A5 #CJK UNIFIED IDEOGRAPH +0x8A49 0x87F9 #CJK UNIFIED IDEOGRAPH +0x8A4A 0x958B #CJK UNIFIED IDEOGRAPH +0x8A4B 0x968E #CJK UNIFIED IDEOGRAPH +0x8A4C 0x8C9D #CJK UNIFIED IDEOGRAPH +0x8A4D 0x51F1 #CJK UNIFIED IDEOGRAPH +0x8A4E 0x52BE #CJK UNIFIED IDEOGRAPH +0x8A4F 0x5916 #CJK UNIFIED IDEOGRAPH +0x8A50 0x54B3 #CJK UNIFIED IDEOGRAPH +0x8A51 0x5BB3 #CJK UNIFIED IDEOGRAPH +0x8A52 0x5D16 #CJK UNIFIED IDEOGRAPH +0x8A53 0x6168 #CJK UNIFIED IDEOGRAPH +0x8A54 0x6982 #CJK UNIFIED IDEOGRAPH +0x8A55 0x6DAF #CJK UNIFIED IDEOGRAPH +0x8A56 0x788D #CJK UNIFIED IDEOGRAPH +0x8A57 0x84CB #CJK UNIFIED IDEOGRAPH +0x8A58 0x8857 #CJK UNIFIED IDEOGRAPH +0x8A59 0x8A72 #CJK UNIFIED IDEOGRAPH +0x8A5A 0x93A7 #CJK UNIFIED IDEOGRAPH +0x8A5B 0x9AB8 #CJK UNIFIED IDEOGRAPH +0x8A5C 0x6D6C #CJK UNIFIED IDEOGRAPH +0x8A5D 0x99A8 #CJK UNIFIED IDEOGRAPH +0x8A5E 0x86D9 #CJK UNIFIED IDEOGRAPH +0x8A5F 0x57A3 #CJK UNIFIED IDEOGRAPH +0x8A60 0x67FF #CJK UNIFIED IDEOGRAPH +0x8A61 0x86CE #CJK UNIFIED IDEOGRAPH +0x8A62 0x920E #CJK UNIFIED IDEOGRAPH +0x8A63 0x5283 #CJK UNIFIED IDEOGRAPH +0x8A64 0x5687 #CJK UNIFIED IDEOGRAPH +0x8A65 0x5404 #CJK UNIFIED IDEOGRAPH +0x8A66 0x5ED3 #CJK UNIFIED IDEOGRAPH +0x8A67 0x62E1 #CJK UNIFIED IDEOGRAPH +0x8A68 0x64B9 #CJK UNIFIED IDEOGRAPH +0x8A69 0x683C #CJK UNIFIED IDEOGRAPH +0x8A6A 0x6838 #CJK UNIFIED IDEOGRAPH +0x8A6B 0x6BBB #CJK UNIFIED IDEOGRAPH +0x8A6C 0x7372 #CJK UNIFIED IDEOGRAPH +0x8A6D 0x78BA #CJK UNIFIED IDEOGRAPH +0x8A6E 0x7A6B #CJK UNIFIED IDEOGRAPH +0x8A6F 0x899A #CJK UNIFIED IDEOGRAPH +0x8A70 0x89D2 #CJK UNIFIED IDEOGRAPH +0x8A71 0x8D6B #CJK UNIFIED IDEOGRAPH +0x8A72 0x8F03 #CJK UNIFIED IDEOGRAPH +0x8A73 0x90ED #CJK UNIFIED IDEOGRAPH +0x8A74 0x95A3 #CJK UNIFIED IDEOGRAPH +0x8A75 0x9694 #CJK UNIFIED IDEOGRAPH +0x8A76 0x9769 #CJK UNIFIED IDEOGRAPH +0x8A77 0x5B66 #CJK UNIFIED IDEOGRAPH +0x8A78 0x5CB3 #CJK UNIFIED IDEOGRAPH +0x8A79 0x697D #CJK UNIFIED IDEOGRAPH +0x8A7A 0x984D #CJK UNIFIED IDEOGRAPH +0x8A7B 0x984E #CJK UNIFIED IDEOGRAPH +0x8A7C 0x639B #CJK UNIFIED IDEOGRAPH +0x8A7D 0x7B20 #CJK UNIFIED IDEOGRAPH +0x8A7E 0x6A2B #CJK UNIFIED IDEOGRAPH +0x8A80 0x6A7F #CJK UNIFIED IDEOGRAPH +0x8A81 0x68B6 #CJK UNIFIED IDEOGRAPH +0x8A82 0x9C0D #CJK UNIFIED IDEOGRAPH +0x8A83 0x6F5F #CJK UNIFIED IDEOGRAPH +0x8A84 0x5272 #CJK UNIFIED IDEOGRAPH +0x8A85 0x559D #CJK UNIFIED IDEOGRAPH +0x8A86 0x6070 #CJK UNIFIED IDEOGRAPH +0x8A87 0x62EC #CJK UNIFIED IDEOGRAPH +0x8A88 0x6D3B #CJK UNIFIED IDEOGRAPH +0x8A89 0x6E07 #CJK UNIFIED IDEOGRAPH +0x8A8A 0x6ED1 #CJK UNIFIED IDEOGRAPH +0x8A8B 0x845B #CJK UNIFIED IDEOGRAPH +0x8A8C 0x8910 #CJK UNIFIED IDEOGRAPH +0x8A8D 0x8F44 #CJK UNIFIED IDEOGRAPH +0x8A8E 0x4E14 #CJK UNIFIED IDEOGRAPH +0x8A8F 0x9C39 #CJK UNIFIED IDEOGRAPH +0x8A90 0x53F6 #CJK UNIFIED IDEOGRAPH +0x8A91 0x691B #CJK UNIFIED IDEOGRAPH +0x8A92 0x6A3A #CJK UNIFIED IDEOGRAPH +0x8A93 0x9784 #CJK UNIFIED IDEOGRAPH +0x8A94 0x682A #CJK UNIFIED IDEOGRAPH +0x8A95 0x515C #CJK UNIFIED IDEOGRAPH +0x8A96 0x7AC3 #CJK UNIFIED IDEOGRAPH +0x8A97 0x84B2 #CJK UNIFIED IDEOGRAPH +0x8A98 0x91DC #CJK UNIFIED IDEOGRAPH +0x8A99 0x938C #CJK UNIFIED IDEOGRAPH +0x8A9A 0x565B #CJK UNIFIED IDEOGRAPH +0x8A9B 0x9D28 #CJK UNIFIED IDEOGRAPH +0x8A9C 0x6822 #CJK UNIFIED IDEOGRAPH +0x8A9D 0x8305 #CJK UNIFIED IDEOGRAPH +0x8A9E 0x8431 #CJK UNIFIED IDEOGRAPH +0x8A9F 0x7CA5 #CJK UNIFIED IDEOGRAPH +0x8AA0 0x5208 #CJK UNIFIED IDEOGRAPH +0x8AA1 0x82C5 #CJK UNIFIED IDEOGRAPH +0x8AA2 0x74E6 #CJK UNIFIED IDEOGRAPH +0x8AA3 0x4E7E #CJK UNIFIED IDEOGRAPH +0x8AA4 0x4F83 #CJK UNIFIED IDEOGRAPH +0x8AA5 0x51A0 #CJK UNIFIED IDEOGRAPH +0x8AA6 0x5BD2 #CJK UNIFIED IDEOGRAPH +0x8AA7 0x520A #CJK UNIFIED IDEOGRAPH +0x8AA8 0x52D8 #CJK UNIFIED IDEOGRAPH +0x8AA9 0x52E7 #CJK UNIFIED IDEOGRAPH +0x8AAA 0x5DFB #CJK UNIFIED IDEOGRAPH +0x8AAB 0x559A #CJK UNIFIED IDEOGRAPH +0x8AAC 0x582A #CJK UNIFIED IDEOGRAPH +0x8AAD 0x59E6 #CJK UNIFIED IDEOGRAPH +0x8AAE 0x5B8C #CJK UNIFIED IDEOGRAPH +0x8AAF 0x5B98 #CJK UNIFIED IDEOGRAPH +0x8AB0 0x5BDB #CJK UNIFIED IDEOGRAPH +0x8AB1 0x5E72 #CJK UNIFIED IDEOGRAPH +0x8AB2 0x5E79 #CJK UNIFIED IDEOGRAPH +0x8AB3 0x60A3 #CJK UNIFIED IDEOGRAPH +0x8AB4 0x611F #CJK UNIFIED IDEOGRAPH +0x8AB5 0x6163 #CJK UNIFIED IDEOGRAPH +0x8AB6 0x61BE #CJK UNIFIED IDEOGRAPH +0x8AB7 0x63DB #CJK UNIFIED IDEOGRAPH +0x8AB8 0x6562 #CJK UNIFIED IDEOGRAPH +0x8AB9 0x67D1 #CJK UNIFIED IDEOGRAPH +0x8ABA 0x6853 #CJK UNIFIED IDEOGRAPH +0x8ABB 0x68FA #CJK UNIFIED IDEOGRAPH +0x8ABC 0x6B3E #CJK UNIFIED IDEOGRAPH +0x8ABD 0x6B53 #CJK UNIFIED IDEOGRAPH +0x8ABE 0x6C57 #CJK UNIFIED IDEOGRAPH +0x8ABF 0x6F22 #CJK UNIFIED IDEOGRAPH +0x8AC0 0x6F97 #CJK UNIFIED IDEOGRAPH +0x8AC1 0x6F45 #CJK UNIFIED IDEOGRAPH +0x8AC2 0x74B0 #CJK UNIFIED IDEOGRAPH +0x8AC3 0x7518 #CJK UNIFIED IDEOGRAPH +0x8AC4 0x76E3 #CJK UNIFIED IDEOGRAPH +0x8AC5 0x770B #CJK UNIFIED IDEOGRAPH +0x8AC6 0x7AFF #CJK UNIFIED IDEOGRAPH +0x8AC7 0x7BA1 #CJK UNIFIED IDEOGRAPH +0x8AC8 0x7C21 #CJK UNIFIED IDEOGRAPH +0x8AC9 0x7DE9 #CJK UNIFIED IDEOGRAPH +0x8ACA 0x7F36 #CJK UNIFIED IDEOGRAPH +0x8ACB 0x7FF0 #CJK UNIFIED IDEOGRAPH +0x8ACC 0x809D #CJK UNIFIED IDEOGRAPH +0x8ACD 0x8266 #CJK UNIFIED IDEOGRAPH +0x8ACE 0x839E #CJK UNIFIED IDEOGRAPH +0x8ACF 0x89B3 #CJK UNIFIED IDEOGRAPH +0x8AD0 0x8ACC #CJK UNIFIED IDEOGRAPH +0x8AD1 0x8CAB #CJK UNIFIED IDEOGRAPH +0x8AD2 0x9084 #CJK UNIFIED IDEOGRAPH +0x8AD3 0x9451 #CJK UNIFIED IDEOGRAPH +0x8AD4 0x9593 #CJK UNIFIED IDEOGRAPH +0x8AD5 0x9591 #CJK UNIFIED IDEOGRAPH +0x8AD6 0x95A2 #CJK UNIFIED IDEOGRAPH +0x8AD7 0x9665 #CJK UNIFIED IDEOGRAPH +0x8AD8 0x97D3 #CJK UNIFIED IDEOGRAPH +0x8AD9 0x9928 #CJK UNIFIED IDEOGRAPH +0x8ADA 0x8218 #CJK UNIFIED IDEOGRAPH +0x8ADB 0x4E38 #CJK UNIFIED IDEOGRAPH +0x8ADC 0x542B #CJK UNIFIED IDEOGRAPH +0x8ADD 0x5CB8 #CJK UNIFIED IDEOGRAPH +0x8ADE 0x5DCC #CJK UNIFIED IDEOGRAPH +0x8ADF 0x73A9 #CJK UNIFIED IDEOGRAPH +0x8AE0 0x764C #CJK UNIFIED IDEOGRAPH +0x8AE1 0x773C #CJK UNIFIED IDEOGRAPH +0x8AE2 0x5CA9 #CJK UNIFIED IDEOGRAPH +0x8AE3 0x7FEB #CJK UNIFIED IDEOGRAPH +0x8AE4 0x8D0B #CJK UNIFIED IDEOGRAPH +0x8AE5 0x96C1 #CJK UNIFIED IDEOGRAPH +0x8AE6 0x9811 #CJK UNIFIED IDEOGRAPH +0x8AE7 0x9854 #CJK UNIFIED IDEOGRAPH +0x8AE8 0x9858 #CJK UNIFIED IDEOGRAPH +0x8AE9 0x4F01 #CJK UNIFIED IDEOGRAPH +0x8AEA 0x4F0E #CJK UNIFIED IDEOGRAPH +0x8AEB 0x5371 #CJK UNIFIED IDEOGRAPH +0x8AEC 0x559C #CJK UNIFIED IDEOGRAPH +0x8AED 0x5668 #CJK UNIFIED IDEOGRAPH +0x8AEE 0x57FA #CJK UNIFIED IDEOGRAPH +0x8AEF 0x5947 #CJK UNIFIED IDEOGRAPH +0x8AF0 0x5B09 #CJK UNIFIED IDEOGRAPH +0x8AF1 0x5BC4 #CJK UNIFIED IDEOGRAPH +0x8AF2 0x5C90 #CJK UNIFIED IDEOGRAPH +0x8AF3 0x5E0C #CJK UNIFIED IDEOGRAPH +0x8AF4 0x5E7E #CJK UNIFIED IDEOGRAPH +0x8AF5 0x5FCC #CJK UNIFIED IDEOGRAPH +0x8AF6 0x63EE #CJK UNIFIED IDEOGRAPH +0x8AF7 0x673A #CJK UNIFIED IDEOGRAPH +0x8AF8 0x65D7 #CJK UNIFIED IDEOGRAPH +0x8AF9 0x65E2 #CJK UNIFIED IDEOGRAPH +0x8AFA 0x671F #CJK UNIFIED IDEOGRAPH +0x8AFB 0x68CB #CJK UNIFIED IDEOGRAPH +0x8AFC 0x68C4 #CJK UNIFIED IDEOGRAPH +0x8B40 0x6A5F #CJK UNIFIED IDEOGRAPH +0x8B41 0x5E30 #CJK UNIFIED IDEOGRAPH +0x8B42 0x6BC5 #CJK UNIFIED IDEOGRAPH +0x8B43 0x6C17 #CJK UNIFIED IDEOGRAPH +0x8B44 0x6C7D #CJK UNIFIED IDEOGRAPH +0x8B45 0x757F #CJK UNIFIED IDEOGRAPH +0x8B46 0x7948 #CJK UNIFIED IDEOGRAPH +0x8B47 0x5B63 #CJK UNIFIED IDEOGRAPH +0x8B48 0x7A00 #CJK UNIFIED IDEOGRAPH +0x8B49 0x7D00 #CJK UNIFIED IDEOGRAPH +0x8B4A 0x5FBD #CJK UNIFIED IDEOGRAPH +0x8B4B 0x898F #CJK UNIFIED IDEOGRAPH +0x8B4C 0x8A18 #CJK UNIFIED IDEOGRAPH +0x8B4D 0x8CB4 #CJK UNIFIED IDEOGRAPH +0x8B4E 0x8D77 #CJK UNIFIED IDEOGRAPH +0x8B4F 0x8ECC #CJK UNIFIED IDEOGRAPH +0x8B50 0x8F1D #CJK UNIFIED IDEOGRAPH +0x8B51 0x98E2 #CJK UNIFIED IDEOGRAPH +0x8B52 0x9A0E #CJK UNIFIED IDEOGRAPH +0x8B53 0x9B3C #CJK UNIFIED IDEOGRAPH +0x8B54 0x4E80 #CJK UNIFIED IDEOGRAPH +0x8B55 0x507D #CJK UNIFIED IDEOGRAPH +0x8B56 0x5100 #CJK UNIFIED IDEOGRAPH +0x8B57 0x5993 #CJK UNIFIED IDEOGRAPH +0x8B58 0x5B9C #CJK UNIFIED IDEOGRAPH +0x8B59 0x622F #CJK UNIFIED IDEOGRAPH +0x8B5A 0x6280 #CJK UNIFIED IDEOGRAPH +0x8B5B 0x64EC #CJK UNIFIED IDEOGRAPH +0x8B5C 0x6B3A #CJK UNIFIED IDEOGRAPH +0x8B5D 0x72A0 #CJK UNIFIED IDEOGRAPH +0x8B5E 0x7591 #CJK UNIFIED IDEOGRAPH +0x8B5F 0x7947 #CJK UNIFIED IDEOGRAPH +0x8B60 0x7FA9 #CJK UNIFIED IDEOGRAPH +0x8B61 0x87FB #CJK UNIFIED IDEOGRAPH +0x8B62 0x8ABC #CJK UNIFIED IDEOGRAPH +0x8B63 0x8B70 #CJK UNIFIED IDEOGRAPH +0x8B64 0x63AC #CJK UNIFIED IDEOGRAPH +0x8B65 0x83CA #CJK UNIFIED IDEOGRAPH +0x8B66 0x97A0 #CJK UNIFIED IDEOGRAPH +0x8B67 0x5409 #CJK UNIFIED IDEOGRAPH +0x8B68 0x5403 #CJK UNIFIED IDEOGRAPH +0x8B69 0x55AB #CJK UNIFIED IDEOGRAPH +0x8B6A 0x6854 #CJK UNIFIED IDEOGRAPH +0x8B6B 0x6A58 #CJK UNIFIED IDEOGRAPH +0x8B6C 0x8A70 #CJK UNIFIED IDEOGRAPH +0x8B6D 0x7827 #CJK UNIFIED IDEOGRAPH +0x8B6E 0x6775 #CJK UNIFIED IDEOGRAPH +0x8B6F 0x9ECD #CJK UNIFIED IDEOGRAPH +0x8B70 0x5374 #CJK UNIFIED IDEOGRAPH +0x8B71 0x5BA2 #CJK UNIFIED IDEOGRAPH +0x8B72 0x811A #CJK UNIFIED IDEOGRAPH +0x8B73 0x8650 #CJK UNIFIED IDEOGRAPH +0x8B74 0x9006 #CJK UNIFIED IDEOGRAPH +0x8B75 0x4E18 #CJK UNIFIED IDEOGRAPH +0x8B76 0x4E45 #CJK UNIFIED IDEOGRAPH +0x8B77 0x4EC7 #CJK UNIFIED IDEOGRAPH +0x8B78 0x4F11 #CJK UNIFIED IDEOGRAPH +0x8B79 0x53CA #CJK UNIFIED IDEOGRAPH +0x8B7A 0x5438 #CJK UNIFIED IDEOGRAPH +0x8B7B 0x5BAE #CJK UNIFIED IDEOGRAPH +0x8B7C 0x5F13 #CJK UNIFIED IDEOGRAPH +0x8B7D 0x6025 #CJK UNIFIED IDEOGRAPH +0x8B7E 0x6551 #CJK UNIFIED IDEOGRAPH +0x8B80 0x673D #CJK UNIFIED IDEOGRAPH +0x8B81 0x6C42 #CJK UNIFIED IDEOGRAPH +0x8B82 0x6C72 #CJK UNIFIED IDEOGRAPH +0x8B83 0x6CE3 #CJK UNIFIED IDEOGRAPH +0x8B84 0x7078 #CJK UNIFIED IDEOGRAPH +0x8B85 0x7403 #CJK UNIFIED IDEOGRAPH +0x8B86 0x7A76 #CJK UNIFIED IDEOGRAPH +0x8B87 0x7AAE #CJK UNIFIED IDEOGRAPH +0x8B88 0x7B08 #CJK UNIFIED IDEOGRAPH +0x8B89 0x7D1A #CJK UNIFIED IDEOGRAPH +0x8B8A 0x7CFE #CJK UNIFIED IDEOGRAPH +0x8B8B 0x7D66 #CJK UNIFIED IDEOGRAPH +0x8B8C 0x65E7 #CJK UNIFIED IDEOGRAPH +0x8B8D 0x725B #CJK UNIFIED IDEOGRAPH +0x8B8E 0x53BB #CJK UNIFIED IDEOGRAPH +0x8B8F 0x5C45 #CJK UNIFIED IDEOGRAPH +0x8B90 0x5DE8 #CJK UNIFIED IDEOGRAPH +0x8B91 0x62D2 #CJK UNIFIED IDEOGRAPH +0x8B92 0x62E0 #CJK UNIFIED IDEOGRAPH +0x8B93 0x6319 #CJK UNIFIED IDEOGRAPH +0x8B94 0x6E20 #CJK UNIFIED IDEOGRAPH +0x8B95 0x865A #CJK UNIFIED IDEOGRAPH +0x8B96 0x8A31 #CJK UNIFIED IDEOGRAPH +0x8B97 0x8DDD #CJK UNIFIED IDEOGRAPH +0x8B98 0x92F8 #CJK UNIFIED IDEOGRAPH +0x8B99 0x6F01 #CJK UNIFIED IDEOGRAPH +0x8B9A 0x79A6 #CJK UNIFIED IDEOGRAPH +0x8B9B 0x9B5A #CJK UNIFIED IDEOGRAPH +0x8B9C 0x4EA8 #CJK UNIFIED IDEOGRAPH +0x8B9D 0x4EAB #CJK UNIFIED IDEOGRAPH +0x8B9E 0x4EAC #CJK UNIFIED IDEOGRAPH +0x8B9F 0x4F9B #CJK UNIFIED IDEOGRAPH +0x8BA0 0x4FA0 #CJK UNIFIED IDEOGRAPH +0x8BA1 0x50D1 #CJK UNIFIED IDEOGRAPH +0x8BA2 0x5147 #CJK UNIFIED IDEOGRAPH +0x8BA3 0x7AF6 #CJK UNIFIED IDEOGRAPH +0x8BA4 0x5171 #CJK UNIFIED IDEOGRAPH +0x8BA5 0x51F6 #CJK UNIFIED IDEOGRAPH +0x8BA6 0x5354 #CJK UNIFIED IDEOGRAPH +0x8BA7 0x5321 #CJK UNIFIED IDEOGRAPH +0x8BA8 0x537F #CJK UNIFIED IDEOGRAPH +0x8BA9 0x53EB #CJK UNIFIED IDEOGRAPH +0x8BAA 0x55AC #CJK UNIFIED IDEOGRAPH +0x8BAB 0x5883 #CJK UNIFIED IDEOGRAPH +0x8BAC 0x5CE1 #CJK UNIFIED IDEOGRAPH +0x8BAD 0x5F37 #CJK UNIFIED IDEOGRAPH +0x8BAE 0x5F4A #CJK UNIFIED IDEOGRAPH +0x8BAF 0x602F #CJK UNIFIED IDEOGRAPH +0x8BB0 0x6050 #CJK UNIFIED IDEOGRAPH +0x8BB1 0x606D #CJK UNIFIED IDEOGRAPH +0x8BB2 0x631F #CJK UNIFIED IDEOGRAPH +0x8BB3 0x6559 #CJK UNIFIED IDEOGRAPH +0x8BB4 0x6A4B #CJK UNIFIED IDEOGRAPH +0x8BB5 0x6CC1 #CJK UNIFIED IDEOGRAPH +0x8BB6 0x72C2 #CJK UNIFIED IDEOGRAPH +0x8BB7 0x72ED #CJK UNIFIED IDEOGRAPH +0x8BB8 0x77EF #CJK UNIFIED IDEOGRAPH +0x8BB9 0x80F8 #CJK UNIFIED IDEOGRAPH +0x8BBA 0x8105 #CJK UNIFIED IDEOGRAPH +0x8BBB 0x8208 #CJK UNIFIED IDEOGRAPH +0x8BBC 0x854E #CJK UNIFIED IDEOGRAPH +0x8BBD 0x90F7 #CJK UNIFIED IDEOGRAPH +0x8BBE 0x93E1 #CJK UNIFIED IDEOGRAPH +0x8BBF 0x97FF #CJK UNIFIED IDEOGRAPH +0x8BC0 0x9957 #CJK UNIFIED IDEOGRAPH +0x8BC1 0x9A5A #CJK UNIFIED IDEOGRAPH +0x8BC2 0x4EF0 #CJK UNIFIED IDEOGRAPH +0x8BC3 0x51DD #CJK UNIFIED IDEOGRAPH +0x8BC4 0x5C2D #CJK UNIFIED IDEOGRAPH +0x8BC5 0x6681 #CJK UNIFIED IDEOGRAPH +0x8BC6 0x696D #CJK UNIFIED IDEOGRAPH +0x8BC7 0x5C40 #CJK UNIFIED IDEOGRAPH +0x8BC8 0x66F2 #CJK UNIFIED IDEOGRAPH +0x8BC9 0x6975 #CJK UNIFIED IDEOGRAPH +0x8BCA 0x7389 #CJK UNIFIED IDEOGRAPH +0x8BCB 0x6850 #CJK UNIFIED IDEOGRAPH +0x8BCC 0x7C81 #CJK UNIFIED IDEOGRAPH +0x8BCD 0x50C5 #CJK UNIFIED IDEOGRAPH +0x8BCE 0x52E4 #CJK UNIFIED IDEOGRAPH +0x8BCF 0x5747 #CJK UNIFIED IDEOGRAPH +0x8BD0 0x5DFE #CJK UNIFIED IDEOGRAPH +0x8BD1 0x9326 #CJK UNIFIED IDEOGRAPH +0x8BD2 0x65A4 #CJK UNIFIED IDEOGRAPH +0x8BD3 0x6B23 #CJK UNIFIED IDEOGRAPH +0x8BD4 0x6B3D #CJK UNIFIED IDEOGRAPH +0x8BD5 0x7434 #CJK UNIFIED IDEOGRAPH +0x8BD6 0x7981 #CJK UNIFIED IDEOGRAPH +0x8BD7 0x79BD #CJK UNIFIED IDEOGRAPH +0x8BD8 0x7B4B #CJK UNIFIED IDEOGRAPH +0x8BD9 0x7DCA #CJK UNIFIED IDEOGRAPH +0x8BDA 0x82B9 #CJK UNIFIED IDEOGRAPH +0x8BDB 0x83CC #CJK UNIFIED IDEOGRAPH +0x8BDC 0x887F #CJK UNIFIED IDEOGRAPH +0x8BDD 0x895F #CJK UNIFIED IDEOGRAPH +0x8BDE 0x8B39 #CJK UNIFIED IDEOGRAPH +0x8BDF 0x8FD1 #CJK UNIFIED IDEOGRAPH +0x8BE0 0x91D1 #CJK UNIFIED IDEOGRAPH +0x8BE1 0x541F #CJK UNIFIED IDEOGRAPH +0x8BE2 0x9280 #CJK UNIFIED IDEOGRAPH +0x8BE3 0x4E5D #CJK UNIFIED IDEOGRAPH +0x8BE4 0x5036 #CJK UNIFIED IDEOGRAPH +0x8BE5 0x53E5 #CJK UNIFIED IDEOGRAPH +0x8BE6 0x533A #CJK UNIFIED IDEOGRAPH +0x8BE7 0x72D7 #CJK UNIFIED IDEOGRAPH +0x8BE8 0x7396 #CJK UNIFIED IDEOGRAPH +0x8BE9 0x77E9 #CJK UNIFIED IDEOGRAPH +0x8BEA 0x82E6 #CJK UNIFIED IDEOGRAPH +0x8BEB 0x8EAF #CJK UNIFIED IDEOGRAPH +0x8BEC 0x99C6 #CJK UNIFIED IDEOGRAPH +0x8BED 0x99C8 #CJK UNIFIED IDEOGRAPH +0x8BEE 0x99D2 #CJK UNIFIED IDEOGRAPH +0x8BEF 0x5177 #CJK UNIFIED IDEOGRAPH +0x8BF0 0x611A #CJK UNIFIED IDEOGRAPH +0x8BF1 0x865E #CJK UNIFIED IDEOGRAPH +0x8BF2 0x55B0 #CJK UNIFIED IDEOGRAPH +0x8BF3 0x7A7A #CJK UNIFIED IDEOGRAPH +0x8BF4 0x5076 #CJK UNIFIED IDEOGRAPH +0x8BF5 0x5BD3 #CJK UNIFIED IDEOGRAPH +0x8BF6 0x9047 #CJK UNIFIED IDEOGRAPH +0x8BF7 0x9685 #CJK UNIFIED IDEOGRAPH +0x8BF8 0x4E32 #CJK UNIFIED IDEOGRAPH +0x8BF9 0x6ADB #CJK UNIFIED IDEOGRAPH +0x8BFA 0x91E7 #CJK UNIFIED IDEOGRAPH +0x8BFB 0x5C51 #CJK UNIFIED IDEOGRAPH +0x8BFC 0x5C48 #CJK UNIFIED IDEOGRAPH +0x8C40 0x6398 #CJK UNIFIED IDEOGRAPH +0x8C41 0x7A9F #CJK UNIFIED IDEOGRAPH +0x8C42 0x6C93 #CJK UNIFIED IDEOGRAPH +0x8C43 0x9774 #CJK UNIFIED IDEOGRAPH +0x8C44 0x8F61 #CJK UNIFIED IDEOGRAPH +0x8C45 0x7AAA #CJK UNIFIED IDEOGRAPH +0x8C46 0x718A #CJK UNIFIED IDEOGRAPH +0x8C47 0x9688 #CJK UNIFIED IDEOGRAPH +0x8C48 0x7C82 #CJK UNIFIED IDEOGRAPH +0x8C49 0x6817 #CJK UNIFIED IDEOGRAPH +0x8C4A 0x7E70 #CJK UNIFIED IDEOGRAPH +0x8C4B 0x6851 #CJK UNIFIED IDEOGRAPH +0x8C4C 0x936C #CJK UNIFIED IDEOGRAPH +0x8C4D 0x52F2 #CJK UNIFIED IDEOGRAPH +0x8C4E 0x541B #CJK UNIFIED IDEOGRAPH +0x8C4F 0x85AB #CJK UNIFIED IDEOGRAPH +0x8C50 0x8A13 #CJK UNIFIED IDEOGRAPH +0x8C51 0x7FA4 #CJK UNIFIED IDEOGRAPH +0x8C52 0x8ECD #CJK UNIFIED IDEOGRAPH +0x8C53 0x90E1 #CJK UNIFIED IDEOGRAPH +0x8C54 0x5366 #CJK UNIFIED IDEOGRAPH +0x8C55 0x8888 #CJK UNIFIED IDEOGRAPH +0x8C56 0x7941 #CJK UNIFIED IDEOGRAPH +0x8C57 0x4FC2 #CJK UNIFIED IDEOGRAPH +0x8C58 0x50BE #CJK UNIFIED IDEOGRAPH +0x8C59 0x5211 #CJK UNIFIED IDEOGRAPH +0x8C5A 0x5144 #CJK UNIFIED IDEOGRAPH +0x8C5B 0x5553 #CJK UNIFIED IDEOGRAPH +0x8C5C 0x572D #CJK UNIFIED IDEOGRAPH +0x8C5D 0x73EA #CJK UNIFIED IDEOGRAPH +0x8C5E 0x578B #CJK UNIFIED IDEOGRAPH +0x8C5F 0x5951 #CJK UNIFIED IDEOGRAPH +0x8C60 0x5F62 #CJK UNIFIED IDEOGRAPH +0x8C61 0x5F84 #CJK UNIFIED IDEOGRAPH +0x8C62 0x6075 #CJK UNIFIED IDEOGRAPH +0x8C63 0x6176 #CJK UNIFIED IDEOGRAPH +0x8C64 0x6167 #CJK UNIFIED IDEOGRAPH +0x8C65 0x61A9 #CJK UNIFIED IDEOGRAPH +0x8C66 0x63B2 #CJK UNIFIED IDEOGRAPH +0x8C67 0x643A #CJK UNIFIED IDEOGRAPH +0x8C68 0x656C #CJK UNIFIED IDEOGRAPH +0x8C69 0x666F #CJK UNIFIED IDEOGRAPH +0x8C6A 0x6842 #CJK UNIFIED IDEOGRAPH +0x8C6B 0x6E13 #CJK UNIFIED IDEOGRAPH +0x8C6C 0x7566 #CJK UNIFIED IDEOGRAPH +0x8C6D 0x7A3D #CJK UNIFIED IDEOGRAPH +0x8C6E 0x7CFB #CJK UNIFIED IDEOGRAPH +0x8C6F 0x7D4C #CJK UNIFIED IDEOGRAPH +0x8C70 0x7D99 #CJK UNIFIED IDEOGRAPH +0x8C71 0x7E4B #CJK UNIFIED IDEOGRAPH +0x8C72 0x7F6B #CJK UNIFIED IDEOGRAPH +0x8C73 0x830E #CJK UNIFIED IDEOGRAPH +0x8C74 0x834A #CJK UNIFIED IDEOGRAPH +0x8C75 0x86CD #CJK UNIFIED IDEOGRAPH +0x8C76 0x8A08 #CJK UNIFIED IDEOGRAPH +0x8C77 0x8A63 #CJK UNIFIED IDEOGRAPH +0x8C78 0x8B66 #CJK UNIFIED IDEOGRAPH +0x8C79 0x8EFD #CJK UNIFIED IDEOGRAPH +0x8C7A 0x981A #CJK UNIFIED IDEOGRAPH +0x8C7B 0x9D8F #CJK UNIFIED IDEOGRAPH +0x8C7C 0x82B8 #CJK UNIFIED IDEOGRAPH +0x8C7D 0x8FCE #CJK UNIFIED IDEOGRAPH +0x8C7E 0x9BE8 #CJK UNIFIED IDEOGRAPH +0x8C80 0x5287 #CJK UNIFIED IDEOGRAPH +0x8C81 0x621F #CJK UNIFIED IDEOGRAPH +0x8C82 0x6483 #CJK UNIFIED IDEOGRAPH +0x8C83 0x6FC0 #CJK UNIFIED IDEOGRAPH +0x8C84 0x9699 #CJK UNIFIED IDEOGRAPH +0x8C85 0x6841 #CJK UNIFIED IDEOGRAPH +0x8C86 0x5091 #CJK UNIFIED IDEOGRAPH +0x8C87 0x6B20 #CJK UNIFIED IDEOGRAPH +0x8C88 0x6C7A #CJK UNIFIED IDEOGRAPH +0x8C89 0x6F54 #CJK UNIFIED IDEOGRAPH +0x8C8A 0x7A74 #CJK UNIFIED IDEOGRAPH +0x8C8B 0x7D50 #CJK UNIFIED IDEOGRAPH +0x8C8C 0x8840 #CJK UNIFIED IDEOGRAPH +0x8C8D 0x8A23 #CJK UNIFIED IDEOGRAPH +0x8C8E 0x6708 #CJK UNIFIED IDEOGRAPH +0x8C8F 0x4EF6 #CJK UNIFIED IDEOGRAPH +0x8C90 0x5039 #CJK UNIFIED IDEOGRAPH +0x8C91 0x5026 #CJK UNIFIED IDEOGRAPH +0x8C92 0x5065 #CJK UNIFIED IDEOGRAPH +0x8C93 0x517C #CJK UNIFIED IDEOGRAPH +0x8C94 0x5238 #CJK UNIFIED IDEOGRAPH +0x8C95 0x5263 #CJK UNIFIED IDEOGRAPH +0x8C96 0x55A7 #CJK UNIFIED IDEOGRAPH +0x8C97 0x570F #CJK UNIFIED IDEOGRAPH +0x8C98 0x5805 #CJK UNIFIED IDEOGRAPH +0x8C99 0x5ACC #CJK UNIFIED IDEOGRAPH +0x8C9A 0x5EFA #CJK UNIFIED IDEOGRAPH +0x8C9B 0x61B2 #CJK UNIFIED IDEOGRAPH +0x8C9C 0x61F8 #CJK UNIFIED IDEOGRAPH +0x8C9D 0x62F3 #CJK UNIFIED IDEOGRAPH +0x8C9E 0x6372 #CJK UNIFIED IDEOGRAPH +0x8C9F 0x691C #CJK UNIFIED IDEOGRAPH +0x8CA0 0x6A29 #CJK UNIFIED IDEOGRAPH +0x8CA1 0x727D #CJK UNIFIED IDEOGRAPH +0x8CA2 0x72AC #CJK UNIFIED IDEOGRAPH +0x8CA3 0x732E #CJK UNIFIED IDEOGRAPH +0x8CA4 0x7814 #CJK UNIFIED IDEOGRAPH +0x8CA5 0x786F #CJK UNIFIED IDEOGRAPH +0x8CA6 0x7D79 #CJK UNIFIED IDEOGRAPH +0x8CA7 0x770C #CJK UNIFIED IDEOGRAPH +0x8CA8 0x80A9 #CJK UNIFIED IDEOGRAPH +0x8CA9 0x898B #CJK UNIFIED IDEOGRAPH +0x8CAA 0x8B19 #CJK UNIFIED IDEOGRAPH +0x8CAB 0x8CE2 #CJK UNIFIED IDEOGRAPH +0x8CAC 0x8ED2 #CJK UNIFIED IDEOGRAPH +0x8CAD 0x9063 #CJK UNIFIED IDEOGRAPH +0x8CAE 0x9375 #CJK UNIFIED IDEOGRAPH +0x8CAF 0x967A #CJK UNIFIED IDEOGRAPH +0x8CB0 0x9855 #CJK UNIFIED IDEOGRAPH +0x8CB1 0x9A13 #CJK UNIFIED IDEOGRAPH +0x8CB2 0x9E78 #CJK UNIFIED IDEOGRAPH +0x8CB3 0x5143 #CJK UNIFIED IDEOGRAPH +0x8CB4 0x539F #CJK UNIFIED IDEOGRAPH +0x8CB5 0x53B3 #CJK UNIFIED IDEOGRAPH +0x8CB6 0x5E7B #CJK UNIFIED IDEOGRAPH +0x8CB7 0x5F26 #CJK UNIFIED IDEOGRAPH +0x8CB8 0x6E1B #CJK UNIFIED IDEOGRAPH +0x8CB9 0x6E90 #CJK UNIFIED IDEOGRAPH +0x8CBA 0x7384 #CJK UNIFIED IDEOGRAPH +0x8CBB 0x73FE #CJK UNIFIED IDEOGRAPH +0x8CBC 0x7D43 #CJK UNIFIED IDEOGRAPH +0x8CBD 0x8237 #CJK UNIFIED IDEOGRAPH +0x8CBE 0x8A00 #CJK UNIFIED IDEOGRAPH +0x8CBF 0x8AFA #CJK UNIFIED IDEOGRAPH +0x8CC0 0x9650 #CJK UNIFIED IDEOGRAPH +0x8CC1 0x4E4E #CJK UNIFIED IDEOGRAPH +0x8CC2 0x500B #CJK UNIFIED IDEOGRAPH +0x8CC3 0x53E4 #CJK UNIFIED IDEOGRAPH +0x8CC4 0x547C #CJK UNIFIED IDEOGRAPH +0x8CC5 0x56FA #CJK UNIFIED IDEOGRAPH +0x8CC6 0x59D1 #CJK UNIFIED IDEOGRAPH +0x8CC7 0x5B64 #CJK UNIFIED IDEOGRAPH +0x8CC8 0x5DF1 #CJK UNIFIED IDEOGRAPH +0x8CC9 0x5EAB #CJK UNIFIED IDEOGRAPH +0x8CCA 0x5F27 #CJK UNIFIED IDEOGRAPH +0x8CCB 0x6238 #CJK UNIFIED IDEOGRAPH +0x8CCC 0x6545 #CJK UNIFIED IDEOGRAPH +0x8CCD 0x67AF #CJK UNIFIED IDEOGRAPH +0x8CCE 0x6E56 #CJK UNIFIED IDEOGRAPH +0x8CCF 0x72D0 #CJK UNIFIED IDEOGRAPH +0x8CD0 0x7CCA #CJK UNIFIED IDEOGRAPH +0x8CD1 0x88B4 #CJK UNIFIED IDEOGRAPH +0x8CD2 0x80A1 #CJK UNIFIED IDEOGRAPH +0x8CD3 0x80E1 #CJK UNIFIED IDEOGRAPH +0x8CD4 0x83F0 #CJK UNIFIED IDEOGRAPH +0x8CD5 0x864E #CJK UNIFIED IDEOGRAPH +0x8CD6 0x8A87 #CJK UNIFIED IDEOGRAPH +0x8CD7 0x8DE8 #CJK UNIFIED IDEOGRAPH +0x8CD8 0x9237 #CJK UNIFIED IDEOGRAPH +0x8CD9 0x96C7 #CJK UNIFIED IDEOGRAPH +0x8CDA 0x9867 #CJK UNIFIED IDEOGRAPH +0x8CDB 0x9F13 #CJK UNIFIED IDEOGRAPH +0x8CDC 0x4E94 #CJK UNIFIED IDEOGRAPH +0x8CDD 0x4E92 #CJK UNIFIED IDEOGRAPH +0x8CDE 0x4F0D #CJK UNIFIED IDEOGRAPH +0x8CDF 0x5348 #CJK UNIFIED IDEOGRAPH +0x8CE0 0x5449 #CJK UNIFIED IDEOGRAPH +0x8CE1 0x543E #CJK UNIFIED IDEOGRAPH +0x8CE2 0x5A2F #CJK UNIFIED IDEOGRAPH +0x8CE3 0x5F8C #CJK UNIFIED IDEOGRAPH +0x8CE4 0x5FA1 #CJK UNIFIED IDEOGRAPH +0x8CE5 0x609F #CJK UNIFIED IDEOGRAPH +0x8CE6 0x68A7 #CJK UNIFIED IDEOGRAPH +0x8CE7 0x6A8E #CJK UNIFIED IDEOGRAPH +0x8CE8 0x745A #CJK UNIFIED IDEOGRAPH +0x8CE9 0x7881 #CJK UNIFIED IDEOGRAPH +0x8CEA 0x8A9E #CJK UNIFIED IDEOGRAPH +0x8CEB 0x8AA4 #CJK UNIFIED IDEOGRAPH +0x8CEC 0x8B77 #CJK UNIFIED IDEOGRAPH +0x8CED 0x9190 #CJK UNIFIED IDEOGRAPH +0x8CEE 0x4E5E #CJK UNIFIED IDEOGRAPH +0x8CEF 0x9BC9 #CJK UNIFIED IDEOGRAPH +0x8CF0 0x4EA4 #CJK UNIFIED IDEOGRAPH +0x8CF1 0x4F7C #CJK UNIFIED IDEOGRAPH +0x8CF2 0x4FAF #CJK UNIFIED IDEOGRAPH +0x8CF3 0x5019 #CJK UNIFIED IDEOGRAPH +0x8CF4 0x5016 #CJK UNIFIED IDEOGRAPH +0x8CF5 0x5149 #CJK UNIFIED IDEOGRAPH +0x8CF6 0x516C #CJK UNIFIED IDEOGRAPH +0x8CF7 0x529F #CJK UNIFIED IDEOGRAPH +0x8CF8 0x52B9 #CJK UNIFIED IDEOGRAPH +0x8CF9 0x52FE #CJK UNIFIED IDEOGRAPH +0x8CFA 0x539A #CJK UNIFIED IDEOGRAPH +0x8CFB 0x53E3 #CJK UNIFIED IDEOGRAPH +0x8CFC 0x5411 #CJK UNIFIED IDEOGRAPH +0x8D40 0x540E #CJK UNIFIED IDEOGRAPH +0x8D41 0x5589 #CJK UNIFIED IDEOGRAPH +0x8D42 0x5751 #CJK UNIFIED IDEOGRAPH +0x8D43 0x57A2 #CJK UNIFIED IDEOGRAPH +0x8D44 0x597D #CJK UNIFIED IDEOGRAPH +0x8D45 0x5B54 #CJK UNIFIED IDEOGRAPH +0x8D46 0x5B5D #CJK UNIFIED IDEOGRAPH +0x8D47 0x5B8F #CJK UNIFIED IDEOGRAPH +0x8D48 0x5DE5 #CJK UNIFIED IDEOGRAPH +0x8D49 0x5DE7 #CJK UNIFIED IDEOGRAPH +0x8D4A 0x5DF7 #CJK UNIFIED IDEOGRAPH +0x8D4B 0x5E78 #CJK UNIFIED IDEOGRAPH +0x8D4C 0x5E83 #CJK UNIFIED IDEOGRAPH +0x8D4D 0x5E9A #CJK UNIFIED IDEOGRAPH +0x8D4E 0x5EB7 #CJK UNIFIED IDEOGRAPH +0x8D4F 0x5F18 #CJK UNIFIED IDEOGRAPH +0x8D50 0x6052 #CJK UNIFIED IDEOGRAPH +0x8D51 0x614C #CJK UNIFIED IDEOGRAPH +0x8D52 0x6297 #CJK UNIFIED IDEOGRAPH +0x8D53 0x62D8 #CJK UNIFIED IDEOGRAPH +0x8D54 0x63A7 #CJK UNIFIED IDEOGRAPH +0x8D55 0x653B #CJK UNIFIED IDEOGRAPH +0x8D56 0x6602 #CJK UNIFIED IDEOGRAPH +0x8D57 0x6643 #CJK UNIFIED IDEOGRAPH +0x8D58 0x66F4 #CJK UNIFIED IDEOGRAPH +0x8D59 0x676D #CJK UNIFIED IDEOGRAPH +0x8D5A 0x6821 #CJK UNIFIED IDEOGRAPH +0x8D5B 0x6897 #CJK UNIFIED IDEOGRAPH +0x8D5C 0x69CB #CJK UNIFIED IDEOGRAPH +0x8D5D 0x6C5F #CJK UNIFIED IDEOGRAPH +0x8D5E 0x6D2A #CJK UNIFIED IDEOGRAPH +0x8D5F 0x6D69 #CJK UNIFIED IDEOGRAPH +0x8D60 0x6E2F #CJK UNIFIED IDEOGRAPH +0x8D61 0x6E9D #CJK UNIFIED IDEOGRAPH +0x8D62 0x7532 #CJK UNIFIED IDEOGRAPH +0x8D63 0x7687 #CJK UNIFIED IDEOGRAPH +0x8D64 0x786C #CJK UNIFIED IDEOGRAPH +0x8D65 0x7A3F #CJK UNIFIED IDEOGRAPH +0x8D66 0x7CE0 #CJK UNIFIED IDEOGRAPH +0x8D67 0x7D05 #CJK UNIFIED IDEOGRAPH +0x8D68 0x7D18 #CJK UNIFIED IDEOGRAPH +0x8D69 0x7D5E #CJK UNIFIED IDEOGRAPH +0x8D6A 0x7DB1 #CJK UNIFIED IDEOGRAPH +0x8D6B 0x8015 #CJK UNIFIED IDEOGRAPH +0x8D6C 0x8003 #CJK UNIFIED IDEOGRAPH +0x8D6D 0x80AF #CJK UNIFIED IDEOGRAPH +0x8D6E 0x80B1 #CJK UNIFIED IDEOGRAPH +0x8D6F 0x8154 #CJK UNIFIED IDEOGRAPH +0x8D70 0x818F #CJK UNIFIED IDEOGRAPH +0x8D71 0x822A #CJK UNIFIED IDEOGRAPH +0x8D72 0x8352 #CJK UNIFIED IDEOGRAPH +0x8D73 0x884C #CJK UNIFIED IDEOGRAPH +0x8D74 0x8861 #CJK UNIFIED IDEOGRAPH +0x8D75 0x8B1B #CJK UNIFIED IDEOGRAPH +0x8D76 0x8CA2 #CJK UNIFIED IDEOGRAPH +0x8D77 0x8CFC #CJK UNIFIED IDEOGRAPH +0x8D78 0x90CA #CJK UNIFIED IDEOGRAPH +0x8D79 0x9175 #CJK UNIFIED IDEOGRAPH +0x8D7A 0x9271 #CJK UNIFIED IDEOGRAPH +0x8D7B 0x783F #CJK UNIFIED IDEOGRAPH +0x8D7C 0x92FC #CJK UNIFIED IDEOGRAPH +0x8D7D 0x95A4 #CJK UNIFIED IDEOGRAPH +0x8D7E 0x964D #CJK UNIFIED IDEOGRAPH +0x8D80 0x9805 #CJK UNIFIED IDEOGRAPH +0x8D81 0x9999 #CJK UNIFIED IDEOGRAPH +0x8D82 0x9AD8 #CJK UNIFIED IDEOGRAPH +0x8D83 0x9D3B #CJK UNIFIED IDEOGRAPH +0x8D84 0x525B #CJK UNIFIED IDEOGRAPH +0x8D85 0x52AB #CJK UNIFIED IDEOGRAPH +0x8D86 0x53F7 #CJK UNIFIED IDEOGRAPH +0x8D87 0x5408 #CJK UNIFIED IDEOGRAPH +0x8D88 0x58D5 #CJK UNIFIED IDEOGRAPH +0x8D89 0x62F7 #CJK UNIFIED IDEOGRAPH +0x8D8A 0x6FE0 #CJK UNIFIED IDEOGRAPH +0x8D8B 0x8C6A #CJK UNIFIED IDEOGRAPH +0x8D8C 0x8F5F #CJK UNIFIED IDEOGRAPH +0x8D8D 0x9EB9 #CJK UNIFIED IDEOGRAPH +0x8D8E 0x514B #CJK UNIFIED IDEOGRAPH +0x8D8F 0x523B #CJK UNIFIED IDEOGRAPH +0x8D90 0x544A #CJK UNIFIED IDEOGRAPH +0x8D91 0x56FD #CJK UNIFIED IDEOGRAPH +0x8D92 0x7A40 #CJK UNIFIED IDEOGRAPH +0x8D93 0x9177 #CJK UNIFIED IDEOGRAPH +0x8D94 0x9D60 #CJK UNIFIED IDEOGRAPH +0x8D95 0x9ED2 #CJK UNIFIED IDEOGRAPH +0x8D96 0x7344 #CJK UNIFIED IDEOGRAPH +0x8D97 0x6F09 #CJK UNIFIED IDEOGRAPH +0x8D98 0x8170 #CJK UNIFIED IDEOGRAPH +0x8D99 0x7511 #CJK UNIFIED IDEOGRAPH +0x8D9A 0x5FFD #CJK UNIFIED IDEOGRAPH +0x8D9B 0x60DA #CJK UNIFIED IDEOGRAPH +0x8D9C 0x9AA8 #CJK UNIFIED IDEOGRAPH +0x8D9D 0x72DB #CJK UNIFIED IDEOGRAPH +0x8D9E 0x8FBC #CJK UNIFIED IDEOGRAPH +0x8D9F 0x6B64 #CJK UNIFIED IDEOGRAPH +0x8DA0 0x9803 #CJK UNIFIED IDEOGRAPH +0x8DA1 0x4ECA #CJK UNIFIED IDEOGRAPH +0x8DA2 0x56F0 #CJK UNIFIED IDEOGRAPH +0x8DA3 0x5764 #CJK UNIFIED IDEOGRAPH +0x8DA4 0x58BE #CJK UNIFIED IDEOGRAPH +0x8DA5 0x5A5A #CJK UNIFIED IDEOGRAPH +0x8DA6 0x6068 #CJK UNIFIED IDEOGRAPH +0x8DA7 0x61C7 #CJK UNIFIED IDEOGRAPH +0x8DA8 0x660F #CJK UNIFIED IDEOGRAPH +0x8DA9 0x6606 #CJK UNIFIED IDEOGRAPH +0x8DAA 0x6839 #CJK UNIFIED IDEOGRAPH +0x8DAB 0x68B1 #CJK UNIFIED IDEOGRAPH +0x8DAC 0x6DF7 #CJK UNIFIED IDEOGRAPH +0x8DAD 0x75D5 #CJK UNIFIED IDEOGRAPH +0x8DAE 0x7D3A #CJK UNIFIED IDEOGRAPH +0x8DAF 0x826E #CJK UNIFIED IDEOGRAPH +0x8DB0 0x9B42 #CJK UNIFIED IDEOGRAPH +0x8DB1 0x4E9B #CJK UNIFIED IDEOGRAPH +0x8DB2 0x4F50 #CJK UNIFIED IDEOGRAPH +0x8DB3 0x53C9 #CJK UNIFIED IDEOGRAPH +0x8DB4 0x5506 #CJK UNIFIED IDEOGRAPH +0x8DB5 0x5D6F #CJK UNIFIED IDEOGRAPH +0x8DB6 0x5DE6 #CJK UNIFIED IDEOGRAPH +0x8DB7 0x5DEE #CJK UNIFIED IDEOGRAPH +0x8DB8 0x67FB #CJK UNIFIED IDEOGRAPH +0x8DB9 0x6C99 #CJK UNIFIED IDEOGRAPH +0x8DBA 0x7473 #CJK UNIFIED IDEOGRAPH +0x8DBB 0x7802 #CJK UNIFIED IDEOGRAPH +0x8DBC 0x8A50 #CJK UNIFIED IDEOGRAPH +0x8DBD 0x9396 #CJK UNIFIED IDEOGRAPH +0x8DBE 0x88DF #CJK UNIFIED IDEOGRAPH +0x8DBF 0x5750 #CJK UNIFIED IDEOGRAPH +0x8DC0 0x5EA7 #CJK UNIFIED IDEOGRAPH +0x8DC1 0x632B #CJK UNIFIED IDEOGRAPH +0x8DC2 0x50B5 #CJK UNIFIED IDEOGRAPH +0x8DC3 0x50AC #CJK UNIFIED IDEOGRAPH +0x8DC4 0x518D #CJK UNIFIED IDEOGRAPH +0x8DC5 0x6700 #CJK UNIFIED IDEOGRAPH +0x8DC6 0x54C9 #CJK UNIFIED IDEOGRAPH +0x8DC7 0x585E #CJK UNIFIED IDEOGRAPH +0x8DC8 0x59BB #CJK UNIFIED IDEOGRAPH +0x8DC9 0x5BB0 #CJK UNIFIED IDEOGRAPH +0x8DCA 0x5F69 #CJK UNIFIED IDEOGRAPH +0x8DCB 0x624D #CJK UNIFIED IDEOGRAPH +0x8DCC 0x63A1 #CJK UNIFIED IDEOGRAPH +0x8DCD 0x683D #CJK UNIFIED IDEOGRAPH +0x8DCE 0x6B73 #CJK UNIFIED IDEOGRAPH +0x8DCF 0x6E08 #CJK UNIFIED IDEOGRAPH +0x8DD0 0x707D #CJK UNIFIED IDEOGRAPH +0x8DD1 0x91C7 #CJK UNIFIED IDEOGRAPH +0x8DD2 0x7280 #CJK UNIFIED IDEOGRAPH +0x8DD3 0x7815 #CJK UNIFIED IDEOGRAPH +0x8DD4 0x7826 #CJK UNIFIED IDEOGRAPH +0x8DD5 0x796D #CJK UNIFIED IDEOGRAPH +0x8DD6 0x658E #CJK UNIFIED IDEOGRAPH +0x8DD7 0x7D30 #CJK UNIFIED IDEOGRAPH +0x8DD8 0x83DC #CJK UNIFIED IDEOGRAPH +0x8DD9 0x88C1 #CJK UNIFIED IDEOGRAPH +0x8DDA 0x8F09 #CJK UNIFIED IDEOGRAPH +0x8DDB 0x969B #CJK UNIFIED IDEOGRAPH +0x8DDC 0x5264 #CJK UNIFIED IDEOGRAPH +0x8DDD 0x5728 #CJK UNIFIED IDEOGRAPH +0x8DDE 0x6750 #CJK UNIFIED IDEOGRAPH +0x8DDF 0x7F6A #CJK UNIFIED IDEOGRAPH +0x8DE0 0x8CA1 #CJK UNIFIED IDEOGRAPH +0x8DE1 0x51B4 #CJK UNIFIED IDEOGRAPH +0x8DE2 0x5742 #CJK UNIFIED IDEOGRAPH +0x8DE3 0x962A #CJK UNIFIED IDEOGRAPH +0x8DE4 0x583A #CJK UNIFIED IDEOGRAPH +0x8DE5 0x698A #CJK UNIFIED IDEOGRAPH +0x8DE6 0x80B4 #CJK UNIFIED IDEOGRAPH +0x8DE7 0x54B2 #CJK UNIFIED IDEOGRAPH +0x8DE8 0x5D0E #CJK UNIFIED IDEOGRAPH +0x8DE9 0x57FC #CJK UNIFIED IDEOGRAPH +0x8DEA 0x7895 #CJK UNIFIED IDEOGRAPH +0x8DEB 0x9DFA #CJK UNIFIED IDEOGRAPH +0x8DEC 0x4F5C #CJK UNIFIED IDEOGRAPH +0x8DED 0x524A #CJK UNIFIED IDEOGRAPH +0x8DEE 0x548B #CJK UNIFIED IDEOGRAPH +0x8DEF 0x643E #CJK UNIFIED IDEOGRAPH +0x8DF0 0x6628 #CJK UNIFIED IDEOGRAPH +0x8DF1 0x6714 #CJK UNIFIED IDEOGRAPH +0x8DF2 0x67F5 #CJK UNIFIED IDEOGRAPH +0x8DF3 0x7A84 #CJK UNIFIED IDEOGRAPH +0x8DF4 0x7B56 #CJK UNIFIED IDEOGRAPH +0x8DF5 0x7D22 #CJK UNIFIED IDEOGRAPH +0x8DF6 0x932F #CJK UNIFIED IDEOGRAPH +0x8DF7 0x685C #CJK UNIFIED IDEOGRAPH +0x8DF8 0x9BAD #CJK UNIFIED IDEOGRAPH +0x8DF9 0x7B39 #CJK UNIFIED IDEOGRAPH +0x8DFA 0x5319 #CJK UNIFIED IDEOGRAPH +0x8DFB 0x518A #CJK UNIFIED IDEOGRAPH +0x8DFC 0x5237 #CJK UNIFIED IDEOGRAPH +0x8E40 0x5BDF #CJK UNIFIED IDEOGRAPH +0x8E41 0x62F6 #CJK UNIFIED IDEOGRAPH +0x8E42 0x64AE #CJK UNIFIED IDEOGRAPH +0x8E43 0x64E6 #CJK UNIFIED IDEOGRAPH +0x8E44 0x672D #CJK UNIFIED IDEOGRAPH +0x8E45 0x6BBA #CJK UNIFIED IDEOGRAPH +0x8E46 0x85A9 #CJK UNIFIED IDEOGRAPH +0x8E47 0x96D1 #CJK UNIFIED IDEOGRAPH +0x8E48 0x7690 #CJK UNIFIED IDEOGRAPH +0x8E49 0x9BD6 #CJK UNIFIED IDEOGRAPH +0x8E4A 0x634C #CJK UNIFIED IDEOGRAPH +0x8E4B 0x9306 #CJK UNIFIED IDEOGRAPH +0x8E4C 0x9BAB #CJK UNIFIED IDEOGRAPH +0x8E4D 0x76BF #CJK UNIFIED IDEOGRAPH +0x8E4E 0x6652 #CJK UNIFIED IDEOGRAPH +0x8E4F 0x4E09 #CJK UNIFIED IDEOGRAPH +0x8E50 0x5098 #CJK UNIFIED IDEOGRAPH +0x8E51 0x53C2 #CJK UNIFIED IDEOGRAPH +0x8E52 0x5C71 #CJK UNIFIED IDEOGRAPH +0x8E53 0x60E8 #CJK UNIFIED IDEOGRAPH +0x8E54 0x6492 #CJK UNIFIED IDEOGRAPH +0x8E55 0x6563 #CJK UNIFIED IDEOGRAPH +0x8E56 0x685F #CJK UNIFIED IDEOGRAPH +0x8E57 0x71E6 #CJK UNIFIED IDEOGRAPH +0x8E58 0x73CA #CJK UNIFIED IDEOGRAPH +0x8E59 0x7523 #CJK UNIFIED IDEOGRAPH +0x8E5A 0x7B97 #CJK UNIFIED IDEOGRAPH +0x8E5B 0x7E82 #CJK UNIFIED IDEOGRAPH +0x8E5C 0x8695 #CJK UNIFIED IDEOGRAPH +0x8E5D 0x8B83 #CJK UNIFIED IDEOGRAPH +0x8E5E 0x8CDB #CJK UNIFIED IDEOGRAPH +0x8E5F 0x9178 #CJK UNIFIED IDEOGRAPH +0x8E60 0x9910 #CJK UNIFIED IDEOGRAPH +0x8E61 0x65AC #CJK UNIFIED IDEOGRAPH +0x8E62 0x66AB #CJK UNIFIED IDEOGRAPH +0x8E63 0x6B8B #CJK UNIFIED IDEOGRAPH +0x8E64 0x4ED5 #CJK UNIFIED IDEOGRAPH +0x8E65 0x4ED4 #CJK UNIFIED IDEOGRAPH +0x8E66 0x4F3A #CJK UNIFIED IDEOGRAPH +0x8E67 0x4F7F #CJK UNIFIED IDEOGRAPH +0x8E68 0x523A #CJK UNIFIED IDEOGRAPH +0x8E69 0x53F8 #CJK UNIFIED IDEOGRAPH +0x8E6A 0x53F2 #CJK UNIFIED IDEOGRAPH +0x8E6B 0x55E3 #CJK UNIFIED IDEOGRAPH +0x8E6C 0x56DB #CJK UNIFIED IDEOGRAPH +0x8E6D 0x58EB #CJK UNIFIED IDEOGRAPH +0x8E6E 0x59CB #CJK UNIFIED IDEOGRAPH +0x8E6F 0x59C9 #CJK UNIFIED IDEOGRAPH +0x8E70 0x59FF #CJK UNIFIED IDEOGRAPH +0x8E71 0x5B50 #CJK UNIFIED IDEOGRAPH +0x8E72 0x5C4D #CJK UNIFIED IDEOGRAPH +0x8E73 0x5E02 #CJK UNIFIED IDEOGRAPH +0x8E74 0x5E2B #CJK UNIFIED IDEOGRAPH +0x8E75 0x5FD7 #CJK UNIFIED IDEOGRAPH +0x8E76 0x601D #CJK UNIFIED IDEOGRAPH +0x8E77 0x6307 #CJK UNIFIED IDEOGRAPH +0x8E78 0x652F #CJK UNIFIED IDEOGRAPH +0x8E79 0x5B5C #CJK UNIFIED IDEOGRAPH +0x8E7A 0x65AF #CJK UNIFIED IDEOGRAPH +0x8E7B 0x65BD #CJK UNIFIED IDEOGRAPH +0x8E7C 0x65E8 #CJK UNIFIED IDEOGRAPH +0x8E7D 0x679D #CJK UNIFIED IDEOGRAPH +0x8E7E 0x6B62 #CJK UNIFIED IDEOGRAPH +0x8E80 0x6B7B #CJK UNIFIED IDEOGRAPH +0x8E81 0x6C0F #CJK UNIFIED IDEOGRAPH +0x8E82 0x7345 #CJK UNIFIED IDEOGRAPH +0x8E83 0x7949 #CJK UNIFIED IDEOGRAPH +0x8E84 0x79C1 #CJK UNIFIED IDEOGRAPH +0x8E85 0x7CF8 #CJK UNIFIED IDEOGRAPH +0x8E86 0x7D19 #CJK UNIFIED IDEOGRAPH +0x8E87 0x7D2B #CJK UNIFIED IDEOGRAPH +0x8E88 0x80A2 #CJK UNIFIED IDEOGRAPH +0x8E89 0x8102 #CJK UNIFIED IDEOGRAPH +0x8E8A 0x81F3 #CJK UNIFIED IDEOGRAPH +0x8E8B 0x8996 #CJK UNIFIED IDEOGRAPH +0x8E8C 0x8A5E #CJK UNIFIED IDEOGRAPH +0x8E8D 0x8A69 #CJK UNIFIED IDEOGRAPH +0x8E8E 0x8A66 #CJK UNIFIED IDEOGRAPH +0x8E8F 0x8A8C #CJK UNIFIED IDEOGRAPH +0x8E90 0x8AEE #CJK UNIFIED IDEOGRAPH +0x8E91 0x8CC7 #CJK UNIFIED IDEOGRAPH +0x8E92 0x8CDC #CJK UNIFIED IDEOGRAPH +0x8E93 0x96CC #CJK UNIFIED IDEOGRAPH +0x8E94 0x98FC #CJK UNIFIED IDEOGRAPH +0x8E95 0x6B6F #CJK UNIFIED IDEOGRAPH +0x8E96 0x4E8B #CJK UNIFIED IDEOGRAPH +0x8E97 0x4F3C #CJK UNIFIED IDEOGRAPH +0x8E98 0x4F8D #CJK UNIFIED IDEOGRAPH +0x8E99 0x5150 #CJK UNIFIED IDEOGRAPH +0x8E9A 0x5B57 #CJK UNIFIED IDEOGRAPH +0x8E9B 0x5BFA #CJK UNIFIED IDEOGRAPH +0x8E9C 0x6148 #CJK UNIFIED IDEOGRAPH +0x8E9D 0x6301 #CJK UNIFIED IDEOGRAPH +0x8E9E 0x6642 #CJK UNIFIED IDEOGRAPH +0x8E9F 0x6B21 #CJK UNIFIED IDEOGRAPH +0x8EA0 0x6ECB #CJK UNIFIED IDEOGRAPH +0x8EA1 0x6CBB #CJK UNIFIED IDEOGRAPH +0x8EA2 0x723E #CJK UNIFIED IDEOGRAPH +0x8EA3 0x74BD #CJK UNIFIED IDEOGRAPH +0x8EA4 0x75D4 #CJK UNIFIED IDEOGRAPH +0x8EA5 0x78C1 #CJK UNIFIED IDEOGRAPH +0x8EA6 0x793A #CJK UNIFIED IDEOGRAPH +0x8EA7 0x800C #CJK UNIFIED IDEOGRAPH +0x8EA8 0x8033 #CJK UNIFIED IDEOGRAPH +0x8EA9 0x81EA #CJK UNIFIED IDEOGRAPH +0x8EAA 0x8494 #CJK UNIFIED IDEOGRAPH +0x8EAB 0x8F9E #CJK UNIFIED IDEOGRAPH +0x8EAC 0x6C50 #CJK UNIFIED IDEOGRAPH +0x8EAD 0x9E7F #CJK UNIFIED IDEOGRAPH +0x8EAE 0x5F0F #CJK UNIFIED IDEOGRAPH +0x8EAF 0x8B58 #CJK UNIFIED IDEOGRAPH +0x8EB0 0x9D2B #CJK UNIFIED IDEOGRAPH +0x8EB1 0x7AFA #CJK UNIFIED IDEOGRAPH +0x8EB2 0x8EF8 #CJK UNIFIED IDEOGRAPH +0x8EB3 0x5B8D #CJK UNIFIED IDEOGRAPH +0x8EB4 0x96EB #CJK UNIFIED IDEOGRAPH +0x8EB5 0x4E03 #CJK UNIFIED IDEOGRAPH +0x8EB6 0x53F1 #CJK UNIFIED IDEOGRAPH +0x8EB7 0x57F7 #CJK UNIFIED IDEOGRAPH +0x8EB8 0x5931 #CJK UNIFIED IDEOGRAPH +0x8EB9 0x5AC9 #CJK UNIFIED IDEOGRAPH +0x8EBA 0x5BA4 #CJK UNIFIED IDEOGRAPH +0x8EBB 0x6089 #CJK UNIFIED IDEOGRAPH +0x8EBC 0x6E7F #CJK UNIFIED IDEOGRAPH +0x8EBD 0x6F06 #CJK UNIFIED IDEOGRAPH +0x8EBE 0x75BE #CJK UNIFIED IDEOGRAPH +0x8EBF 0x8CEA #CJK UNIFIED IDEOGRAPH +0x8EC0 0x5B9F #CJK UNIFIED IDEOGRAPH +0x8EC1 0x8500 #CJK UNIFIED IDEOGRAPH +0x8EC2 0x7BE0 #CJK UNIFIED IDEOGRAPH +0x8EC3 0x5072 #CJK UNIFIED IDEOGRAPH +0x8EC4 0x67F4 #CJK UNIFIED IDEOGRAPH +0x8EC5 0x829D #CJK UNIFIED IDEOGRAPH +0x8EC6 0x5C61 #CJK UNIFIED IDEOGRAPH +0x8EC7 0x854A #CJK UNIFIED IDEOGRAPH +0x8EC8 0x7E1E #CJK UNIFIED IDEOGRAPH +0x8EC9 0x820E #CJK UNIFIED IDEOGRAPH +0x8ECA 0x5199 #CJK UNIFIED IDEOGRAPH +0x8ECB 0x5C04 #CJK UNIFIED IDEOGRAPH +0x8ECC 0x6368 #CJK UNIFIED IDEOGRAPH +0x8ECD 0x8D66 #CJK UNIFIED IDEOGRAPH +0x8ECE 0x659C #CJK UNIFIED IDEOGRAPH +0x8ECF 0x716E #CJK UNIFIED IDEOGRAPH +0x8ED0 0x793E #CJK UNIFIED IDEOGRAPH +0x8ED1 0x7D17 #CJK UNIFIED IDEOGRAPH +0x8ED2 0x8005 #CJK UNIFIED IDEOGRAPH +0x8ED3 0x8B1D #CJK UNIFIED IDEOGRAPH +0x8ED4 0x8ECA #CJK UNIFIED IDEOGRAPH +0x8ED5 0x906E #CJK UNIFIED IDEOGRAPH +0x8ED6 0x86C7 #CJK UNIFIED IDEOGRAPH +0x8ED7 0x90AA #CJK UNIFIED IDEOGRAPH +0x8ED8 0x501F #CJK UNIFIED IDEOGRAPH +0x8ED9 0x52FA #CJK UNIFIED IDEOGRAPH +0x8EDA 0x5C3A #CJK UNIFIED IDEOGRAPH +0x8EDB 0x6753 #CJK UNIFIED IDEOGRAPH +0x8EDC 0x707C #CJK UNIFIED IDEOGRAPH +0x8EDD 0x7235 #CJK UNIFIED IDEOGRAPH +0x8EDE 0x914C #CJK UNIFIED IDEOGRAPH +0x8EDF 0x91C8 #CJK UNIFIED IDEOGRAPH +0x8EE0 0x932B #CJK UNIFIED IDEOGRAPH +0x8EE1 0x82E5 #CJK UNIFIED IDEOGRAPH +0x8EE2 0x5BC2 #CJK UNIFIED IDEOGRAPH +0x8EE3 0x5F31 #CJK UNIFIED IDEOGRAPH +0x8EE4 0x60F9 #CJK UNIFIED IDEOGRAPH +0x8EE5 0x4E3B #CJK UNIFIED IDEOGRAPH +0x8EE6 0x53D6 #CJK UNIFIED IDEOGRAPH +0x8EE7 0x5B88 #CJK UNIFIED IDEOGRAPH +0x8EE8 0x624B #CJK UNIFIED IDEOGRAPH +0x8EE9 0x6731 #CJK UNIFIED IDEOGRAPH +0x8EEA 0x6B8A #CJK UNIFIED IDEOGRAPH +0x8EEB 0x72E9 #CJK UNIFIED IDEOGRAPH +0x8EEC 0x73E0 #CJK UNIFIED IDEOGRAPH +0x8EED 0x7A2E #CJK UNIFIED IDEOGRAPH +0x8EEE 0x816B #CJK UNIFIED IDEOGRAPH +0x8EEF 0x8DA3 #CJK UNIFIED IDEOGRAPH +0x8EF0 0x9152 #CJK UNIFIED IDEOGRAPH +0x8EF1 0x9996 #CJK UNIFIED IDEOGRAPH +0x8EF2 0x5112 #CJK UNIFIED IDEOGRAPH +0x8EF3 0x53D7 #CJK UNIFIED IDEOGRAPH +0x8EF4 0x546A #CJK UNIFIED IDEOGRAPH +0x8EF5 0x5BFF #CJK UNIFIED IDEOGRAPH +0x8EF6 0x6388 #CJK UNIFIED IDEOGRAPH +0x8EF7 0x6A39 #CJK UNIFIED IDEOGRAPH +0x8EF8 0x7DAC #CJK UNIFIED IDEOGRAPH +0x8EF9 0x9700 #CJK UNIFIED IDEOGRAPH +0x8EFA 0x56DA #CJK UNIFIED IDEOGRAPH +0x8EFB 0x53CE #CJK UNIFIED IDEOGRAPH +0x8EFC 0x5468 #CJK UNIFIED IDEOGRAPH +0x8F40 0x5B97 #CJK UNIFIED IDEOGRAPH +0x8F41 0x5C31 #CJK UNIFIED IDEOGRAPH +0x8F42 0x5DDE #CJK UNIFIED IDEOGRAPH +0x8F43 0x4FEE #CJK UNIFIED IDEOGRAPH +0x8F44 0x6101 #CJK UNIFIED IDEOGRAPH +0x8F45 0x62FE #CJK UNIFIED IDEOGRAPH +0x8F46 0x6D32 #CJK UNIFIED IDEOGRAPH +0x8F47 0x79C0 #CJK UNIFIED IDEOGRAPH +0x8F48 0x79CB #CJK UNIFIED IDEOGRAPH +0x8F49 0x7D42 #CJK UNIFIED IDEOGRAPH +0x8F4A 0x7E4D #CJK UNIFIED IDEOGRAPH +0x8F4B 0x7FD2 #CJK UNIFIED IDEOGRAPH +0x8F4C 0x81ED #CJK UNIFIED IDEOGRAPH +0x8F4D 0x821F #CJK UNIFIED IDEOGRAPH +0x8F4E 0x8490 #CJK UNIFIED IDEOGRAPH +0x8F4F 0x8846 #CJK UNIFIED IDEOGRAPH +0x8F50 0x8972 #CJK UNIFIED IDEOGRAPH +0x8F51 0x8B90 #CJK UNIFIED IDEOGRAPH +0x8F52 0x8E74 #CJK UNIFIED IDEOGRAPH +0x8F53 0x8F2F #CJK UNIFIED IDEOGRAPH +0x8F54 0x9031 #CJK UNIFIED IDEOGRAPH +0x8F55 0x914B #CJK UNIFIED IDEOGRAPH +0x8F56 0x916C #CJK UNIFIED IDEOGRAPH +0x8F57 0x96C6 #CJK UNIFIED IDEOGRAPH +0x8F58 0x919C #CJK UNIFIED IDEOGRAPH +0x8F59 0x4EC0 #CJK UNIFIED IDEOGRAPH +0x8F5A 0x4F4F #CJK UNIFIED IDEOGRAPH +0x8F5B 0x5145 #CJK UNIFIED IDEOGRAPH +0x8F5C 0x5341 #CJK UNIFIED IDEOGRAPH +0x8F5D 0x5F93 #CJK UNIFIED IDEOGRAPH +0x8F5E 0x620E #CJK UNIFIED IDEOGRAPH +0x8F5F 0x67D4 #CJK UNIFIED IDEOGRAPH +0x8F60 0x6C41 #CJK UNIFIED IDEOGRAPH +0x8F61 0x6E0B #CJK UNIFIED IDEOGRAPH +0x8F62 0x7363 #CJK UNIFIED IDEOGRAPH +0x8F63 0x7E26 #CJK UNIFIED IDEOGRAPH +0x8F64 0x91CD #CJK UNIFIED IDEOGRAPH +0x8F65 0x9283 #CJK UNIFIED IDEOGRAPH +0x8F66 0x53D4 #CJK UNIFIED IDEOGRAPH +0x8F67 0x5919 #CJK UNIFIED IDEOGRAPH +0x8F68 0x5BBF #CJK UNIFIED IDEOGRAPH +0x8F69 0x6DD1 #CJK UNIFIED IDEOGRAPH +0x8F6A 0x795D #CJK UNIFIED IDEOGRAPH +0x8F6B 0x7E2E #CJK UNIFIED IDEOGRAPH +0x8F6C 0x7C9B #CJK UNIFIED IDEOGRAPH +0x8F6D 0x587E #CJK UNIFIED IDEOGRAPH +0x8F6E 0x719F #CJK UNIFIED IDEOGRAPH +0x8F6F 0x51FA #CJK UNIFIED IDEOGRAPH +0x8F70 0x8853 #CJK UNIFIED IDEOGRAPH +0x8F71 0x8FF0 #CJK UNIFIED IDEOGRAPH +0x8F72 0x4FCA #CJK UNIFIED IDEOGRAPH +0x8F73 0x5CFB #CJK UNIFIED IDEOGRAPH +0x8F74 0x6625 #CJK UNIFIED IDEOGRAPH +0x8F75 0x77AC #CJK UNIFIED IDEOGRAPH +0x8F76 0x7AE3 #CJK UNIFIED IDEOGRAPH +0x8F77 0x821C #CJK UNIFIED IDEOGRAPH +0x8F78 0x99FF #CJK UNIFIED IDEOGRAPH +0x8F79 0x51C6 #CJK UNIFIED IDEOGRAPH +0x8F7A 0x5FAA #CJK UNIFIED IDEOGRAPH +0x8F7B 0x65EC #CJK UNIFIED IDEOGRAPH +0x8F7C 0x696F #CJK UNIFIED IDEOGRAPH +0x8F7D 0x6B89 #CJK UNIFIED IDEOGRAPH +0x8F7E 0x6DF3 #CJK UNIFIED IDEOGRAPH +0x8F80 0x6E96 #CJK UNIFIED IDEOGRAPH +0x8F81 0x6F64 #CJK UNIFIED IDEOGRAPH +0x8F82 0x76FE #CJK UNIFIED IDEOGRAPH +0x8F83 0x7D14 #CJK UNIFIED IDEOGRAPH +0x8F84 0x5DE1 #CJK UNIFIED IDEOGRAPH +0x8F85 0x9075 #CJK UNIFIED IDEOGRAPH +0x8F86 0x9187 #CJK UNIFIED IDEOGRAPH +0x8F87 0x9806 #CJK UNIFIED IDEOGRAPH +0x8F88 0x51E6 #CJK UNIFIED IDEOGRAPH +0x8F89 0x521D #CJK UNIFIED IDEOGRAPH +0x8F8A 0x6240 #CJK UNIFIED IDEOGRAPH +0x8F8B 0x6691 #CJK UNIFIED IDEOGRAPH +0x8F8C 0x66D9 #CJK UNIFIED IDEOGRAPH +0x8F8D 0x6E1A #CJK UNIFIED IDEOGRAPH +0x8F8E 0x5EB6 #CJK UNIFIED IDEOGRAPH +0x8F8F 0x7DD2 #CJK UNIFIED IDEOGRAPH +0x8F90 0x7F72 #CJK UNIFIED IDEOGRAPH +0x8F91 0x66F8 #CJK UNIFIED IDEOGRAPH +0x8F92 0x85AF #CJK UNIFIED IDEOGRAPH +0x8F93 0x85F7 #CJK UNIFIED IDEOGRAPH +0x8F94 0x8AF8 #CJK UNIFIED IDEOGRAPH +0x8F95 0x52A9 #CJK UNIFIED IDEOGRAPH +0x8F96 0x53D9 #CJK UNIFIED IDEOGRAPH +0x8F97 0x5973 #CJK UNIFIED IDEOGRAPH +0x8F98 0x5E8F #CJK UNIFIED IDEOGRAPH +0x8F99 0x5F90 #CJK UNIFIED IDEOGRAPH +0x8F9A 0x6055 #CJK UNIFIED IDEOGRAPH +0x8F9B 0x92E4 #CJK UNIFIED IDEOGRAPH +0x8F9C 0x9664 #CJK UNIFIED IDEOGRAPH +0x8F9D 0x50B7 #CJK UNIFIED IDEOGRAPH +0x8F9E 0x511F #CJK UNIFIED IDEOGRAPH +0x8F9F 0x52DD #CJK UNIFIED IDEOGRAPH +0x8FA0 0x5320 #CJK UNIFIED IDEOGRAPH +0x8FA1 0x5347 #CJK UNIFIED IDEOGRAPH +0x8FA2 0x53EC #CJK UNIFIED IDEOGRAPH +0x8FA3 0x54E8 #CJK UNIFIED IDEOGRAPH +0x8FA4 0x5546 #CJK UNIFIED IDEOGRAPH +0x8FA5 0x5531 #CJK UNIFIED IDEOGRAPH +0x8FA6 0x5617 #CJK UNIFIED IDEOGRAPH +0x8FA7 0x5968 #CJK UNIFIED IDEOGRAPH +0x8FA8 0x59BE #CJK UNIFIED IDEOGRAPH +0x8FA9 0x5A3C #CJK UNIFIED IDEOGRAPH +0x8FAA 0x5BB5 #CJK UNIFIED IDEOGRAPH +0x8FAB 0x5C06 #CJK UNIFIED IDEOGRAPH +0x8FAC 0x5C0F #CJK UNIFIED IDEOGRAPH +0x8FAD 0x5C11 #CJK UNIFIED IDEOGRAPH +0x8FAE 0x5C1A #CJK UNIFIED IDEOGRAPH +0x8FAF 0x5E84 #CJK UNIFIED IDEOGRAPH +0x8FB0 0x5E8A #CJK UNIFIED IDEOGRAPH +0x8FB1 0x5EE0 #CJK UNIFIED IDEOGRAPH +0x8FB2 0x5F70 #CJK UNIFIED IDEOGRAPH +0x8FB3 0x627F #CJK UNIFIED IDEOGRAPH +0x8FB4 0x6284 #CJK UNIFIED IDEOGRAPH +0x8FB5 0x62DB #CJK UNIFIED IDEOGRAPH +0x8FB6 0x638C #CJK UNIFIED IDEOGRAPH +0x8FB7 0x6377 #CJK UNIFIED IDEOGRAPH +0x8FB8 0x6607 #CJK UNIFIED IDEOGRAPH +0x8FB9 0x660C #CJK UNIFIED IDEOGRAPH +0x8FBA 0x662D #CJK UNIFIED IDEOGRAPH +0x8FBB 0x6676 #CJK UNIFIED IDEOGRAPH +0x8FBC 0x677E #CJK UNIFIED IDEOGRAPH +0x8FBD 0x68A2 #CJK UNIFIED IDEOGRAPH +0x8FBE 0x6A1F #CJK UNIFIED IDEOGRAPH +0x8FBF 0x6A35 #CJK UNIFIED IDEOGRAPH +0x8FC0 0x6CBC #CJK UNIFIED IDEOGRAPH +0x8FC1 0x6D88 #CJK UNIFIED IDEOGRAPH +0x8FC2 0x6E09 #CJK UNIFIED IDEOGRAPH +0x8FC3 0x6E58 #CJK UNIFIED IDEOGRAPH +0x8FC4 0x713C #CJK UNIFIED IDEOGRAPH +0x8FC5 0x7126 #CJK UNIFIED IDEOGRAPH +0x8FC6 0x7167 #CJK UNIFIED IDEOGRAPH +0x8FC7 0x75C7 #CJK UNIFIED IDEOGRAPH +0x8FC8 0x7701 #CJK UNIFIED IDEOGRAPH +0x8FC9 0x785D #CJK UNIFIED IDEOGRAPH +0x8FCA 0x7901 #CJK UNIFIED IDEOGRAPH +0x8FCB 0x7965 #CJK UNIFIED IDEOGRAPH +0x8FCC 0x79F0 #CJK UNIFIED IDEOGRAPH +0x8FCD 0x7AE0 #CJK UNIFIED IDEOGRAPH +0x8FCE 0x7B11 #CJK UNIFIED IDEOGRAPH +0x8FCF 0x7CA7 #CJK UNIFIED IDEOGRAPH +0x8FD0 0x7D39 #CJK UNIFIED IDEOGRAPH +0x8FD1 0x8096 #CJK UNIFIED IDEOGRAPH +0x8FD2 0x83D6 #CJK UNIFIED IDEOGRAPH +0x8FD3 0x848B #CJK UNIFIED IDEOGRAPH +0x8FD4 0x8549 #CJK UNIFIED IDEOGRAPH +0x8FD5 0x885D #CJK UNIFIED IDEOGRAPH +0x8FD6 0x88F3 #CJK UNIFIED IDEOGRAPH +0x8FD7 0x8A1F #CJK UNIFIED IDEOGRAPH +0x8FD8 0x8A3C #CJK UNIFIED IDEOGRAPH +0x8FD9 0x8A54 #CJK UNIFIED IDEOGRAPH +0x8FDA 0x8A73 #CJK UNIFIED IDEOGRAPH +0x8FDB 0x8C61 #CJK UNIFIED IDEOGRAPH +0x8FDC 0x8CDE #CJK UNIFIED IDEOGRAPH +0x8FDD 0x91A4 #CJK UNIFIED IDEOGRAPH +0x8FDE 0x9266 #CJK UNIFIED IDEOGRAPH +0x8FDF 0x937E #CJK UNIFIED IDEOGRAPH +0x8FE0 0x9418 #CJK UNIFIED IDEOGRAPH +0x8FE1 0x969C #CJK UNIFIED IDEOGRAPH +0x8FE2 0x9798 #CJK UNIFIED IDEOGRAPH +0x8FE3 0x4E0A #CJK UNIFIED IDEOGRAPH +0x8FE4 0x4E08 #CJK UNIFIED IDEOGRAPH +0x8FE5 0x4E1E #CJK UNIFIED IDEOGRAPH +0x8FE6 0x4E57 #CJK UNIFIED IDEOGRAPH +0x8FE7 0x5197 #CJK UNIFIED IDEOGRAPH +0x8FE8 0x5270 #CJK UNIFIED IDEOGRAPH +0x8FE9 0x57CE #CJK UNIFIED IDEOGRAPH +0x8FEA 0x5834 #CJK UNIFIED IDEOGRAPH +0x8FEB 0x58CC #CJK UNIFIED IDEOGRAPH +0x8FEC 0x5B22 #CJK UNIFIED IDEOGRAPH +0x8FED 0x5E38 #CJK UNIFIED IDEOGRAPH +0x8FEE 0x60C5 #CJK UNIFIED IDEOGRAPH +0x8FEF 0x64FE #CJK UNIFIED IDEOGRAPH +0x8FF0 0x6761 #CJK UNIFIED IDEOGRAPH +0x8FF1 0x6756 #CJK UNIFIED IDEOGRAPH +0x8FF2 0x6D44 #CJK UNIFIED IDEOGRAPH +0x8FF3 0x72B6 #CJK UNIFIED IDEOGRAPH +0x8FF4 0x7573 #CJK UNIFIED IDEOGRAPH +0x8FF5 0x7A63 #CJK UNIFIED IDEOGRAPH +0x8FF6 0x84B8 #CJK UNIFIED IDEOGRAPH +0x8FF7 0x8B72 #CJK UNIFIED IDEOGRAPH +0x8FF8 0x91B8 #CJK UNIFIED IDEOGRAPH +0x8FF9 0x9320 #CJK UNIFIED IDEOGRAPH +0x8FFA 0x5631 #CJK UNIFIED IDEOGRAPH +0x8FFB 0x57F4 #CJK UNIFIED IDEOGRAPH +0x8FFC 0x98FE #CJK UNIFIED IDEOGRAPH +0x9040 0x62ED #CJK UNIFIED IDEOGRAPH +0x9041 0x690D #CJK UNIFIED IDEOGRAPH +0x9042 0x6B96 #CJK UNIFIED IDEOGRAPH +0x9043 0x71ED #CJK UNIFIED IDEOGRAPH +0x9044 0x7E54 #CJK UNIFIED IDEOGRAPH +0x9045 0x8077 #CJK UNIFIED IDEOGRAPH +0x9046 0x8272 #CJK UNIFIED IDEOGRAPH +0x9047 0x89E6 #CJK UNIFIED IDEOGRAPH +0x9048 0x98DF #CJK UNIFIED IDEOGRAPH +0x9049 0x8755 #CJK UNIFIED IDEOGRAPH +0x904A 0x8FB1 #CJK UNIFIED IDEOGRAPH +0x904B 0x5C3B #CJK UNIFIED IDEOGRAPH +0x904C 0x4F38 #CJK UNIFIED IDEOGRAPH +0x904D 0x4FE1 #CJK UNIFIED IDEOGRAPH +0x904E 0x4FB5 #CJK UNIFIED IDEOGRAPH +0x904F 0x5507 #CJK UNIFIED IDEOGRAPH +0x9050 0x5A20 #CJK UNIFIED IDEOGRAPH +0x9051 0x5BDD #CJK UNIFIED IDEOGRAPH +0x9052 0x5BE9 #CJK UNIFIED IDEOGRAPH +0x9053 0x5FC3 #CJK UNIFIED IDEOGRAPH +0x9054 0x614E #CJK UNIFIED IDEOGRAPH +0x9055 0x632F #CJK UNIFIED IDEOGRAPH +0x9056 0x65B0 #CJK UNIFIED IDEOGRAPH +0x9057 0x664B #CJK UNIFIED IDEOGRAPH +0x9058 0x68EE #CJK UNIFIED IDEOGRAPH +0x9059 0x699B #CJK UNIFIED IDEOGRAPH +0x905A 0x6D78 #CJK UNIFIED IDEOGRAPH +0x905B 0x6DF1 #CJK UNIFIED IDEOGRAPH +0x905C 0x7533 #CJK UNIFIED IDEOGRAPH +0x905D 0x75B9 #CJK UNIFIED IDEOGRAPH +0x905E 0x771F #CJK UNIFIED IDEOGRAPH +0x905F 0x795E #CJK UNIFIED IDEOGRAPH +0x9060 0x79E6 #CJK UNIFIED IDEOGRAPH +0x9061 0x7D33 #CJK UNIFIED IDEOGRAPH +0x9062 0x81E3 #CJK UNIFIED IDEOGRAPH +0x9063 0x82AF #CJK UNIFIED IDEOGRAPH +0x9064 0x85AA #CJK UNIFIED IDEOGRAPH +0x9065 0x89AA #CJK UNIFIED IDEOGRAPH +0x9066 0x8A3A #CJK UNIFIED IDEOGRAPH +0x9067 0x8EAB #CJK UNIFIED IDEOGRAPH +0x9068 0x8F9B #CJK UNIFIED IDEOGRAPH +0x9069 0x9032 #CJK UNIFIED IDEOGRAPH +0x906A 0x91DD #CJK UNIFIED IDEOGRAPH +0x906B 0x9707 #CJK UNIFIED IDEOGRAPH +0x906C 0x4EBA #CJK UNIFIED IDEOGRAPH +0x906D 0x4EC1 #CJK UNIFIED IDEOGRAPH +0x906E 0x5203 #CJK UNIFIED IDEOGRAPH +0x906F 0x5875 #CJK UNIFIED IDEOGRAPH +0x9070 0x58EC #CJK UNIFIED IDEOGRAPH +0x9071 0x5C0B #CJK UNIFIED IDEOGRAPH +0x9072 0x751A #CJK UNIFIED IDEOGRAPH +0x9073 0x5C3D #CJK UNIFIED IDEOGRAPH +0x9074 0x814E #CJK UNIFIED IDEOGRAPH +0x9075 0x8A0A #CJK UNIFIED IDEOGRAPH +0x9076 0x8FC5 #CJK UNIFIED IDEOGRAPH +0x9077 0x9663 #CJK UNIFIED IDEOGRAPH +0x9078 0x976D #CJK UNIFIED IDEOGRAPH +0x9079 0x7B25 #CJK UNIFIED IDEOGRAPH +0x907A 0x8ACF #CJK UNIFIED IDEOGRAPH +0x907B 0x9808 #CJK UNIFIED IDEOGRAPH +0x907C 0x9162 #CJK UNIFIED IDEOGRAPH +0x907D 0x56F3 #CJK UNIFIED IDEOGRAPH +0x907E 0x53A8 #CJK UNIFIED IDEOGRAPH +0x9080 0x9017 #CJK UNIFIED IDEOGRAPH +0x9081 0x5439 #CJK UNIFIED IDEOGRAPH +0x9082 0x5782 #CJK UNIFIED IDEOGRAPH +0x9083 0x5E25 #CJK UNIFIED IDEOGRAPH +0x9084 0x63A8 #CJK UNIFIED IDEOGRAPH +0x9085 0x6C34 #CJK UNIFIED IDEOGRAPH +0x9086 0x708A #CJK UNIFIED IDEOGRAPH +0x9087 0x7761 #CJK UNIFIED IDEOGRAPH +0x9088 0x7C8B #CJK UNIFIED IDEOGRAPH +0x9089 0x7FE0 #CJK UNIFIED IDEOGRAPH +0x908A 0x8870 #CJK UNIFIED IDEOGRAPH +0x908B 0x9042 #CJK UNIFIED IDEOGRAPH +0x908C 0x9154 #CJK UNIFIED IDEOGRAPH +0x908D 0x9310 #CJK UNIFIED IDEOGRAPH +0x908E 0x9318 #CJK UNIFIED IDEOGRAPH +0x908F 0x968F #CJK UNIFIED IDEOGRAPH +0x9090 0x745E #CJK UNIFIED IDEOGRAPH +0x9091 0x9AC4 #CJK UNIFIED IDEOGRAPH +0x9092 0x5D07 #CJK UNIFIED IDEOGRAPH +0x9093 0x5D69 #CJK UNIFIED IDEOGRAPH +0x9094 0x6570 #CJK UNIFIED IDEOGRAPH +0x9095 0x67A2 #CJK UNIFIED IDEOGRAPH +0x9096 0x8DA8 #CJK UNIFIED IDEOGRAPH +0x9097 0x96DB #CJK UNIFIED IDEOGRAPH +0x9098 0x636E #CJK UNIFIED IDEOGRAPH +0x9099 0x6749 #CJK UNIFIED IDEOGRAPH +0x909A 0x6919 #CJK UNIFIED IDEOGRAPH +0x909B 0x83C5 #CJK UNIFIED IDEOGRAPH +0x909C 0x9817 #CJK UNIFIED IDEOGRAPH +0x909D 0x96C0 #CJK UNIFIED IDEOGRAPH +0x909E 0x88FE #CJK UNIFIED IDEOGRAPH +0x909F 0x6F84 #CJK UNIFIED IDEOGRAPH +0x90A0 0x647A #CJK UNIFIED IDEOGRAPH +0x90A1 0x5BF8 #CJK UNIFIED IDEOGRAPH +0x90A2 0x4E16 #CJK UNIFIED IDEOGRAPH +0x90A3 0x702C #CJK UNIFIED IDEOGRAPH +0x90A4 0x755D #CJK UNIFIED IDEOGRAPH +0x90A5 0x662F #CJK UNIFIED IDEOGRAPH +0x90A6 0x51C4 #CJK UNIFIED IDEOGRAPH +0x90A7 0x5236 #CJK UNIFIED IDEOGRAPH +0x90A8 0x52E2 #CJK UNIFIED IDEOGRAPH +0x90A9 0x59D3 #CJK UNIFIED IDEOGRAPH +0x90AA 0x5F81 #CJK UNIFIED IDEOGRAPH +0x90AB 0x6027 #CJK UNIFIED IDEOGRAPH +0x90AC 0x6210 #CJK UNIFIED IDEOGRAPH +0x90AD 0x653F #CJK UNIFIED IDEOGRAPH +0x90AE 0x6574 #CJK UNIFIED IDEOGRAPH +0x90AF 0x661F #CJK UNIFIED IDEOGRAPH +0x90B0 0x6674 #CJK UNIFIED IDEOGRAPH +0x90B1 0x68F2 #CJK UNIFIED IDEOGRAPH +0x90B2 0x6816 #CJK UNIFIED IDEOGRAPH +0x90B3 0x6B63 #CJK UNIFIED IDEOGRAPH +0x90B4 0x6E05 #CJK UNIFIED IDEOGRAPH +0x90B5 0x7272 #CJK UNIFIED IDEOGRAPH +0x90B6 0x751F #CJK UNIFIED IDEOGRAPH +0x90B7 0x76DB #CJK UNIFIED IDEOGRAPH +0x90B8 0x7CBE #CJK UNIFIED IDEOGRAPH +0x90B9 0x8056 #CJK UNIFIED IDEOGRAPH +0x90BA 0x58F0 #CJK UNIFIED IDEOGRAPH +0x90BB 0x88FD #CJK UNIFIED IDEOGRAPH +0x90BC 0x897F #CJK UNIFIED IDEOGRAPH +0x90BD 0x8AA0 #CJK UNIFIED IDEOGRAPH +0x90BE 0x8A93 #CJK UNIFIED IDEOGRAPH +0x90BF 0x8ACB #CJK UNIFIED IDEOGRAPH +0x90C0 0x901D #CJK UNIFIED IDEOGRAPH +0x90C1 0x9192 #CJK UNIFIED IDEOGRAPH +0x90C2 0x9752 #CJK UNIFIED IDEOGRAPH +0x90C3 0x9759 #CJK UNIFIED IDEOGRAPH +0x90C4 0x6589 #CJK UNIFIED IDEOGRAPH +0x90C5 0x7A0E #CJK UNIFIED IDEOGRAPH +0x90C6 0x8106 #CJK UNIFIED IDEOGRAPH +0x90C7 0x96BB #CJK UNIFIED IDEOGRAPH +0x90C8 0x5E2D #CJK UNIFIED IDEOGRAPH +0x90C9 0x60DC #CJK UNIFIED IDEOGRAPH +0x90CA 0x621A #CJK UNIFIED IDEOGRAPH +0x90CB 0x65A5 #CJK UNIFIED IDEOGRAPH +0x90CC 0x6614 #CJK UNIFIED IDEOGRAPH +0x90CD 0x6790 #CJK UNIFIED IDEOGRAPH +0x90CE 0x77F3 #CJK UNIFIED IDEOGRAPH +0x90CF 0x7A4D #CJK UNIFIED IDEOGRAPH +0x90D0 0x7C4D #CJK UNIFIED IDEOGRAPH +0x90D1 0x7E3E #CJK UNIFIED IDEOGRAPH +0x90D2 0x810A #CJK UNIFIED IDEOGRAPH +0x90D3 0x8CAC #CJK UNIFIED IDEOGRAPH +0x90D4 0x8D64 #CJK UNIFIED IDEOGRAPH +0x90D5 0x8DE1 #CJK UNIFIED IDEOGRAPH +0x90D6 0x8E5F #CJK UNIFIED IDEOGRAPH +0x90D7 0x78A9 #CJK UNIFIED IDEOGRAPH +0x90D8 0x5207 #CJK UNIFIED IDEOGRAPH +0x90D9 0x62D9 #CJK UNIFIED IDEOGRAPH +0x90DA 0x63A5 #CJK UNIFIED IDEOGRAPH +0x90DB 0x6442 #CJK UNIFIED IDEOGRAPH +0x90DC 0x6298 #CJK UNIFIED IDEOGRAPH +0x90DD 0x8A2D #CJK UNIFIED IDEOGRAPH +0x90DE 0x7A83 #CJK UNIFIED IDEOGRAPH +0x90DF 0x7BC0 #CJK UNIFIED IDEOGRAPH +0x90E0 0x8AAC #CJK UNIFIED IDEOGRAPH +0x90E1 0x96EA #CJK UNIFIED IDEOGRAPH +0x90E2 0x7D76 #CJK UNIFIED IDEOGRAPH +0x90E3 0x820C #CJK UNIFIED IDEOGRAPH +0x90E4 0x8749 #CJK UNIFIED IDEOGRAPH +0x90E5 0x4ED9 #CJK UNIFIED IDEOGRAPH +0x90E6 0x5148 #CJK UNIFIED IDEOGRAPH +0x90E7 0x5343 #CJK UNIFIED IDEOGRAPH +0x90E8 0x5360 #CJK UNIFIED IDEOGRAPH +0x90E9 0x5BA3 #CJK UNIFIED IDEOGRAPH +0x90EA 0x5C02 #CJK UNIFIED IDEOGRAPH +0x90EB 0x5C16 #CJK UNIFIED IDEOGRAPH +0x90EC 0x5DDD #CJK UNIFIED IDEOGRAPH +0x90ED 0x6226 #CJK UNIFIED IDEOGRAPH +0x90EE 0x6247 #CJK UNIFIED IDEOGRAPH +0x90EF 0x64B0 #CJK UNIFIED IDEOGRAPH +0x90F0 0x6813 #CJK UNIFIED IDEOGRAPH +0x90F1 0x6834 #CJK UNIFIED IDEOGRAPH +0x90F2 0x6CC9 #CJK UNIFIED IDEOGRAPH +0x90F3 0x6D45 #CJK UNIFIED IDEOGRAPH +0x90F4 0x6D17 #CJK UNIFIED IDEOGRAPH +0x90F5 0x67D3 #CJK UNIFIED IDEOGRAPH +0x90F6 0x6F5C #CJK UNIFIED IDEOGRAPH +0x90F7 0x714E #CJK UNIFIED IDEOGRAPH +0x90F8 0x717D #CJK UNIFIED IDEOGRAPH +0x90F9 0x65CB #CJK UNIFIED IDEOGRAPH +0x90FA 0x7A7F #CJK UNIFIED IDEOGRAPH +0x90FB 0x7BAD #CJK UNIFIED IDEOGRAPH +0x90FC 0x7DDA #CJK UNIFIED IDEOGRAPH +0x9140 0x7E4A #CJK UNIFIED IDEOGRAPH +0x9141 0x7FA8 #CJK UNIFIED IDEOGRAPH +0x9142 0x817A #CJK UNIFIED IDEOGRAPH +0x9143 0x821B #CJK UNIFIED IDEOGRAPH +0x9144 0x8239 #CJK UNIFIED IDEOGRAPH +0x9145 0x85A6 #CJK UNIFIED IDEOGRAPH +0x9146 0x8A6E #CJK UNIFIED IDEOGRAPH +0x9147 0x8CCE #CJK UNIFIED IDEOGRAPH +0x9148 0x8DF5 #CJK UNIFIED IDEOGRAPH +0x9149 0x9078 #CJK UNIFIED IDEOGRAPH +0x914A 0x9077 #CJK UNIFIED IDEOGRAPH +0x914B 0x92AD #CJK UNIFIED IDEOGRAPH +0x914C 0x9291 #CJK UNIFIED IDEOGRAPH +0x914D 0x9583 #CJK UNIFIED IDEOGRAPH +0x914E 0x9BAE #CJK UNIFIED IDEOGRAPH +0x914F 0x524D #CJK UNIFIED IDEOGRAPH +0x9150 0x5584 #CJK UNIFIED IDEOGRAPH +0x9151 0x6F38 #CJK UNIFIED IDEOGRAPH +0x9152 0x7136 #CJK UNIFIED IDEOGRAPH +0x9153 0x5168 #CJK UNIFIED IDEOGRAPH +0x9154 0x7985 #CJK UNIFIED IDEOGRAPH +0x9155 0x7E55 #CJK UNIFIED IDEOGRAPH +0x9156 0x81B3 #CJK UNIFIED IDEOGRAPH +0x9157 0x7CCE #CJK UNIFIED IDEOGRAPH +0x9158 0x564C #CJK UNIFIED IDEOGRAPH +0x9159 0x5851 #CJK UNIFIED IDEOGRAPH +0x915A 0x5CA8 #CJK UNIFIED IDEOGRAPH +0x915B 0x63AA #CJK UNIFIED IDEOGRAPH +0x915C 0x66FE #CJK UNIFIED IDEOGRAPH +0x915D 0x66FD #CJK UNIFIED IDEOGRAPH +0x915E 0x695A #CJK UNIFIED IDEOGRAPH +0x915F 0x72D9 #CJK UNIFIED IDEOGRAPH +0x9160 0x758F #CJK UNIFIED IDEOGRAPH +0x9161 0x758E #CJK UNIFIED IDEOGRAPH +0x9162 0x790E #CJK UNIFIED IDEOGRAPH +0x9163 0x7956 #CJK UNIFIED IDEOGRAPH +0x9164 0x79DF #CJK UNIFIED IDEOGRAPH +0x9165 0x7C97 #CJK UNIFIED IDEOGRAPH +0x9166 0x7D20 #CJK UNIFIED IDEOGRAPH +0x9167 0x7D44 #CJK UNIFIED IDEOGRAPH +0x9168 0x8607 #CJK UNIFIED IDEOGRAPH +0x9169 0x8A34 #CJK UNIFIED IDEOGRAPH +0x916A 0x963B #CJK UNIFIED IDEOGRAPH +0x916B 0x9061 #CJK UNIFIED IDEOGRAPH +0x916C 0x9F20 #CJK UNIFIED IDEOGRAPH +0x916D 0x50E7 #CJK UNIFIED IDEOGRAPH +0x916E 0x5275 #CJK UNIFIED IDEOGRAPH +0x916F 0x53CC #CJK UNIFIED IDEOGRAPH +0x9170 0x53E2 #CJK UNIFIED IDEOGRAPH +0x9171 0x5009 #CJK UNIFIED IDEOGRAPH +0x9172 0x55AA #CJK UNIFIED IDEOGRAPH +0x9173 0x58EE #CJK UNIFIED IDEOGRAPH +0x9174 0x594F #CJK UNIFIED IDEOGRAPH +0x9175 0x723D #CJK UNIFIED IDEOGRAPH +0x9176 0x5B8B #CJK UNIFIED IDEOGRAPH +0x9177 0x5C64 #CJK UNIFIED IDEOGRAPH +0x9178 0x531D #CJK UNIFIED IDEOGRAPH +0x9179 0x60E3 #CJK UNIFIED IDEOGRAPH +0x917A 0x60F3 #CJK UNIFIED IDEOGRAPH +0x917B 0x635C #CJK UNIFIED IDEOGRAPH +0x917C 0x6383 #CJK UNIFIED IDEOGRAPH +0x917D 0x633F #CJK UNIFIED IDEOGRAPH +0x917E 0x63BB #CJK UNIFIED IDEOGRAPH +0x9180 0x64CD #CJK UNIFIED IDEOGRAPH +0x9181 0x65E9 #CJK UNIFIED IDEOGRAPH +0x9182 0x66F9 #CJK UNIFIED IDEOGRAPH +0x9183 0x5DE3 #CJK UNIFIED IDEOGRAPH +0x9184 0x69CD #CJK UNIFIED IDEOGRAPH +0x9185 0x69FD #CJK UNIFIED IDEOGRAPH +0x9186 0x6F15 #CJK UNIFIED IDEOGRAPH +0x9187 0x71E5 #CJK UNIFIED IDEOGRAPH +0x9188 0x4E89 #CJK UNIFIED IDEOGRAPH +0x9189 0x75E9 #CJK UNIFIED IDEOGRAPH +0x918A 0x76F8 #CJK UNIFIED IDEOGRAPH +0x918B 0x7A93 #CJK UNIFIED IDEOGRAPH +0x918C 0x7CDF #CJK UNIFIED IDEOGRAPH +0x918D 0x7DCF #CJK UNIFIED IDEOGRAPH +0x918E 0x7D9C #CJK UNIFIED IDEOGRAPH +0x918F 0x8061 #CJK UNIFIED IDEOGRAPH +0x9190 0x8349 #CJK UNIFIED IDEOGRAPH +0x9191 0x8358 #CJK UNIFIED IDEOGRAPH +0x9192 0x846C #CJK UNIFIED IDEOGRAPH +0x9193 0x84BC #CJK UNIFIED IDEOGRAPH +0x9194 0x85FB #CJK UNIFIED IDEOGRAPH +0x9195 0x88C5 #CJK UNIFIED IDEOGRAPH +0x9196 0x8D70 #CJK UNIFIED IDEOGRAPH +0x9197 0x9001 #CJK UNIFIED IDEOGRAPH +0x9198 0x906D #CJK UNIFIED IDEOGRAPH +0x9199 0x9397 #CJK UNIFIED IDEOGRAPH +0x919A 0x971C #CJK UNIFIED IDEOGRAPH +0x919B 0x9A12 #CJK UNIFIED IDEOGRAPH +0x919C 0x50CF #CJK UNIFIED IDEOGRAPH +0x919D 0x5897 #CJK UNIFIED IDEOGRAPH +0x919E 0x618E #CJK UNIFIED IDEOGRAPH +0x919F 0x81D3 #CJK UNIFIED IDEOGRAPH +0x91A0 0x8535 #CJK UNIFIED IDEOGRAPH +0x91A1 0x8D08 #CJK UNIFIED IDEOGRAPH +0x91A2 0x9020 #CJK UNIFIED IDEOGRAPH +0x91A3 0x4FC3 #CJK UNIFIED IDEOGRAPH +0x91A4 0x5074 #CJK UNIFIED IDEOGRAPH +0x91A5 0x5247 #CJK UNIFIED IDEOGRAPH +0x91A6 0x5373 #CJK UNIFIED IDEOGRAPH +0x91A7 0x606F #CJK UNIFIED IDEOGRAPH +0x91A8 0x6349 #CJK UNIFIED IDEOGRAPH +0x91A9 0x675F #CJK UNIFIED IDEOGRAPH +0x91AA 0x6E2C #CJK UNIFIED IDEOGRAPH +0x91AB 0x8DB3 #CJK UNIFIED IDEOGRAPH +0x91AC 0x901F #CJK UNIFIED IDEOGRAPH +0x91AD 0x4FD7 #CJK UNIFIED IDEOGRAPH +0x91AE 0x5C5E #CJK UNIFIED IDEOGRAPH +0x91AF 0x8CCA #CJK UNIFIED IDEOGRAPH +0x91B0 0x65CF #CJK UNIFIED IDEOGRAPH +0x91B1 0x7D9A #CJK UNIFIED IDEOGRAPH +0x91B2 0x5352 #CJK UNIFIED IDEOGRAPH +0x91B3 0x8896 #CJK UNIFIED IDEOGRAPH +0x91B4 0x5176 #CJK UNIFIED IDEOGRAPH +0x91B5 0x63C3 #CJK UNIFIED IDEOGRAPH +0x91B6 0x5B58 #CJK UNIFIED IDEOGRAPH +0x91B7 0x5B6B #CJK UNIFIED IDEOGRAPH +0x91B8 0x5C0A #CJK UNIFIED IDEOGRAPH +0x91B9 0x640D #CJK UNIFIED IDEOGRAPH +0x91BA 0x6751 #CJK UNIFIED IDEOGRAPH +0x91BB 0x905C #CJK UNIFIED IDEOGRAPH +0x91BC 0x4ED6 #CJK UNIFIED IDEOGRAPH +0x91BD 0x591A #CJK UNIFIED IDEOGRAPH +0x91BE 0x592A #CJK UNIFIED IDEOGRAPH +0x91BF 0x6C70 #CJK UNIFIED IDEOGRAPH +0x91C0 0x8A51 #CJK UNIFIED IDEOGRAPH +0x91C1 0x553E #CJK UNIFIED IDEOGRAPH +0x91C2 0x5815 #CJK UNIFIED IDEOGRAPH +0x91C3 0x59A5 #CJK UNIFIED IDEOGRAPH +0x91C4 0x60F0 #CJK UNIFIED IDEOGRAPH +0x91C5 0x6253 #CJK UNIFIED IDEOGRAPH +0x91C6 0x67C1 #CJK UNIFIED IDEOGRAPH +0x91C7 0x8235 #CJK UNIFIED IDEOGRAPH +0x91C8 0x6955 #CJK UNIFIED IDEOGRAPH +0x91C9 0x9640 #CJK UNIFIED IDEOGRAPH +0x91CA 0x99C4 #CJK UNIFIED IDEOGRAPH +0x91CB 0x9A28 #CJK UNIFIED IDEOGRAPH +0x91CC 0x4F53 #CJK UNIFIED IDEOGRAPH +0x91CD 0x5806 #CJK UNIFIED IDEOGRAPH +0x91CE 0x5BFE #CJK UNIFIED IDEOGRAPH +0x91CF 0x8010 #CJK UNIFIED IDEOGRAPH +0x91D0 0x5CB1 #CJK UNIFIED IDEOGRAPH +0x91D1 0x5E2F #CJK UNIFIED IDEOGRAPH +0x91D2 0x5F85 #CJK UNIFIED IDEOGRAPH +0x91D3 0x6020 #CJK UNIFIED IDEOGRAPH +0x91D4 0x614B #CJK UNIFIED IDEOGRAPH +0x91D5 0x6234 #CJK UNIFIED IDEOGRAPH +0x91D6 0x66FF #CJK UNIFIED IDEOGRAPH +0x91D7 0x6CF0 #CJK UNIFIED IDEOGRAPH +0x91D8 0x6EDE #CJK UNIFIED IDEOGRAPH +0x91D9 0x80CE #CJK UNIFIED IDEOGRAPH +0x91DA 0x817F #CJK UNIFIED IDEOGRAPH +0x91DB 0x82D4 #CJK UNIFIED IDEOGRAPH +0x91DC 0x888B #CJK UNIFIED IDEOGRAPH +0x91DD 0x8CB8 #CJK UNIFIED IDEOGRAPH +0x91DE 0x9000 #CJK UNIFIED IDEOGRAPH +0x91DF 0x902E #CJK UNIFIED IDEOGRAPH +0x91E0 0x968A #CJK UNIFIED IDEOGRAPH +0x91E1 0x9EDB #CJK UNIFIED IDEOGRAPH +0x91E2 0x9BDB #CJK UNIFIED IDEOGRAPH +0x91E3 0x4EE3 #CJK UNIFIED IDEOGRAPH +0x91E4 0x53F0 #CJK UNIFIED IDEOGRAPH +0x91E5 0x5927 #CJK UNIFIED IDEOGRAPH +0x91E6 0x7B2C #CJK UNIFIED IDEOGRAPH +0x91E7 0x918D #CJK UNIFIED IDEOGRAPH +0x91E8 0x984C #CJK UNIFIED IDEOGRAPH +0x91E9 0x9DF9 #CJK UNIFIED IDEOGRAPH +0x91EA 0x6EDD #CJK UNIFIED IDEOGRAPH +0x91EB 0x7027 #CJK UNIFIED IDEOGRAPH +0x91EC 0x5353 #CJK UNIFIED IDEOGRAPH +0x91ED 0x5544 #CJK UNIFIED IDEOGRAPH +0x91EE 0x5B85 #CJK UNIFIED IDEOGRAPH +0x91EF 0x6258 #CJK UNIFIED IDEOGRAPH +0x91F0 0x629E #CJK UNIFIED IDEOGRAPH +0x91F1 0x62D3 #CJK UNIFIED IDEOGRAPH +0x91F2 0x6CA2 #CJK UNIFIED IDEOGRAPH +0x91F3 0x6FEF #CJK UNIFIED IDEOGRAPH +0x91F4 0x7422 #CJK UNIFIED IDEOGRAPH +0x91F5 0x8A17 #CJK UNIFIED IDEOGRAPH +0x91F6 0x9438 #CJK UNIFIED IDEOGRAPH +0x91F7 0x6FC1 #CJK UNIFIED IDEOGRAPH +0x91F8 0x8AFE #CJK UNIFIED IDEOGRAPH +0x91F9 0x8338 #CJK UNIFIED IDEOGRAPH +0x91FA 0x51E7 #CJK UNIFIED IDEOGRAPH +0x91FB 0x86F8 #CJK UNIFIED IDEOGRAPH +0x91FC 0x53EA #CJK UNIFIED IDEOGRAPH +0x9240 0x53E9 #CJK UNIFIED IDEOGRAPH +0x9241 0x4F46 #CJK UNIFIED IDEOGRAPH +0x9242 0x9054 #CJK UNIFIED IDEOGRAPH +0x9243 0x8FB0 #CJK UNIFIED IDEOGRAPH +0x9244 0x596A #CJK UNIFIED IDEOGRAPH +0x9245 0x8131 #CJK UNIFIED IDEOGRAPH +0x9246 0x5DFD #CJK UNIFIED IDEOGRAPH +0x9247 0x7AEA #CJK UNIFIED IDEOGRAPH +0x9248 0x8FBF #CJK UNIFIED IDEOGRAPH +0x9249 0x68DA #CJK UNIFIED IDEOGRAPH +0x924A 0x8C37 #CJK UNIFIED IDEOGRAPH +0x924B 0x72F8 #CJK UNIFIED IDEOGRAPH +0x924C 0x9C48 #CJK UNIFIED IDEOGRAPH +0x924D 0x6A3D #CJK UNIFIED IDEOGRAPH +0x924E 0x8AB0 #CJK UNIFIED IDEOGRAPH +0x924F 0x4E39 #CJK UNIFIED IDEOGRAPH +0x9250 0x5358 #CJK UNIFIED IDEOGRAPH +0x9251 0x5606 #CJK UNIFIED IDEOGRAPH +0x9252 0x5766 #CJK UNIFIED IDEOGRAPH +0x9253 0x62C5 #CJK UNIFIED IDEOGRAPH +0x9254 0x63A2 #CJK UNIFIED IDEOGRAPH +0x9255 0x65E6 #CJK UNIFIED IDEOGRAPH +0x9256 0x6B4E #CJK UNIFIED IDEOGRAPH +0x9257 0x6DE1 #CJK UNIFIED IDEOGRAPH +0x9258 0x6E5B #CJK UNIFIED IDEOGRAPH +0x9259 0x70AD #CJK UNIFIED IDEOGRAPH +0x925A 0x77ED #CJK UNIFIED IDEOGRAPH +0x925B 0x7AEF #CJK UNIFIED IDEOGRAPH +0x925C 0x7BAA #CJK UNIFIED IDEOGRAPH +0x925D 0x7DBB #CJK UNIFIED IDEOGRAPH +0x925E 0x803D #CJK UNIFIED IDEOGRAPH +0x925F 0x80C6 #CJK UNIFIED IDEOGRAPH +0x9260 0x86CB #CJK UNIFIED IDEOGRAPH +0x9261 0x8A95 #CJK UNIFIED IDEOGRAPH +0x9262 0x935B #CJK UNIFIED IDEOGRAPH +0x9263 0x56E3 #CJK UNIFIED IDEOGRAPH +0x9264 0x58C7 #CJK UNIFIED IDEOGRAPH +0x9265 0x5F3E #CJK UNIFIED IDEOGRAPH +0x9266 0x65AD #CJK UNIFIED IDEOGRAPH +0x9267 0x6696 #CJK UNIFIED IDEOGRAPH +0x9268 0x6A80 #CJK UNIFIED IDEOGRAPH +0x9269 0x6BB5 #CJK UNIFIED IDEOGRAPH +0x926A 0x7537 #CJK UNIFIED IDEOGRAPH +0x926B 0x8AC7 #CJK UNIFIED IDEOGRAPH +0x926C 0x5024 #CJK UNIFIED IDEOGRAPH +0x926D 0x77E5 #CJK UNIFIED IDEOGRAPH +0x926E 0x5730 #CJK UNIFIED IDEOGRAPH +0x926F 0x5F1B #CJK UNIFIED IDEOGRAPH +0x9270 0x6065 #CJK UNIFIED IDEOGRAPH +0x9271 0x667A #CJK UNIFIED IDEOGRAPH +0x9272 0x6C60 #CJK UNIFIED IDEOGRAPH +0x9273 0x75F4 #CJK UNIFIED IDEOGRAPH +0x9274 0x7A1A #CJK UNIFIED IDEOGRAPH +0x9275 0x7F6E #CJK UNIFIED IDEOGRAPH +0x9276 0x81F4 #CJK UNIFIED IDEOGRAPH +0x9277 0x8718 #CJK UNIFIED IDEOGRAPH +0x9278 0x9045 #CJK UNIFIED IDEOGRAPH +0x9279 0x99B3 #CJK UNIFIED IDEOGRAPH +0x927A 0x7BC9 #CJK UNIFIED IDEOGRAPH +0x927B 0x755C #CJK UNIFIED IDEOGRAPH +0x927C 0x7AF9 #CJK UNIFIED IDEOGRAPH +0x927D 0x7B51 #CJK UNIFIED IDEOGRAPH +0x927E 0x84C4 #CJK UNIFIED IDEOGRAPH +0x9280 0x9010 #CJK UNIFIED IDEOGRAPH +0x9281 0x79E9 #CJK UNIFIED IDEOGRAPH +0x9282 0x7A92 #CJK UNIFIED IDEOGRAPH +0x9283 0x8336 #CJK UNIFIED IDEOGRAPH +0x9284 0x5AE1 #CJK UNIFIED IDEOGRAPH +0x9285 0x7740 #CJK UNIFIED IDEOGRAPH +0x9286 0x4E2D #CJK UNIFIED IDEOGRAPH +0x9287 0x4EF2 #CJK UNIFIED IDEOGRAPH +0x9288 0x5B99 #CJK UNIFIED IDEOGRAPH +0x9289 0x5FE0 #CJK UNIFIED IDEOGRAPH +0x928A 0x62BD #CJK UNIFIED IDEOGRAPH +0x928B 0x663C #CJK UNIFIED IDEOGRAPH +0x928C 0x67F1 #CJK UNIFIED IDEOGRAPH +0x928D 0x6CE8 #CJK UNIFIED IDEOGRAPH +0x928E 0x866B #CJK UNIFIED IDEOGRAPH +0x928F 0x8877 #CJK UNIFIED IDEOGRAPH +0x9290 0x8A3B #CJK UNIFIED IDEOGRAPH +0x9291 0x914E #CJK UNIFIED IDEOGRAPH +0x9292 0x92F3 #CJK UNIFIED IDEOGRAPH +0x9293 0x99D0 #CJK UNIFIED IDEOGRAPH +0x9294 0x6A17 #CJK UNIFIED IDEOGRAPH +0x9295 0x7026 #CJK UNIFIED IDEOGRAPH +0x9296 0x732A #CJK UNIFIED IDEOGRAPH +0x9297 0x82E7 #CJK UNIFIED IDEOGRAPH +0x9298 0x8457 #CJK UNIFIED IDEOGRAPH +0x9299 0x8CAF #CJK UNIFIED IDEOGRAPH +0x929A 0x4E01 #CJK UNIFIED IDEOGRAPH +0x929B 0x5146 #CJK UNIFIED IDEOGRAPH +0x929C 0x51CB #CJK UNIFIED IDEOGRAPH +0x929D 0x558B #CJK UNIFIED IDEOGRAPH +0x929E 0x5BF5 #CJK UNIFIED IDEOGRAPH +0x929F 0x5E16 #CJK UNIFIED IDEOGRAPH +0x92A0 0x5E33 #CJK UNIFIED IDEOGRAPH +0x92A1 0x5E81 #CJK UNIFIED IDEOGRAPH +0x92A2 0x5F14 #CJK UNIFIED IDEOGRAPH +0x92A3 0x5F35 #CJK UNIFIED IDEOGRAPH +0x92A4 0x5F6B #CJK UNIFIED IDEOGRAPH +0x92A5 0x5FB4 #CJK UNIFIED IDEOGRAPH +0x92A6 0x61F2 #CJK UNIFIED IDEOGRAPH +0x92A7 0x6311 #CJK UNIFIED IDEOGRAPH +0x92A8 0x66A2 #CJK UNIFIED IDEOGRAPH +0x92A9 0x671D #CJK UNIFIED IDEOGRAPH +0x92AA 0x6F6E #CJK UNIFIED IDEOGRAPH +0x92AB 0x7252 #CJK UNIFIED IDEOGRAPH +0x92AC 0x753A #CJK UNIFIED IDEOGRAPH +0x92AD 0x773A #CJK UNIFIED IDEOGRAPH +0x92AE 0x8074 #CJK UNIFIED IDEOGRAPH +0x92AF 0x8139 #CJK UNIFIED IDEOGRAPH +0x92B0 0x8178 #CJK UNIFIED IDEOGRAPH +0x92B1 0x8776 #CJK UNIFIED IDEOGRAPH +0x92B2 0x8ABF #CJK UNIFIED IDEOGRAPH +0x92B3 0x8ADC #CJK UNIFIED IDEOGRAPH +0x92B4 0x8D85 #CJK UNIFIED IDEOGRAPH +0x92B5 0x8DF3 #CJK UNIFIED IDEOGRAPH +0x92B6 0x929A #CJK UNIFIED IDEOGRAPH +0x92B7 0x9577 #CJK UNIFIED IDEOGRAPH +0x92B8 0x9802 #CJK UNIFIED IDEOGRAPH +0x92B9 0x9CE5 #CJK UNIFIED IDEOGRAPH +0x92BA 0x52C5 #CJK UNIFIED IDEOGRAPH +0x92BB 0x6357 #CJK UNIFIED IDEOGRAPH +0x92BC 0x76F4 #CJK UNIFIED IDEOGRAPH +0x92BD 0x6715 #CJK UNIFIED IDEOGRAPH +0x92BE 0x6C88 #CJK UNIFIED IDEOGRAPH +0x92BF 0x73CD #CJK UNIFIED IDEOGRAPH +0x92C0 0x8CC3 #CJK UNIFIED IDEOGRAPH +0x92C1 0x93AE #CJK UNIFIED IDEOGRAPH +0x92C2 0x9673 #CJK UNIFIED IDEOGRAPH +0x92C3 0x6D25 #CJK UNIFIED IDEOGRAPH +0x92C4 0x589C #CJK UNIFIED IDEOGRAPH +0x92C5 0x690E #CJK UNIFIED IDEOGRAPH +0x92C6 0x69CC #CJK UNIFIED IDEOGRAPH +0x92C7 0x8FFD #CJK UNIFIED IDEOGRAPH +0x92C8 0x939A #CJK UNIFIED IDEOGRAPH +0x92C9 0x75DB #CJK UNIFIED IDEOGRAPH +0x92CA 0x901A #CJK UNIFIED IDEOGRAPH +0x92CB 0x585A #CJK UNIFIED IDEOGRAPH +0x92CC 0x6802 #CJK UNIFIED IDEOGRAPH +0x92CD 0x63B4 #CJK UNIFIED IDEOGRAPH +0x92CE 0x69FB #CJK UNIFIED IDEOGRAPH +0x92CF 0x4F43 #CJK UNIFIED IDEOGRAPH +0x92D0 0x6F2C #CJK UNIFIED IDEOGRAPH +0x92D1 0x67D8 #CJK UNIFIED IDEOGRAPH +0x92D2 0x8FBB #CJK UNIFIED IDEOGRAPH +0x92D3 0x8526 #CJK UNIFIED IDEOGRAPH +0x92D4 0x7DB4 #CJK UNIFIED IDEOGRAPH +0x92D5 0x9354 #CJK UNIFIED IDEOGRAPH +0x92D6 0x693F #CJK UNIFIED IDEOGRAPH +0x92D7 0x6F70 #CJK UNIFIED IDEOGRAPH +0x92D8 0x576A #CJK UNIFIED IDEOGRAPH +0x92D9 0x58F7 #CJK UNIFIED IDEOGRAPH +0x92DA 0x5B2C #CJK UNIFIED IDEOGRAPH +0x92DB 0x7D2C #CJK UNIFIED IDEOGRAPH +0x92DC 0x722A #CJK UNIFIED IDEOGRAPH +0x92DD 0x540A #CJK UNIFIED IDEOGRAPH +0x92DE 0x91E3 #CJK UNIFIED IDEOGRAPH +0x92DF 0x9DB4 #CJK UNIFIED IDEOGRAPH +0x92E0 0x4EAD #CJK UNIFIED IDEOGRAPH +0x92E1 0x4F4E #CJK UNIFIED IDEOGRAPH +0x92E2 0x505C #CJK UNIFIED IDEOGRAPH +0x92E3 0x5075 #CJK UNIFIED IDEOGRAPH +0x92E4 0x5243 #CJK UNIFIED IDEOGRAPH +0x92E5 0x8C9E #CJK UNIFIED IDEOGRAPH +0x92E6 0x5448 #CJK UNIFIED IDEOGRAPH +0x92E7 0x5824 #CJK UNIFIED IDEOGRAPH +0x92E8 0x5B9A #CJK UNIFIED IDEOGRAPH +0x92E9 0x5E1D #CJK UNIFIED IDEOGRAPH +0x92EA 0x5E95 #CJK UNIFIED IDEOGRAPH +0x92EB 0x5EAD #CJK UNIFIED IDEOGRAPH +0x92EC 0x5EF7 #CJK UNIFIED IDEOGRAPH +0x92ED 0x5F1F #CJK UNIFIED IDEOGRAPH +0x92EE 0x608C #CJK UNIFIED IDEOGRAPH +0x92EF 0x62B5 #CJK UNIFIED IDEOGRAPH +0x92F0 0x633A #CJK UNIFIED IDEOGRAPH +0x92F1 0x63D0 #CJK UNIFIED IDEOGRAPH +0x92F2 0x68AF #CJK UNIFIED IDEOGRAPH +0x92F3 0x6C40 #CJK UNIFIED IDEOGRAPH +0x92F4 0x7887 #CJK UNIFIED IDEOGRAPH +0x92F5 0x798E #CJK UNIFIED IDEOGRAPH +0x92F6 0x7A0B #CJK UNIFIED IDEOGRAPH +0x92F7 0x7DE0 #CJK UNIFIED IDEOGRAPH +0x92F8 0x8247 #CJK UNIFIED IDEOGRAPH +0x92F9 0x8A02 #CJK UNIFIED IDEOGRAPH +0x92FA 0x8AE6 #CJK UNIFIED IDEOGRAPH +0x92FB 0x8E44 #CJK UNIFIED IDEOGRAPH +0x92FC 0x9013 #CJK UNIFIED IDEOGRAPH +0x9340 0x90B8 #CJK UNIFIED IDEOGRAPH +0x9341 0x912D #CJK UNIFIED IDEOGRAPH +0x9342 0x91D8 #CJK UNIFIED IDEOGRAPH +0x9343 0x9F0E #CJK UNIFIED IDEOGRAPH +0x9344 0x6CE5 #CJK UNIFIED IDEOGRAPH +0x9345 0x6458 #CJK UNIFIED IDEOGRAPH +0x9346 0x64E2 #CJK UNIFIED IDEOGRAPH +0x9347 0x6575 #CJK UNIFIED IDEOGRAPH +0x9348 0x6EF4 #CJK UNIFIED IDEOGRAPH +0x9349 0x7684 #CJK UNIFIED IDEOGRAPH +0x934A 0x7B1B #CJK UNIFIED IDEOGRAPH +0x934B 0x9069 #CJK UNIFIED IDEOGRAPH +0x934C 0x93D1 #CJK UNIFIED IDEOGRAPH +0x934D 0x6EBA #CJK UNIFIED IDEOGRAPH +0x934E 0x54F2 #CJK UNIFIED IDEOGRAPH +0x934F 0x5FB9 #CJK UNIFIED IDEOGRAPH +0x9350 0x64A4 #CJK UNIFIED IDEOGRAPH +0x9351 0x8F4D #CJK UNIFIED IDEOGRAPH +0x9352 0x8FED #CJK UNIFIED IDEOGRAPH +0x9353 0x9244 #CJK UNIFIED IDEOGRAPH +0x9354 0x5178 #CJK UNIFIED IDEOGRAPH +0x9355 0x586B #CJK UNIFIED IDEOGRAPH +0x9356 0x5929 #CJK UNIFIED IDEOGRAPH +0x9357 0x5C55 #CJK UNIFIED IDEOGRAPH +0x9358 0x5E97 #CJK UNIFIED IDEOGRAPH +0x9359 0x6DFB #CJK UNIFIED IDEOGRAPH +0x935A 0x7E8F #CJK UNIFIED IDEOGRAPH +0x935B 0x751C #CJK UNIFIED IDEOGRAPH +0x935C 0x8CBC #CJK UNIFIED IDEOGRAPH +0x935D 0x8EE2 #CJK UNIFIED IDEOGRAPH +0x935E 0x985B #CJK UNIFIED IDEOGRAPH +0x935F 0x70B9 #CJK UNIFIED IDEOGRAPH +0x9360 0x4F1D #CJK UNIFIED IDEOGRAPH +0x9361 0x6BBF #CJK UNIFIED IDEOGRAPH +0x9362 0x6FB1 #CJK UNIFIED IDEOGRAPH +0x9363 0x7530 #CJK UNIFIED IDEOGRAPH +0x9364 0x96FB #CJK UNIFIED IDEOGRAPH +0x9365 0x514E #CJK UNIFIED IDEOGRAPH +0x9366 0x5410 #CJK UNIFIED IDEOGRAPH +0x9367 0x5835 #CJK UNIFIED IDEOGRAPH +0x9368 0x5857 #CJK UNIFIED IDEOGRAPH +0x9369 0x59AC #CJK UNIFIED IDEOGRAPH +0x936A 0x5C60 #CJK UNIFIED IDEOGRAPH +0x936B 0x5F92 #CJK UNIFIED IDEOGRAPH +0x936C 0x6597 #CJK UNIFIED IDEOGRAPH +0x936D 0x675C #CJK UNIFIED IDEOGRAPH +0x936E 0x6E21 #CJK UNIFIED IDEOGRAPH +0x936F 0x767B #CJK UNIFIED IDEOGRAPH +0x9370 0x83DF #CJK UNIFIED IDEOGRAPH +0x9371 0x8CED #CJK UNIFIED IDEOGRAPH +0x9372 0x9014 #CJK UNIFIED IDEOGRAPH +0x9373 0x90FD #CJK UNIFIED IDEOGRAPH +0x9374 0x934D #CJK UNIFIED IDEOGRAPH +0x9375 0x7825 #CJK UNIFIED IDEOGRAPH +0x9376 0x783A #CJK UNIFIED IDEOGRAPH +0x9377 0x52AA #CJK UNIFIED IDEOGRAPH +0x9378 0x5EA6 #CJK UNIFIED IDEOGRAPH +0x9379 0x571F #CJK UNIFIED IDEOGRAPH +0x937A 0x5974 #CJK UNIFIED IDEOGRAPH +0x937B 0x6012 #CJK UNIFIED IDEOGRAPH +0x937C 0x5012 #CJK UNIFIED IDEOGRAPH +0x937D 0x515A #CJK UNIFIED IDEOGRAPH +0x937E 0x51AC #CJK UNIFIED IDEOGRAPH +0x9380 0x51CD #CJK UNIFIED IDEOGRAPH +0x9381 0x5200 #CJK UNIFIED IDEOGRAPH +0x9382 0x5510 #CJK UNIFIED IDEOGRAPH +0x9383 0x5854 #CJK UNIFIED IDEOGRAPH +0x9384 0x5858 #CJK UNIFIED IDEOGRAPH +0x9385 0x5957 #CJK UNIFIED IDEOGRAPH +0x9386 0x5B95 #CJK UNIFIED IDEOGRAPH +0x9387 0x5CF6 #CJK UNIFIED IDEOGRAPH +0x9388 0x5D8B #CJK UNIFIED IDEOGRAPH +0x9389 0x60BC #CJK UNIFIED IDEOGRAPH +0x938A 0x6295 #CJK UNIFIED IDEOGRAPH +0x938B 0x642D #CJK UNIFIED IDEOGRAPH +0x938C 0x6771 #CJK UNIFIED IDEOGRAPH +0x938D 0x6843 #CJK UNIFIED IDEOGRAPH +0x938E 0x68BC #CJK UNIFIED IDEOGRAPH +0x938F 0x68DF #CJK UNIFIED IDEOGRAPH +0x9390 0x76D7 #CJK UNIFIED IDEOGRAPH +0x9391 0x6DD8 #CJK UNIFIED IDEOGRAPH +0x9392 0x6E6F #CJK UNIFIED IDEOGRAPH +0x9393 0x6D9B #CJK UNIFIED IDEOGRAPH +0x9394 0x706F #CJK UNIFIED IDEOGRAPH +0x9395 0x71C8 #CJK UNIFIED IDEOGRAPH +0x9396 0x5F53 #CJK UNIFIED IDEOGRAPH +0x9397 0x75D8 #CJK UNIFIED IDEOGRAPH +0x9398 0x7977 #CJK UNIFIED IDEOGRAPH +0x9399 0x7B49 #CJK UNIFIED IDEOGRAPH +0x939A 0x7B54 #CJK UNIFIED IDEOGRAPH +0x939B 0x7B52 #CJK UNIFIED IDEOGRAPH +0x939C 0x7CD6 #CJK UNIFIED IDEOGRAPH +0x939D 0x7D71 #CJK UNIFIED IDEOGRAPH +0x939E 0x5230 #CJK UNIFIED IDEOGRAPH +0x939F 0x8463 #CJK UNIFIED IDEOGRAPH +0x93A0 0x8569 #CJK UNIFIED IDEOGRAPH +0x93A1 0x85E4 #CJK UNIFIED IDEOGRAPH +0x93A2 0x8A0E #CJK UNIFIED IDEOGRAPH +0x93A3 0x8B04 #CJK UNIFIED IDEOGRAPH +0x93A4 0x8C46 #CJK UNIFIED IDEOGRAPH +0x93A5 0x8E0F #CJK UNIFIED IDEOGRAPH +0x93A6 0x9003 #CJK UNIFIED IDEOGRAPH +0x93A7 0x900F #CJK UNIFIED IDEOGRAPH +0x93A8 0x9419 #CJK UNIFIED IDEOGRAPH +0x93A9 0x9676 #CJK UNIFIED IDEOGRAPH +0x93AA 0x982D #CJK UNIFIED IDEOGRAPH +0x93AB 0x9A30 #CJK UNIFIED IDEOGRAPH +0x93AC 0x95D8 #CJK UNIFIED IDEOGRAPH +0x93AD 0x50CD #CJK UNIFIED IDEOGRAPH +0x93AE 0x52D5 #CJK UNIFIED IDEOGRAPH +0x93AF 0x540C #CJK UNIFIED IDEOGRAPH +0x93B0 0x5802 #CJK UNIFIED IDEOGRAPH +0x93B1 0x5C0E #CJK UNIFIED IDEOGRAPH +0x93B2 0x61A7 #CJK UNIFIED IDEOGRAPH +0x93B3 0x649E #CJK UNIFIED IDEOGRAPH +0x93B4 0x6D1E #CJK UNIFIED IDEOGRAPH +0x93B5 0x77B3 #CJK UNIFIED IDEOGRAPH +0x93B6 0x7AE5 #CJK UNIFIED IDEOGRAPH +0x93B7 0x80F4 #CJK UNIFIED IDEOGRAPH +0x93B8 0x8404 #CJK UNIFIED IDEOGRAPH +0x93B9 0x9053 #CJK UNIFIED IDEOGRAPH +0x93BA 0x9285 #CJK UNIFIED IDEOGRAPH +0x93BB 0x5CE0 #CJK UNIFIED IDEOGRAPH +0x93BC 0x9D07 #CJK UNIFIED IDEOGRAPH +0x93BD 0x533F #CJK UNIFIED IDEOGRAPH +0x93BE 0x5F97 #CJK UNIFIED IDEOGRAPH +0x93BF 0x5FB3 #CJK UNIFIED IDEOGRAPH +0x93C0 0x6D9C #CJK UNIFIED IDEOGRAPH +0x93C1 0x7279 #CJK UNIFIED IDEOGRAPH +0x93C2 0x7763 #CJK UNIFIED IDEOGRAPH +0x93C3 0x79BF #CJK UNIFIED IDEOGRAPH +0x93C4 0x7BE4 #CJK UNIFIED IDEOGRAPH +0x93C5 0x6BD2 #CJK UNIFIED IDEOGRAPH +0x93C6 0x72EC #CJK UNIFIED IDEOGRAPH +0x93C7 0x8AAD #CJK UNIFIED IDEOGRAPH +0x93C8 0x6803 #CJK UNIFIED IDEOGRAPH +0x93C9 0x6A61 #CJK UNIFIED IDEOGRAPH +0x93CA 0x51F8 #CJK UNIFIED IDEOGRAPH +0x93CB 0x7A81 #CJK UNIFIED IDEOGRAPH +0x93CC 0x6934 #CJK UNIFIED IDEOGRAPH +0x93CD 0x5C4A #CJK UNIFIED IDEOGRAPH +0x93CE 0x9CF6 #CJK UNIFIED IDEOGRAPH +0x93CF 0x82EB #CJK UNIFIED IDEOGRAPH +0x93D0 0x5BC5 #CJK UNIFIED IDEOGRAPH +0x93D1 0x9149 #CJK UNIFIED IDEOGRAPH +0x93D2 0x701E #CJK UNIFIED IDEOGRAPH +0x93D3 0x5678 #CJK UNIFIED IDEOGRAPH +0x93D4 0x5C6F #CJK UNIFIED IDEOGRAPH +0x93D5 0x60C7 #CJK UNIFIED IDEOGRAPH +0x93D6 0x6566 #CJK UNIFIED IDEOGRAPH +0x93D7 0x6C8C #CJK UNIFIED IDEOGRAPH +0x93D8 0x8C5A #CJK UNIFIED IDEOGRAPH +0x93D9 0x9041 #CJK UNIFIED IDEOGRAPH +0x93DA 0x9813 #CJK UNIFIED IDEOGRAPH +0x93DB 0x5451 #CJK UNIFIED IDEOGRAPH +0x93DC 0x66C7 #CJK UNIFIED IDEOGRAPH +0x93DD 0x920D #CJK UNIFIED IDEOGRAPH +0x93DE 0x5948 #CJK UNIFIED IDEOGRAPH +0x93DF 0x90A3 #CJK UNIFIED IDEOGRAPH +0x93E0 0x5185 #CJK UNIFIED IDEOGRAPH +0x93E1 0x4E4D #CJK UNIFIED IDEOGRAPH +0x93E2 0x51EA #CJK UNIFIED IDEOGRAPH +0x93E3 0x8599 #CJK UNIFIED IDEOGRAPH +0x93E4 0x8B0E #CJK UNIFIED IDEOGRAPH +0x93E5 0x7058 #CJK UNIFIED IDEOGRAPH +0x93E6 0x637A #CJK UNIFIED IDEOGRAPH +0x93E7 0x934B #CJK UNIFIED IDEOGRAPH +0x93E8 0x6962 #CJK UNIFIED IDEOGRAPH +0x93E9 0x99B4 #CJK UNIFIED IDEOGRAPH +0x93EA 0x7E04 #CJK UNIFIED IDEOGRAPH +0x93EB 0x7577 #CJK UNIFIED IDEOGRAPH +0x93EC 0x5357 #CJK UNIFIED IDEOGRAPH +0x93ED 0x6960 #CJK UNIFIED IDEOGRAPH +0x93EE 0x8EDF #CJK UNIFIED IDEOGRAPH +0x93EF 0x96E3 #CJK UNIFIED IDEOGRAPH +0x93F0 0x6C5D #CJK UNIFIED IDEOGRAPH +0x93F1 0x4E8C #CJK UNIFIED IDEOGRAPH +0x93F2 0x5C3C #CJK UNIFIED IDEOGRAPH +0x93F3 0x5F10 #CJK UNIFIED IDEOGRAPH +0x93F4 0x8FE9 #CJK UNIFIED IDEOGRAPH +0x93F5 0x5302 #CJK UNIFIED IDEOGRAPH +0x93F6 0x8CD1 #CJK UNIFIED IDEOGRAPH +0x93F7 0x8089 #CJK UNIFIED IDEOGRAPH +0x93F8 0x8679 #CJK UNIFIED IDEOGRAPH +0x93F9 0x5EFF #CJK UNIFIED IDEOGRAPH +0x93FA 0x65E5 #CJK UNIFIED IDEOGRAPH +0x93FB 0x4E73 #CJK UNIFIED IDEOGRAPH +0x93FC 0x5165 #CJK UNIFIED IDEOGRAPH +0x9440 0x5982 #CJK UNIFIED IDEOGRAPH +0x9441 0x5C3F #CJK UNIFIED IDEOGRAPH +0x9442 0x97EE #CJK UNIFIED IDEOGRAPH +0x9443 0x4EFB #CJK UNIFIED IDEOGRAPH +0x9444 0x598A #CJK UNIFIED IDEOGRAPH +0x9445 0x5FCD #CJK UNIFIED IDEOGRAPH +0x9446 0x8A8D #CJK UNIFIED IDEOGRAPH +0x9447 0x6FE1 #CJK UNIFIED IDEOGRAPH +0x9448 0x79B0 #CJK UNIFIED IDEOGRAPH +0x9449 0x7962 #CJK UNIFIED IDEOGRAPH +0x944A 0x5BE7 #CJK UNIFIED IDEOGRAPH +0x944B 0x8471 #CJK UNIFIED IDEOGRAPH +0x944C 0x732B #CJK UNIFIED IDEOGRAPH +0x944D 0x71B1 #CJK UNIFIED IDEOGRAPH +0x944E 0x5E74 #CJK UNIFIED IDEOGRAPH +0x944F 0x5FF5 #CJK UNIFIED IDEOGRAPH +0x9450 0x637B #CJK UNIFIED IDEOGRAPH +0x9451 0x649A #CJK UNIFIED IDEOGRAPH +0x9452 0x71C3 #CJK UNIFIED IDEOGRAPH +0x9453 0x7C98 #CJK UNIFIED IDEOGRAPH +0x9454 0x4E43 #CJK UNIFIED IDEOGRAPH +0x9455 0x5EFC #CJK UNIFIED IDEOGRAPH +0x9456 0x4E4B #CJK UNIFIED IDEOGRAPH +0x9457 0x57DC #CJK UNIFIED IDEOGRAPH +0x9458 0x56A2 #CJK UNIFIED IDEOGRAPH +0x9459 0x60A9 #CJK UNIFIED IDEOGRAPH +0x945A 0x6FC3 #CJK UNIFIED IDEOGRAPH +0x945B 0x7D0D #CJK UNIFIED IDEOGRAPH +0x945C 0x80FD #CJK UNIFIED IDEOGRAPH +0x945D 0x8133 #CJK UNIFIED IDEOGRAPH +0x945E 0x81BF #CJK UNIFIED IDEOGRAPH +0x945F 0x8FB2 #CJK UNIFIED IDEOGRAPH +0x9460 0x8997 #CJK UNIFIED IDEOGRAPH +0x9461 0x86A4 #CJK UNIFIED IDEOGRAPH +0x9462 0x5DF4 #CJK UNIFIED IDEOGRAPH +0x9463 0x628A #CJK UNIFIED IDEOGRAPH +0x9464 0x64AD #CJK UNIFIED IDEOGRAPH +0x9465 0x8987 #CJK UNIFIED IDEOGRAPH +0x9466 0x6777 #CJK UNIFIED IDEOGRAPH +0x9467 0x6CE2 #CJK UNIFIED IDEOGRAPH +0x9468 0x6D3E #CJK UNIFIED IDEOGRAPH +0x9469 0x7436 #CJK UNIFIED IDEOGRAPH +0x946A 0x7834 #CJK UNIFIED IDEOGRAPH +0x946B 0x5A46 #CJK UNIFIED IDEOGRAPH +0x946C 0x7F75 #CJK UNIFIED IDEOGRAPH +0x946D 0x82AD #CJK UNIFIED IDEOGRAPH +0x946E 0x99AC #CJK UNIFIED IDEOGRAPH +0x946F 0x4FF3 #CJK UNIFIED IDEOGRAPH +0x9470 0x5EC3 #CJK UNIFIED IDEOGRAPH +0x9471 0x62DD #CJK UNIFIED IDEOGRAPH +0x9472 0x6392 #CJK UNIFIED IDEOGRAPH +0x9473 0x6557 #CJK UNIFIED IDEOGRAPH +0x9474 0x676F #CJK UNIFIED IDEOGRAPH +0x9475 0x76C3 #CJK UNIFIED IDEOGRAPH +0x9476 0x724C #CJK UNIFIED IDEOGRAPH +0x9477 0x80CC #CJK UNIFIED IDEOGRAPH +0x9478 0x80BA #CJK UNIFIED IDEOGRAPH +0x9479 0x8F29 #CJK UNIFIED IDEOGRAPH +0x947A 0x914D #CJK UNIFIED IDEOGRAPH +0x947B 0x500D #CJK UNIFIED IDEOGRAPH +0x947C 0x57F9 #CJK UNIFIED IDEOGRAPH +0x947D 0x5A92 #CJK UNIFIED IDEOGRAPH +0x947E 0x6885 #CJK UNIFIED IDEOGRAPH +0x9480 0x6973 #CJK UNIFIED IDEOGRAPH +0x9481 0x7164 #CJK UNIFIED IDEOGRAPH +0x9482 0x72FD #CJK UNIFIED IDEOGRAPH +0x9483 0x8CB7 #CJK UNIFIED IDEOGRAPH +0x9484 0x58F2 #CJK UNIFIED IDEOGRAPH +0x9485 0x8CE0 #CJK UNIFIED IDEOGRAPH +0x9486 0x966A #CJK UNIFIED IDEOGRAPH +0x9487 0x9019 #CJK UNIFIED IDEOGRAPH +0x9488 0x877F #CJK UNIFIED IDEOGRAPH +0x9489 0x79E4 #CJK UNIFIED IDEOGRAPH +0x948A 0x77E7 #CJK UNIFIED IDEOGRAPH +0x948B 0x8429 #CJK UNIFIED IDEOGRAPH +0x948C 0x4F2F #CJK UNIFIED IDEOGRAPH +0x948D 0x5265 #CJK UNIFIED IDEOGRAPH +0x948E 0x535A #CJK UNIFIED IDEOGRAPH +0x948F 0x62CD #CJK UNIFIED IDEOGRAPH +0x9490 0x67CF #CJK UNIFIED IDEOGRAPH +0x9491 0x6CCA #CJK UNIFIED IDEOGRAPH +0x9492 0x767D #CJK UNIFIED IDEOGRAPH +0x9493 0x7B94 #CJK UNIFIED IDEOGRAPH +0x9494 0x7C95 #CJK UNIFIED IDEOGRAPH +0x9495 0x8236 #CJK UNIFIED IDEOGRAPH +0x9496 0x8584 #CJK UNIFIED IDEOGRAPH +0x9497 0x8FEB #CJK UNIFIED IDEOGRAPH +0x9498 0x66DD #CJK UNIFIED IDEOGRAPH +0x9499 0x6F20 #CJK UNIFIED IDEOGRAPH +0x949A 0x7206 #CJK UNIFIED IDEOGRAPH +0x949B 0x7E1B #CJK UNIFIED IDEOGRAPH +0x949C 0x83AB #CJK UNIFIED IDEOGRAPH +0x949D 0x99C1 #CJK UNIFIED IDEOGRAPH +0x949E 0x9EA6 #CJK UNIFIED IDEOGRAPH +0x949F 0x51FD #CJK UNIFIED IDEOGRAPH +0x94A0 0x7BB1 #CJK UNIFIED IDEOGRAPH +0x94A1 0x7872 #CJK UNIFIED IDEOGRAPH +0x94A2 0x7BB8 #CJK UNIFIED IDEOGRAPH +0x94A3 0x8087 #CJK UNIFIED IDEOGRAPH +0x94A4 0x7B48 #CJK UNIFIED IDEOGRAPH +0x94A5 0x6AE8 #CJK UNIFIED IDEOGRAPH +0x94A6 0x5E61 #CJK UNIFIED IDEOGRAPH +0x94A7 0x808C #CJK UNIFIED IDEOGRAPH +0x94A8 0x7551 #CJK UNIFIED IDEOGRAPH +0x94A9 0x7560 #CJK UNIFIED IDEOGRAPH +0x94AA 0x516B #CJK UNIFIED IDEOGRAPH +0x94AB 0x9262 #CJK UNIFIED IDEOGRAPH +0x94AC 0x6E8C #CJK UNIFIED IDEOGRAPH +0x94AD 0x767A #CJK UNIFIED IDEOGRAPH +0x94AE 0x9197 #CJK UNIFIED IDEOGRAPH +0x94AF 0x9AEA #CJK UNIFIED IDEOGRAPH +0x94B0 0x4F10 #CJK UNIFIED IDEOGRAPH +0x94B1 0x7F70 #CJK UNIFIED IDEOGRAPH +0x94B2 0x629C #CJK UNIFIED IDEOGRAPH +0x94B3 0x7B4F #CJK UNIFIED IDEOGRAPH +0x94B4 0x95A5 #CJK UNIFIED IDEOGRAPH +0x94B5 0x9CE9 #CJK UNIFIED IDEOGRAPH +0x94B6 0x567A #CJK UNIFIED IDEOGRAPH +0x94B7 0x5859 #CJK UNIFIED IDEOGRAPH +0x94B8 0x86E4 #CJK UNIFIED IDEOGRAPH +0x94B9 0x96BC #CJK UNIFIED IDEOGRAPH +0x94BA 0x4F34 #CJK UNIFIED IDEOGRAPH +0x94BB 0x5224 #CJK UNIFIED IDEOGRAPH +0x94BC 0x534A #CJK UNIFIED IDEOGRAPH +0x94BD 0x53CD #CJK UNIFIED IDEOGRAPH +0x94BE 0x53DB #CJK UNIFIED IDEOGRAPH +0x94BF 0x5E06 #CJK UNIFIED IDEOGRAPH +0x94C0 0x642C #CJK UNIFIED IDEOGRAPH +0x94C1 0x6591 #CJK UNIFIED IDEOGRAPH +0x94C2 0x677F #CJK UNIFIED IDEOGRAPH +0x94C3 0x6C3E #CJK UNIFIED IDEOGRAPH +0x94C4 0x6C4E #CJK UNIFIED IDEOGRAPH +0x94C5 0x7248 #CJK UNIFIED IDEOGRAPH +0x94C6 0x72AF #CJK UNIFIED IDEOGRAPH +0x94C7 0x73ED #CJK UNIFIED IDEOGRAPH +0x94C8 0x7554 #CJK UNIFIED IDEOGRAPH +0x94C9 0x7E41 #CJK UNIFIED IDEOGRAPH +0x94CA 0x822C #CJK UNIFIED IDEOGRAPH +0x94CB 0x85E9 #CJK UNIFIED IDEOGRAPH +0x94CC 0x8CA9 #CJK UNIFIED IDEOGRAPH +0x94CD 0x7BC4 #CJK UNIFIED IDEOGRAPH +0x94CE 0x91C6 #CJK UNIFIED IDEOGRAPH +0x94CF 0x7169 #CJK UNIFIED IDEOGRAPH +0x94D0 0x9812 #CJK UNIFIED IDEOGRAPH +0x94D1 0x98EF #CJK UNIFIED IDEOGRAPH +0x94D2 0x633D #CJK UNIFIED IDEOGRAPH +0x94D3 0x6669 #CJK UNIFIED IDEOGRAPH +0x94D4 0x756A #CJK UNIFIED IDEOGRAPH +0x94D5 0x76E4 #CJK UNIFIED IDEOGRAPH +0x94D6 0x78D0 #CJK UNIFIED IDEOGRAPH +0x94D7 0x8543 #CJK UNIFIED IDEOGRAPH +0x94D8 0x86EE #CJK UNIFIED IDEOGRAPH +0x94D9 0x532A #CJK UNIFIED IDEOGRAPH +0x94DA 0x5351 #CJK UNIFIED IDEOGRAPH +0x94DB 0x5426 #CJK UNIFIED IDEOGRAPH +0x94DC 0x5983 #CJK UNIFIED IDEOGRAPH +0x94DD 0x5E87 #CJK UNIFIED IDEOGRAPH +0x94DE 0x5F7C #CJK UNIFIED IDEOGRAPH +0x94DF 0x60B2 #CJK UNIFIED IDEOGRAPH +0x94E0 0x6249 #CJK UNIFIED IDEOGRAPH +0x94E1 0x6279 #CJK UNIFIED IDEOGRAPH +0x94E2 0x62AB #CJK UNIFIED IDEOGRAPH +0x94E3 0x6590 #CJK UNIFIED IDEOGRAPH +0x94E4 0x6BD4 #CJK UNIFIED IDEOGRAPH +0x94E5 0x6CCC #CJK UNIFIED IDEOGRAPH +0x94E6 0x75B2 #CJK UNIFIED IDEOGRAPH +0x94E7 0x76AE #CJK UNIFIED IDEOGRAPH +0x94E8 0x7891 #CJK UNIFIED IDEOGRAPH +0x94E9 0x79D8 #CJK UNIFIED IDEOGRAPH +0x94EA 0x7DCB #CJK UNIFIED IDEOGRAPH +0x94EB 0x7F77 #CJK UNIFIED IDEOGRAPH +0x94EC 0x80A5 #CJK UNIFIED IDEOGRAPH +0x94ED 0x88AB #CJK UNIFIED IDEOGRAPH +0x94EE 0x8AB9 #CJK UNIFIED IDEOGRAPH +0x94EF 0x8CBB #CJK UNIFIED IDEOGRAPH +0x94F0 0x907F #CJK UNIFIED IDEOGRAPH +0x94F1 0x975E #CJK UNIFIED IDEOGRAPH +0x94F2 0x98DB #CJK UNIFIED IDEOGRAPH +0x94F3 0x6A0B #CJK UNIFIED IDEOGRAPH +0x94F4 0x7C38 #CJK UNIFIED IDEOGRAPH +0x94F5 0x5099 #CJK UNIFIED IDEOGRAPH +0x94F6 0x5C3E #CJK UNIFIED IDEOGRAPH +0x94F7 0x5FAE #CJK UNIFIED IDEOGRAPH +0x94F8 0x6787 #CJK UNIFIED IDEOGRAPH +0x94F9 0x6BD8 #CJK UNIFIED IDEOGRAPH +0x94FA 0x7435 #CJK UNIFIED IDEOGRAPH +0x94FB 0x7709 #CJK UNIFIED IDEOGRAPH +0x94FC 0x7F8E #CJK UNIFIED IDEOGRAPH +0x9540 0x9F3B #CJK UNIFIED IDEOGRAPH +0x9541 0x67CA #CJK UNIFIED IDEOGRAPH +0x9542 0x7A17 #CJK UNIFIED IDEOGRAPH +0x9543 0x5339 #CJK UNIFIED IDEOGRAPH +0x9544 0x758B #CJK UNIFIED IDEOGRAPH +0x9545 0x9AED #CJK UNIFIED IDEOGRAPH +0x9546 0x5F66 #CJK UNIFIED IDEOGRAPH +0x9547 0x819D #CJK UNIFIED IDEOGRAPH +0x9548 0x83F1 #CJK UNIFIED IDEOGRAPH +0x9549 0x8098 #CJK UNIFIED IDEOGRAPH +0x954A 0x5F3C #CJK UNIFIED IDEOGRAPH +0x954B 0x5FC5 #CJK UNIFIED IDEOGRAPH +0x954C 0x7562 #CJK UNIFIED IDEOGRAPH +0x954D 0x7B46 #CJK UNIFIED IDEOGRAPH +0x954E 0x903C #CJK UNIFIED IDEOGRAPH +0x954F 0x6867 #CJK UNIFIED IDEOGRAPH +0x9550 0x59EB #CJK UNIFIED IDEOGRAPH +0x9551 0x5A9B #CJK UNIFIED IDEOGRAPH +0x9552 0x7D10 #CJK UNIFIED IDEOGRAPH +0x9553 0x767E #CJK UNIFIED IDEOGRAPH +0x9554 0x8B2C #CJK UNIFIED IDEOGRAPH +0x9555 0x4FF5 #CJK UNIFIED IDEOGRAPH +0x9556 0x5F6A #CJK UNIFIED IDEOGRAPH +0x9557 0x6A19 #CJK UNIFIED IDEOGRAPH +0x9558 0x6C37 #CJK UNIFIED IDEOGRAPH +0x9559 0x6F02 #CJK UNIFIED IDEOGRAPH +0x955A 0x74E2 #CJK UNIFIED IDEOGRAPH +0x955B 0x7968 #CJK UNIFIED IDEOGRAPH +0x955C 0x8868 #CJK UNIFIED IDEOGRAPH +0x955D 0x8A55 #CJK UNIFIED IDEOGRAPH +0x955E 0x8C79 #CJK UNIFIED IDEOGRAPH +0x955F 0x5EDF #CJK UNIFIED IDEOGRAPH +0x9560 0x63CF #CJK UNIFIED IDEOGRAPH +0x9561 0x75C5 #CJK UNIFIED IDEOGRAPH +0x9562 0x79D2 #CJK UNIFIED IDEOGRAPH +0x9563 0x82D7 #CJK UNIFIED IDEOGRAPH +0x9564 0x9328 #CJK UNIFIED IDEOGRAPH +0x9565 0x92F2 #CJK UNIFIED IDEOGRAPH +0x9566 0x849C #CJK UNIFIED IDEOGRAPH +0x9567 0x86ED #CJK UNIFIED IDEOGRAPH +0x9568 0x9C2D #CJK UNIFIED IDEOGRAPH +0x9569 0x54C1 #CJK UNIFIED IDEOGRAPH +0x956A 0x5F6C #CJK UNIFIED IDEOGRAPH +0x956B 0x658C #CJK UNIFIED IDEOGRAPH +0x956C 0x6D5C #CJK UNIFIED IDEOGRAPH +0x956D 0x7015 #CJK UNIFIED IDEOGRAPH +0x956E 0x8CA7 #CJK UNIFIED IDEOGRAPH +0x956F 0x8CD3 #CJK UNIFIED IDEOGRAPH +0x9570 0x983B #CJK UNIFIED IDEOGRAPH +0x9571 0x654F #CJK UNIFIED IDEOGRAPH +0x9572 0x74F6 #CJK UNIFIED IDEOGRAPH +0x9573 0x4E0D #CJK UNIFIED IDEOGRAPH +0x9574 0x4ED8 #CJK UNIFIED IDEOGRAPH +0x9575 0x57E0 #CJK UNIFIED IDEOGRAPH +0x9576 0x592B #CJK UNIFIED IDEOGRAPH +0x9577 0x5A66 #CJK UNIFIED IDEOGRAPH +0x9578 0x5BCC #CJK UNIFIED IDEOGRAPH +0x9579 0x51A8 #CJK UNIFIED IDEOGRAPH +0x957A 0x5E03 #CJK UNIFIED IDEOGRAPH +0x957B 0x5E9C #CJK UNIFIED IDEOGRAPH +0x957C 0x6016 #CJK UNIFIED IDEOGRAPH +0x957D 0x6276 #CJK UNIFIED IDEOGRAPH +0x957E 0x6577 #CJK UNIFIED IDEOGRAPH +0x9580 0x65A7 #CJK UNIFIED IDEOGRAPH +0x9581 0x666E #CJK UNIFIED IDEOGRAPH +0x9582 0x6D6E #CJK UNIFIED IDEOGRAPH +0x9583 0x7236 #CJK UNIFIED IDEOGRAPH +0x9584 0x7B26 #CJK UNIFIED IDEOGRAPH +0x9585 0x8150 #CJK UNIFIED IDEOGRAPH +0x9586 0x819A #CJK UNIFIED IDEOGRAPH +0x9587 0x8299 #CJK UNIFIED IDEOGRAPH +0x9588 0x8B5C #CJK UNIFIED IDEOGRAPH +0x9589 0x8CA0 #CJK UNIFIED IDEOGRAPH +0x958A 0x8CE6 #CJK UNIFIED IDEOGRAPH +0x958B 0x8D74 #CJK UNIFIED IDEOGRAPH +0x958C 0x961C #CJK UNIFIED IDEOGRAPH +0x958D 0x9644 #CJK UNIFIED IDEOGRAPH +0x958E 0x4FAE #CJK UNIFIED IDEOGRAPH +0x958F 0x64AB #CJK UNIFIED IDEOGRAPH +0x9590 0x6B66 #CJK UNIFIED IDEOGRAPH +0x9591 0x821E #CJK UNIFIED IDEOGRAPH +0x9592 0x8461 #CJK UNIFIED IDEOGRAPH +0x9593 0x856A #CJK UNIFIED IDEOGRAPH +0x9594 0x90E8 #CJK UNIFIED IDEOGRAPH +0x9595 0x5C01 #CJK UNIFIED IDEOGRAPH +0x9596 0x6953 #CJK UNIFIED IDEOGRAPH +0x9597 0x98A8 #CJK UNIFIED IDEOGRAPH +0x9598 0x847A #CJK UNIFIED IDEOGRAPH +0x9599 0x8557 #CJK UNIFIED IDEOGRAPH +0x959A 0x4F0F #CJK UNIFIED IDEOGRAPH +0x959B 0x526F #CJK UNIFIED IDEOGRAPH +0x959C 0x5FA9 #CJK UNIFIED IDEOGRAPH +0x959D 0x5E45 #CJK UNIFIED IDEOGRAPH +0x959E 0x670D #CJK UNIFIED IDEOGRAPH +0x959F 0x798F #CJK UNIFIED IDEOGRAPH +0x95A0 0x8179 #CJK UNIFIED IDEOGRAPH +0x95A1 0x8907 #CJK UNIFIED IDEOGRAPH +0x95A2 0x8986 #CJK UNIFIED IDEOGRAPH +0x95A3 0x6DF5 #CJK UNIFIED IDEOGRAPH +0x95A4 0x5F17 #CJK UNIFIED IDEOGRAPH +0x95A5 0x6255 #CJK UNIFIED IDEOGRAPH +0x95A6 0x6CB8 #CJK UNIFIED IDEOGRAPH +0x95A7 0x4ECF #CJK UNIFIED IDEOGRAPH +0x95A8 0x7269 #CJK UNIFIED IDEOGRAPH +0x95A9 0x9B92 #CJK UNIFIED IDEOGRAPH +0x95AA 0x5206 #CJK UNIFIED IDEOGRAPH +0x95AB 0x543B #CJK UNIFIED IDEOGRAPH +0x95AC 0x5674 #CJK UNIFIED IDEOGRAPH +0x95AD 0x58B3 #CJK UNIFIED IDEOGRAPH +0x95AE 0x61A4 #CJK UNIFIED IDEOGRAPH +0x95AF 0x626E #CJK UNIFIED IDEOGRAPH +0x95B0 0x711A #CJK UNIFIED IDEOGRAPH +0x95B1 0x596E #CJK UNIFIED IDEOGRAPH +0x95B2 0x7C89 #CJK UNIFIED IDEOGRAPH +0x95B3 0x7CDE #CJK UNIFIED IDEOGRAPH +0x95B4 0x7D1B #CJK UNIFIED IDEOGRAPH +0x95B5 0x96F0 #CJK UNIFIED IDEOGRAPH +0x95B6 0x6587 #CJK UNIFIED IDEOGRAPH +0x95B7 0x805E #CJK UNIFIED IDEOGRAPH +0x95B8 0x4E19 #CJK UNIFIED IDEOGRAPH +0x95B9 0x4F75 #CJK UNIFIED IDEOGRAPH +0x95BA 0x5175 #CJK UNIFIED IDEOGRAPH +0x95BB 0x5840 #CJK UNIFIED IDEOGRAPH +0x95BC 0x5E63 #CJK UNIFIED IDEOGRAPH +0x95BD 0x5E73 #CJK UNIFIED IDEOGRAPH +0x95BE 0x5F0A #CJK UNIFIED IDEOGRAPH +0x95BF 0x67C4 #CJK UNIFIED IDEOGRAPH +0x95C0 0x4E26 #CJK UNIFIED IDEOGRAPH +0x95C1 0x853D #CJK UNIFIED IDEOGRAPH +0x95C2 0x9589 #CJK UNIFIED IDEOGRAPH +0x95C3 0x965B #CJK UNIFIED IDEOGRAPH +0x95C4 0x7C73 #CJK UNIFIED IDEOGRAPH +0x95C5 0x9801 #CJK UNIFIED IDEOGRAPH +0x95C6 0x50FB #CJK UNIFIED IDEOGRAPH +0x95C7 0x58C1 #CJK UNIFIED IDEOGRAPH +0x95C8 0x7656 #CJK UNIFIED IDEOGRAPH +0x95C9 0x78A7 #CJK UNIFIED IDEOGRAPH +0x95CA 0x5225 #CJK UNIFIED IDEOGRAPH +0x95CB 0x77A5 #CJK UNIFIED IDEOGRAPH +0x95CC 0x8511 #CJK UNIFIED IDEOGRAPH +0x95CD 0x7B86 #CJK UNIFIED IDEOGRAPH +0x95CE 0x504F #CJK UNIFIED IDEOGRAPH +0x95CF 0x5909 #CJK UNIFIED IDEOGRAPH +0x95D0 0x7247 #CJK UNIFIED IDEOGRAPH +0x95D1 0x7BC7 #CJK UNIFIED IDEOGRAPH +0x95D2 0x7DE8 #CJK UNIFIED IDEOGRAPH +0x95D3 0x8FBA #CJK UNIFIED IDEOGRAPH +0x95D4 0x8FD4 #CJK UNIFIED IDEOGRAPH +0x95D5 0x904D #CJK UNIFIED IDEOGRAPH +0x95D6 0x4FBF #CJK UNIFIED IDEOGRAPH +0x95D7 0x52C9 #CJK UNIFIED IDEOGRAPH +0x95D8 0x5A29 #CJK UNIFIED IDEOGRAPH +0x95D9 0x5F01 #CJK UNIFIED IDEOGRAPH +0x95DA 0x97AD #CJK UNIFIED IDEOGRAPH +0x95DB 0x4FDD #CJK UNIFIED IDEOGRAPH +0x95DC 0x8217 #CJK UNIFIED IDEOGRAPH +0x95DD 0x92EA #CJK UNIFIED IDEOGRAPH +0x95DE 0x5703 #CJK UNIFIED IDEOGRAPH +0x95DF 0x6355 #CJK UNIFIED IDEOGRAPH +0x95E0 0x6B69 #CJK UNIFIED IDEOGRAPH +0x95E1 0x752B #CJK UNIFIED IDEOGRAPH +0x95E2 0x88DC #CJK UNIFIED IDEOGRAPH +0x95E3 0x8F14 #CJK UNIFIED IDEOGRAPH +0x95E4 0x7A42 #CJK UNIFIED IDEOGRAPH +0x95E5 0x52DF #CJK UNIFIED IDEOGRAPH +0x95E6 0x5893 #CJK UNIFIED IDEOGRAPH +0x95E7 0x6155 #CJK UNIFIED IDEOGRAPH +0x95E8 0x620A #CJK UNIFIED IDEOGRAPH +0x95E9 0x66AE #CJK UNIFIED IDEOGRAPH +0x95EA 0x6BCD #CJK UNIFIED IDEOGRAPH +0x95EB 0x7C3F #CJK UNIFIED IDEOGRAPH +0x95EC 0x83E9 #CJK UNIFIED IDEOGRAPH +0x95ED 0x5023 #CJK UNIFIED IDEOGRAPH +0x95EE 0x4FF8 #CJK UNIFIED IDEOGRAPH +0x95EF 0x5305 #CJK UNIFIED IDEOGRAPH +0x95F0 0x5446 #CJK UNIFIED IDEOGRAPH +0x95F1 0x5831 #CJK UNIFIED IDEOGRAPH +0x95F2 0x5949 #CJK UNIFIED IDEOGRAPH +0x95F3 0x5B9D #CJK UNIFIED IDEOGRAPH +0x95F4 0x5CF0 #CJK UNIFIED IDEOGRAPH +0x95F5 0x5CEF #CJK UNIFIED IDEOGRAPH +0x95F6 0x5D29 #CJK UNIFIED IDEOGRAPH +0x95F7 0x5E96 #CJK UNIFIED IDEOGRAPH +0x95F8 0x62B1 #CJK UNIFIED IDEOGRAPH +0x95F9 0x6367 #CJK UNIFIED IDEOGRAPH +0x95FA 0x653E #CJK UNIFIED IDEOGRAPH +0x95FB 0x65B9 #CJK UNIFIED IDEOGRAPH +0x95FC 0x670B #CJK UNIFIED IDEOGRAPH +0x9640 0x6CD5 #CJK UNIFIED IDEOGRAPH +0x9641 0x6CE1 #CJK UNIFIED IDEOGRAPH +0x9642 0x70F9 #CJK UNIFIED IDEOGRAPH +0x9643 0x7832 #CJK UNIFIED IDEOGRAPH +0x9644 0x7E2B #CJK UNIFIED IDEOGRAPH +0x9645 0x80DE #CJK UNIFIED IDEOGRAPH +0x9646 0x82B3 #CJK UNIFIED IDEOGRAPH +0x9647 0x840C #CJK UNIFIED IDEOGRAPH +0x9648 0x84EC #CJK UNIFIED IDEOGRAPH +0x9649 0x8702 #CJK UNIFIED IDEOGRAPH +0x964A 0x8912 #CJK UNIFIED IDEOGRAPH +0x964B 0x8A2A #CJK UNIFIED IDEOGRAPH +0x964C 0x8C4A #CJK UNIFIED IDEOGRAPH +0x964D 0x90A6 #CJK UNIFIED IDEOGRAPH +0x964E 0x92D2 #CJK UNIFIED IDEOGRAPH +0x964F 0x98FD #CJK UNIFIED IDEOGRAPH +0x9650 0x9CF3 #CJK UNIFIED IDEOGRAPH +0x9651 0x9D6C #CJK UNIFIED IDEOGRAPH +0x9652 0x4E4F #CJK UNIFIED IDEOGRAPH +0x9653 0x4EA1 #CJK UNIFIED IDEOGRAPH +0x9654 0x508D #CJK UNIFIED IDEOGRAPH +0x9655 0x5256 #CJK UNIFIED IDEOGRAPH +0x9656 0x574A #CJK UNIFIED IDEOGRAPH +0x9657 0x59A8 #CJK UNIFIED IDEOGRAPH +0x9658 0x5E3D #CJK UNIFIED IDEOGRAPH +0x9659 0x5FD8 #CJK UNIFIED IDEOGRAPH +0x965A 0x5FD9 #CJK UNIFIED IDEOGRAPH +0x965B 0x623F #CJK UNIFIED IDEOGRAPH +0x965C 0x66B4 #CJK UNIFIED IDEOGRAPH +0x965D 0x671B #CJK UNIFIED IDEOGRAPH +0x965E 0x67D0 #CJK UNIFIED IDEOGRAPH +0x965F 0x68D2 #CJK UNIFIED IDEOGRAPH +0x9660 0x5192 #CJK UNIFIED IDEOGRAPH +0x9661 0x7D21 #CJK UNIFIED IDEOGRAPH +0x9662 0x80AA #CJK UNIFIED IDEOGRAPH +0x9663 0x81A8 #CJK UNIFIED IDEOGRAPH +0x9664 0x8B00 #CJK UNIFIED IDEOGRAPH +0x9665 0x8C8C #CJK UNIFIED IDEOGRAPH +0x9666 0x8CBF #CJK UNIFIED IDEOGRAPH +0x9667 0x927E #CJK UNIFIED IDEOGRAPH +0x9668 0x9632 #CJK UNIFIED IDEOGRAPH +0x9669 0x5420 #CJK UNIFIED IDEOGRAPH +0x966A 0x982C #CJK UNIFIED IDEOGRAPH +0x966B 0x5317 #CJK UNIFIED IDEOGRAPH +0x966C 0x50D5 #CJK UNIFIED IDEOGRAPH +0x966D 0x535C #CJK UNIFIED IDEOGRAPH +0x966E 0x58A8 #CJK UNIFIED IDEOGRAPH +0x966F 0x64B2 #CJK UNIFIED IDEOGRAPH +0x9670 0x6734 #CJK UNIFIED IDEOGRAPH +0x9671 0x7267 #CJK UNIFIED IDEOGRAPH +0x9672 0x7766 #CJK UNIFIED IDEOGRAPH +0x9673 0x7A46 #CJK UNIFIED IDEOGRAPH +0x9674 0x91E6 #CJK UNIFIED IDEOGRAPH +0x9675 0x52C3 #CJK UNIFIED IDEOGRAPH +0x9676 0x6CA1 #CJK UNIFIED IDEOGRAPH +0x9677 0x6B86 #CJK UNIFIED IDEOGRAPH +0x9678 0x5800 #CJK UNIFIED IDEOGRAPH +0x9679 0x5E4C #CJK UNIFIED IDEOGRAPH +0x967A 0x5954 #CJK UNIFIED IDEOGRAPH +0x967B 0x672C #CJK UNIFIED IDEOGRAPH +0x967C 0x7FFB #CJK UNIFIED IDEOGRAPH +0x967D 0x51E1 #CJK UNIFIED IDEOGRAPH +0x967E 0x76C6 #CJK UNIFIED IDEOGRAPH +0x9680 0x6469 #CJK UNIFIED IDEOGRAPH +0x9681 0x78E8 #CJK UNIFIED IDEOGRAPH +0x9682 0x9B54 #CJK UNIFIED IDEOGRAPH +0x9683 0x9EBB #CJK UNIFIED IDEOGRAPH +0x9684 0x57CB #CJK UNIFIED IDEOGRAPH +0x9685 0x59B9 #CJK UNIFIED IDEOGRAPH +0x9686 0x6627 #CJK UNIFIED IDEOGRAPH +0x9687 0x679A #CJK UNIFIED IDEOGRAPH +0x9688 0x6BCE #CJK UNIFIED IDEOGRAPH +0x9689 0x54E9 #CJK UNIFIED IDEOGRAPH +0x968A 0x69D9 #CJK UNIFIED IDEOGRAPH +0x968B 0x5E55 #CJK UNIFIED IDEOGRAPH +0x968C 0x819C #CJK UNIFIED IDEOGRAPH +0x968D 0x6795 #CJK UNIFIED IDEOGRAPH +0x968E 0x9BAA #CJK UNIFIED IDEOGRAPH +0x968F 0x67FE #CJK UNIFIED IDEOGRAPH +0x9690 0x9C52 #CJK UNIFIED IDEOGRAPH +0x9691 0x685D #CJK UNIFIED IDEOGRAPH +0x9692 0x4EA6 #CJK UNIFIED IDEOGRAPH +0x9693 0x4FE3 #CJK UNIFIED IDEOGRAPH +0x9694 0x53C8 #CJK UNIFIED IDEOGRAPH +0x9695 0x62B9 #CJK UNIFIED IDEOGRAPH +0x9696 0x672B #CJK UNIFIED IDEOGRAPH +0x9697 0x6CAB #CJK UNIFIED IDEOGRAPH +0x9698 0x8FC4 #CJK UNIFIED IDEOGRAPH +0x9699 0x4FAD #CJK UNIFIED IDEOGRAPH +0x969A 0x7E6D #CJK UNIFIED IDEOGRAPH +0x969B 0x9EBF #CJK UNIFIED IDEOGRAPH +0x969C 0x4E07 #CJK UNIFIED IDEOGRAPH +0x969D 0x6162 #CJK UNIFIED IDEOGRAPH +0x969E 0x6E80 #CJK UNIFIED IDEOGRAPH +0x969F 0x6F2B #CJK UNIFIED IDEOGRAPH +0x96A0 0x8513 #CJK UNIFIED IDEOGRAPH +0x96A1 0x5473 #CJK UNIFIED IDEOGRAPH +0x96A2 0x672A #CJK UNIFIED IDEOGRAPH +0x96A3 0x9B45 #CJK UNIFIED IDEOGRAPH +0x96A4 0x5DF3 #CJK UNIFIED IDEOGRAPH +0x96A5 0x7B95 #CJK UNIFIED IDEOGRAPH +0x96A6 0x5CAC #CJK UNIFIED IDEOGRAPH +0x96A7 0x5BC6 #CJK UNIFIED IDEOGRAPH +0x96A8 0x871C #CJK UNIFIED IDEOGRAPH +0x96A9 0x6E4A #CJK UNIFIED IDEOGRAPH +0x96AA 0x84D1 #CJK UNIFIED IDEOGRAPH +0x96AB 0x7A14 #CJK UNIFIED IDEOGRAPH +0x96AC 0x8108 #CJK UNIFIED IDEOGRAPH +0x96AD 0x5999 #CJK UNIFIED IDEOGRAPH +0x96AE 0x7C8D #CJK UNIFIED IDEOGRAPH +0x96AF 0x6C11 #CJK UNIFIED IDEOGRAPH +0x96B0 0x7720 #CJK UNIFIED IDEOGRAPH +0x96B1 0x52D9 #CJK UNIFIED IDEOGRAPH +0x96B2 0x5922 #CJK UNIFIED IDEOGRAPH +0x96B3 0x7121 #CJK UNIFIED IDEOGRAPH +0x96B4 0x725F #CJK UNIFIED IDEOGRAPH +0x96B5 0x77DB #CJK UNIFIED IDEOGRAPH +0x96B6 0x9727 #CJK UNIFIED IDEOGRAPH +0x96B7 0x9D61 #CJK UNIFIED IDEOGRAPH +0x96B8 0x690B #CJK UNIFIED IDEOGRAPH +0x96B9 0x5A7F #CJK UNIFIED IDEOGRAPH +0x96BA 0x5A18 #CJK UNIFIED IDEOGRAPH +0x96BB 0x51A5 #CJK UNIFIED IDEOGRAPH +0x96BC 0x540D #CJK UNIFIED IDEOGRAPH +0x96BD 0x547D #CJK UNIFIED IDEOGRAPH +0x96BE 0x660E #CJK UNIFIED IDEOGRAPH +0x96BF 0x76DF #CJK UNIFIED IDEOGRAPH +0x96C0 0x8FF7 #CJK UNIFIED IDEOGRAPH +0x96C1 0x9298 #CJK UNIFIED IDEOGRAPH +0x96C2 0x9CF4 #CJK UNIFIED IDEOGRAPH +0x96C3 0x59EA #CJK UNIFIED IDEOGRAPH +0x96C4 0x725D #CJK UNIFIED IDEOGRAPH +0x96C5 0x6EC5 #CJK UNIFIED IDEOGRAPH +0x96C6 0x514D #CJK UNIFIED IDEOGRAPH +0x96C7 0x68C9 #CJK UNIFIED IDEOGRAPH +0x96C8 0x7DBF #CJK UNIFIED IDEOGRAPH +0x96C9 0x7DEC #CJK UNIFIED IDEOGRAPH +0x96CA 0x9762 #CJK UNIFIED IDEOGRAPH +0x96CB 0x9EBA #CJK UNIFIED IDEOGRAPH +0x96CC 0x6478 #CJK UNIFIED IDEOGRAPH +0x96CD 0x6A21 #CJK UNIFIED IDEOGRAPH +0x96CE 0x8302 #CJK UNIFIED IDEOGRAPH +0x96CF 0x5984 #CJK UNIFIED IDEOGRAPH +0x96D0 0x5B5F #CJK UNIFIED IDEOGRAPH +0x96D1 0x6BDB #CJK UNIFIED IDEOGRAPH +0x96D2 0x731B #CJK UNIFIED IDEOGRAPH +0x96D3 0x76F2 #CJK UNIFIED IDEOGRAPH +0x96D4 0x7DB2 #CJK UNIFIED IDEOGRAPH +0x96D5 0x8017 #CJK UNIFIED IDEOGRAPH +0x96D6 0x8499 #CJK UNIFIED IDEOGRAPH +0x96D7 0x5132 #CJK UNIFIED IDEOGRAPH +0x96D8 0x6728 #CJK UNIFIED IDEOGRAPH +0x96D9 0x9ED9 #CJK UNIFIED IDEOGRAPH +0x96DA 0x76EE #CJK UNIFIED IDEOGRAPH +0x96DB 0x6762 #CJK UNIFIED IDEOGRAPH +0x96DC 0x52FF #CJK UNIFIED IDEOGRAPH +0x96DD 0x9905 #CJK UNIFIED IDEOGRAPH +0x96DE 0x5C24 #CJK UNIFIED IDEOGRAPH +0x96DF 0x623B #CJK UNIFIED IDEOGRAPH +0x96E0 0x7C7E #CJK UNIFIED IDEOGRAPH +0x96E1 0x8CB0 #CJK UNIFIED IDEOGRAPH +0x96E2 0x554F #CJK UNIFIED IDEOGRAPH +0x96E3 0x60B6 #CJK UNIFIED IDEOGRAPH +0x96E4 0x7D0B #CJK UNIFIED IDEOGRAPH +0x96E5 0x9580 #CJK UNIFIED IDEOGRAPH +0x96E6 0x5301 #CJK UNIFIED IDEOGRAPH +0x96E7 0x4E5F #CJK UNIFIED IDEOGRAPH +0x96E8 0x51B6 #CJK UNIFIED IDEOGRAPH +0x96E9 0x591C #CJK UNIFIED IDEOGRAPH +0x96EA 0x723A #CJK UNIFIED IDEOGRAPH +0x96EB 0x8036 #CJK UNIFIED IDEOGRAPH +0x96EC 0x91CE #CJK UNIFIED IDEOGRAPH +0x96ED 0x5F25 #CJK UNIFIED IDEOGRAPH +0x96EE 0x77E2 #CJK UNIFIED IDEOGRAPH +0x96EF 0x5384 #CJK UNIFIED IDEOGRAPH +0x96F0 0x5F79 #CJK UNIFIED IDEOGRAPH +0x96F1 0x7D04 #CJK UNIFIED IDEOGRAPH +0x96F2 0x85AC #CJK UNIFIED IDEOGRAPH +0x96F3 0x8A33 #CJK UNIFIED IDEOGRAPH +0x96F4 0x8E8D #CJK UNIFIED IDEOGRAPH +0x96F5 0x9756 #CJK UNIFIED IDEOGRAPH +0x96F6 0x67F3 #CJK UNIFIED IDEOGRAPH +0x96F7 0x85AE #CJK UNIFIED IDEOGRAPH +0x96F8 0x9453 #CJK UNIFIED IDEOGRAPH +0x96F9 0x6109 #CJK UNIFIED IDEOGRAPH +0x96FA 0x6108 #CJK UNIFIED IDEOGRAPH +0x96FB 0x6CB9 #CJK UNIFIED IDEOGRAPH +0x96FC 0x7652 #CJK UNIFIED IDEOGRAPH +0x9740 0x8AED #CJK UNIFIED IDEOGRAPH +0x9741 0x8F38 #CJK UNIFIED IDEOGRAPH +0x9742 0x552F #CJK UNIFIED IDEOGRAPH +0x9743 0x4F51 #CJK UNIFIED IDEOGRAPH +0x9744 0x512A #CJK UNIFIED IDEOGRAPH +0x9745 0x52C7 #CJK UNIFIED IDEOGRAPH +0x9746 0x53CB #CJK UNIFIED IDEOGRAPH +0x9747 0x5BA5 #CJK UNIFIED IDEOGRAPH +0x9748 0x5E7D #CJK UNIFIED IDEOGRAPH +0x9749 0x60A0 #CJK UNIFIED IDEOGRAPH +0x974A 0x6182 #CJK UNIFIED IDEOGRAPH +0x974B 0x63D6 #CJK UNIFIED IDEOGRAPH +0x974C 0x6709 #CJK UNIFIED IDEOGRAPH +0x974D 0x67DA #CJK UNIFIED IDEOGRAPH +0x974E 0x6E67 #CJK UNIFIED IDEOGRAPH +0x974F 0x6D8C #CJK UNIFIED IDEOGRAPH +0x9750 0x7336 #CJK UNIFIED IDEOGRAPH +0x9751 0x7337 #CJK UNIFIED IDEOGRAPH +0x9752 0x7531 #CJK UNIFIED IDEOGRAPH +0x9753 0x7950 #CJK UNIFIED IDEOGRAPH +0x9754 0x88D5 #CJK UNIFIED IDEOGRAPH +0x9755 0x8A98 #CJK UNIFIED IDEOGRAPH +0x9756 0x904A #CJK UNIFIED IDEOGRAPH +0x9757 0x9091 #CJK UNIFIED IDEOGRAPH +0x9758 0x90F5 #CJK UNIFIED IDEOGRAPH +0x9759 0x96C4 #CJK UNIFIED IDEOGRAPH +0x975A 0x878D #CJK UNIFIED IDEOGRAPH +0x975B 0x5915 #CJK UNIFIED IDEOGRAPH +0x975C 0x4E88 #CJK UNIFIED IDEOGRAPH +0x975D 0x4F59 #CJK UNIFIED IDEOGRAPH +0x975E 0x4E0E #CJK UNIFIED IDEOGRAPH +0x975F 0x8A89 #CJK UNIFIED IDEOGRAPH +0x9760 0x8F3F #CJK UNIFIED IDEOGRAPH +0x9761 0x9810 #CJK UNIFIED IDEOGRAPH +0x9762 0x50AD #CJK UNIFIED IDEOGRAPH +0x9763 0x5E7C #CJK UNIFIED IDEOGRAPH +0x9764 0x5996 #CJK UNIFIED IDEOGRAPH +0x9765 0x5BB9 #CJK UNIFIED IDEOGRAPH +0x9766 0x5EB8 #CJK UNIFIED IDEOGRAPH +0x9767 0x63DA #CJK UNIFIED IDEOGRAPH +0x9768 0x63FA #CJK UNIFIED IDEOGRAPH +0x9769 0x64C1 #CJK UNIFIED IDEOGRAPH +0x976A 0x66DC #CJK UNIFIED IDEOGRAPH +0x976B 0x694A #CJK UNIFIED IDEOGRAPH +0x976C 0x69D8 #CJK UNIFIED IDEOGRAPH +0x976D 0x6D0B #CJK UNIFIED IDEOGRAPH +0x976E 0x6EB6 #CJK UNIFIED IDEOGRAPH +0x976F 0x7194 #CJK UNIFIED IDEOGRAPH +0x9770 0x7528 #CJK UNIFIED IDEOGRAPH +0x9771 0x7AAF #CJK UNIFIED IDEOGRAPH +0x9772 0x7F8A #CJK UNIFIED IDEOGRAPH +0x9773 0x8000 #CJK UNIFIED IDEOGRAPH +0x9774 0x8449 #CJK UNIFIED IDEOGRAPH +0x9775 0x84C9 #CJK UNIFIED IDEOGRAPH +0x9776 0x8981 #CJK UNIFIED IDEOGRAPH +0x9777 0x8B21 #CJK UNIFIED IDEOGRAPH +0x9778 0x8E0A #CJK UNIFIED IDEOGRAPH +0x9779 0x9065 #CJK UNIFIED IDEOGRAPH +0x977A 0x967D #CJK UNIFIED IDEOGRAPH +0x977B 0x990A #CJK UNIFIED IDEOGRAPH +0x977C 0x617E #CJK UNIFIED IDEOGRAPH +0x977D 0x6291 #CJK UNIFIED IDEOGRAPH +0x977E 0x6B32 #CJK UNIFIED IDEOGRAPH +0x9780 0x6C83 #CJK UNIFIED IDEOGRAPH +0x9781 0x6D74 #CJK UNIFIED IDEOGRAPH +0x9782 0x7FCC #CJK UNIFIED IDEOGRAPH +0x9783 0x7FFC #CJK UNIFIED IDEOGRAPH +0x9784 0x6DC0 #CJK UNIFIED IDEOGRAPH +0x9785 0x7F85 #CJK UNIFIED IDEOGRAPH +0x9786 0x87BA #CJK UNIFIED IDEOGRAPH +0x9787 0x88F8 #CJK UNIFIED IDEOGRAPH +0x9788 0x6765 #CJK UNIFIED IDEOGRAPH +0x9789 0x83B1 #CJK UNIFIED IDEOGRAPH +0x978A 0x983C #CJK UNIFIED IDEOGRAPH +0x978B 0x96F7 #CJK UNIFIED IDEOGRAPH +0x978C 0x6D1B #CJK UNIFIED IDEOGRAPH +0x978D 0x7D61 #CJK UNIFIED IDEOGRAPH +0x978E 0x843D #CJK UNIFIED IDEOGRAPH +0x978F 0x916A #CJK UNIFIED IDEOGRAPH +0x9790 0x4E71 #CJK UNIFIED IDEOGRAPH +0x9791 0x5375 #CJK UNIFIED IDEOGRAPH +0x9792 0x5D50 #CJK UNIFIED IDEOGRAPH +0x9793 0x6B04 #CJK UNIFIED IDEOGRAPH +0x9794 0x6FEB #CJK UNIFIED IDEOGRAPH +0x9795 0x85CD #CJK UNIFIED IDEOGRAPH +0x9796 0x862D #CJK UNIFIED IDEOGRAPH +0x9797 0x89A7 #CJK UNIFIED IDEOGRAPH +0x9798 0x5229 #CJK UNIFIED IDEOGRAPH +0x9799 0x540F #CJK UNIFIED IDEOGRAPH +0x979A 0x5C65 #CJK UNIFIED IDEOGRAPH +0x979B 0x674E #CJK UNIFIED IDEOGRAPH +0x979C 0x68A8 #CJK UNIFIED IDEOGRAPH +0x979D 0x7406 #CJK UNIFIED IDEOGRAPH +0x979E 0x7483 #CJK UNIFIED IDEOGRAPH +0x979F 0x75E2 #CJK UNIFIED IDEOGRAPH +0x97A0 0x88CF #CJK UNIFIED IDEOGRAPH +0x97A1 0x88E1 #CJK UNIFIED IDEOGRAPH +0x97A2 0x91CC #CJK UNIFIED IDEOGRAPH +0x97A3 0x96E2 #CJK UNIFIED IDEOGRAPH +0x97A4 0x9678 #CJK UNIFIED IDEOGRAPH +0x97A5 0x5F8B #CJK UNIFIED IDEOGRAPH +0x97A6 0x7387 #CJK UNIFIED IDEOGRAPH +0x97A7 0x7ACB #CJK UNIFIED IDEOGRAPH +0x97A8 0x844E #CJK UNIFIED IDEOGRAPH +0x97A9 0x63A0 #CJK UNIFIED IDEOGRAPH +0x97AA 0x7565 #CJK UNIFIED IDEOGRAPH +0x97AB 0x5289 #CJK UNIFIED IDEOGRAPH +0x97AC 0x6D41 #CJK UNIFIED IDEOGRAPH +0x97AD 0x6E9C #CJK UNIFIED IDEOGRAPH +0x97AE 0x7409 #CJK UNIFIED IDEOGRAPH +0x97AF 0x7559 #CJK UNIFIED IDEOGRAPH +0x97B0 0x786B #CJK UNIFIED IDEOGRAPH +0x97B1 0x7C92 #CJK UNIFIED IDEOGRAPH +0x97B2 0x9686 #CJK UNIFIED IDEOGRAPH +0x97B3 0x7ADC #CJK UNIFIED IDEOGRAPH +0x97B4 0x9F8D #CJK UNIFIED IDEOGRAPH +0x97B5 0x4FB6 #CJK UNIFIED IDEOGRAPH +0x97B6 0x616E #CJK UNIFIED IDEOGRAPH +0x97B7 0x65C5 #CJK UNIFIED IDEOGRAPH +0x97B8 0x865C #CJK UNIFIED IDEOGRAPH +0x97B9 0x4E86 #CJK UNIFIED IDEOGRAPH +0x97BA 0x4EAE #CJK UNIFIED IDEOGRAPH +0x97BB 0x50DA #CJK UNIFIED IDEOGRAPH +0x97BC 0x4E21 #CJK UNIFIED IDEOGRAPH +0x97BD 0x51CC #CJK UNIFIED IDEOGRAPH +0x97BE 0x5BEE #CJK UNIFIED IDEOGRAPH +0x97BF 0x6599 #CJK UNIFIED IDEOGRAPH +0x97C0 0x6881 #CJK UNIFIED IDEOGRAPH +0x97C1 0x6DBC #CJK UNIFIED IDEOGRAPH +0x97C2 0x731F #CJK UNIFIED IDEOGRAPH +0x97C3 0x7642 #CJK UNIFIED IDEOGRAPH +0x97C4 0x77AD #CJK UNIFIED IDEOGRAPH +0x97C5 0x7A1C #CJK UNIFIED IDEOGRAPH +0x97C6 0x7CE7 #CJK UNIFIED IDEOGRAPH +0x97C7 0x826F #CJK UNIFIED IDEOGRAPH +0x97C8 0x8AD2 #CJK UNIFIED IDEOGRAPH +0x97C9 0x907C #CJK UNIFIED IDEOGRAPH +0x97CA 0x91CF #CJK UNIFIED IDEOGRAPH +0x97CB 0x9675 #CJK UNIFIED IDEOGRAPH +0x97CC 0x9818 #CJK UNIFIED IDEOGRAPH +0x97CD 0x529B #CJK UNIFIED IDEOGRAPH +0x97CE 0x7DD1 #CJK UNIFIED IDEOGRAPH +0x97CF 0x502B #CJK UNIFIED IDEOGRAPH +0x97D0 0x5398 #CJK UNIFIED IDEOGRAPH +0x97D1 0x6797 #CJK UNIFIED IDEOGRAPH +0x97D2 0x6DCB #CJK UNIFIED IDEOGRAPH +0x97D3 0x71D0 #CJK UNIFIED IDEOGRAPH +0x97D4 0x7433 #CJK UNIFIED IDEOGRAPH +0x97D5 0x81E8 #CJK UNIFIED IDEOGRAPH +0x97D6 0x8F2A #CJK UNIFIED IDEOGRAPH +0x97D7 0x96A3 #CJK UNIFIED IDEOGRAPH +0x97D8 0x9C57 #CJK UNIFIED IDEOGRAPH +0x97D9 0x9E9F #CJK UNIFIED IDEOGRAPH +0x97DA 0x7460 #CJK UNIFIED IDEOGRAPH +0x97DB 0x5841 #CJK UNIFIED IDEOGRAPH +0x97DC 0x6D99 #CJK UNIFIED IDEOGRAPH +0x97DD 0x7D2F #CJK UNIFIED IDEOGRAPH +0x97DE 0x985E #CJK UNIFIED IDEOGRAPH +0x97DF 0x4EE4 #CJK UNIFIED IDEOGRAPH +0x97E0 0x4F36 #CJK UNIFIED IDEOGRAPH +0x97E1 0x4F8B #CJK UNIFIED IDEOGRAPH +0x97E2 0x51B7 #CJK UNIFIED IDEOGRAPH +0x97E3 0x52B1 #CJK UNIFIED IDEOGRAPH +0x97E4 0x5DBA #CJK UNIFIED IDEOGRAPH +0x97E5 0x601C #CJK UNIFIED IDEOGRAPH +0x97E6 0x73B2 #CJK UNIFIED IDEOGRAPH +0x97E7 0x793C #CJK UNIFIED IDEOGRAPH +0x97E8 0x82D3 #CJK UNIFIED IDEOGRAPH +0x97E9 0x9234 #CJK UNIFIED IDEOGRAPH +0x97EA 0x96B7 #CJK UNIFIED IDEOGRAPH +0x97EB 0x96F6 #CJK UNIFIED IDEOGRAPH +0x97EC 0x970A #CJK UNIFIED IDEOGRAPH +0x97ED 0x9E97 #CJK UNIFIED IDEOGRAPH +0x97EE 0x9F62 #CJK UNIFIED IDEOGRAPH +0x97EF 0x66A6 #CJK UNIFIED IDEOGRAPH +0x97F0 0x6B74 #CJK UNIFIED IDEOGRAPH +0x97F1 0x5217 #CJK UNIFIED IDEOGRAPH +0x97F2 0x52A3 #CJK UNIFIED IDEOGRAPH +0x97F3 0x70C8 #CJK UNIFIED IDEOGRAPH +0x97F4 0x88C2 #CJK UNIFIED IDEOGRAPH +0x97F5 0x5EC9 #CJK UNIFIED IDEOGRAPH +0x97F6 0x604B #CJK UNIFIED IDEOGRAPH +0x97F7 0x6190 #CJK UNIFIED IDEOGRAPH +0x97F8 0x6F23 #CJK UNIFIED IDEOGRAPH +0x97F9 0x7149 #CJK UNIFIED IDEOGRAPH +0x97FA 0x7C3E #CJK UNIFIED IDEOGRAPH +0x97FB 0x7DF4 #CJK UNIFIED IDEOGRAPH +0x97FC 0x806F #CJK UNIFIED IDEOGRAPH +0x9840 0x84EE #CJK UNIFIED IDEOGRAPH +0x9841 0x9023 #CJK UNIFIED IDEOGRAPH +0x9842 0x932C #CJK UNIFIED IDEOGRAPH +0x9843 0x5442 #CJK UNIFIED IDEOGRAPH +0x9844 0x9B6F #CJK UNIFIED IDEOGRAPH +0x9845 0x6AD3 #CJK UNIFIED IDEOGRAPH +0x9846 0x7089 #CJK UNIFIED IDEOGRAPH +0x9847 0x8CC2 #CJK UNIFIED IDEOGRAPH +0x9848 0x8DEF #CJK UNIFIED IDEOGRAPH +0x9849 0x9732 #CJK UNIFIED IDEOGRAPH +0x984A 0x52B4 #CJK UNIFIED IDEOGRAPH +0x984B 0x5A41 #CJK UNIFIED IDEOGRAPH +0x984C 0x5ECA #CJK UNIFIED IDEOGRAPH +0x984D 0x5F04 #CJK UNIFIED IDEOGRAPH +0x984E 0x6717 #CJK UNIFIED IDEOGRAPH +0x984F 0x697C #CJK UNIFIED IDEOGRAPH +0x9850 0x6994 #CJK UNIFIED IDEOGRAPH +0x9851 0x6D6A #CJK UNIFIED IDEOGRAPH +0x9852 0x6F0F #CJK UNIFIED IDEOGRAPH +0x9853 0x7262 #CJK UNIFIED IDEOGRAPH +0x9854 0x72FC #CJK UNIFIED IDEOGRAPH +0x9855 0x7BED #CJK UNIFIED IDEOGRAPH +0x9856 0x8001 #CJK UNIFIED IDEOGRAPH +0x9857 0x807E #CJK UNIFIED IDEOGRAPH +0x9858 0x874B #CJK UNIFIED IDEOGRAPH +0x9859 0x90CE #CJK UNIFIED IDEOGRAPH +0x985A 0x516D #CJK UNIFIED IDEOGRAPH +0x985B 0x9E93 #CJK UNIFIED IDEOGRAPH +0x985C 0x7984 #CJK UNIFIED IDEOGRAPH +0x985D 0x808B #CJK UNIFIED IDEOGRAPH +0x985E 0x9332 #CJK UNIFIED IDEOGRAPH +0x985F 0x8AD6 #CJK UNIFIED IDEOGRAPH +0x9860 0x502D #CJK UNIFIED IDEOGRAPH +0x9861 0x548C #CJK UNIFIED IDEOGRAPH +0x9862 0x8A71 #CJK UNIFIED IDEOGRAPH +0x9863 0x6B6A #CJK UNIFIED IDEOGRAPH +0x9864 0x8CC4 #CJK UNIFIED IDEOGRAPH +0x9865 0x8107 #CJK UNIFIED IDEOGRAPH +0x9866 0x60D1 #CJK UNIFIED IDEOGRAPH +0x9867 0x67A0 #CJK UNIFIED IDEOGRAPH +0x9868 0x9DF2 #CJK UNIFIED IDEOGRAPH +0x9869 0x4E99 #CJK UNIFIED IDEOGRAPH +0x986A 0x4E98 #CJK UNIFIED IDEOGRAPH +0x986B 0x9C10 #CJK UNIFIED IDEOGRAPH +0x986C 0x8A6B #CJK UNIFIED IDEOGRAPH +0x986D 0x85C1 #CJK UNIFIED IDEOGRAPH +0x986E 0x8568 #CJK UNIFIED IDEOGRAPH +0x986F 0x6900 #CJK UNIFIED IDEOGRAPH +0x9870 0x6E7E #CJK UNIFIED IDEOGRAPH +0x9871 0x7897 #CJK UNIFIED IDEOGRAPH +0x9872 0x8155 #CJK UNIFIED IDEOGRAPH +0x989F 0x5F0C #CJK UNIFIED IDEOGRAPH +0x98A0 0x4E10 #CJK UNIFIED IDEOGRAPH +0x98A1 0x4E15 #CJK UNIFIED IDEOGRAPH +0x98A2 0x4E2A #CJK UNIFIED IDEOGRAPH +0x98A3 0x4E31 #CJK UNIFIED IDEOGRAPH +0x98A4 0x4E36 #CJK UNIFIED IDEOGRAPH +0x98A5 0x4E3C #CJK UNIFIED IDEOGRAPH +0x98A6 0x4E3F #CJK UNIFIED IDEOGRAPH +0x98A7 0x4E42 #CJK UNIFIED IDEOGRAPH +0x98A8 0x4E56 #CJK UNIFIED IDEOGRAPH +0x98A9 0x4E58 #CJK UNIFIED IDEOGRAPH +0x98AA 0x4E82 #CJK UNIFIED IDEOGRAPH +0x98AB 0x4E85 #CJK UNIFIED IDEOGRAPH +0x98AC 0x8C6B #CJK UNIFIED IDEOGRAPH +0x98AD 0x4E8A #CJK UNIFIED IDEOGRAPH +0x98AE 0x8212 #CJK UNIFIED IDEOGRAPH +0x98AF 0x5F0D #CJK UNIFIED IDEOGRAPH +0x98B0 0x4E8E #CJK UNIFIED IDEOGRAPH +0x98B1 0x4E9E #CJK UNIFIED IDEOGRAPH +0x98B2 0x4E9F #CJK UNIFIED IDEOGRAPH +0x98B3 0x4EA0 #CJK UNIFIED IDEOGRAPH +0x98B4 0x4EA2 #CJK UNIFIED IDEOGRAPH +0x98B5 0x4EB0 #CJK UNIFIED IDEOGRAPH +0x98B6 0x4EB3 #CJK UNIFIED IDEOGRAPH +0x98B7 0x4EB6 #CJK UNIFIED IDEOGRAPH +0x98B8 0x4ECE #CJK UNIFIED IDEOGRAPH +0x98B9 0x4ECD #CJK UNIFIED IDEOGRAPH +0x98BA 0x4EC4 #CJK UNIFIED IDEOGRAPH +0x98BB 0x4EC6 #CJK UNIFIED IDEOGRAPH +0x98BC 0x4EC2 #CJK UNIFIED IDEOGRAPH +0x98BD 0x4ED7 #CJK UNIFIED IDEOGRAPH +0x98BE 0x4EDE #CJK UNIFIED IDEOGRAPH +0x98BF 0x4EED #CJK UNIFIED IDEOGRAPH +0x98C0 0x4EDF #CJK UNIFIED IDEOGRAPH +0x98C1 0x4EF7 #CJK UNIFIED IDEOGRAPH +0x98C2 0x4F09 #CJK UNIFIED IDEOGRAPH +0x98C3 0x4F5A #CJK UNIFIED IDEOGRAPH +0x98C4 0x4F30 #CJK UNIFIED IDEOGRAPH +0x98C5 0x4F5B #CJK UNIFIED IDEOGRAPH +0x98C6 0x4F5D #CJK UNIFIED IDEOGRAPH +0x98C7 0x4F57 #CJK UNIFIED IDEOGRAPH +0x98C8 0x4F47 #CJK UNIFIED IDEOGRAPH +0x98C9 0x4F76 #CJK UNIFIED IDEOGRAPH +0x98CA 0x4F88 #CJK UNIFIED IDEOGRAPH +0x98CB 0x4F8F #CJK UNIFIED IDEOGRAPH +0x98CC 0x4F98 #CJK UNIFIED IDEOGRAPH +0x98CD 0x4F7B #CJK UNIFIED IDEOGRAPH +0x98CE 0x4F69 #CJK UNIFIED IDEOGRAPH +0x98CF 0x4F70 #CJK UNIFIED IDEOGRAPH +0x98D0 0x4F91 #CJK UNIFIED IDEOGRAPH +0x98D1 0x4F6F #CJK UNIFIED IDEOGRAPH +0x98D2 0x4F86 #CJK UNIFIED IDEOGRAPH +0x98D3 0x4F96 #CJK UNIFIED IDEOGRAPH +0x98D4 0x5118 #CJK UNIFIED IDEOGRAPH +0x98D5 0x4FD4 #CJK UNIFIED IDEOGRAPH +0x98D6 0x4FDF #CJK UNIFIED IDEOGRAPH +0x98D7 0x4FCE #CJK UNIFIED IDEOGRAPH +0x98D8 0x4FD8 #CJK UNIFIED IDEOGRAPH +0x98D9 0x4FDB #CJK UNIFIED IDEOGRAPH +0x98DA 0x4FD1 #CJK UNIFIED IDEOGRAPH +0x98DB 0x4FDA #CJK UNIFIED IDEOGRAPH +0x98DC 0x4FD0 #CJK UNIFIED IDEOGRAPH +0x98DD 0x4FE4 #CJK UNIFIED IDEOGRAPH +0x98DE 0x4FE5 #CJK UNIFIED IDEOGRAPH +0x98DF 0x501A #CJK UNIFIED IDEOGRAPH +0x98E0 0x5028 #CJK UNIFIED IDEOGRAPH +0x98E1 0x5014 #CJK UNIFIED IDEOGRAPH +0x98E2 0x502A #CJK UNIFIED IDEOGRAPH +0x98E3 0x5025 #CJK UNIFIED IDEOGRAPH +0x98E4 0x5005 #CJK UNIFIED IDEOGRAPH +0x98E5 0x4F1C #CJK UNIFIED IDEOGRAPH +0x98E6 0x4FF6 #CJK UNIFIED IDEOGRAPH +0x98E7 0x5021 #CJK UNIFIED IDEOGRAPH +0x98E8 0x5029 #CJK UNIFIED IDEOGRAPH +0x98E9 0x502C #CJK UNIFIED IDEOGRAPH +0x98EA 0x4FFE #CJK UNIFIED IDEOGRAPH +0x98EB 0x4FEF #CJK UNIFIED IDEOGRAPH +0x98EC 0x5011 #CJK UNIFIED IDEOGRAPH +0x98ED 0x5006 #CJK UNIFIED IDEOGRAPH +0x98EE 0x5043 #CJK UNIFIED IDEOGRAPH +0x98EF 0x5047 #CJK UNIFIED IDEOGRAPH +0x98F0 0x6703 #CJK UNIFIED IDEOGRAPH +0x98F1 0x5055 #CJK UNIFIED IDEOGRAPH +0x98F2 0x5050 #CJK UNIFIED IDEOGRAPH +0x98F3 0x5048 #CJK UNIFIED IDEOGRAPH +0x98F4 0x505A #CJK UNIFIED IDEOGRAPH +0x98F5 0x5056 #CJK UNIFIED IDEOGRAPH +0x98F6 0x506C #CJK UNIFIED IDEOGRAPH +0x98F7 0x5078 #CJK UNIFIED IDEOGRAPH +0x98F8 0x5080 #CJK UNIFIED IDEOGRAPH +0x98F9 0x509A #CJK UNIFIED IDEOGRAPH +0x98FA 0x5085 #CJK UNIFIED IDEOGRAPH +0x98FB 0x50B4 #CJK UNIFIED IDEOGRAPH +0x98FC 0x50B2 #CJK UNIFIED IDEOGRAPH +0x9940 0x50C9 #CJK UNIFIED IDEOGRAPH +0x9941 0x50CA #CJK UNIFIED IDEOGRAPH +0x9942 0x50B3 #CJK UNIFIED IDEOGRAPH +0x9943 0x50C2 #CJK UNIFIED IDEOGRAPH +0x9944 0x50D6 #CJK UNIFIED IDEOGRAPH +0x9945 0x50DE #CJK UNIFIED IDEOGRAPH +0x9946 0x50E5 #CJK UNIFIED IDEOGRAPH +0x9947 0x50ED #CJK UNIFIED IDEOGRAPH +0x9948 0x50E3 #CJK UNIFIED IDEOGRAPH +0x9949 0x50EE #CJK UNIFIED IDEOGRAPH +0x994A 0x50F9 #CJK UNIFIED IDEOGRAPH +0x994B 0x50F5 #CJK UNIFIED IDEOGRAPH +0x994C 0x5109 #CJK UNIFIED IDEOGRAPH +0x994D 0x5101 #CJK UNIFIED IDEOGRAPH +0x994E 0x5102 #CJK UNIFIED IDEOGRAPH +0x994F 0x5116 #CJK UNIFIED IDEOGRAPH +0x9950 0x5115 #CJK UNIFIED IDEOGRAPH +0x9951 0x5114 #CJK UNIFIED IDEOGRAPH +0x9952 0x511A #CJK UNIFIED IDEOGRAPH +0x9953 0x5121 #CJK UNIFIED IDEOGRAPH +0x9954 0x513A #CJK UNIFIED IDEOGRAPH +0x9955 0x5137 #CJK UNIFIED IDEOGRAPH +0x9956 0x513C #CJK UNIFIED IDEOGRAPH +0x9957 0x513B #CJK UNIFIED IDEOGRAPH +0x9958 0x513F #CJK UNIFIED IDEOGRAPH +0x9959 0x5140 #CJK UNIFIED IDEOGRAPH +0x995A 0x5152 #CJK UNIFIED IDEOGRAPH +0x995B 0x514C #CJK UNIFIED IDEOGRAPH +0x995C 0x5154 #CJK UNIFIED IDEOGRAPH +0x995D 0x5162 #CJK UNIFIED IDEOGRAPH +0x995E 0x7AF8 #CJK UNIFIED IDEOGRAPH +0x995F 0x5169 #CJK UNIFIED IDEOGRAPH +0x9960 0x516A #CJK UNIFIED IDEOGRAPH +0x9961 0x516E #CJK UNIFIED IDEOGRAPH +0x9962 0x5180 #CJK UNIFIED IDEOGRAPH +0x9963 0x5182 #CJK UNIFIED IDEOGRAPH +0x9964 0x56D8 #CJK UNIFIED IDEOGRAPH +0x9965 0x518C #CJK UNIFIED IDEOGRAPH +0x9966 0x5189 #CJK UNIFIED IDEOGRAPH +0x9967 0x518F #CJK UNIFIED IDEOGRAPH +0x9968 0x5191 #CJK UNIFIED IDEOGRAPH +0x9969 0x5193 #CJK UNIFIED IDEOGRAPH +0x996A 0x5195 #CJK UNIFIED IDEOGRAPH +0x996B 0x5196 #CJK UNIFIED IDEOGRAPH +0x996C 0x51A4 #CJK UNIFIED IDEOGRAPH +0x996D 0x51A6 #CJK UNIFIED IDEOGRAPH +0x996E 0x51A2 #CJK UNIFIED IDEOGRAPH +0x996F 0x51A9 #CJK UNIFIED IDEOGRAPH +0x9970 0x51AA #CJK UNIFIED IDEOGRAPH +0x9971 0x51AB #CJK UNIFIED IDEOGRAPH +0x9972 0x51B3 #CJK UNIFIED IDEOGRAPH +0x9973 0x51B1 #CJK UNIFIED IDEOGRAPH +0x9974 0x51B2 #CJK UNIFIED IDEOGRAPH +0x9975 0x51B0 #CJK UNIFIED IDEOGRAPH +0x9976 0x51B5 #CJK UNIFIED IDEOGRAPH +0x9977 0x51BD #CJK UNIFIED IDEOGRAPH +0x9978 0x51C5 #CJK UNIFIED IDEOGRAPH +0x9979 0x51C9 #CJK UNIFIED IDEOGRAPH +0x997A 0x51DB #CJK UNIFIED IDEOGRAPH +0x997B 0x51E0 #CJK UNIFIED IDEOGRAPH +0x997C 0x8655 #CJK UNIFIED IDEOGRAPH +0x997D 0x51E9 #CJK UNIFIED IDEOGRAPH +0x997E 0x51ED #CJK UNIFIED IDEOGRAPH +0x9980 0x51F0 #CJK UNIFIED IDEOGRAPH +0x9981 0x51F5 #CJK UNIFIED IDEOGRAPH +0x9982 0x51FE #CJK UNIFIED IDEOGRAPH +0x9983 0x5204 #CJK UNIFIED IDEOGRAPH +0x9984 0x520B #CJK UNIFIED IDEOGRAPH +0x9985 0x5214 #CJK UNIFIED IDEOGRAPH +0x9986 0x520E #CJK UNIFIED IDEOGRAPH +0x9987 0x5227 #CJK UNIFIED IDEOGRAPH +0x9988 0x522A #CJK UNIFIED IDEOGRAPH +0x9989 0x522E #CJK UNIFIED IDEOGRAPH +0x998A 0x5233 #CJK UNIFIED IDEOGRAPH +0x998B 0x5239 #CJK UNIFIED IDEOGRAPH +0x998C 0x524F #CJK UNIFIED IDEOGRAPH +0x998D 0x5244 #CJK UNIFIED IDEOGRAPH +0x998E 0x524B #CJK UNIFIED IDEOGRAPH +0x998F 0x524C #CJK UNIFIED IDEOGRAPH +0x9990 0x525E #CJK UNIFIED IDEOGRAPH +0x9991 0x5254 #CJK UNIFIED IDEOGRAPH +0x9992 0x526A #CJK UNIFIED IDEOGRAPH +0x9993 0x5274 #CJK UNIFIED IDEOGRAPH +0x9994 0x5269 #CJK UNIFIED IDEOGRAPH +0x9995 0x5273 #CJK UNIFIED IDEOGRAPH +0x9996 0x527F #CJK UNIFIED IDEOGRAPH +0x9997 0x527D #CJK UNIFIED IDEOGRAPH +0x9998 0x528D #CJK UNIFIED IDEOGRAPH +0x9999 0x5294 #CJK UNIFIED IDEOGRAPH +0x999A 0x5292 #CJK UNIFIED IDEOGRAPH +0x999B 0x5271 #CJK UNIFIED IDEOGRAPH +0x999C 0x5288 #CJK UNIFIED IDEOGRAPH +0x999D 0x5291 #CJK UNIFIED IDEOGRAPH +0x999E 0x8FA8 #CJK UNIFIED IDEOGRAPH +0x999F 0x8FA7 #CJK UNIFIED IDEOGRAPH +0x99A0 0x52AC #CJK UNIFIED IDEOGRAPH +0x99A1 0x52AD #CJK UNIFIED IDEOGRAPH +0x99A2 0x52BC #CJK UNIFIED IDEOGRAPH +0x99A3 0x52B5 #CJK UNIFIED IDEOGRAPH +0x99A4 0x52C1 #CJK UNIFIED IDEOGRAPH +0x99A5 0x52CD #CJK UNIFIED IDEOGRAPH +0x99A6 0x52D7 #CJK UNIFIED IDEOGRAPH +0x99A7 0x52DE #CJK UNIFIED IDEOGRAPH +0x99A8 0x52E3 #CJK UNIFIED IDEOGRAPH +0x99A9 0x52E6 #CJK UNIFIED IDEOGRAPH +0x99AA 0x98ED #CJK UNIFIED IDEOGRAPH +0x99AB 0x52E0 #CJK UNIFIED IDEOGRAPH +0x99AC 0x52F3 #CJK UNIFIED IDEOGRAPH +0x99AD 0x52F5 #CJK UNIFIED IDEOGRAPH +0x99AE 0x52F8 #CJK UNIFIED IDEOGRAPH +0x99AF 0x52F9 #CJK UNIFIED IDEOGRAPH +0x99B0 0x5306 #CJK UNIFIED IDEOGRAPH +0x99B1 0x5308 #CJK UNIFIED IDEOGRAPH +0x99B2 0x7538 #CJK UNIFIED IDEOGRAPH +0x99B3 0x530D #CJK UNIFIED IDEOGRAPH +0x99B4 0x5310 #CJK UNIFIED IDEOGRAPH +0x99B5 0x530F #CJK UNIFIED IDEOGRAPH +0x99B6 0x5315 #CJK UNIFIED IDEOGRAPH +0x99B7 0x531A #CJK UNIFIED IDEOGRAPH +0x99B8 0x5323 #CJK UNIFIED IDEOGRAPH +0x99B9 0x532F #CJK UNIFIED IDEOGRAPH +0x99BA 0x5331 #CJK UNIFIED IDEOGRAPH +0x99BB 0x5333 #CJK UNIFIED IDEOGRAPH +0x99BC 0x5338 #CJK UNIFIED IDEOGRAPH +0x99BD 0x5340 #CJK UNIFIED IDEOGRAPH +0x99BE 0x5346 #CJK UNIFIED IDEOGRAPH +0x99BF 0x5345 #CJK UNIFIED IDEOGRAPH +0x99C0 0x4E17 #CJK UNIFIED IDEOGRAPH +0x99C1 0x5349 #CJK UNIFIED IDEOGRAPH +0x99C2 0x534D #CJK UNIFIED IDEOGRAPH +0x99C3 0x51D6 #CJK UNIFIED IDEOGRAPH +0x99C4 0x535E #CJK UNIFIED IDEOGRAPH +0x99C5 0x5369 #CJK UNIFIED IDEOGRAPH +0x99C6 0x536E #CJK UNIFIED IDEOGRAPH +0x99C7 0x5918 #CJK UNIFIED IDEOGRAPH +0x99C8 0x537B #CJK UNIFIED IDEOGRAPH +0x99C9 0x5377 #CJK UNIFIED IDEOGRAPH +0x99CA 0x5382 #CJK UNIFIED IDEOGRAPH +0x99CB 0x5396 #CJK UNIFIED IDEOGRAPH +0x99CC 0x53A0 #CJK UNIFIED IDEOGRAPH +0x99CD 0x53A6 #CJK UNIFIED IDEOGRAPH +0x99CE 0x53A5 #CJK UNIFIED IDEOGRAPH +0x99CF 0x53AE #CJK UNIFIED IDEOGRAPH +0x99D0 0x53B0 #CJK UNIFIED IDEOGRAPH +0x99D1 0x53B6 #CJK UNIFIED IDEOGRAPH +0x99D2 0x53C3 #CJK UNIFIED IDEOGRAPH +0x99D3 0x7C12 #CJK UNIFIED IDEOGRAPH +0x99D4 0x96D9 #CJK UNIFIED IDEOGRAPH +0x99D5 0x53DF #CJK UNIFIED IDEOGRAPH +0x99D6 0x66FC #CJK UNIFIED IDEOGRAPH +0x99D7 0x71EE #CJK UNIFIED IDEOGRAPH +0x99D8 0x53EE #CJK UNIFIED IDEOGRAPH +0x99D9 0x53E8 #CJK UNIFIED IDEOGRAPH +0x99DA 0x53ED #CJK UNIFIED IDEOGRAPH +0x99DB 0x53FA #CJK UNIFIED IDEOGRAPH +0x99DC 0x5401 #CJK UNIFIED IDEOGRAPH +0x99DD 0x543D #CJK UNIFIED IDEOGRAPH +0x99DE 0x5440 #CJK UNIFIED IDEOGRAPH +0x99DF 0x542C #CJK UNIFIED IDEOGRAPH +0x99E0 0x542D #CJK UNIFIED IDEOGRAPH +0x99E1 0x543C #CJK UNIFIED IDEOGRAPH +0x99E2 0x542E #CJK UNIFIED IDEOGRAPH +0x99E3 0x5436 #CJK UNIFIED IDEOGRAPH +0x99E4 0x5429 #CJK UNIFIED IDEOGRAPH +0x99E5 0x541D #CJK UNIFIED IDEOGRAPH +0x99E6 0x544E #CJK UNIFIED IDEOGRAPH +0x99E7 0x548F #CJK UNIFIED IDEOGRAPH +0x99E8 0x5475 #CJK UNIFIED IDEOGRAPH +0x99E9 0x548E #CJK UNIFIED IDEOGRAPH +0x99EA 0x545F #CJK UNIFIED IDEOGRAPH +0x99EB 0x5471 #CJK UNIFIED IDEOGRAPH +0x99EC 0x5477 #CJK UNIFIED IDEOGRAPH +0x99ED 0x5470 #CJK UNIFIED IDEOGRAPH +0x99EE 0x5492 #CJK UNIFIED IDEOGRAPH +0x99EF 0x547B #CJK UNIFIED IDEOGRAPH +0x99F0 0x5480 #CJK UNIFIED IDEOGRAPH +0x99F1 0x5476 #CJK UNIFIED IDEOGRAPH +0x99F2 0x5484 #CJK UNIFIED IDEOGRAPH +0x99F3 0x5490 #CJK UNIFIED IDEOGRAPH +0x99F4 0x5486 #CJK UNIFIED IDEOGRAPH +0x99F5 0x54C7 #CJK UNIFIED IDEOGRAPH +0x99F6 0x54A2 #CJK UNIFIED IDEOGRAPH +0x99F7 0x54B8 #CJK UNIFIED IDEOGRAPH +0x99F8 0x54A5 #CJK UNIFIED IDEOGRAPH +0x99F9 0x54AC #CJK UNIFIED IDEOGRAPH +0x99FA 0x54C4 #CJK UNIFIED IDEOGRAPH +0x99FB 0x54C8 #CJK UNIFIED IDEOGRAPH +0x99FC 0x54A8 #CJK UNIFIED IDEOGRAPH +0x9A40 0x54AB #CJK UNIFIED IDEOGRAPH +0x9A41 0x54C2 #CJK UNIFIED IDEOGRAPH +0x9A42 0x54A4 #CJK UNIFIED IDEOGRAPH +0x9A43 0x54BE #CJK UNIFIED IDEOGRAPH +0x9A44 0x54BC #CJK UNIFIED IDEOGRAPH +0x9A45 0x54D8 #CJK UNIFIED IDEOGRAPH +0x9A46 0x54E5 #CJK UNIFIED IDEOGRAPH +0x9A47 0x54E6 #CJK UNIFIED IDEOGRAPH +0x9A48 0x550F #CJK UNIFIED IDEOGRAPH +0x9A49 0x5514 #CJK UNIFIED IDEOGRAPH +0x9A4A 0x54FD #CJK UNIFIED IDEOGRAPH +0x9A4B 0x54EE #CJK UNIFIED IDEOGRAPH +0x9A4C 0x54ED #CJK UNIFIED IDEOGRAPH +0x9A4D 0x54FA #CJK UNIFIED IDEOGRAPH +0x9A4E 0x54E2 #CJK UNIFIED IDEOGRAPH +0x9A4F 0x5539 #CJK UNIFIED IDEOGRAPH +0x9A50 0x5540 #CJK UNIFIED IDEOGRAPH +0x9A51 0x5563 #CJK UNIFIED IDEOGRAPH +0x9A52 0x554C #CJK UNIFIED IDEOGRAPH +0x9A53 0x552E #CJK UNIFIED IDEOGRAPH +0x9A54 0x555C #CJK UNIFIED IDEOGRAPH +0x9A55 0x5545 #CJK UNIFIED IDEOGRAPH +0x9A56 0x5556 #CJK UNIFIED IDEOGRAPH +0x9A57 0x5557 #CJK UNIFIED IDEOGRAPH +0x9A58 0x5538 #CJK UNIFIED IDEOGRAPH +0x9A59 0x5533 #CJK UNIFIED IDEOGRAPH +0x9A5A 0x555D #CJK UNIFIED IDEOGRAPH +0x9A5B 0x5599 #CJK UNIFIED IDEOGRAPH +0x9A5C 0x5580 #CJK UNIFIED IDEOGRAPH +0x9A5D 0x54AF #CJK UNIFIED IDEOGRAPH +0x9A5E 0x558A #CJK UNIFIED IDEOGRAPH +0x9A5F 0x559F #CJK UNIFIED IDEOGRAPH +0x9A60 0x557B #CJK UNIFIED IDEOGRAPH +0x9A61 0x557E #CJK UNIFIED IDEOGRAPH +0x9A62 0x5598 #CJK UNIFIED IDEOGRAPH +0x9A63 0x559E #CJK UNIFIED IDEOGRAPH +0x9A64 0x55AE #CJK UNIFIED IDEOGRAPH +0x9A65 0x557C #CJK UNIFIED IDEOGRAPH +0x9A66 0x5583 #CJK UNIFIED IDEOGRAPH +0x9A67 0x55A9 #CJK UNIFIED IDEOGRAPH +0x9A68 0x5587 #CJK UNIFIED IDEOGRAPH +0x9A69 0x55A8 #CJK UNIFIED IDEOGRAPH +0x9A6A 0x55DA #CJK UNIFIED IDEOGRAPH +0x9A6B 0x55C5 #CJK UNIFIED IDEOGRAPH +0x9A6C 0x55DF #CJK UNIFIED IDEOGRAPH +0x9A6D 0x55C4 #CJK UNIFIED IDEOGRAPH +0x9A6E 0x55DC #CJK UNIFIED IDEOGRAPH +0x9A6F 0x55E4 #CJK UNIFIED IDEOGRAPH +0x9A70 0x55D4 #CJK UNIFIED IDEOGRAPH +0x9A71 0x5614 #CJK UNIFIED IDEOGRAPH +0x9A72 0x55F7 #CJK UNIFIED IDEOGRAPH +0x9A73 0x5616 #CJK UNIFIED IDEOGRAPH +0x9A74 0x55FE #CJK UNIFIED IDEOGRAPH +0x9A75 0x55FD #CJK UNIFIED IDEOGRAPH +0x9A76 0x561B #CJK UNIFIED IDEOGRAPH +0x9A77 0x55F9 #CJK UNIFIED IDEOGRAPH +0x9A78 0x564E #CJK UNIFIED IDEOGRAPH +0x9A79 0x5650 #CJK UNIFIED IDEOGRAPH +0x9A7A 0x71DF #CJK UNIFIED IDEOGRAPH +0x9A7B 0x5634 #CJK UNIFIED IDEOGRAPH +0x9A7C 0x5636 #CJK UNIFIED IDEOGRAPH +0x9A7D 0x5632 #CJK UNIFIED IDEOGRAPH +0x9A7E 0x5638 #CJK UNIFIED IDEOGRAPH +0x9A80 0x566B #CJK UNIFIED IDEOGRAPH +0x9A81 0x5664 #CJK UNIFIED IDEOGRAPH +0x9A82 0x562F #CJK UNIFIED IDEOGRAPH +0x9A83 0x566C #CJK UNIFIED IDEOGRAPH +0x9A84 0x566A #CJK UNIFIED IDEOGRAPH +0x9A85 0x5686 #CJK UNIFIED IDEOGRAPH +0x9A86 0x5680 #CJK UNIFIED IDEOGRAPH +0x9A87 0x568A #CJK UNIFIED IDEOGRAPH +0x9A88 0x56A0 #CJK UNIFIED IDEOGRAPH +0x9A89 0x5694 #CJK UNIFIED IDEOGRAPH +0x9A8A 0x568F #CJK UNIFIED IDEOGRAPH +0x9A8B 0x56A5 #CJK UNIFIED IDEOGRAPH +0x9A8C 0x56AE #CJK UNIFIED IDEOGRAPH +0x9A8D 0x56B6 #CJK UNIFIED IDEOGRAPH +0x9A8E 0x56B4 #CJK UNIFIED IDEOGRAPH +0x9A8F 0x56C2 #CJK UNIFIED IDEOGRAPH +0x9A90 0x56BC #CJK UNIFIED IDEOGRAPH +0x9A91 0x56C1 #CJK UNIFIED IDEOGRAPH +0x9A92 0x56C3 #CJK UNIFIED IDEOGRAPH +0x9A93 0x56C0 #CJK UNIFIED IDEOGRAPH +0x9A94 0x56C8 #CJK UNIFIED IDEOGRAPH +0x9A95 0x56CE #CJK UNIFIED IDEOGRAPH +0x9A96 0x56D1 #CJK UNIFIED IDEOGRAPH +0x9A97 0x56D3 #CJK UNIFIED IDEOGRAPH +0x9A98 0x56D7 #CJK UNIFIED IDEOGRAPH +0x9A99 0x56EE #CJK UNIFIED IDEOGRAPH +0x9A9A 0x56F9 #CJK UNIFIED IDEOGRAPH +0x9A9B 0x5700 #CJK UNIFIED IDEOGRAPH +0x9A9C 0x56FF #CJK UNIFIED IDEOGRAPH +0x9A9D 0x5704 #CJK UNIFIED IDEOGRAPH +0x9A9E 0x5709 #CJK UNIFIED IDEOGRAPH +0x9A9F 0x5708 #CJK UNIFIED IDEOGRAPH +0x9AA0 0x570B #CJK UNIFIED IDEOGRAPH +0x9AA1 0x570D #CJK UNIFIED IDEOGRAPH +0x9AA2 0x5713 #CJK UNIFIED IDEOGRAPH +0x9AA3 0x5718 #CJK UNIFIED IDEOGRAPH +0x9AA4 0x5716 #CJK UNIFIED IDEOGRAPH +0x9AA5 0x55C7 #CJK UNIFIED IDEOGRAPH +0x9AA6 0x571C #CJK UNIFIED IDEOGRAPH +0x9AA7 0x5726 #CJK UNIFIED IDEOGRAPH +0x9AA8 0x5737 #CJK UNIFIED IDEOGRAPH +0x9AA9 0x5738 #CJK UNIFIED IDEOGRAPH +0x9AAA 0x574E #CJK UNIFIED IDEOGRAPH +0x9AAB 0x573B #CJK UNIFIED IDEOGRAPH +0x9AAC 0x5740 #CJK UNIFIED IDEOGRAPH +0x9AAD 0x574F #CJK UNIFIED IDEOGRAPH +0x9AAE 0x5769 #CJK UNIFIED IDEOGRAPH +0x9AAF 0x57C0 #CJK UNIFIED IDEOGRAPH +0x9AB0 0x5788 #CJK UNIFIED IDEOGRAPH +0x9AB1 0x5761 #CJK UNIFIED IDEOGRAPH +0x9AB2 0x577F #CJK UNIFIED IDEOGRAPH +0x9AB3 0x5789 #CJK UNIFIED IDEOGRAPH +0x9AB4 0x5793 #CJK UNIFIED IDEOGRAPH +0x9AB5 0x57A0 #CJK UNIFIED IDEOGRAPH +0x9AB6 0x57B3 #CJK UNIFIED IDEOGRAPH +0x9AB7 0x57A4 #CJK UNIFIED IDEOGRAPH +0x9AB8 0x57AA #CJK UNIFIED IDEOGRAPH +0x9AB9 0x57B0 #CJK UNIFIED IDEOGRAPH +0x9ABA 0x57C3 #CJK UNIFIED IDEOGRAPH +0x9ABB 0x57C6 #CJK UNIFIED IDEOGRAPH +0x9ABC 0x57D4 #CJK UNIFIED IDEOGRAPH +0x9ABD 0x57D2 #CJK UNIFIED IDEOGRAPH +0x9ABE 0x57D3 #CJK UNIFIED IDEOGRAPH +0x9ABF 0x580A #CJK UNIFIED IDEOGRAPH +0x9AC0 0x57D6 #CJK UNIFIED IDEOGRAPH +0x9AC1 0x57E3 #CJK UNIFIED IDEOGRAPH +0x9AC2 0x580B #CJK UNIFIED IDEOGRAPH +0x9AC3 0x5819 #CJK UNIFIED IDEOGRAPH +0x9AC4 0x581D #CJK UNIFIED IDEOGRAPH +0x9AC5 0x5872 #CJK UNIFIED IDEOGRAPH +0x9AC6 0x5821 #CJK UNIFIED IDEOGRAPH +0x9AC7 0x5862 #CJK UNIFIED IDEOGRAPH +0x9AC8 0x584B #CJK UNIFIED IDEOGRAPH +0x9AC9 0x5870 #CJK UNIFIED IDEOGRAPH +0x9ACA 0x6BC0 #CJK UNIFIED IDEOGRAPH +0x9ACB 0x5852 #CJK UNIFIED IDEOGRAPH +0x9ACC 0x583D #CJK UNIFIED IDEOGRAPH +0x9ACD 0x5879 #CJK UNIFIED IDEOGRAPH +0x9ACE 0x5885 #CJK UNIFIED IDEOGRAPH +0x9ACF 0x58B9 #CJK UNIFIED IDEOGRAPH +0x9AD0 0x589F #CJK UNIFIED IDEOGRAPH +0x9AD1 0x58AB #CJK UNIFIED IDEOGRAPH +0x9AD2 0x58BA #CJK UNIFIED IDEOGRAPH +0x9AD3 0x58DE #CJK UNIFIED IDEOGRAPH +0x9AD4 0x58BB #CJK UNIFIED IDEOGRAPH +0x9AD5 0x58B8 #CJK UNIFIED IDEOGRAPH +0x9AD6 0x58AE #CJK UNIFIED IDEOGRAPH +0x9AD7 0x58C5 #CJK UNIFIED IDEOGRAPH +0x9AD8 0x58D3 #CJK UNIFIED IDEOGRAPH +0x9AD9 0x58D1 #CJK UNIFIED IDEOGRAPH +0x9ADA 0x58D7 #CJK UNIFIED IDEOGRAPH +0x9ADB 0x58D9 #CJK UNIFIED IDEOGRAPH +0x9ADC 0x58D8 #CJK UNIFIED IDEOGRAPH +0x9ADD 0x58E5 #CJK UNIFIED IDEOGRAPH +0x9ADE 0x58DC #CJK UNIFIED IDEOGRAPH +0x9ADF 0x58E4 #CJK UNIFIED IDEOGRAPH +0x9AE0 0x58DF #CJK UNIFIED IDEOGRAPH +0x9AE1 0x58EF #CJK UNIFIED IDEOGRAPH +0x9AE2 0x58FA #CJK UNIFIED IDEOGRAPH +0x9AE3 0x58F9 #CJK UNIFIED IDEOGRAPH +0x9AE4 0x58FB #CJK UNIFIED IDEOGRAPH +0x9AE5 0x58FC #CJK UNIFIED IDEOGRAPH +0x9AE6 0x58FD #CJK UNIFIED IDEOGRAPH +0x9AE7 0x5902 #CJK UNIFIED IDEOGRAPH +0x9AE8 0x590A #CJK UNIFIED IDEOGRAPH +0x9AE9 0x5910 #CJK UNIFIED IDEOGRAPH +0x9AEA 0x591B #CJK UNIFIED IDEOGRAPH +0x9AEB 0x68A6 #CJK UNIFIED IDEOGRAPH +0x9AEC 0x5925 #CJK UNIFIED IDEOGRAPH +0x9AED 0x592C #CJK UNIFIED IDEOGRAPH +0x9AEE 0x592D #CJK UNIFIED IDEOGRAPH +0x9AEF 0x5932 #CJK UNIFIED IDEOGRAPH +0x9AF0 0x5938 #CJK UNIFIED IDEOGRAPH +0x9AF1 0x593E #CJK UNIFIED IDEOGRAPH +0x9AF2 0x7AD2 #CJK UNIFIED IDEOGRAPH +0x9AF3 0x5955 #CJK UNIFIED IDEOGRAPH +0x9AF4 0x5950 #CJK UNIFIED IDEOGRAPH +0x9AF5 0x594E #CJK UNIFIED IDEOGRAPH +0x9AF6 0x595A #CJK UNIFIED IDEOGRAPH +0x9AF7 0x5958 #CJK UNIFIED IDEOGRAPH +0x9AF8 0x5962 #CJK UNIFIED IDEOGRAPH +0x9AF9 0x5960 #CJK UNIFIED IDEOGRAPH +0x9AFA 0x5967 #CJK UNIFIED IDEOGRAPH +0x9AFB 0x596C #CJK UNIFIED IDEOGRAPH +0x9AFC 0x5969 #CJK UNIFIED IDEOGRAPH +0x9B40 0x5978 #CJK UNIFIED IDEOGRAPH +0x9B41 0x5981 #CJK UNIFIED IDEOGRAPH +0x9B42 0x599D #CJK UNIFIED IDEOGRAPH +0x9B43 0x4F5E #CJK UNIFIED IDEOGRAPH +0x9B44 0x4FAB #CJK UNIFIED IDEOGRAPH +0x9B45 0x59A3 #CJK UNIFIED IDEOGRAPH +0x9B46 0x59B2 #CJK UNIFIED IDEOGRAPH +0x9B47 0x59C6 #CJK UNIFIED IDEOGRAPH +0x9B48 0x59E8 #CJK UNIFIED IDEOGRAPH +0x9B49 0x59DC #CJK UNIFIED IDEOGRAPH +0x9B4A 0x598D #CJK UNIFIED IDEOGRAPH +0x9B4B 0x59D9 #CJK UNIFIED IDEOGRAPH +0x9B4C 0x59DA #CJK UNIFIED IDEOGRAPH +0x9B4D 0x5A25 #CJK UNIFIED IDEOGRAPH +0x9B4E 0x5A1F #CJK UNIFIED IDEOGRAPH +0x9B4F 0x5A11 #CJK UNIFIED IDEOGRAPH +0x9B50 0x5A1C #CJK UNIFIED IDEOGRAPH +0x9B51 0x5A09 #CJK UNIFIED IDEOGRAPH +0x9B52 0x5A1A #CJK UNIFIED IDEOGRAPH +0x9B53 0x5A40 #CJK UNIFIED IDEOGRAPH +0x9B54 0x5A6C #CJK UNIFIED IDEOGRAPH +0x9B55 0x5A49 #CJK UNIFIED IDEOGRAPH +0x9B56 0x5A35 #CJK UNIFIED IDEOGRAPH +0x9B57 0x5A36 #CJK UNIFIED IDEOGRAPH +0x9B58 0x5A62 #CJK UNIFIED IDEOGRAPH +0x9B59 0x5A6A #CJK UNIFIED IDEOGRAPH +0x9B5A 0x5A9A #CJK UNIFIED IDEOGRAPH +0x9B5B 0x5ABC #CJK UNIFIED IDEOGRAPH +0x9B5C 0x5ABE #CJK UNIFIED IDEOGRAPH +0x9B5D 0x5ACB #CJK UNIFIED IDEOGRAPH +0x9B5E 0x5AC2 #CJK UNIFIED IDEOGRAPH +0x9B5F 0x5ABD #CJK UNIFIED IDEOGRAPH +0x9B60 0x5AE3 #CJK UNIFIED IDEOGRAPH +0x9B61 0x5AD7 #CJK UNIFIED IDEOGRAPH +0x9B62 0x5AE6 #CJK UNIFIED IDEOGRAPH +0x9B63 0x5AE9 #CJK UNIFIED IDEOGRAPH +0x9B64 0x5AD6 #CJK UNIFIED IDEOGRAPH +0x9B65 0x5AFA #CJK UNIFIED IDEOGRAPH +0x9B66 0x5AFB #CJK UNIFIED IDEOGRAPH +0x9B67 0x5B0C #CJK UNIFIED IDEOGRAPH +0x9B68 0x5B0B #CJK UNIFIED IDEOGRAPH +0x9B69 0x5B16 #CJK UNIFIED IDEOGRAPH +0x9B6A 0x5B32 #CJK UNIFIED IDEOGRAPH +0x9B6B 0x5AD0 #CJK UNIFIED IDEOGRAPH +0x9B6C 0x5B2A #CJK UNIFIED IDEOGRAPH +0x9B6D 0x5B36 #CJK UNIFIED IDEOGRAPH +0x9B6E 0x5B3E #CJK UNIFIED IDEOGRAPH +0x9B6F 0x5B43 #CJK UNIFIED IDEOGRAPH +0x9B70 0x5B45 #CJK UNIFIED IDEOGRAPH +0x9B71 0x5B40 #CJK UNIFIED IDEOGRAPH +0x9B72 0x5B51 #CJK UNIFIED IDEOGRAPH +0x9B73 0x5B55 #CJK UNIFIED IDEOGRAPH +0x9B74 0x5B5A #CJK UNIFIED IDEOGRAPH +0x9B75 0x5B5B #CJK UNIFIED IDEOGRAPH +0x9B76 0x5B65 #CJK UNIFIED IDEOGRAPH +0x9B77 0x5B69 #CJK UNIFIED IDEOGRAPH +0x9B78 0x5B70 #CJK UNIFIED IDEOGRAPH +0x9B79 0x5B73 #CJK UNIFIED IDEOGRAPH +0x9B7A 0x5B75 #CJK UNIFIED IDEOGRAPH +0x9B7B 0x5B78 #CJK UNIFIED IDEOGRAPH +0x9B7C 0x6588 #CJK UNIFIED IDEOGRAPH +0x9B7D 0x5B7A #CJK UNIFIED IDEOGRAPH +0x9B7E 0x5B80 #CJK UNIFIED IDEOGRAPH +0x9B80 0x5B83 #CJK UNIFIED IDEOGRAPH +0x9B81 0x5BA6 #CJK UNIFIED IDEOGRAPH +0x9B82 0x5BB8 #CJK UNIFIED IDEOGRAPH +0x9B83 0x5BC3 #CJK UNIFIED IDEOGRAPH +0x9B84 0x5BC7 #CJK UNIFIED IDEOGRAPH +0x9B85 0x5BC9 #CJK UNIFIED IDEOGRAPH +0x9B86 0x5BD4 #CJK UNIFIED IDEOGRAPH +0x9B87 0x5BD0 #CJK UNIFIED IDEOGRAPH +0x9B88 0x5BE4 #CJK UNIFIED IDEOGRAPH +0x9B89 0x5BE6 #CJK UNIFIED IDEOGRAPH +0x9B8A 0x5BE2 #CJK UNIFIED IDEOGRAPH +0x9B8B 0x5BDE #CJK UNIFIED IDEOGRAPH +0x9B8C 0x5BE5 #CJK UNIFIED IDEOGRAPH +0x9B8D 0x5BEB #CJK UNIFIED IDEOGRAPH +0x9B8E 0x5BF0 #CJK UNIFIED IDEOGRAPH +0x9B8F 0x5BF6 #CJK UNIFIED IDEOGRAPH +0x9B90 0x5BF3 #CJK UNIFIED IDEOGRAPH +0x9B91 0x5C05 #CJK UNIFIED IDEOGRAPH +0x9B92 0x5C07 #CJK UNIFIED IDEOGRAPH +0x9B93 0x5C08 #CJK UNIFIED IDEOGRAPH +0x9B94 0x5C0D #CJK UNIFIED IDEOGRAPH +0x9B95 0x5C13 #CJK UNIFIED IDEOGRAPH +0x9B96 0x5C20 #CJK UNIFIED IDEOGRAPH +0x9B97 0x5C22 #CJK UNIFIED IDEOGRAPH +0x9B98 0x5C28 #CJK UNIFIED IDEOGRAPH +0x9B99 0x5C38 #CJK UNIFIED IDEOGRAPH +0x9B9A 0x5C39 #CJK UNIFIED IDEOGRAPH +0x9B9B 0x5C41 #CJK UNIFIED IDEOGRAPH +0x9B9C 0x5C46 #CJK UNIFIED IDEOGRAPH +0x9B9D 0x5C4E #CJK UNIFIED IDEOGRAPH +0x9B9E 0x5C53 #CJK UNIFIED IDEOGRAPH +0x9B9F 0x5C50 #CJK UNIFIED IDEOGRAPH +0x9BA0 0x5C4F #CJK UNIFIED IDEOGRAPH +0x9BA1 0x5B71 #CJK UNIFIED IDEOGRAPH +0x9BA2 0x5C6C #CJK UNIFIED IDEOGRAPH +0x9BA3 0x5C6E #CJK UNIFIED IDEOGRAPH +0x9BA4 0x4E62 #CJK UNIFIED IDEOGRAPH +0x9BA5 0x5C76 #CJK UNIFIED IDEOGRAPH +0x9BA6 0x5C79 #CJK UNIFIED IDEOGRAPH +0x9BA7 0x5C8C #CJK UNIFIED IDEOGRAPH +0x9BA8 0x5C91 #CJK UNIFIED IDEOGRAPH +0x9BA9 0x5C94 #CJK UNIFIED IDEOGRAPH +0x9BAA 0x599B #CJK UNIFIED IDEOGRAPH +0x9BAB 0x5CAB #CJK UNIFIED IDEOGRAPH +0x9BAC 0x5CBB #CJK UNIFIED IDEOGRAPH +0x9BAD 0x5CB6 #CJK UNIFIED IDEOGRAPH +0x9BAE 0x5CBC #CJK UNIFIED IDEOGRAPH +0x9BAF 0x5CB7 #CJK UNIFIED IDEOGRAPH +0x9BB0 0x5CC5 #CJK UNIFIED IDEOGRAPH +0x9BB1 0x5CBE #CJK UNIFIED IDEOGRAPH +0x9BB2 0x5CC7 #CJK UNIFIED IDEOGRAPH +0x9BB3 0x5CD9 #CJK UNIFIED IDEOGRAPH +0x9BB4 0x5CE9 #CJK UNIFIED IDEOGRAPH +0x9BB5 0x5CFD #CJK UNIFIED IDEOGRAPH +0x9BB6 0x5CFA #CJK UNIFIED IDEOGRAPH +0x9BB7 0x5CED #CJK UNIFIED IDEOGRAPH +0x9BB8 0x5D8C #CJK UNIFIED IDEOGRAPH +0x9BB9 0x5CEA #CJK UNIFIED IDEOGRAPH +0x9BBA 0x5D0B #CJK UNIFIED IDEOGRAPH +0x9BBB 0x5D15 #CJK UNIFIED IDEOGRAPH +0x9BBC 0x5D17 #CJK UNIFIED IDEOGRAPH +0x9BBD 0x5D5C #CJK UNIFIED IDEOGRAPH +0x9BBE 0x5D1F #CJK UNIFIED IDEOGRAPH +0x9BBF 0x5D1B #CJK UNIFIED IDEOGRAPH +0x9BC0 0x5D11 #CJK UNIFIED IDEOGRAPH +0x9BC1 0x5D14 #CJK UNIFIED IDEOGRAPH +0x9BC2 0x5D22 #CJK UNIFIED IDEOGRAPH +0x9BC3 0x5D1A #CJK UNIFIED IDEOGRAPH +0x9BC4 0x5D19 #CJK UNIFIED IDEOGRAPH +0x9BC5 0x5D18 #CJK UNIFIED IDEOGRAPH +0x9BC6 0x5D4C #CJK UNIFIED IDEOGRAPH +0x9BC7 0x5D52 #CJK UNIFIED IDEOGRAPH +0x9BC8 0x5D4E #CJK UNIFIED IDEOGRAPH +0x9BC9 0x5D4B #CJK UNIFIED IDEOGRAPH +0x9BCA 0x5D6C #CJK UNIFIED IDEOGRAPH +0x9BCB 0x5D73 #CJK UNIFIED IDEOGRAPH +0x9BCC 0x5D76 #CJK UNIFIED IDEOGRAPH +0x9BCD 0x5D87 #CJK UNIFIED IDEOGRAPH +0x9BCE 0x5D84 #CJK UNIFIED IDEOGRAPH +0x9BCF 0x5D82 #CJK UNIFIED IDEOGRAPH +0x9BD0 0x5DA2 #CJK UNIFIED IDEOGRAPH +0x9BD1 0x5D9D #CJK UNIFIED IDEOGRAPH +0x9BD2 0x5DAC #CJK UNIFIED IDEOGRAPH +0x9BD3 0x5DAE #CJK UNIFIED IDEOGRAPH +0x9BD4 0x5DBD #CJK UNIFIED IDEOGRAPH +0x9BD5 0x5D90 #CJK UNIFIED IDEOGRAPH +0x9BD6 0x5DB7 #CJK UNIFIED IDEOGRAPH +0x9BD7 0x5DBC #CJK UNIFIED IDEOGRAPH +0x9BD8 0x5DC9 #CJK UNIFIED IDEOGRAPH +0x9BD9 0x5DCD #CJK UNIFIED IDEOGRAPH +0x9BDA 0x5DD3 #CJK UNIFIED IDEOGRAPH +0x9BDB 0x5DD2 #CJK UNIFIED IDEOGRAPH +0x9BDC 0x5DD6 #CJK UNIFIED IDEOGRAPH +0x9BDD 0x5DDB #CJK UNIFIED IDEOGRAPH +0x9BDE 0x5DEB #CJK UNIFIED IDEOGRAPH +0x9BDF 0x5DF2 #CJK UNIFIED IDEOGRAPH +0x9BE0 0x5DF5 #CJK UNIFIED IDEOGRAPH +0x9BE1 0x5E0B #CJK UNIFIED IDEOGRAPH +0x9BE2 0x5E1A #CJK UNIFIED IDEOGRAPH +0x9BE3 0x5E19 #CJK UNIFIED IDEOGRAPH +0x9BE4 0x5E11 #CJK UNIFIED IDEOGRAPH +0x9BE5 0x5E1B #CJK UNIFIED IDEOGRAPH +0x9BE6 0x5E36 #CJK UNIFIED IDEOGRAPH +0x9BE7 0x5E37 #CJK UNIFIED IDEOGRAPH +0x9BE8 0x5E44 #CJK UNIFIED IDEOGRAPH +0x9BE9 0x5E43 #CJK UNIFIED IDEOGRAPH +0x9BEA 0x5E40 #CJK UNIFIED IDEOGRAPH +0x9BEB 0x5E4E #CJK UNIFIED IDEOGRAPH +0x9BEC 0x5E57 #CJK UNIFIED IDEOGRAPH +0x9BED 0x5E54 #CJK UNIFIED IDEOGRAPH +0x9BEE 0x5E5F #CJK UNIFIED IDEOGRAPH +0x9BEF 0x5E62 #CJK UNIFIED IDEOGRAPH +0x9BF0 0x5E64 #CJK UNIFIED IDEOGRAPH +0x9BF1 0x5E47 #CJK UNIFIED IDEOGRAPH +0x9BF2 0x5E75 #CJK UNIFIED IDEOGRAPH +0x9BF3 0x5E76 #CJK UNIFIED IDEOGRAPH +0x9BF4 0x5E7A #CJK UNIFIED IDEOGRAPH +0x9BF5 0x9EBC #CJK UNIFIED IDEOGRAPH +0x9BF6 0x5E7F #CJK UNIFIED IDEOGRAPH +0x9BF7 0x5EA0 #CJK UNIFIED IDEOGRAPH +0x9BF8 0x5EC1 #CJK UNIFIED IDEOGRAPH +0x9BF9 0x5EC2 #CJK UNIFIED IDEOGRAPH +0x9BFA 0x5EC8 #CJK UNIFIED IDEOGRAPH +0x9BFB 0x5ED0 #CJK UNIFIED IDEOGRAPH +0x9BFC 0x5ECF #CJK UNIFIED IDEOGRAPH +0x9C40 0x5ED6 #CJK UNIFIED IDEOGRAPH +0x9C41 0x5EE3 #CJK UNIFIED IDEOGRAPH +0x9C42 0x5EDD #CJK UNIFIED IDEOGRAPH +0x9C43 0x5EDA #CJK UNIFIED IDEOGRAPH +0x9C44 0x5EDB #CJK UNIFIED IDEOGRAPH +0x9C45 0x5EE2 #CJK UNIFIED IDEOGRAPH +0x9C46 0x5EE1 #CJK UNIFIED IDEOGRAPH +0x9C47 0x5EE8 #CJK UNIFIED IDEOGRAPH +0x9C48 0x5EE9 #CJK UNIFIED IDEOGRAPH +0x9C49 0x5EEC #CJK UNIFIED IDEOGRAPH +0x9C4A 0x5EF1 #CJK UNIFIED IDEOGRAPH +0x9C4B 0x5EF3 #CJK UNIFIED IDEOGRAPH +0x9C4C 0x5EF0 #CJK UNIFIED IDEOGRAPH +0x9C4D 0x5EF4 #CJK UNIFIED IDEOGRAPH +0x9C4E 0x5EF8 #CJK UNIFIED IDEOGRAPH +0x9C4F 0x5EFE #CJK UNIFIED IDEOGRAPH +0x9C50 0x5F03 #CJK UNIFIED IDEOGRAPH +0x9C51 0x5F09 #CJK UNIFIED IDEOGRAPH +0x9C52 0x5F5D #CJK UNIFIED IDEOGRAPH +0x9C53 0x5F5C #CJK UNIFIED IDEOGRAPH +0x9C54 0x5F0B #CJK UNIFIED IDEOGRAPH +0x9C55 0x5F11 #CJK UNIFIED IDEOGRAPH +0x9C56 0x5F16 #CJK UNIFIED IDEOGRAPH +0x9C57 0x5F29 #CJK UNIFIED IDEOGRAPH +0x9C58 0x5F2D #CJK UNIFIED IDEOGRAPH +0x9C59 0x5F38 #CJK UNIFIED IDEOGRAPH +0x9C5A 0x5F41 #CJK UNIFIED IDEOGRAPH +0x9C5B 0x5F48 #CJK UNIFIED IDEOGRAPH +0x9C5C 0x5F4C #CJK UNIFIED IDEOGRAPH +0x9C5D 0x5F4E #CJK UNIFIED IDEOGRAPH +0x9C5E 0x5F2F #CJK UNIFIED IDEOGRAPH +0x9C5F 0x5F51 #CJK UNIFIED IDEOGRAPH +0x9C60 0x5F56 #CJK UNIFIED IDEOGRAPH +0x9C61 0x5F57 #CJK UNIFIED IDEOGRAPH +0x9C62 0x5F59 #CJK UNIFIED IDEOGRAPH +0x9C63 0x5F61 #CJK UNIFIED IDEOGRAPH +0x9C64 0x5F6D #CJK UNIFIED IDEOGRAPH +0x9C65 0x5F73 #CJK UNIFIED IDEOGRAPH +0x9C66 0x5F77 #CJK UNIFIED IDEOGRAPH +0x9C67 0x5F83 #CJK UNIFIED IDEOGRAPH +0x9C68 0x5F82 #CJK UNIFIED IDEOGRAPH +0x9C69 0x5F7F #CJK UNIFIED IDEOGRAPH +0x9C6A 0x5F8A #CJK UNIFIED IDEOGRAPH +0x9C6B 0x5F88 #CJK UNIFIED IDEOGRAPH +0x9C6C 0x5F91 #CJK UNIFIED IDEOGRAPH +0x9C6D 0x5F87 #CJK UNIFIED IDEOGRAPH +0x9C6E 0x5F9E #CJK UNIFIED IDEOGRAPH +0x9C6F 0x5F99 #CJK UNIFIED IDEOGRAPH +0x9C70 0x5F98 #CJK UNIFIED IDEOGRAPH +0x9C71 0x5FA0 #CJK UNIFIED IDEOGRAPH +0x9C72 0x5FA8 #CJK UNIFIED IDEOGRAPH +0x9C73 0x5FAD #CJK UNIFIED IDEOGRAPH +0x9C74 0x5FBC #CJK UNIFIED IDEOGRAPH +0x9C75 0x5FD6 #CJK UNIFIED IDEOGRAPH +0x9C76 0x5FFB #CJK UNIFIED IDEOGRAPH +0x9C77 0x5FE4 #CJK UNIFIED IDEOGRAPH +0x9C78 0x5FF8 #CJK UNIFIED IDEOGRAPH +0x9C79 0x5FF1 #CJK UNIFIED IDEOGRAPH +0x9C7A 0x5FDD #CJK UNIFIED IDEOGRAPH +0x9C7B 0x60B3 #CJK UNIFIED IDEOGRAPH +0x9C7C 0x5FFF #CJK UNIFIED IDEOGRAPH +0x9C7D 0x6021 #CJK UNIFIED IDEOGRAPH +0x9C7E 0x6060 #CJK UNIFIED IDEOGRAPH +0x9C80 0x6019 #CJK UNIFIED IDEOGRAPH +0x9C81 0x6010 #CJK UNIFIED IDEOGRAPH +0x9C82 0x6029 #CJK UNIFIED IDEOGRAPH +0x9C83 0x600E #CJK UNIFIED IDEOGRAPH +0x9C84 0x6031 #CJK UNIFIED IDEOGRAPH +0x9C85 0x601B #CJK UNIFIED IDEOGRAPH +0x9C86 0x6015 #CJK UNIFIED IDEOGRAPH +0x9C87 0x602B #CJK UNIFIED IDEOGRAPH +0x9C88 0x6026 #CJK UNIFIED IDEOGRAPH +0x9C89 0x600F #CJK UNIFIED IDEOGRAPH +0x9C8A 0x603A #CJK UNIFIED IDEOGRAPH +0x9C8B 0x605A #CJK UNIFIED IDEOGRAPH +0x9C8C 0x6041 #CJK UNIFIED IDEOGRAPH +0x9C8D 0x606A #CJK UNIFIED IDEOGRAPH +0x9C8E 0x6077 #CJK UNIFIED IDEOGRAPH +0x9C8F 0x605F #CJK UNIFIED IDEOGRAPH +0x9C90 0x604A #CJK UNIFIED IDEOGRAPH +0x9C91 0x6046 #CJK UNIFIED IDEOGRAPH +0x9C92 0x604D #CJK UNIFIED IDEOGRAPH +0x9C93 0x6063 #CJK UNIFIED IDEOGRAPH +0x9C94 0x6043 #CJK UNIFIED IDEOGRAPH +0x9C95 0x6064 #CJK UNIFIED IDEOGRAPH +0x9C96 0x6042 #CJK UNIFIED IDEOGRAPH +0x9C97 0x606C #CJK UNIFIED IDEOGRAPH +0x9C98 0x606B #CJK UNIFIED IDEOGRAPH +0x9C99 0x6059 #CJK UNIFIED IDEOGRAPH +0x9C9A 0x6081 #CJK UNIFIED IDEOGRAPH +0x9C9B 0x608D #CJK UNIFIED IDEOGRAPH +0x9C9C 0x60E7 #CJK UNIFIED IDEOGRAPH +0x9C9D 0x6083 #CJK UNIFIED IDEOGRAPH +0x9C9E 0x609A #CJK UNIFIED IDEOGRAPH +0x9C9F 0x6084 #CJK UNIFIED IDEOGRAPH +0x9CA0 0x609B #CJK UNIFIED IDEOGRAPH +0x9CA1 0x6096 #CJK UNIFIED IDEOGRAPH +0x9CA2 0x6097 #CJK UNIFIED IDEOGRAPH +0x9CA3 0x6092 #CJK UNIFIED IDEOGRAPH +0x9CA4 0x60A7 #CJK UNIFIED IDEOGRAPH +0x9CA5 0x608B #CJK UNIFIED IDEOGRAPH +0x9CA6 0x60E1 #CJK UNIFIED IDEOGRAPH +0x9CA7 0x60B8 #CJK UNIFIED IDEOGRAPH +0x9CA8 0x60E0 #CJK UNIFIED IDEOGRAPH +0x9CA9 0x60D3 #CJK UNIFIED IDEOGRAPH +0x9CAA 0x60B4 #CJK UNIFIED IDEOGRAPH +0x9CAB 0x5FF0 #CJK UNIFIED IDEOGRAPH +0x9CAC 0x60BD #CJK UNIFIED IDEOGRAPH +0x9CAD 0x60C6 #CJK UNIFIED IDEOGRAPH +0x9CAE 0x60B5 #CJK UNIFIED IDEOGRAPH +0x9CAF 0x60D8 #CJK UNIFIED IDEOGRAPH +0x9CB0 0x614D #CJK UNIFIED IDEOGRAPH +0x9CB1 0x6115 #CJK UNIFIED IDEOGRAPH +0x9CB2 0x6106 #CJK UNIFIED IDEOGRAPH +0x9CB3 0x60F6 #CJK UNIFIED IDEOGRAPH +0x9CB4 0x60F7 #CJK UNIFIED IDEOGRAPH +0x9CB5 0x6100 #CJK UNIFIED IDEOGRAPH +0x9CB6 0x60F4 #CJK UNIFIED IDEOGRAPH +0x9CB7 0x60FA #CJK UNIFIED IDEOGRAPH +0x9CB8 0x6103 #CJK UNIFIED IDEOGRAPH +0x9CB9 0x6121 #CJK UNIFIED IDEOGRAPH +0x9CBA 0x60FB #CJK UNIFIED IDEOGRAPH +0x9CBB 0x60F1 #CJK UNIFIED IDEOGRAPH +0x9CBC 0x610D #CJK UNIFIED IDEOGRAPH +0x9CBD 0x610E #CJK UNIFIED IDEOGRAPH +0x9CBE 0x6147 #CJK UNIFIED IDEOGRAPH +0x9CBF 0x613E #CJK UNIFIED IDEOGRAPH +0x9CC0 0x6128 #CJK UNIFIED IDEOGRAPH +0x9CC1 0x6127 #CJK UNIFIED IDEOGRAPH +0x9CC2 0x614A #CJK UNIFIED IDEOGRAPH +0x9CC3 0x613F #CJK UNIFIED IDEOGRAPH +0x9CC4 0x613C #CJK UNIFIED IDEOGRAPH +0x9CC5 0x612C #CJK UNIFIED IDEOGRAPH +0x9CC6 0x6134 #CJK UNIFIED IDEOGRAPH +0x9CC7 0x613D #CJK UNIFIED IDEOGRAPH +0x9CC8 0x6142 #CJK UNIFIED IDEOGRAPH +0x9CC9 0x6144 #CJK UNIFIED IDEOGRAPH +0x9CCA 0x6173 #CJK UNIFIED IDEOGRAPH +0x9CCB 0x6177 #CJK UNIFIED IDEOGRAPH +0x9CCC 0x6158 #CJK UNIFIED IDEOGRAPH +0x9CCD 0x6159 #CJK UNIFIED IDEOGRAPH +0x9CCE 0x615A #CJK UNIFIED IDEOGRAPH +0x9CCF 0x616B #CJK UNIFIED IDEOGRAPH +0x9CD0 0x6174 #CJK UNIFIED IDEOGRAPH +0x9CD1 0x616F #CJK UNIFIED IDEOGRAPH +0x9CD2 0x6165 #CJK UNIFIED IDEOGRAPH +0x9CD3 0x6171 #CJK UNIFIED IDEOGRAPH +0x9CD4 0x615F #CJK UNIFIED IDEOGRAPH +0x9CD5 0x615D #CJK UNIFIED IDEOGRAPH +0x9CD6 0x6153 #CJK UNIFIED IDEOGRAPH +0x9CD7 0x6175 #CJK UNIFIED IDEOGRAPH +0x9CD8 0x6199 #CJK UNIFIED IDEOGRAPH +0x9CD9 0x6196 #CJK UNIFIED IDEOGRAPH +0x9CDA 0x6187 #CJK UNIFIED IDEOGRAPH +0x9CDB 0x61AC #CJK UNIFIED IDEOGRAPH +0x9CDC 0x6194 #CJK UNIFIED IDEOGRAPH +0x9CDD 0x619A #CJK UNIFIED IDEOGRAPH +0x9CDE 0x618A #CJK UNIFIED IDEOGRAPH +0x9CDF 0x6191 #CJK UNIFIED IDEOGRAPH +0x9CE0 0x61AB #CJK UNIFIED IDEOGRAPH +0x9CE1 0x61AE #CJK UNIFIED IDEOGRAPH +0x9CE2 0x61CC #CJK UNIFIED IDEOGRAPH +0x9CE3 0x61CA #CJK UNIFIED IDEOGRAPH +0x9CE4 0x61C9 #CJK UNIFIED IDEOGRAPH +0x9CE5 0x61F7 #CJK UNIFIED IDEOGRAPH +0x9CE6 0x61C8 #CJK UNIFIED IDEOGRAPH +0x9CE7 0x61C3 #CJK UNIFIED IDEOGRAPH +0x9CE8 0x61C6 #CJK UNIFIED IDEOGRAPH +0x9CE9 0x61BA #CJK UNIFIED IDEOGRAPH +0x9CEA 0x61CB #CJK UNIFIED IDEOGRAPH +0x9CEB 0x7F79 #CJK UNIFIED IDEOGRAPH +0x9CEC 0x61CD #CJK UNIFIED IDEOGRAPH +0x9CED 0x61E6 #CJK UNIFIED IDEOGRAPH +0x9CEE 0x61E3 #CJK UNIFIED IDEOGRAPH +0x9CEF 0x61F6 #CJK UNIFIED IDEOGRAPH +0x9CF0 0x61FA #CJK UNIFIED IDEOGRAPH +0x9CF1 0x61F4 #CJK UNIFIED IDEOGRAPH +0x9CF2 0x61FF #CJK UNIFIED IDEOGRAPH +0x9CF3 0x61FD #CJK UNIFIED IDEOGRAPH +0x9CF4 0x61FC #CJK UNIFIED IDEOGRAPH +0x9CF5 0x61FE #CJK UNIFIED IDEOGRAPH +0x9CF6 0x6200 #CJK UNIFIED IDEOGRAPH +0x9CF7 0x6208 #CJK UNIFIED IDEOGRAPH +0x9CF8 0x6209 #CJK UNIFIED IDEOGRAPH +0x9CF9 0x620D #CJK UNIFIED IDEOGRAPH +0x9CFA 0x620C #CJK UNIFIED IDEOGRAPH +0x9CFB 0x6214 #CJK UNIFIED IDEOGRAPH +0x9CFC 0x621B #CJK UNIFIED IDEOGRAPH +0x9D40 0x621E #CJK UNIFIED IDEOGRAPH +0x9D41 0x6221 #CJK UNIFIED IDEOGRAPH +0x9D42 0x622A #CJK UNIFIED IDEOGRAPH +0x9D43 0x622E #CJK UNIFIED IDEOGRAPH +0x9D44 0x6230 #CJK UNIFIED IDEOGRAPH +0x9D45 0x6232 #CJK UNIFIED IDEOGRAPH +0x9D46 0x6233 #CJK UNIFIED IDEOGRAPH +0x9D47 0x6241 #CJK UNIFIED IDEOGRAPH +0x9D48 0x624E #CJK UNIFIED IDEOGRAPH +0x9D49 0x625E #CJK UNIFIED IDEOGRAPH +0x9D4A 0x6263 #CJK UNIFIED IDEOGRAPH +0x9D4B 0x625B #CJK UNIFIED IDEOGRAPH +0x9D4C 0x6260 #CJK UNIFIED IDEOGRAPH +0x9D4D 0x6268 #CJK UNIFIED IDEOGRAPH +0x9D4E 0x627C #CJK UNIFIED IDEOGRAPH +0x9D4F 0x6282 #CJK UNIFIED IDEOGRAPH +0x9D50 0x6289 #CJK UNIFIED IDEOGRAPH +0x9D51 0x627E #CJK UNIFIED IDEOGRAPH +0x9D52 0x6292 #CJK UNIFIED IDEOGRAPH +0x9D53 0x6293 #CJK UNIFIED IDEOGRAPH +0x9D54 0x6296 #CJK UNIFIED IDEOGRAPH +0x9D55 0x62D4 #CJK UNIFIED IDEOGRAPH +0x9D56 0x6283 #CJK UNIFIED IDEOGRAPH +0x9D57 0x6294 #CJK UNIFIED IDEOGRAPH +0x9D58 0x62D7 #CJK UNIFIED IDEOGRAPH +0x9D59 0x62D1 #CJK UNIFIED IDEOGRAPH +0x9D5A 0x62BB #CJK UNIFIED IDEOGRAPH +0x9D5B 0x62CF #CJK UNIFIED IDEOGRAPH +0x9D5C 0x62FF #CJK UNIFIED IDEOGRAPH +0x9D5D 0x62C6 #CJK UNIFIED IDEOGRAPH +0x9D5E 0x64D4 #CJK UNIFIED IDEOGRAPH +0x9D5F 0x62C8 #CJK UNIFIED IDEOGRAPH +0x9D60 0x62DC #CJK UNIFIED IDEOGRAPH +0x9D61 0x62CC #CJK UNIFIED IDEOGRAPH +0x9D62 0x62CA #CJK UNIFIED IDEOGRAPH +0x9D63 0x62C2 #CJK UNIFIED IDEOGRAPH +0x9D64 0x62C7 #CJK UNIFIED IDEOGRAPH +0x9D65 0x629B #CJK UNIFIED IDEOGRAPH +0x9D66 0x62C9 #CJK UNIFIED IDEOGRAPH +0x9D67 0x630C #CJK UNIFIED IDEOGRAPH +0x9D68 0x62EE #CJK UNIFIED IDEOGRAPH +0x9D69 0x62F1 #CJK UNIFIED IDEOGRAPH +0x9D6A 0x6327 #CJK UNIFIED IDEOGRAPH +0x9D6B 0x6302 #CJK UNIFIED IDEOGRAPH +0x9D6C 0x6308 #CJK UNIFIED IDEOGRAPH +0x9D6D 0x62EF #CJK UNIFIED IDEOGRAPH +0x9D6E 0x62F5 #CJK UNIFIED IDEOGRAPH +0x9D6F 0x6350 #CJK UNIFIED IDEOGRAPH +0x9D70 0x633E #CJK UNIFIED IDEOGRAPH +0x9D71 0x634D #CJK UNIFIED IDEOGRAPH +0x9D72 0x641C #CJK UNIFIED IDEOGRAPH +0x9D73 0x634F #CJK UNIFIED IDEOGRAPH +0x9D74 0x6396 #CJK UNIFIED IDEOGRAPH +0x9D75 0x638E #CJK UNIFIED IDEOGRAPH +0x9D76 0x6380 #CJK UNIFIED IDEOGRAPH +0x9D77 0x63AB #CJK UNIFIED IDEOGRAPH +0x9D78 0x6376 #CJK UNIFIED IDEOGRAPH +0x9D79 0x63A3 #CJK UNIFIED IDEOGRAPH +0x9D7A 0x638F #CJK UNIFIED IDEOGRAPH +0x9D7B 0x6389 #CJK UNIFIED IDEOGRAPH +0x9D7C 0x639F #CJK UNIFIED IDEOGRAPH +0x9D7D 0x63B5 #CJK UNIFIED IDEOGRAPH +0x9D7E 0x636B #CJK UNIFIED IDEOGRAPH +0x9D80 0x6369 #CJK UNIFIED IDEOGRAPH +0x9D81 0x63BE #CJK UNIFIED IDEOGRAPH +0x9D82 0x63E9 #CJK UNIFIED IDEOGRAPH +0x9D83 0x63C0 #CJK UNIFIED IDEOGRAPH +0x9D84 0x63C6 #CJK UNIFIED IDEOGRAPH +0x9D85 0x63E3 #CJK UNIFIED IDEOGRAPH +0x9D86 0x63C9 #CJK UNIFIED IDEOGRAPH +0x9D87 0x63D2 #CJK UNIFIED IDEOGRAPH +0x9D88 0x63F6 #CJK UNIFIED IDEOGRAPH +0x9D89 0x63C4 #CJK UNIFIED IDEOGRAPH +0x9D8A 0x6416 #CJK UNIFIED IDEOGRAPH +0x9D8B 0x6434 #CJK UNIFIED IDEOGRAPH +0x9D8C 0x6406 #CJK UNIFIED IDEOGRAPH +0x9D8D 0x6413 #CJK UNIFIED IDEOGRAPH +0x9D8E 0x6426 #CJK UNIFIED IDEOGRAPH +0x9D8F 0x6436 #CJK UNIFIED IDEOGRAPH +0x9D90 0x651D #CJK UNIFIED IDEOGRAPH +0x9D91 0x6417 #CJK UNIFIED IDEOGRAPH +0x9D92 0x6428 #CJK UNIFIED IDEOGRAPH +0x9D93 0x640F #CJK UNIFIED IDEOGRAPH +0x9D94 0x6467 #CJK UNIFIED IDEOGRAPH +0x9D95 0x646F #CJK UNIFIED IDEOGRAPH +0x9D96 0x6476 #CJK UNIFIED IDEOGRAPH +0x9D97 0x644E #CJK UNIFIED IDEOGRAPH +0x9D98 0x652A #CJK UNIFIED IDEOGRAPH +0x9D99 0x6495 #CJK UNIFIED IDEOGRAPH +0x9D9A 0x6493 #CJK UNIFIED IDEOGRAPH +0x9D9B 0x64A5 #CJK UNIFIED IDEOGRAPH +0x9D9C 0x64A9 #CJK UNIFIED IDEOGRAPH +0x9D9D 0x6488 #CJK UNIFIED IDEOGRAPH +0x9D9E 0x64BC #CJK UNIFIED IDEOGRAPH +0x9D9F 0x64DA #CJK UNIFIED IDEOGRAPH +0x9DA0 0x64D2 #CJK UNIFIED IDEOGRAPH +0x9DA1 0x64C5 #CJK UNIFIED IDEOGRAPH +0x9DA2 0x64C7 #CJK UNIFIED IDEOGRAPH +0x9DA3 0x64BB #CJK UNIFIED IDEOGRAPH +0x9DA4 0x64D8 #CJK UNIFIED IDEOGRAPH +0x9DA5 0x64C2 #CJK UNIFIED IDEOGRAPH +0x9DA6 0x64F1 #CJK UNIFIED IDEOGRAPH +0x9DA7 0x64E7 #CJK UNIFIED IDEOGRAPH +0x9DA8 0x8209 #CJK UNIFIED IDEOGRAPH +0x9DA9 0x64E0 #CJK UNIFIED IDEOGRAPH +0x9DAA 0x64E1 #CJK UNIFIED IDEOGRAPH +0x9DAB 0x62AC #CJK UNIFIED IDEOGRAPH +0x9DAC 0x64E3 #CJK UNIFIED IDEOGRAPH +0x9DAD 0x64EF #CJK UNIFIED IDEOGRAPH +0x9DAE 0x652C #CJK UNIFIED IDEOGRAPH +0x9DAF 0x64F6 #CJK UNIFIED IDEOGRAPH +0x9DB0 0x64F4 #CJK UNIFIED IDEOGRAPH +0x9DB1 0x64F2 #CJK UNIFIED IDEOGRAPH +0x9DB2 0x64FA #CJK UNIFIED IDEOGRAPH +0x9DB3 0x6500 #CJK UNIFIED IDEOGRAPH +0x9DB4 0x64FD #CJK UNIFIED IDEOGRAPH +0x9DB5 0x6518 #CJK UNIFIED IDEOGRAPH +0x9DB6 0x651C #CJK UNIFIED IDEOGRAPH +0x9DB7 0x6505 #CJK UNIFIED IDEOGRAPH +0x9DB8 0x6524 #CJK UNIFIED IDEOGRAPH +0x9DB9 0x6523 #CJK UNIFIED IDEOGRAPH +0x9DBA 0x652B #CJK UNIFIED IDEOGRAPH +0x9DBB 0x6534 #CJK UNIFIED IDEOGRAPH +0x9DBC 0x6535 #CJK UNIFIED IDEOGRAPH +0x9DBD 0x6537 #CJK UNIFIED IDEOGRAPH +0x9DBE 0x6536 #CJK UNIFIED IDEOGRAPH +0x9DBF 0x6538 #CJK UNIFIED IDEOGRAPH +0x9DC0 0x754B #CJK UNIFIED IDEOGRAPH +0x9DC1 0x6548 #CJK UNIFIED IDEOGRAPH +0x9DC2 0x6556 #CJK UNIFIED IDEOGRAPH +0x9DC3 0x6555 #CJK UNIFIED IDEOGRAPH +0x9DC4 0x654D #CJK UNIFIED IDEOGRAPH +0x9DC5 0x6558 #CJK UNIFIED IDEOGRAPH +0x9DC6 0x655E #CJK UNIFIED IDEOGRAPH +0x9DC7 0x655D #CJK UNIFIED IDEOGRAPH +0x9DC8 0x6572 #CJK UNIFIED IDEOGRAPH +0x9DC9 0x6578 #CJK UNIFIED IDEOGRAPH +0x9DCA 0x6582 #CJK UNIFIED IDEOGRAPH +0x9DCB 0x6583 #CJK UNIFIED IDEOGRAPH +0x9DCC 0x8B8A #CJK UNIFIED IDEOGRAPH +0x9DCD 0x659B #CJK UNIFIED IDEOGRAPH +0x9DCE 0x659F #CJK UNIFIED IDEOGRAPH +0x9DCF 0x65AB #CJK UNIFIED IDEOGRAPH +0x9DD0 0x65B7 #CJK UNIFIED IDEOGRAPH +0x9DD1 0x65C3 #CJK UNIFIED IDEOGRAPH +0x9DD2 0x65C6 #CJK UNIFIED IDEOGRAPH +0x9DD3 0x65C1 #CJK UNIFIED IDEOGRAPH +0x9DD4 0x65C4 #CJK UNIFIED IDEOGRAPH +0x9DD5 0x65CC #CJK UNIFIED IDEOGRAPH +0x9DD6 0x65D2 #CJK UNIFIED IDEOGRAPH +0x9DD7 0x65DB #CJK UNIFIED IDEOGRAPH +0x9DD8 0x65D9 #CJK UNIFIED IDEOGRAPH +0x9DD9 0x65E0 #CJK UNIFIED IDEOGRAPH +0x9DDA 0x65E1 #CJK UNIFIED IDEOGRAPH +0x9DDB 0x65F1 #CJK UNIFIED IDEOGRAPH +0x9DDC 0x6772 #CJK UNIFIED IDEOGRAPH +0x9DDD 0x660A #CJK UNIFIED IDEOGRAPH +0x9DDE 0x6603 #CJK UNIFIED IDEOGRAPH +0x9DDF 0x65FB #CJK UNIFIED IDEOGRAPH +0x9DE0 0x6773 #CJK UNIFIED IDEOGRAPH +0x9DE1 0x6635 #CJK UNIFIED IDEOGRAPH +0x9DE2 0x6636 #CJK UNIFIED IDEOGRAPH +0x9DE3 0x6634 #CJK UNIFIED IDEOGRAPH +0x9DE4 0x661C #CJK UNIFIED IDEOGRAPH +0x9DE5 0x664F #CJK UNIFIED IDEOGRAPH +0x9DE6 0x6644 #CJK UNIFIED IDEOGRAPH +0x9DE7 0x6649 #CJK UNIFIED IDEOGRAPH +0x9DE8 0x6641 #CJK UNIFIED IDEOGRAPH +0x9DE9 0x665E #CJK UNIFIED IDEOGRAPH +0x9DEA 0x665D #CJK UNIFIED IDEOGRAPH +0x9DEB 0x6664 #CJK UNIFIED IDEOGRAPH +0x9DEC 0x6667 #CJK UNIFIED IDEOGRAPH +0x9DED 0x6668 #CJK UNIFIED IDEOGRAPH +0x9DEE 0x665F #CJK UNIFIED IDEOGRAPH +0x9DEF 0x6662 #CJK UNIFIED IDEOGRAPH +0x9DF0 0x6670 #CJK UNIFIED IDEOGRAPH +0x9DF1 0x6683 #CJK UNIFIED IDEOGRAPH +0x9DF2 0x6688 #CJK UNIFIED IDEOGRAPH +0x9DF3 0x668E #CJK UNIFIED IDEOGRAPH +0x9DF4 0x6689 #CJK UNIFIED IDEOGRAPH +0x9DF5 0x6684 #CJK UNIFIED IDEOGRAPH +0x9DF6 0x6698 #CJK UNIFIED IDEOGRAPH +0x9DF7 0x669D #CJK UNIFIED IDEOGRAPH +0x9DF8 0x66C1 #CJK UNIFIED IDEOGRAPH +0x9DF9 0x66B9 #CJK UNIFIED IDEOGRAPH +0x9DFA 0x66C9 #CJK UNIFIED IDEOGRAPH +0x9DFB 0x66BE #CJK UNIFIED IDEOGRAPH +0x9DFC 0x66BC #CJK UNIFIED IDEOGRAPH +0x9E40 0x66C4 #CJK UNIFIED IDEOGRAPH +0x9E41 0x66B8 #CJK UNIFIED IDEOGRAPH +0x9E42 0x66D6 #CJK UNIFIED IDEOGRAPH +0x9E43 0x66DA #CJK UNIFIED IDEOGRAPH +0x9E44 0x66E0 #CJK UNIFIED IDEOGRAPH +0x9E45 0x663F #CJK UNIFIED IDEOGRAPH +0x9E46 0x66E6 #CJK UNIFIED IDEOGRAPH +0x9E47 0x66E9 #CJK UNIFIED IDEOGRAPH +0x9E48 0x66F0 #CJK UNIFIED IDEOGRAPH +0x9E49 0x66F5 #CJK UNIFIED IDEOGRAPH +0x9E4A 0x66F7 #CJK UNIFIED IDEOGRAPH +0x9E4B 0x670F #CJK UNIFIED IDEOGRAPH +0x9E4C 0x6716 #CJK UNIFIED IDEOGRAPH +0x9E4D 0x671E #CJK UNIFIED IDEOGRAPH +0x9E4E 0x6726 #CJK UNIFIED IDEOGRAPH +0x9E4F 0x6727 #CJK UNIFIED IDEOGRAPH +0x9E50 0x9738 #CJK UNIFIED IDEOGRAPH +0x9E51 0x672E #CJK UNIFIED IDEOGRAPH +0x9E52 0x673F #CJK UNIFIED IDEOGRAPH +0x9E53 0x6736 #CJK UNIFIED IDEOGRAPH +0x9E54 0x6741 #CJK UNIFIED IDEOGRAPH +0x9E55 0x6738 #CJK UNIFIED IDEOGRAPH +0x9E56 0x6737 #CJK UNIFIED IDEOGRAPH +0x9E57 0x6746 #CJK UNIFIED IDEOGRAPH +0x9E58 0x675E #CJK UNIFIED IDEOGRAPH +0x9E59 0x6760 #CJK UNIFIED IDEOGRAPH +0x9E5A 0x6759 #CJK UNIFIED IDEOGRAPH +0x9E5B 0x6763 #CJK UNIFIED IDEOGRAPH +0x9E5C 0x6764 #CJK UNIFIED IDEOGRAPH +0x9E5D 0x6789 #CJK UNIFIED IDEOGRAPH +0x9E5E 0x6770 #CJK UNIFIED IDEOGRAPH +0x9E5F 0x67A9 #CJK UNIFIED IDEOGRAPH +0x9E60 0x677C #CJK UNIFIED IDEOGRAPH +0x9E61 0x676A #CJK UNIFIED IDEOGRAPH +0x9E62 0x678C #CJK UNIFIED IDEOGRAPH +0x9E63 0x678B #CJK UNIFIED IDEOGRAPH +0x9E64 0x67A6 #CJK UNIFIED IDEOGRAPH +0x9E65 0x67A1 #CJK UNIFIED IDEOGRAPH +0x9E66 0x6785 #CJK UNIFIED IDEOGRAPH +0x9E67 0x67B7 #CJK UNIFIED IDEOGRAPH +0x9E68 0x67EF #CJK UNIFIED IDEOGRAPH +0x9E69 0x67B4 #CJK UNIFIED IDEOGRAPH +0x9E6A 0x67EC #CJK UNIFIED IDEOGRAPH +0x9E6B 0x67B3 #CJK UNIFIED IDEOGRAPH +0x9E6C 0x67E9 #CJK UNIFIED IDEOGRAPH +0x9E6D 0x67B8 #CJK UNIFIED IDEOGRAPH +0x9E6E 0x67E4 #CJK UNIFIED IDEOGRAPH +0x9E6F 0x67DE #CJK UNIFIED IDEOGRAPH +0x9E70 0x67DD #CJK UNIFIED IDEOGRAPH +0x9E71 0x67E2 #CJK UNIFIED IDEOGRAPH +0x9E72 0x67EE #CJK UNIFIED IDEOGRAPH +0x9E73 0x67B9 #CJK UNIFIED IDEOGRAPH +0x9E74 0x67CE #CJK UNIFIED IDEOGRAPH +0x9E75 0x67C6 #CJK UNIFIED IDEOGRAPH +0x9E76 0x67E7 #CJK UNIFIED IDEOGRAPH +0x9E77 0x6A9C #CJK UNIFIED IDEOGRAPH +0x9E78 0x681E #CJK UNIFIED IDEOGRAPH +0x9E79 0x6846 #CJK UNIFIED IDEOGRAPH +0x9E7A 0x6829 #CJK UNIFIED IDEOGRAPH +0x9E7B 0x6840 #CJK UNIFIED IDEOGRAPH +0x9E7C 0x684D #CJK UNIFIED IDEOGRAPH +0x9E7D 0x6832 #CJK UNIFIED IDEOGRAPH +0x9E7E 0x684E #CJK UNIFIED IDEOGRAPH +0x9E80 0x68B3 #CJK UNIFIED IDEOGRAPH +0x9E81 0x682B #CJK UNIFIED IDEOGRAPH +0x9E82 0x6859 #CJK UNIFIED IDEOGRAPH +0x9E83 0x6863 #CJK UNIFIED IDEOGRAPH +0x9E84 0x6877 #CJK UNIFIED IDEOGRAPH +0x9E85 0x687F #CJK UNIFIED IDEOGRAPH +0x9E86 0x689F #CJK UNIFIED IDEOGRAPH +0x9E87 0x688F #CJK UNIFIED IDEOGRAPH +0x9E88 0x68AD #CJK UNIFIED IDEOGRAPH +0x9E89 0x6894 #CJK UNIFIED IDEOGRAPH +0x9E8A 0x689D #CJK UNIFIED IDEOGRAPH +0x9E8B 0x689B #CJK UNIFIED IDEOGRAPH +0x9E8C 0x6883 #CJK UNIFIED IDEOGRAPH +0x9E8D 0x6AAE #CJK UNIFIED IDEOGRAPH +0x9E8E 0x68B9 #CJK UNIFIED IDEOGRAPH +0x9E8F 0x6874 #CJK UNIFIED IDEOGRAPH +0x9E90 0x68B5 #CJK UNIFIED IDEOGRAPH +0x9E91 0x68A0 #CJK UNIFIED IDEOGRAPH +0x9E92 0x68BA #CJK UNIFIED IDEOGRAPH +0x9E93 0x690F #CJK UNIFIED IDEOGRAPH +0x9E94 0x688D #CJK UNIFIED IDEOGRAPH +0x9E95 0x687E #CJK UNIFIED IDEOGRAPH +0x9E96 0x6901 #CJK UNIFIED IDEOGRAPH +0x9E97 0x68CA #CJK UNIFIED IDEOGRAPH +0x9E98 0x6908 #CJK UNIFIED IDEOGRAPH +0x9E99 0x68D8 #CJK UNIFIED IDEOGRAPH +0x9E9A 0x6922 #CJK UNIFIED IDEOGRAPH +0x9E9B 0x6926 #CJK UNIFIED IDEOGRAPH +0x9E9C 0x68E1 #CJK UNIFIED IDEOGRAPH +0x9E9D 0x690C #CJK UNIFIED IDEOGRAPH +0x9E9E 0x68CD #CJK UNIFIED IDEOGRAPH +0x9E9F 0x68D4 #CJK UNIFIED IDEOGRAPH +0x9EA0 0x68E7 #CJK UNIFIED IDEOGRAPH +0x9EA1 0x68D5 #CJK UNIFIED IDEOGRAPH +0x9EA2 0x6936 #CJK UNIFIED IDEOGRAPH +0x9EA3 0x6912 #CJK UNIFIED IDEOGRAPH +0x9EA4 0x6904 #CJK UNIFIED IDEOGRAPH +0x9EA5 0x68D7 #CJK UNIFIED IDEOGRAPH +0x9EA6 0x68E3 #CJK UNIFIED IDEOGRAPH +0x9EA7 0x6925 #CJK UNIFIED IDEOGRAPH +0x9EA8 0x68F9 #CJK UNIFIED IDEOGRAPH +0x9EA9 0x68E0 #CJK UNIFIED IDEOGRAPH +0x9EAA 0x68EF #CJK UNIFIED IDEOGRAPH +0x9EAB 0x6928 #CJK UNIFIED IDEOGRAPH +0x9EAC 0x692A #CJK UNIFIED IDEOGRAPH +0x9EAD 0x691A #CJK UNIFIED IDEOGRAPH +0x9EAE 0x6923 #CJK UNIFIED IDEOGRAPH +0x9EAF 0x6921 #CJK UNIFIED IDEOGRAPH +0x9EB0 0x68C6 #CJK UNIFIED IDEOGRAPH +0x9EB1 0x6979 #CJK UNIFIED IDEOGRAPH +0x9EB2 0x6977 #CJK UNIFIED IDEOGRAPH +0x9EB3 0x695C #CJK UNIFIED IDEOGRAPH +0x9EB4 0x6978 #CJK UNIFIED IDEOGRAPH +0x9EB5 0x696B #CJK UNIFIED IDEOGRAPH +0x9EB6 0x6954 #CJK UNIFIED IDEOGRAPH +0x9EB7 0x697E #CJK UNIFIED IDEOGRAPH +0x9EB8 0x696E #CJK UNIFIED IDEOGRAPH +0x9EB9 0x6939 #CJK UNIFIED IDEOGRAPH +0x9EBA 0x6974 #CJK UNIFIED IDEOGRAPH +0x9EBB 0x693D #CJK UNIFIED IDEOGRAPH +0x9EBC 0x6959 #CJK UNIFIED IDEOGRAPH +0x9EBD 0x6930 #CJK UNIFIED IDEOGRAPH +0x9EBE 0x6961 #CJK UNIFIED IDEOGRAPH +0x9EBF 0x695E #CJK UNIFIED IDEOGRAPH +0x9EC0 0x695D #CJK UNIFIED IDEOGRAPH +0x9EC1 0x6981 #CJK UNIFIED IDEOGRAPH +0x9EC2 0x696A #CJK UNIFIED IDEOGRAPH +0x9EC3 0x69B2 #CJK UNIFIED IDEOGRAPH +0x9EC4 0x69AE #CJK UNIFIED IDEOGRAPH +0x9EC5 0x69D0 #CJK UNIFIED IDEOGRAPH +0x9EC6 0x69BF #CJK UNIFIED IDEOGRAPH +0x9EC7 0x69C1 #CJK UNIFIED IDEOGRAPH +0x9EC8 0x69D3 #CJK UNIFIED IDEOGRAPH +0x9EC9 0x69BE #CJK UNIFIED IDEOGRAPH +0x9ECA 0x69CE #CJK UNIFIED IDEOGRAPH +0x9ECB 0x5BE8 #CJK UNIFIED IDEOGRAPH +0x9ECC 0x69CA #CJK UNIFIED IDEOGRAPH +0x9ECD 0x69DD #CJK UNIFIED IDEOGRAPH +0x9ECE 0x69BB #CJK UNIFIED IDEOGRAPH +0x9ECF 0x69C3 #CJK UNIFIED IDEOGRAPH +0x9ED0 0x69A7 #CJK UNIFIED IDEOGRAPH +0x9ED1 0x6A2E #CJK UNIFIED IDEOGRAPH +0x9ED2 0x6991 #CJK UNIFIED IDEOGRAPH +0x9ED3 0x69A0 #CJK UNIFIED IDEOGRAPH +0x9ED4 0x699C #CJK UNIFIED IDEOGRAPH +0x9ED5 0x6995 #CJK UNIFIED IDEOGRAPH +0x9ED6 0x69B4 #CJK UNIFIED IDEOGRAPH +0x9ED7 0x69DE #CJK UNIFIED IDEOGRAPH +0x9ED8 0x69E8 #CJK UNIFIED IDEOGRAPH +0x9ED9 0x6A02 #CJK UNIFIED IDEOGRAPH +0x9EDA 0x6A1B #CJK UNIFIED IDEOGRAPH +0x9EDB 0x69FF #CJK UNIFIED IDEOGRAPH +0x9EDC 0x6B0A #CJK UNIFIED IDEOGRAPH +0x9EDD 0x69F9 #CJK UNIFIED IDEOGRAPH +0x9EDE 0x69F2 #CJK UNIFIED IDEOGRAPH +0x9EDF 0x69E7 #CJK UNIFIED IDEOGRAPH +0x9EE0 0x6A05 #CJK UNIFIED IDEOGRAPH +0x9EE1 0x69B1 #CJK UNIFIED IDEOGRAPH +0x9EE2 0x6A1E #CJK UNIFIED IDEOGRAPH +0x9EE3 0x69ED #CJK UNIFIED IDEOGRAPH +0x9EE4 0x6A14 #CJK UNIFIED IDEOGRAPH +0x9EE5 0x69EB #CJK UNIFIED IDEOGRAPH +0x9EE6 0x6A0A #CJK UNIFIED IDEOGRAPH +0x9EE7 0x6A12 #CJK UNIFIED IDEOGRAPH +0x9EE8 0x6AC1 #CJK UNIFIED IDEOGRAPH +0x9EE9 0x6A23 #CJK UNIFIED IDEOGRAPH +0x9EEA 0x6A13 #CJK UNIFIED IDEOGRAPH +0x9EEB 0x6A44 #CJK UNIFIED IDEOGRAPH +0x9EEC 0x6A0C #CJK UNIFIED IDEOGRAPH +0x9EED 0x6A72 #CJK UNIFIED IDEOGRAPH +0x9EEE 0x6A36 #CJK UNIFIED IDEOGRAPH +0x9EEF 0x6A78 #CJK UNIFIED IDEOGRAPH +0x9EF0 0x6A47 #CJK UNIFIED IDEOGRAPH +0x9EF1 0x6A62 #CJK UNIFIED IDEOGRAPH +0x9EF2 0x6A59 #CJK UNIFIED IDEOGRAPH +0x9EF3 0x6A66 #CJK UNIFIED IDEOGRAPH +0x9EF4 0x6A48 #CJK UNIFIED IDEOGRAPH +0x9EF5 0x6A38 #CJK UNIFIED IDEOGRAPH +0x9EF6 0x6A22 #CJK UNIFIED IDEOGRAPH +0x9EF7 0x6A90 #CJK UNIFIED IDEOGRAPH +0x9EF8 0x6A8D #CJK UNIFIED IDEOGRAPH +0x9EF9 0x6AA0 #CJK UNIFIED IDEOGRAPH +0x9EFA 0x6A84 #CJK UNIFIED IDEOGRAPH +0x9EFB 0x6AA2 #CJK UNIFIED IDEOGRAPH +0x9EFC 0x6AA3 #CJK UNIFIED IDEOGRAPH +0x9F40 0x6A97 #CJK UNIFIED IDEOGRAPH +0x9F41 0x8617 #CJK UNIFIED IDEOGRAPH +0x9F42 0x6ABB #CJK UNIFIED IDEOGRAPH +0x9F43 0x6AC3 #CJK UNIFIED IDEOGRAPH +0x9F44 0x6AC2 #CJK UNIFIED IDEOGRAPH +0x9F45 0x6AB8 #CJK UNIFIED IDEOGRAPH +0x9F46 0x6AB3 #CJK UNIFIED IDEOGRAPH +0x9F47 0x6AAC #CJK UNIFIED IDEOGRAPH +0x9F48 0x6ADE #CJK UNIFIED IDEOGRAPH +0x9F49 0x6AD1 #CJK UNIFIED IDEOGRAPH +0x9F4A 0x6ADF #CJK UNIFIED IDEOGRAPH +0x9F4B 0x6AAA #CJK UNIFIED IDEOGRAPH +0x9F4C 0x6ADA #CJK UNIFIED IDEOGRAPH +0x9F4D 0x6AEA #CJK UNIFIED IDEOGRAPH +0x9F4E 0x6AFB #CJK UNIFIED IDEOGRAPH +0x9F4F 0x6B05 #CJK UNIFIED IDEOGRAPH +0x9F50 0x8616 #CJK UNIFIED IDEOGRAPH +0x9F51 0x6AFA #CJK UNIFIED IDEOGRAPH +0x9F52 0x6B12 #CJK UNIFIED IDEOGRAPH +0x9F53 0x6B16 #CJK UNIFIED IDEOGRAPH +0x9F54 0x9B31 #CJK UNIFIED IDEOGRAPH +0x9F55 0x6B1F #CJK UNIFIED IDEOGRAPH +0x9F56 0x6B38 #CJK UNIFIED IDEOGRAPH +0x9F57 0x6B37 #CJK UNIFIED IDEOGRAPH +0x9F58 0x76DC #CJK UNIFIED IDEOGRAPH +0x9F59 0x6B39 #CJK UNIFIED IDEOGRAPH +0x9F5A 0x98EE #CJK UNIFIED IDEOGRAPH +0x9F5B 0x6B47 #CJK UNIFIED IDEOGRAPH +0x9F5C 0x6B43 #CJK UNIFIED IDEOGRAPH +0x9F5D 0x6B49 #CJK UNIFIED IDEOGRAPH +0x9F5E 0x6B50 #CJK UNIFIED IDEOGRAPH +0x9F5F 0x6B59 #CJK UNIFIED IDEOGRAPH +0x9F60 0x6B54 #CJK UNIFIED IDEOGRAPH +0x9F61 0x6B5B #CJK UNIFIED IDEOGRAPH +0x9F62 0x6B5F #CJK UNIFIED IDEOGRAPH +0x9F63 0x6B61 #CJK UNIFIED IDEOGRAPH +0x9F64 0x6B78 #CJK UNIFIED IDEOGRAPH +0x9F65 0x6B79 #CJK UNIFIED IDEOGRAPH +0x9F66 0x6B7F #CJK UNIFIED IDEOGRAPH +0x9F67 0x6B80 #CJK UNIFIED IDEOGRAPH +0x9F68 0x6B84 #CJK UNIFIED IDEOGRAPH +0x9F69 0x6B83 #CJK UNIFIED IDEOGRAPH +0x9F6A 0x6B8D #CJK UNIFIED IDEOGRAPH +0x9F6B 0x6B98 #CJK UNIFIED IDEOGRAPH +0x9F6C 0x6B95 #CJK UNIFIED IDEOGRAPH +0x9F6D 0x6B9E #CJK UNIFIED IDEOGRAPH +0x9F6E 0x6BA4 #CJK UNIFIED IDEOGRAPH +0x9F6F 0x6BAA #CJK UNIFIED IDEOGRAPH +0x9F70 0x6BAB #CJK UNIFIED IDEOGRAPH +0x9F71 0x6BAF #CJK UNIFIED IDEOGRAPH +0x9F72 0x6BB2 #CJK UNIFIED IDEOGRAPH +0x9F73 0x6BB1 #CJK UNIFIED IDEOGRAPH +0x9F74 0x6BB3 #CJK UNIFIED IDEOGRAPH +0x9F75 0x6BB7 #CJK UNIFIED IDEOGRAPH +0x9F76 0x6BBC #CJK UNIFIED IDEOGRAPH +0x9F77 0x6BC6 #CJK UNIFIED IDEOGRAPH +0x9F78 0x6BCB #CJK UNIFIED IDEOGRAPH +0x9F79 0x6BD3 #CJK UNIFIED IDEOGRAPH +0x9F7A 0x6BDF #CJK UNIFIED IDEOGRAPH +0x9F7B 0x6BEC #CJK UNIFIED IDEOGRAPH +0x9F7C 0x6BEB #CJK UNIFIED IDEOGRAPH +0x9F7D 0x6BF3 #CJK UNIFIED IDEOGRAPH +0x9F7E 0x6BEF #CJK UNIFIED IDEOGRAPH +0x9F80 0x9EBE #CJK UNIFIED IDEOGRAPH +0x9F81 0x6C08 #CJK UNIFIED IDEOGRAPH +0x9F82 0x6C13 #CJK UNIFIED IDEOGRAPH +0x9F83 0x6C14 #CJK UNIFIED IDEOGRAPH +0x9F84 0x6C1B #CJK UNIFIED IDEOGRAPH +0x9F85 0x6C24 #CJK UNIFIED IDEOGRAPH +0x9F86 0x6C23 #CJK UNIFIED IDEOGRAPH +0x9F87 0x6C5E #CJK UNIFIED IDEOGRAPH +0x9F88 0x6C55 #CJK UNIFIED IDEOGRAPH +0x9F89 0x6C62 #CJK UNIFIED IDEOGRAPH +0x9F8A 0x6C6A #CJK UNIFIED IDEOGRAPH +0x9F8B 0x6C82 #CJK UNIFIED IDEOGRAPH +0x9F8C 0x6C8D #CJK UNIFIED IDEOGRAPH +0x9F8D 0x6C9A #CJK UNIFIED IDEOGRAPH +0x9F8E 0x6C81 #CJK UNIFIED IDEOGRAPH +0x9F8F 0x6C9B #CJK UNIFIED IDEOGRAPH +0x9F90 0x6C7E #CJK UNIFIED IDEOGRAPH +0x9F91 0x6C68 #CJK UNIFIED IDEOGRAPH +0x9F92 0x6C73 #CJK UNIFIED IDEOGRAPH +0x9F93 0x6C92 #CJK UNIFIED IDEOGRAPH +0x9F94 0x6C90 #CJK UNIFIED IDEOGRAPH +0x9F95 0x6CC4 #CJK UNIFIED IDEOGRAPH +0x9F96 0x6CF1 #CJK UNIFIED IDEOGRAPH +0x9F97 0x6CD3 #CJK UNIFIED IDEOGRAPH +0x9F98 0x6CBD #CJK UNIFIED IDEOGRAPH +0x9F99 0x6CD7 #CJK UNIFIED IDEOGRAPH +0x9F9A 0x6CC5 #CJK UNIFIED IDEOGRAPH +0x9F9B 0x6CDD #CJK UNIFIED IDEOGRAPH +0x9F9C 0x6CAE #CJK UNIFIED IDEOGRAPH +0x9F9D 0x6CB1 #CJK UNIFIED IDEOGRAPH +0x9F9E 0x6CBE #CJK UNIFIED IDEOGRAPH +0x9F9F 0x6CBA #CJK UNIFIED IDEOGRAPH +0x9FA0 0x6CDB #CJK UNIFIED IDEOGRAPH +0x9FA1 0x6CEF #CJK UNIFIED IDEOGRAPH +0x9FA2 0x6CD9 #CJK UNIFIED IDEOGRAPH +0x9FA3 0x6CEA #CJK UNIFIED IDEOGRAPH +0x9FA4 0x6D1F #CJK UNIFIED IDEOGRAPH +0x9FA5 0x884D #CJK UNIFIED IDEOGRAPH +0x9FA6 0x6D36 #CJK UNIFIED IDEOGRAPH +0x9FA7 0x6D2B #CJK UNIFIED IDEOGRAPH +0x9FA8 0x6D3D #CJK UNIFIED IDEOGRAPH +0x9FA9 0x6D38 #CJK UNIFIED IDEOGRAPH +0x9FAA 0x6D19 #CJK UNIFIED IDEOGRAPH +0x9FAB 0x6D35 #CJK UNIFIED IDEOGRAPH +0x9FAC 0x6D33 #CJK UNIFIED IDEOGRAPH +0x9FAD 0x6D12 #CJK UNIFIED IDEOGRAPH +0x9FAE 0x6D0C #CJK UNIFIED IDEOGRAPH +0x9FAF 0x6D63 #CJK UNIFIED IDEOGRAPH +0x9FB0 0x6D93 #CJK UNIFIED IDEOGRAPH +0x9FB1 0x6D64 #CJK UNIFIED IDEOGRAPH +0x9FB2 0x6D5A #CJK UNIFIED IDEOGRAPH +0x9FB3 0x6D79 #CJK UNIFIED IDEOGRAPH +0x9FB4 0x6D59 #CJK UNIFIED IDEOGRAPH +0x9FB5 0x6D8E #CJK UNIFIED IDEOGRAPH +0x9FB6 0x6D95 #CJK UNIFIED IDEOGRAPH +0x9FB7 0x6FE4 #CJK UNIFIED IDEOGRAPH +0x9FB8 0x6D85 #CJK UNIFIED IDEOGRAPH +0x9FB9 0x6DF9 #CJK UNIFIED IDEOGRAPH +0x9FBA 0x6E15 #CJK UNIFIED IDEOGRAPH +0x9FBB 0x6E0A #CJK UNIFIED IDEOGRAPH +0x9FBC 0x6DB5 #CJK UNIFIED IDEOGRAPH +0x9FBD 0x6DC7 #CJK UNIFIED IDEOGRAPH +0x9FBE 0x6DE6 #CJK UNIFIED IDEOGRAPH +0x9FBF 0x6DB8 #CJK UNIFIED IDEOGRAPH +0x9FC0 0x6DC6 #CJK UNIFIED IDEOGRAPH +0x9FC1 0x6DEC #CJK UNIFIED IDEOGRAPH +0x9FC2 0x6DDE #CJK UNIFIED IDEOGRAPH +0x9FC3 0x6DCC #CJK UNIFIED IDEOGRAPH +0x9FC4 0x6DE8 #CJK UNIFIED IDEOGRAPH +0x9FC5 0x6DD2 #CJK UNIFIED IDEOGRAPH +0x9FC6 0x6DC5 #CJK UNIFIED IDEOGRAPH +0x9FC7 0x6DFA #CJK UNIFIED IDEOGRAPH +0x9FC8 0x6DD9 #CJK UNIFIED IDEOGRAPH +0x9FC9 0x6DE4 #CJK UNIFIED IDEOGRAPH +0x9FCA 0x6DD5 #CJK UNIFIED IDEOGRAPH +0x9FCB 0x6DEA #CJK UNIFIED IDEOGRAPH +0x9FCC 0x6DEE #CJK UNIFIED IDEOGRAPH +0x9FCD 0x6E2D #CJK UNIFIED IDEOGRAPH +0x9FCE 0x6E6E #CJK UNIFIED IDEOGRAPH +0x9FCF 0x6E2E #CJK UNIFIED IDEOGRAPH +0x9FD0 0x6E19 #CJK UNIFIED IDEOGRAPH +0x9FD1 0x6E72 #CJK UNIFIED IDEOGRAPH +0x9FD2 0x6E5F #CJK UNIFIED IDEOGRAPH +0x9FD3 0x6E3E #CJK UNIFIED IDEOGRAPH +0x9FD4 0x6E23 #CJK UNIFIED IDEOGRAPH +0x9FD5 0x6E6B #CJK UNIFIED IDEOGRAPH +0x9FD6 0x6E2B #CJK UNIFIED IDEOGRAPH +0x9FD7 0x6E76 #CJK UNIFIED IDEOGRAPH +0x9FD8 0x6E4D #CJK UNIFIED IDEOGRAPH +0x9FD9 0x6E1F #CJK UNIFIED IDEOGRAPH +0x9FDA 0x6E43 #CJK UNIFIED IDEOGRAPH +0x9FDB 0x6E3A #CJK UNIFIED IDEOGRAPH +0x9FDC 0x6E4E #CJK UNIFIED IDEOGRAPH +0x9FDD 0x6E24 #CJK UNIFIED IDEOGRAPH +0x9FDE 0x6EFF #CJK UNIFIED IDEOGRAPH +0x9FDF 0x6E1D #CJK UNIFIED IDEOGRAPH +0x9FE0 0x6E38 #CJK UNIFIED IDEOGRAPH +0x9FE1 0x6E82 #CJK UNIFIED IDEOGRAPH +0x9FE2 0x6EAA #CJK UNIFIED IDEOGRAPH +0x9FE3 0x6E98 #CJK UNIFIED IDEOGRAPH +0x9FE4 0x6EC9 #CJK UNIFIED IDEOGRAPH +0x9FE5 0x6EB7 #CJK UNIFIED IDEOGRAPH +0x9FE6 0x6ED3 #CJK UNIFIED IDEOGRAPH +0x9FE7 0x6EBD #CJK UNIFIED IDEOGRAPH +0x9FE8 0x6EAF #CJK UNIFIED IDEOGRAPH +0x9FE9 0x6EC4 #CJK UNIFIED IDEOGRAPH +0x9FEA 0x6EB2 #CJK UNIFIED IDEOGRAPH +0x9FEB 0x6ED4 #CJK UNIFIED IDEOGRAPH +0x9FEC 0x6ED5 #CJK UNIFIED IDEOGRAPH +0x9FED 0x6E8F #CJK UNIFIED IDEOGRAPH +0x9FEE 0x6EA5 #CJK UNIFIED IDEOGRAPH +0x9FEF 0x6EC2 #CJK UNIFIED IDEOGRAPH +0x9FF0 0x6E9F #CJK UNIFIED IDEOGRAPH +0x9FF1 0x6F41 #CJK UNIFIED IDEOGRAPH +0x9FF2 0x6F11 #CJK UNIFIED IDEOGRAPH +0x9FF3 0x704C #CJK UNIFIED IDEOGRAPH +0x9FF4 0x6EEC #CJK UNIFIED IDEOGRAPH +0x9FF5 0x6EF8 #CJK UNIFIED IDEOGRAPH +0x9FF6 0x6EFE #CJK UNIFIED IDEOGRAPH +0x9FF7 0x6F3F #CJK UNIFIED IDEOGRAPH +0x9FF8 0x6EF2 #CJK UNIFIED IDEOGRAPH +0x9FF9 0x6F31 #CJK UNIFIED IDEOGRAPH +0x9FFA 0x6EEF #CJK UNIFIED IDEOGRAPH +0x9FFB 0x6F32 #CJK UNIFIED IDEOGRAPH +0x9FFC 0x6ECC #CJK UNIFIED IDEOGRAPH +0xE040 0x6F3E #CJK UNIFIED IDEOGRAPH +0xE041 0x6F13 #CJK UNIFIED IDEOGRAPH +0xE042 0x6EF7 #CJK UNIFIED IDEOGRAPH +0xE043 0x6F86 #CJK UNIFIED IDEOGRAPH +0xE044 0x6F7A #CJK UNIFIED IDEOGRAPH +0xE045 0x6F78 #CJK UNIFIED IDEOGRAPH +0xE046 0x6F81 #CJK UNIFIED IDEOGRAPH +0xE047 0x6F80 #CJK UNIFIED IDEOGRAPH +0xE048 0x6F6F #CJK UNIFIED IDEOGRAPH +0xE049 0x6F5B #CJK UNIFIED IDEOGRAPH +0xE04A 0x6FF3 #CJK UNIFIED IDEOGRAPH +0xE04B 0x6F6D #CJK UNIFIED IDEOGRAPH +0xE04C 0x6F82 #CJK UNIFIED IDEOGRAPH +0xE04D 0x6F7C #CJK UNIFIED IDEOGRAPH +0xE04E 0x6F58 #CJK UNIFIED IDEOGRAPH +0xE04F 0x6F8E #CJK UNIFIED IDEOGRAPH +0xE050 0x6F91 #CJK UNIFIED IDEOGRAPH +0xE051 0x6FC2 #CJK UNIFIED IDEOGRAPH +0xE052 0x6F66 #CJK UNIFIED IDEOGRAPH +0xE053 0x6FB3 #CJK UNIFIED IDEOGRAPH +0xE054 0x6FA3 #CJK UNIFIED IDEOGRAPH +0xE055 0x6FA1 #CJK UNIFIED IDEOGRAPH +0xE056 0x6FA4 #CJK UNIFIED IDEOGRAPH +0xE057 0x6FB9 #CJK UNIFIED IDEOGRAPH +0xE058 0x6FC6 #CJK UNIFIED IDEOGRAPH +0xE059 0x6FAA #CJK UNIFIED IDEOGRAPH +0xE05A 0x6FDF #CJK UNIFIED IDEOGRAPH +0xE05B 0x6FD5 #CJK UNIFIED IDEOGRAPH +0xE05C 0x6FEC #CJK UNIFIED IDEOGRAPH +0xE05D 0x6FD4 #CJK UNIFIED IDEOGRAPH +0xE05E 0x6FD8 #CJK UNIFIED IDEOGRAPH +0xE05F 0x6FF1 #CJK UNIFIED IDEOGRAPH +0xE060 0x6FEE #CJK UNIFIED IDEOGRAPH +0xE061 0x6FDB #CJK UNIFIED IDEOGRAPH +0xE062 0x7009 #CJK UNIFIED IDEOGRAPH +0xE063 0x700B #CJK UNIFIED IDEOGRAPH +0xE064 0x6FFA #CJK UNIFIED IDEOGRAPH +0xE065 0x7011 #CJK UNIFIED IDEOGRAPH +0xE066 0x7001 #CJK UNIFIED IDEOGRAPH +0xE067 0x700F #CJK UNIFIED IDEOGRAPH +0xE068 0x6FFE #CJK UNIFIED IDEOGRAPH +0xE069 0x701B #CJK UNIFIED IDEOGRAPH +0xE06A 0x701A #CJK UNIFIED IDEOGRAPH +0xE06B 0x6F74 #CJK UNIFIED IDEOGRAPH +0xE06C 0x701D #CJK UNIFIED IDEOGRAPH +0xE06D 0x7018 #CJK UNIFIED IDEOGRAPH +0xE06E 0x701F #CJK UNIFIED IDEOGRAPH +0xE06F 0x7030 #CJK UNIFIED IDEOGRAPH +0xE070 0x703E #CJK UNIFIED IDEOGRAPH +0xE071 0x7032 #CJK UNIFIED IDEOGRAPH +0xE072 0x7051 #CJK UNIFIED IDEOGRAPH +0xE073 0x7063 #CJK UNIFIED IDEOGRAPH +0xE074 0x7099 #CJK UNIFIED IDEOGRAPH +0xE075 0x7092 #CJK UNIFIED IDEOGRAPH +0xE076 0x70AF #CJK UNIFIED IDEOGRAPH +0xE077 0x70F1 #CJK UNIFIED IDEOGRAPH +0xE078 0x70AC #CJK UNIFIED IDEOGRAPH +0xE079 0x70B8 #CJK UNIFIED IDEOGRAPH +0xE07A 0x70B3 #CJK UNIFIED IDEOGRAPH +0xE07B 0x70AE #CJK UNIFIED IDEOGRAPH +0xE07C 0x70DF #CJK UNIFIED IDEOGRAPH +0xE07D 0x70CB #CJK UNIFIED IDEOGRAPH +0xE07E 0x70DD #CJK UNIFIED IDEOGRAPH +0xE080 0x70D9 #CJK UNIFIED IDEOGRAPH +0xE081 0x7109 #CJK UNIFIED IDEOGRAPH +0xE082 0x70FD #CJK UNIFIED IDEOGRAPH +0xE083 0x711C #CJK UNIFIED IDEOGRAPH +0xE084 0x7119 #CJK UNIFIED IDEOGRAPH +0xE085 0x7165 #CJK UNIFIED IDEOGRAPH +0xE086 0x7155 #CJK UNIFIED IDEOGRAPH +0xE087 0x7188 #CJK UNIFIED IDEOGRAPH +0xE088 0x7166 #CJK UNIFIED IDEOGRAPH +0xE089 0x7162 #CJK UNIFIED IDEOGRAPH +0xE08A 0x714C #CJK UNIFIED IDEOGRAPH +0xE08B 0x7156 #CJK UNIFIED IDEOGRAPH +0xE08C 0x716C #CJK UNIFIED IDEOGRAPH +0xE08D 0x718F #CJK UNIFIED IDEOGRAPH +0xE08E 0x71FB #CJK UNIFIED IDEOGRAPH +0xE08F 0x7184 #CJK UNIFIED IDEOGRAPH +0xE090 0x7195 #CJK UNIFIED IDEOGRAPH +0xE091 0x71A8 #CJK UNIFIED IDEOGRAPH +0xE092 0x71AC #CJK UNIFIED IDEOGRAPH +0xE093 0x71D7 #CJK UNIFIED IDEOGRAPH +0xE094 0x71B9 #CJK UNIFIED IDEOGRAPH +0xE095 0x71BE #CJK UNIFIED IDEOGRAPH +0xE096 0x71D2 #CJK UNIFIED IDEOGRAPH +0xE097 0x71C9 #CJK UNIFIED IDEOGRAPH +0xE098 0x71D4 #CJK UNIFIED IDEOGRAPH +0xE099 0x71CE #CJK UNIFIED IDEOGRAPH +0xE09A 0x71E0 #CJK UNIFIED IDEOGRAPH +0xE09B 0x71EC #CJK UNIFIED IDEOGRAPH +0xE09C 0x71E7 #CJK UNIFIED IDEOGRAPH +0xE09D 0x71F5 #CJK UNIFIED IDEOGRAPH +0xE09E 0x71FC #CJK UNIFIED IDEOGRAPH +0xE09F 0x71F9 #CJK UNIFIED IDEOGRAPH +0xE0A0 0x71FF #CJK UNIFIED IDEOGRAPH +0xE0A1 0x720D #CJK UNIFIED IDEOGRAPH +0xE0A2 0x7210 #CJK UNIFIED IDEOGRAPH +0xE0A3 0x721B #CJK UNIFIED IDEOGRAPH +0xE0A4 0x7228 #CJK UNIFIED IDEOGRAPH +0xE0A5 0x722D #CJK UNIFIED IDEOGRAPH +0xE0A6 0x722C #CJK UNIFIED IDEOGRAPH +0xE0A7 0x7230 #CJK UNIFIED IDEOGRAPH +0xE0A8 0x7232 #CJK UNIFIED IDEOGRAPH +0xE0A9 0x723B #CJK UNIFIED IDEOGRAPH +0xE0AA 0x723C #CJK UNIFIED IDEOGRAPH +0xE0AB 0x723F #CJK UNIFIED IDEOGRAPH +0xE0AC 0x7240 #CJK UNIFIED IDEOGRAPH +0xE0AD 0x7246 #CJK UNIFIED IDEOGRAPH +0xE0AE 0x724B #CJK UNIFIED IDEOGRAPH +0xE0AF 0x7258 #CJK UNIFIED IDEOGRAPH +0xE0B0 0x7274 #CJK UNIFIED IDEOGRAPH +0xE0B1 0x727E #CJK UNIFIED IDEOGRAPH +0xE0B2 0x7282 #CJK UNIFIED IDEOGRAPH +0xE0B3 0x7281 #CJK UNIFIED IDEOGRAPH +0xE0B4 0x7287 #CJK UNIFIED IDEOGRAPH +0xE0B5 0x7292 #CJK UNIFIED IDEOGRAPH +0xE0B6 0x7296 #CJK UNIFIED IDEOGRAPH +0xE0B7 0x72A2 #CJK UNIFIED IDEOGRAPH +0xE0B8 0x72A7 #CJK UNIFIED IDEOGRAPH +0xE0B9 0x72B9 #CJK UNIFIED IDEOGRAPH +0xE0BA 0x72B2 #CJK UNIFIED IDEOGRAPH +0xE0BB 0x72C3 #CJK UNIFIED IDEOGRAPH +0xE0BC 0x72C6 #CJK UNIFIED IDEOGRAPH +0xE0BD 0x72C4 #CJK UNIFIED IDEOGRAPH +0xE0BE 0x72CE #CJK UNIFIED IDEOGRAPH +0xE0BF 0x72D2 #CJK UNIFIED IDEOGRAPH +0xE0C0 0x72E2 #CJK UNIFIED IDEOGRAPH +0xE0C1 0x72E0 #CJK UNIFIED IDEOGRAPH +0xE0C2 0x72E1 #CJK UNIFIED IDEOGRAPH +0xE0C3 0x72F9 #CJK UNIFIED IDEOGRAPH +0xE0C4 0x72F7 #CJK UNIFIED IDEOGRAPH +0xE0C5 0x500F #CJK UNIFIED IDEOGRAPH +0xE0C6 0x7317 #CJK UNIFIED IDEOGRAPH +0xE0C7 0x730A #CJK UNIFIED IDEOGRAPH +0xE0C8 0x731C #CJK UNIFIED IDEOGRAPH +0xE0C9 0x7316 #CJK UNIFIED IDEOGRAPH +0xE0CA 0x731D #CJK UNIFIED IDEOGRAPH +0xE0CB 0x7334 #CJK UNIFIED IDEOGRAPH +0xE0CC 0x732F #CJK UNIFIED IDEOGRAPH +0xE0CD 0x7329 #CJK UNIFIED IDEOGRAPH +0xE0CE 0x7325 #CJK UNIFIED IDEOGRAPH +0xE0CF 0x733E #CJK UNIFIED IDEOGRAPH +0xE0D0 0x734E #CJK UNIFIED IDEOGRAPH +0xE0D1 0x734F #CJK UNIFIED IDEOGRAPH +0xE0D2 0x9ED8 #CJK UNIFIED IDEOGRAPH +0xE0D3 0x7357 #CJK UNIFIED IDEOGRAPH +0xE0D4 0x736A #CJK UNIFIED IDEOGRAPH +0xE0D5 0x7368 #CJK UNIFIED IDEOGRAPH +0xE0D6 0x7370 #CJK UNIFIED IDEOGRAPH +0xE0D7 0x7378 #CJK UNIFIED IDEOGRAPH +0xE0D8 0x7375 #CJK UNIFIED IDEOGRAPH +0xE0D9 0x737B #CJK UNIFIED IDEOGRAPH +0xE0DA 0x737A #CJK UNIFIED IDEOGRAPH +0xE0DB 0x73C8 #CJK UNIFIED IDEOGRAPH +0xE0DC 0x73B3 #CJK UNIFIED IDEOGRAPH +0xE0DD 0x73CE #CJK UNIFIED IDEOGRAPH +0xE0DE 0x73BB #CJK UNIFIED IDEOGRAPH +0xE0DF 0x73C0 #CJK UNIFIED IDEOGRAPH +0xE0E0 0x73E5 #CJK UNIFIED IDEOGRAPH +0xE0E1 0x73EE #CJK UNIFIED IDEOGRAPH +0xE0E2 0x73DE #CJK UNIFIED IDEOGRAPH +0xE0E3 0x74A2 #CJK UNIFIED IDEOGRAPH +0xE0E4 0x7405 #CJK UNIFIED IDEOGRAPH +0xE0E5 0x746F #CJK UNIFIED IDEOGRAPH +0xE0E6 0x7425 #CJK UNIFIED IDEOGRAPH +0xE0E7 0x73F8 #CJK UNIFIED IDEOGRAPH +0xE0E8 0x7432 #CJK UNIFIED IDEOGRAPH +0xE0E9 0x743A #CJK UNIFIED IDEOGRAPH +0xE0EA 0x7455 #CJK UNIFIED IDEOGRAPH +0xE0EB 0x743F #CJK UNIFIED IDEOGRAPH +0xE0EC 0x745F #CJK UNIFIED IDEOGRAPH +0xE0ED 0x7459 #CJK UNIFIED IDEOGRAPH +0xE0EE 0x7441 #CJK UNIFIED IDEOGRAPH +0xE0EF 0x745C #CJK UNIFIED IDEOGRAPH +0xE0F0 0x7469 #CJK UNIFIED IDEOGRAPH +0xE0F1 0x7470 #CJK UNIFIED IDEOGRAPH +0xE0F2 0x7463 #CJK UNIFIED IDEOGRAPH +0xE0F3 0x746A #CJK UNIFIED IDEOGRAPH +0xE0F4 0x7476 #CJK UNIFIED IDEOGRAPH +0xE0F5 0x747E #CJK UNIFIED IDEOGRAPH +0xE0F6 0x748B #CJK UNIFIED IDEOGRAPH +0xE0F7 0x749E #CJK UNIFIED IDEOGRAPH +0xE0F8 0x74A7 #CJK UNIFIED IDEOGRAPH +0xE0F9 0x74CA #CJK UNIFIED IDEOGRAPH +0xE0FA 0x74CF #CJK UNIFIED IDEOGRAPH +0xE0FB 0x74D4 #CJK UNIFIED IDEOGRAPH +0xE0FC 0x73F1 #CJK UNIFIED IDEOGRAPH +0xE140 0x74E0 #CJK UNIFIED IDEOGRAPH +0xE141 0x74E3 #CJK UNIFIED IDEOGRAPH +0xE142 0x74E7 #CJK UNIFIED IDEOGRAPH +0xE143 0x74E9 #CJK UNIFIED IDEOGRAPH +0xE144 0x74EE #CJK UNIFIED IDEOGRAPH +0xE145 0x74F2 #CJK UNIFIED IDEOGRAPH +0xE146 0x74F0 #CJK UNIFIED IDEOGRAPH +0xE147 0x74F1 #CJK UNIFIED IDEOGRAPH +0xE148 0x74F8 #CJK UNIFIED IDEOGRAPH +0xE149 0x74F7 #CJK UNIFIED IDEOGRAPH +0xE14A 0x7504 #CJK UNIFIED IDEOGRAPH +0xE14B 0x7503 #CJK UNIFIED IDEOGRAPH +0xE14C 0x7505 #CJK UNIFIED IDEOGRAPH +0xE14D 0x750C #CJK UNIFIED IDEOGRAPH +0xE14E 0x750E #CJK UNIFIED IDEOGRAPH +0xE14F 0x750D #CJK UNIFIED IDEOGRAPH +0xE150 0x7515 #CJK UNIFIED IDEOGRAPH +0xE151 0x7513 #CJK UNIFIED IDEOGRAPH +0xE152 0x751E #CJK UNIFIED IDEOGRAPH +0xE153 0x7526 #CJK UNIFIED IDEOGRAPH +0xE154 0x752C #CJK UNIFIED IDEOGRAPH +0xE155 0x753C #CJK UNIFIED IDEOGRAPH +0xE156 0x7544 #CJK UNIFIED IDEOGRAPH +0xE157 0x754D #CJK UNIFIED IDEOGRAPH +0xE158 0x754A #CJK UNIFIED IDEOGRAPH +0xE159 0x7549 #CJK UNIFIED IDEOGRAPH +0xE15A 0x755B #CJK UNIFIED IDEOGRAPH +0xE15B 0x7546 #CJK UNIFIED IDEOGRAPH +0xE15C 0x755A #CJK UNIFIED IDEOGRAPH +0xE15D 0x7569 #CJK UNIFIED IDEOGRAPH +0xE15E 0x7564 #CJK UNIFIED IDEOGRAPH +0xE15F 0x7567 #CJK UNIFIED IDEOGRAPH +0xE160 0x756B #CJK UNIFIED IDEOGRAPH +0xE161 0x756D #CJK UNIFIED IDEOGRAPH +0xE162 0x7578 #CJK UNIFIED IDEOGRAPH +0xE163 0x7576 #CJK UNIFIED IDEOGRAPH +0xE164 0x7586 #CJK UNIFIED IDEOGRAPH +0xE165 0x7587 #CJK UNIFIED IDEOGRAPH +0xE166 0x7574 #CJK UNIFIED IDEOGRAPH +0xE167 0x758A #CJK UNIFIED IDEOGRAPH +0xE168 0x7589 #CJK UNIFIED IDEOGRAPH +0xE169 0x7582 #CJK UNIFIED IDEOGRAPH +0xE16A 0x7594 #CJK UNIFIED IDEOGRAPH +0xE16B 0x759A #CJK UNIFIED IDEOGRAPH +0xE16C 0x759D #CJK UNIFIED IDEOGRAPH +0xE16D 0x75A5 #CJK UNIFIED IDEOGRAPH +0xE16E 0x75A3 #CJK UNIFIED IDEOGRAPH +0xE16F 0x75C2 #CJK UNIFIED IDEOGRAPH +0xE170 0x75B3 #CJK UNIFIED IDEOGRAPH +0xE171 0x75C3 #CJK UNIFIED IDEOGRAPH +0xE172 0x75B5 #CJK UNIFIED IDEOGRAPH +0xE173 0x75BD #CJK UNIFIED IDEOGRAPH +0xE174 0x75B8 #CJK UNIFIED IDEOGRAPH +0xE175 0x75BC #CJK UNIFIED IDEOGRAPH +0xE176 0x75B1 #CJK UNIFIED IDEOGRAPH +0xE177 0x75CD #CJK UNIFIED IDEOGRAPH +0xE178 0x75CA #CJK UNIFIED IDEOGRAPH +0xE179 0x75D2 #CJK UNIFIED IDEOGRAPH +0xE17A 0x75D9 #CJK UNIFIED IDEOGRAPH +0xE17B 0x75E3 #CJK UNIFIED IDEOGRAPH +0xE17C 0x75DE #CJK UNIFIED IDEOGRAPH +0xE17D 0x75FE #CJK UNIFIED IDEOGRAPH +0xE17E 0x75FF #CJK UNIFIED IDEOGRAPH +0xE180 0x75FC #CJK UNIFIED IDEOGRAPH +0xE181 0x7601 #CJK UNIFIED IDEOGRAPH +0xE182 0x75F0 #CJK UNIFIED IDEOGRAPH +0xE183 0x75FA #CJK UNIFIED IDEOGRAPH +0xE184 0x75F2 #CJK UNIFIED IDEOGRAPH +0xE185 0x75F3 #CJK UNIFIED IDEOGRAPH +0xE186 0x760B #CJK UNIFIED IDEOGRAPH +0xE187 0x760D #CJK UNIFIED IDEOGRAPH +0xE188 0x7609 #CJK UNIFIED IDEOGRAPH +0xE189 0x761F #CJK UNIFIED IDEOGRAPH +0xE18A 0x7627 #CJK UNIFIED IDEOGRAPH +0xE18B 0x7620 #CJK UNIFIED IDEOGRAPH +0xE18C 0x7621 #CJK UNIFIED IDEOGRAPH +0xE18D 0x7622 #CJK UNIFIED IDEOGRAPH +0xE18E 0x7624 #CJK UNIFIED IDEOGRAPH +0xE18F 0x7634 #CJK UNIFIED IDEOGRAPH +0xE190 0x7630 #CJK UNIFIED IDEOGRAPH +0xE191 0x763B #CJK UNIFIED IDEOGRAPH +0xE192 0x7647 #CJK UNIFIED IDEOGRAPH +0xE193 0x7648 #CJK UNIFIED IDEOGRAPH +0xE194 0x7646 #CJK UNIFIED IDEOGRAPH +0xE195 0x765C #CJK UNIFIED IDEOGRAPH +0xE196 0x7658 #CJK UNIFIED IDEOGRAPH +0xE197 0x7661 #CJK UNIFIED IDEOGRAPH +0xE198 0x7662 #CJK UNIFIED IDEOGRAPH +0xE199 0x7668 #CJK UNIFIED IDEOGRAPH +0xE19A 0x7669 #CJK UNIFIED IDEOGRAPH +0xE19B 0x766A #CJK UNIFIED IDEOGRAPH +0xE19C 0x7667 #CJK UNIFIED IDEOGRAPH +0xE19D 0x766C #CJK UNIFIED IDEOGRAPH +0xE19E 0x7670 #CJK UNIFIED IDEOGRAPH +0xE19F 0x7672 #CJK UNIFIED IDEOGRAPH +0xE1A0 0x7676 #CJK UNIFIED IDEOGRAPH +0xE1A1 0x7678 #CJK UNIFIED IDEOGRAPH +0xE1A2 0x767C #CJK UNIFIED IDEOGRAPH +0xE1A3 0x7680 #CJK UNIFIED IDEOGRAPH +0xE1A4 0x7683 #CJK UNIFIED IDEOGRAPH +0xE1A5 0x7688 #CJK UNIFIED IDEOGRAPH +0xE1A6 0x768B #CJK UNIFIED IDEOGRAPH +0xE1A7 0x768E #CJK UNIFIED IDEOGRAPH +0xE1A8 0x7696 #CJK UNIFIED IDEOGRAPH +0xE1A9 0x7693 #CJK UNIFIED IDEOGRAPH +0xE1AA 0x7699 #CJK UNIFIED IDEOGRAPH +0xE1AB 0x769A #CJK UNIFIED IDEOGRAPH +0xE1AC 0x76B0 #CJK UNIFIED IDEOGRAPH +0xE1AD 0x76B4 #CJK UNIFIED IDEOGRAPH +0xE1AE 0x76B8 #CJK UNIFIED IDEOGRAPH +0xE1AF 0x76B9 #CJK UNIFIED IDEOGRAPH +0xE1B0 0x76BA #CJK UNIFIED IDEOGRAPH +0xE1B1 0x76C2 #CJK UNIFIED IDEOGRAPH +0xE1B2 0x76CD #CJK UNIFIED IDEOGRAPH +0xE1B3 0x76D6 #CJK UNIFIED IDEOGRAPH +0xE1B4 0x76D2 #CJK UNIFIED IDEOGRAPH +0xE1B5 0x76DE #CJK UNIFIED IDEOGRAPH +0xE1B6 0x76E1 #CJK UNIFIED IDEOGRAPH +0xE1B7 0x76E5 #CJK UNIFIED IDEOGRAPH +0xE1B8 0x76E7 #CJK UNIFIED IDEOGRAPH +0xE1B9 0x76EA #CJK UNIFIED IDEOGRAPH +0xE1BA 0x862F #CJK UNIFIED IDEOGRAPH +0xE1BB 0x76FB #CJK UNIFIED IDEOGRAPH +0xE1BC 0x7708 #CJK UNIFIED IDEOGRAPH +0xE1BD 0x7707 #CJK UNIFIED IDEOGRAPH +0xE1BE 0x7704 #CJK UNIFIED IDEOGRAPH +0xE1BF 0x7729 #CJK UNIFIED IDEOGRAPH +0xE1C0 0x7724 #CJK UNIFIED IDEOGRAPH +0xE1C1 0x771E #CJK UNIFIED IDEOGRAPH +0xE1C2 0x7725 #CJK UNIFIED IDEOGRAPH +0xE1C3 0x7726 #CJK UNIFIED IDEOGRAPH +0xE1C4 0x771B #CJK UNIFIED IDEOGRAPH +0xE1C5 0x7737 #CJK UNIFIED IDEOGRAPH +0xE1C6 0x7738 #CJK UNIFIED IDEOGRAPH +0xE1C7 0x7747 #CJK UNIFIED IDEOGRAPH +0xE1C8 0x775A #CJK UNIFIED IDEOGRAPH +0xE1C9 0x7768 #CJK UNIFIED IDEOGRAPH +0xE1CA 0x776B #CJK UNIFIED IDEOGRAPH +0xE1CB 0x775B #CJK UNIFIED IDEOGRAPH +0xE1CC 0x7765 #CJK UNIFIED IDEOGRAPH +0xE1CD 0x777F #CJK UNIFIED IDEOGRAPH +0xE1CE 0x777E #CJK UNIFIED IDEOGRAPH +0xE1CF 0x7779 #CJK UNIFIED IDEOGRAPH +0xE1D0 0x778E #CJK UNIFIED IDEOGRAPH +0xE1D1 0x778B #CJK UNIFIED IDEOGRAPH +0xE1D2 0x7791 #CJK UNIFIED IDEOGRAPH +0xE1D3 0x77A0 #CJK UNIFIED IDEOGRAPH +0xE1D4 0x779E #CJK UNIFIED IDEOGRAPH +0xE1D5 0x77B0 #CJK UNIFIED IDEOGRAPH +0xE1D6 0x77B6 #CJK UNIFIED IDEOGRAPH +0xE1D7 0x77B9 #CJK UNIFIED IDEOGRAPH +0xE1D8 0x77BF #CJK UNIFIED IDEOGRAPH +0xE1D9 0x77BC #CJK UNIFIED IDEOGRAPH +0xE1DA 0x77BD #CJK UNIFIED IDEOGRAPH +0xE1DB 0x77BB #CJK UNIFIED IDEOGRAPH +0xE1DC 0x77C7 #CJK UNIFIED IDEOGRAPH +0xE1DD 0x77CD #CJK UNIFIED IDEOGRAPH +0xE1DE 0x77D7 #CJK UNIFIED IDEOGRAPH +0xE1DF 0x77DA #CJK UNIFIED IDEOGRAPH +0xE1E0 0x77DC #CJK UNIFIED IDEOGRAPH +0xE1E1 0x77E3 #CJK UNIFIED IDEOGRAPH +0xE1E2 0x77EE #CJK UNIFIED IDEOGRAPH +0xE1E3 0x77FC #CJK UNIFIED IDEOGRAPH +0xE1E4 0x780C #CJK UNIFIED IDEOGRAPH +0xE1E5 0x7812 #CJK UNIFIED IDEOGRAPH +0xE1E6 0x7926 #CJK UNIFIED IDEOGRAPH +0xE1E7 0x7820 #CJK UNIFIED IDEOGRAPH +0xE1E8 0x792A #CJK UNIFIED IDEOGRAPH +0xE1E9 0x7845 #CJK UNIFIED IDEOGRAPH +0xE1EA 0x788E #CJK UNIFIED IDEOGRAPH +0xE1EB 0x7874 #CJK UNIFIED IDEOGRAPH +0xE1EC 0x7886 #CJK UNIFIED IDEOGRAPH +0xE1ED 0x787C #CJK UNIFIED IDEOGRAPH +0xE1EE 0x789A #CJK UNIFIED IDEOGRAPH +0xE1EF 0x788C #CJK UNIFIED IDEOGRAPH +0xE1F0 0x78A3 #CJK UNIFIED IDEOGRAPH +0xE1F1 0x78B5 #CJK UNIFIED IDEOGRAPH +0xE1F2 0x78AA #CJK UNIFIED IDEOGRAPH +0xE1F3 0x78AF #CJK UNIFIED IDEOGRAPH +0xE1F4 0x78D1 #CJK UNIFIED IDEOGRAPH +0xE1F5 0x78C6 #CJK UNIFIED IDEOGRAPH +0xE1F6 0x78CB #CJK UNIFIED IDEOGRAPH +0xE1F7 0x78D4 #CJK UNIFIED IDEOGRAPH +0xE1F8 0x78BE #CJK UNIFIED IDEOGRAPH +0xE1F9 0x78BC #CJK UNIFIED IDEOGRAPH +0xE1FA 0x78C5 #CJK UNIFIED IDEOGRAPH +0xE1FB 0x78CA #CJK UNIFIED IDEOGRAPH +0xE1FC 0x78EC #CJK UNIFIED IDEOGRAPH +0xE240 0x78E7 #CJK UNIFIED IDEOGRAPH +0xE241 0x78DA #CJK UNIFIED IDEOGRAPH +0xE242 0x78FD #CJK UNIFIED IDEOGRAPH +0xE243 0x78F4 #CJK UNIFIED IDEOGRAPH +0xE244 0x7907 #CJK UNIFIED IDEOGRAPH +0xE245 0x7912 #CJK UNIFIED IDEOGRAPH +0xE246 0x7911 #CJK UNIFIED IDEOGRAPH +0xE247 0x7919 #CJK UNIFIED IDEOGRAPH +0xE248 0x792C #CJK UNIFIED IDEOGRAPH +0xE249 0x792B #CJK UNIFIED IDEOGRAPH +0xE24A 0x7940 #CJK UNIFIED IDEOGRAPH +0xE24B 0x7960 #CJK UNIFIED IDEOGRAPH +0xE24C 0x7957 #CJK UNIFIED IDEOGRAPH +0xE24D 0x795F #CJK UNIFIED IDEOGRAPH +0xE24E 0x795A #CJK UNIFIED IDEOGRAPH +0xE24F 0x7955 #CJK UNIFIED IDEOGRAPH +0xE250 0x7953 #CJK UNIFIED IDEOGRAPH +0xE251 0x797A #CJK UNIFIED IDEOGRAPH +0xE252 0x797F #CJK UNIFIED IDEOGRAPH +0xE253 0x798A #CJK UNIFIED IDEOGRAPH +0xE254 0x799D #CJK UNIFIED IDEOGRAPH +0xE255 0x79A7 #CJK UNIFIED IDEOGRAPH +0xE256 0x9F4B #CJK UNIFIED IDEOGRAPH +0xE257 0x79AA #CJK UNIFIED IDEOGRAPH +0xE258 0x79AE #CJK UNIFIED IDEOGRAPH +0xE259 0x79B3 #CJK UNIFIED IDEOGRAPH +0xE25A 0x79B9 #CJK UNIFIED IDEOGRAPH +0xE25B 0x79BA #CJK UNIFIED IDEOGRAPH +0xE25C 0x79C9 #CJK UNIFIED IDEOGRAPH +0xE25D 0x79D5 #CJK UNIFIED IDEOGRAPH +0xE25E 0x79E7 #CJK UNIFIED IDEOGRAPH +0xE25F 0x79EC #CJK UNIFIED IDEOGRAPH +0xE260 0x79E1 #CJK UNIFIED IDEOGRAPH +0xE261 0x79E3 #CJK UNIFIED IDEOGRAPH +0xE262 0x7A08 #CJK UNIFIED IDEOGRAPH +0xE263 0x7A0D #CJK UNIFIED IDEOGRAPH +0xE264 0x7A18 #CJK UNIFIED IDEOGRAPH +0xE265 0x7A19 #CJK UNIFIED IDEOGRAPH +0xE266 0x7A20 #CJK UNIFIED IDEOGRAPH +0xE267 0x7A1F #CJK UNIFIED IDEOGRAPH +0xE268 0x7980 #CJK UNIFIED IDEOGRAPH +0xE269 0x7A31 #CJK UNIFIED IDEOGRAPH +0xE26A 0x7A3B #CJK UNIFIED IDEOGRAPH +0xE26B 0x7A3E #CJK UNIFIED IDEOGRAPH +0xE26C 0x7A37 #CJK UNIFIED IDEOGRAPH +0xE26D 0x7A43 #CJK UNIFIED IDEOGRAPH +0xE26E 0x7A57 #CJK UNIFIED IDEOGRAPH +0xE26F 0x7A49 #CJK UNIFIED IDEOGRAPH +0xE270 0x7A61 #CJK UNIFIED IDEOGRAPH +0xE271 0x7A62 #CJK UNIFIED IDEOGRAPH +0xE272 0x7A69 #CJK UNIFIED IDEOGRAPH +0xE273 0x9F9D #CJK UNIFIED IDEOGRAPH +0xE274 0x7A70 #CJK UNIFIED IDEOGRAPH +0xE275 0x7A79 #CJK UNIFIED IDEOGRAPH +0xE276 0x7A7D #CJK UNIFIED IDEOGRAPH +0xE277 0x7A88 #CJK UNIFIED IDEOGRAPH +0xE278 0x7A97 #CJK UNIFIED IDEOGRAPH +0xE279 0x7A95 #CJK UNIFIED IDEOGRAPH +0xE27A 0x7A98 #CJK UNIFIED IDEOGRAPH +0xE27B 0x7A96 #CJK UNIFIED IDEOGRAPH +0xE27C 0x7AA9 #CJK UNIFIED IDEOGRAPH +0xE27D 0x7AC8 #CJK UNIFIED IDEOGRAPH +0xE27E 0x7AB0 #CJK UNIFIED IDEOGRAPH +0xE280 0x7AB6 #CJK UNIFIED IDEOGRAPH +0xE281 0x7AC5 #CJK UNIFIED IDEOGRAPH +0xE282 0x7AC4 #CJK UNIFIED IDEOGRAPH +0xE283 0x7ABF #CJK UNIFIED IDEOGRAPH +0xE284 0x9083 #CJK UNIFIED IDEOGRAPH +0xE285 0x7AC7 #CJK UNIFIED IDEOGRAPH +0xE286 0x7ACA #CJK UNIFIED IDEOGRAPH +0xE287 0x7ACD #CJK UNIFIED IDEOGRAPH +0xE288 0x7ACF #CJK UNIFIED IDEOGRAPH +0xE289 0x7AD5 #CJK UNIFIED IDEOGRAPH +0xE28A 0x7AD3 #CJK UNIFIED IDEOGRAPH +0xE28B 0x7AD9 #CJK UNIFIED IDEOGRAPH +0xE28C 0x7ADA #CJK UNIFIED IDEOGRAPH +0xE28D 0x7ADD #CJK UNIFIED IDEOGRAPH +0xE28E 0x7AE1 #CJK UNIFIED IDEOGRAPH +0xE28F 0x7AE2 #CJK UNIFIED IDEOGRAPH +0xE290 0x7AE6 #CJK UNIFIED IDEOGRAPH +0xE291 0x7AED #CJK UNIFIED IDEOGRAPH +0xE292 0x7AF0 #CJK UNIFIED IDEOGRAPH +0xE293 0x7B02 #CJK UNIFIED IDEOGRAPH +0xE294 0x7B0F #CJK UNIFIED IDEOGRAPH +0xE295 0x7B0A #CJK UNIFIED IDEOGRAPH +0xE296 0x7B06 #CJK UNIFIED IDEOGRAPH +0xE297 0x7B33 #CJK UNIFIED IDEOGRAPH +0xE298 0x7B18 #CJK UNIFIED IDEOGRAPH +0xE299 0x7B19 #CJK UNIFIED IDEOGRAPH +0xE29A 0x7B1E #CJK UNIFIED IDEOGRAPH +0xE29B 0x7B35 #CJK UNIFIED IDEOGRAPH +0xE29C 0x7B28 #CJK UNIFIED IDEOGRAPH +0xE29D 0x7B36 #CJK UNIFIED IDEOGRAPH +0xE29E 0x7B50 #CJK UNIFIED IDEOGRAPH +0xE29F 0x7B7A #CJK UNIFIED IDEOGRAPH +0xE2A0 0x7B04 #CJK UNIFIED IDEOGRAPH +0xE2A1 0x7B4D #CJK UNIFIED IDEOGRAPH +0xE2A2 0x7B0B #CJK UNIFIED IDEOGRAPH +0xE2A3 0x7B4C #CJK UNIFIED IDEOGRAPH +0xE2A4 0x7B45 #CJK UNIFIED IDEOGRAPH +0xE2A5 0x7B75 #CJK UNIFIED IDEOGRAPH +0xE2A6 0x7B65 #CJK UNIFIED IDEOGRAPH +0xE2A7 0x7B74 #CJK UNIFIED IDEOGRAPH +0xE2A8 0x7B67 #CJK UNIFIED IDEOGRAPH +0xE2A9 0x7B70 #CJK UNIFIED IDEOGRAPH +0xE2AA 0x7B71 #CJK UNIFIED IDEOGRAPH +0xE2AB 0x7B6C #CJK UNIFIED IDEOGRAPH +0xE2AC 0x7B6E #CJK UNIFIED IDEOGRAPH +0xE2AD 0x7B9D #CJK UNIFIED IDEOGRAPH +0xE2AE 0x7B98 #CJK UNIFIED IDEOGRAPH +0xE2AF 0x7B9F #CJK UNIFIED IDEOGRAPH +0xE2B0 0x7B8D #CJK UNIFIED IDEOGRAPH +0xE2B1 0x7B9C #CJK UNIFIED IDEOGRAPH +0xE2B2 0x7B9A #CJK UNIFIED IDEOGRAPH +0xE2B3 0x7B8B #CJK UNIFIED IDEOGRAPH +0xE2B4 0x7B92 #CJK UNIFIED IDEOGRAPH +0xE2B5 0x7B8F #CJK UNIFIED IDEOGRAPH +0xE2B6 0x7B5D #CJK UNIFIED IDEOGRAPH +0xE2B7 0x7B99 #CJK UNIFIED IDEOGRAPH +0xE2B8 0x7BCB #CJK UNIFIED IDEOGRAPH +0xE2B9 0x7BC1 #CJK UNIFIED IDEOGRAPH +0xE2BA 0x7BCC #CJK UNIFIED IDEOGRAPH +0xE2BB 0x7BCF #CJK UNIFIED IDEOGRAPH +0xE2BC 0x7BB4 #CJK UNIFIED IDEOGRAPH +0xE2BD 0x7BC6 #CJK UNIFIED IDEOGRAPH +0xE2BE 0x7BDD #CJK UNIFIED IDEOGRAPH +0xE2BF 0x7BE9 #CJK UNIFIED IDEOGRAPH +0xE2C0 0x7C11 #CJK UNIFIED IDEOGRAPH +0xE2C1 0x7C14 #CJK UNIFIED IDEOGRAPH +0xE2C2 0x7BE6 #CJK UNIFIED IDEOGRAPH +0xE2C3 0x7BE5 #CJK UNIFIED IDEOGRAPH +0xE2C4 0x7C60 #CJK UNIFIED IDEOGRAPH +0xE2C5 0x7C00 #CJK UNIFIED IDEOGRAPH +0xE2C6 0x7C07 #CJK UNIFIED IDEOGRAPH +0xE2C7 0x7C13 #CJK UNIFIED IDEOGRAPH +0xE2C8 0x7BF3 #CJK UNIFIED IDEOGRAPH +0xE2C9 0x7BF7 #CJK UNIFIED IDEOGRAPH +0xE2CA 0x7C17 #CJK UNIFIED IDEOGRAPH +0xE2CB 0x7C0D #CJK UNIFIED IDEOGRAPH +0xE2CC 0x7BF6 #CJK UNIFIED IDEOGRAPH +0xE2CD 0x7C23 #CJK UNIFIED IDEOGRAPH +0xE2CE 0x7C27 #CJK UNIFIED IDEOGRAPH +0xE2CF 0x7C2A #CJK UNIFIED IDEOGRAPH +0xE2D0 0x7C1F #CJK UNIFIED IDEOGRAPH +0xE2D1 0x7C37 #CJK UNIFIED IDEOGRAPH +0xE2D2 0x7C2B #CJK UNIFIED IDEOGRAPH +0xE2D3 0x7C3D #CJK UNIFIED IDEOGRAPH +0xE2D4 0x7C4C #CJK UNIFIED IDEOGRAPH +0xE2D5 0x7C43 #CJK UNIFIED IDEOGRAPH +0xE2D6 0x7C54 #CJK UNIFIED IDEOGRAPH +0xE2D7 0x7C4F #CJK UNIFIED IDEOGRAPH +0xE2D8 0x7C40 #CJK UNIFIED IDEOGRAPH +0xE2D9 0x7C50 #CJK UNIFIED IDEOGRAPH +0xE2DA 0x7C58 #CJK UNIFIED IDEOGRAPH +0xE2DB 0x7C5F #CJK UNIFIED IDEOGRAPH +0xE2DC 0x7C64 #CJK UNIFIED IDEOGRAPH +0xE2DD 0x7C56 #CJK UNIFIED IDEOGRAPH +0xE2DE 0x7C65 #CJK UNIFIED IDEOGRAPH +0xE2DF 0x7C6C #CJK UNIFIED IDEOGRAPH +0xE2E0 0x7C75 #CJK UNIFIED IDEOGRAPH +0xE2E1 0x7C83 #CJK UNIFIED IDEOGRAPH +0xE2E2 0x7C90 #CJK UNIFIED IDEOGRAPH +0xE2E3 0x7CA4 #CJK UNIFIED IDEOGRAPH +0xE2E4 0x7CAD #CJK UNIFIED IDEOGRAPH +0xE2E5 0x7CA2 #CJK UNIFIED IDEOGRAPH +0xE2E6 0x7CAB #CJK UNIFIED IDEOGRAPH +0xE2E7 0x7CA1 #CJK UNIFIED IDEOGRAPH +0xE2E8 0x7CA8 #CJK UNIFIED IDEOGRAPH +0xE2E9 0x7CB3 #CJK UNIFIED IDEOGRAPH +0xE2EA 0x7CB2 #CJK UNIFIED IDEOGRAPH +0xE2EB 0x7CB1 #CJK UNIFIED IDEOGRAPH +0xE2EC 0x7CAE #CJK UNIFIED IDEOGRAPH +0xE2ED 0x7CB9 #CJK UNIFIED IDEOGRAPH +0xE2EE 0x7CBD #CJK UNIFIED IDEOGRAPH +0xE2EF 0x7CC0 #CJK UNIFIED IDEOGRAPH +0xE2F0 0x7CC5 #CJK UNIFIED IDEOGRAPH +0xE2F1 0x7CC2 #CJK UNIFIED IDEOGRAPH +0xE2F2 0x7CD8 #CJK UNIFIED IDEOGRAPH +0xE2F3 0x7CD2 #CJK UNIFIED IDEOGRAPH +0xE2F4 0x7CDC #CJK UNIFIED IDEOGRAPH +0xE2F5 0x7CE2 #CJK UNIFIED IDEOGRAPH +0xE2F6 0x9B3B #CJK UNIFIED IDEOGRAPH +0xE2F7 0x7CEF #CJK UNIFIED IDEOGRAPH +0xE2F8 0x7CF2 #CJK UNIFIED IDEOGRAPH +0xE2F9 0x7CF4 #CJK UNIFIED IDEOGRAPH +0xE2FA 0x7CF6 #CJK UNIFIED IDEOGRAPH +0xE2FB 0x7CFA #CJK UNIFIED IDEOGRAPH +0xE2FC 0x7D06 #CJK UNIFIED IDEOGRAPH +0xE340 0x7D02 #CJK UNIFIED IDEOGRAPH +0xE341 0x7D1C #CJK UNIFIED IDEOGRAPH +0xE342 0x7D15 #CJK UNIFIED IDEOGRAPH +0xE343 0x7D0A #CJK UNIFIED IDEOGRAPH +0xE344 0x7D45 #CJK UNIFIED IDEOGRAPH +0xE345 0x7D4B #CJK UNIFIED IDEOGRAPH +0xE346 0x7D2E #CJK UNIFIED IDEOGRAPH +0xE347 0x7D32 #CJK UNIFIED IDEOGRAPH +0xE348 0x7D3F #CJK UNIFIED IDEOGRAPH +0xE349 0x7D35 #CJK UNIFIED IDEOGRAPH +0xE34A 0x7D46 #CJK UNIFIED IDEOGRAPH +0xE34B 0x7D73 #CJK UNIFIED IDEOGRAPH +0xE34C 0x7D56 #CJK UNIFIED IDEOGRAPH +0xE34D 0x7D4E #CJK UNIFIED IDEOGRAPH +0xE34E 0x7D72 #CJK UNIFIED IDEOGRAPH +0xE34F 0x7D68 #CJK UNIFIED IDEOGRAPH +0xE350 0x7D6E #CJK UNIFIED IDEOGRAPH +0xE351 0x7D4F #CJK UNIFIED IDEOGRAPH +0xE352 0x7D63 #CJK UNIFIED IDEOGRAPH +0xE353 0x7D93 #CJK UNIFIED IDEOGRAPH +0xE354 0x7D89 #CJK UNIFIED IDEOGRAPH +0xE355 0x7D5B #CJK UNIFIED IDEOGRAPH +0xE356 0x7D8F #CJK UNIFIED IDEOGRAPH +0xE357 0x7D7D #CJK UNIFIED IDEOGRAPH +0xE358 0x7D9B #CJK UNIFIED IDEOGRAPH +0xE359 0x7DBA #CJK UNIFIED IDEOGRAPH +0xE35A 0x7DAE #CJK UNIFIED IDEOGRAPH +0xE35B 0x7DA3 #CJK UNIFIED IDEOGRAPH +0xE35C 0x7DB5 #CJK UNIFIED IDEOGRAPH +0xE35D 0x7DC7 #CJK UNIFIED IDEOGRAPH +0xE35E 0x7DBD #CJK UNIFIED IDEOGRAPH +0xE35F 0x7DAB #CJK UNIFIED IDEOGRAPH +0xE360 0x7E3D #CJK UNIFIED IDEOGRAPH +0xE361 0x7DA2 #CJK UNIFIED IDEOGRAPH +0xE362 0x7DAF #CJK UNIFIED IDEOGRAPH +0xE363 0x7DDC #CJK UNIFIED IDEOGRAPH +0xE364 0x7DB8 #CJK UNIFIED IDEOGRAPH +0xE365 0x7D9F #CJK UNIFIED IDEOGRAPH +0xE366 0x7DB0 #CJK UNIFIED IDEOGRAPH +0xE367 0x7DD8 #CJK UNIFIED IDEOGRAPH +0xE368 0x7DDD #CJK UNIFIED IDEOGRAPH +0xE369 0x7DE4 #CJK UNIFIED IDEOGRAPH +0xE36A 0x7DDE #CJK UNIFIED IDEOGRAPH +0xE36B 0x7DFB #CJK UNIFIED IDEOGRAPH +0xE36C 0x7DF2 #CJK UNIFIED IDEOGRAPH +0xE36D 0x7DE1 #CJK UNIFIED IDEOGRAPH +0xE36E 0x7E05 #CJK UNIFIED IDEOGRAPH +0xE36F 0x7E0A #CJK UNIFIED IDEOGRAPH +0xE370 0x7E23 #CJK UNIFIED IDEOGRAPH +0xE371 0x7E21 #CJK UNIFIED IDEOGRAPH +0xE372 0x7E12 #CJK UNIFIED IDEOGRAPH +0xE373 0x7E31 #CJK UNIFIED IDEOGRAPH +0xE374 0x7E1F #CJK UNIFIED IDEOGRAPH +0xE375 0x7E09 #CJK UNIFIED IDEOGRAPH +0xE376 0x7E0B #CJK UNIFIED IDEOGRAPH +0xE377 0x7E22 #CJK UNIFIED IDEOGRAPH +0xE378 0x7E46 #CJK UNIFIED IDEOGRAPH +0xE379 0x7E66 #CJK UNIFIED IDEOGRAPH +0xE37A 0x7E3B #CJK UNIFIED IDEOGRAPH +0xE37B 0x7E35 #CJK UNIFIED IDEOGRAPH +0xE37C 0x7E39 #CJK UNIFIED IDEOGRAPH +0xE37D 0x7E43 #CJK UNIFIED IDEOGRAPH +0xE37E 0x7E37 #CJK UNIFIED IDEOGRAPH +0xE380 0x7E32 #CJK UNIFIED IDEOGRAPH +0xE381 0x7E3A #CJK UNIFIED IDEOGRAPH +0xE382 0x7E67 #CJK UNIFIED IDEOGRAPH +0xE383 0x7E5D #CJK UNIFIED IDEOGRAPH +0xE384 0x7E56 #CJK UNIFIED IDEOGRAPH +0xE385 0x7E5E #CJK UNIFIED IDEOGRAPH +0xE386 0x7E59 #CJK UNIFIED IDEOGRAPH +0xE387 0x7E5A #CJK UNIFIED IDEOGRAPH +0xE388 0x7E79 #CJK UNIFIED IDEOGRAPH +0xE389 0x7E6A #CJK UNIFIED IDEOGRAPH +0xE38A 0x7E69 #CJK UNIFIED IDEOGRAPH +0xE38B 0x7E7C #CJK UNIFIED IDEOGRAPH +0xE38C 0x7E7B #CJK UNIFIED IDEOGRAPH +0xE38D 0x7E83 #CJK UNIFIED IDEOGRAPH +0xE38E 0x7DD5 #CJK UNIFIED IDEOGRAPH +0xE38F 0x7E7D #CJK UNIFIED IDEOGRAPH +0xE390 0x8FAE #CJK UNIFIED IDEOGRAPH +0xE391 0x7E7F #CJK UNIFIED IDEOGRAPH +0xE392 0x7E88 #CJK UNIFIED IDEOGRAPH +0xE393 0x7E89 #CJK UNIFIED IDEOGRAPH +0xE394 0x7E8C #CJK UNIFIED IDEOGRAPH +0xE395 0x7E92 #CJK UNIFIED IDEOGRAPH +0xE396 0x7E90 #CJK UNIFIED IDEOGRAPH +0xE397 0x7E93 #CJK UNIFIED IDEOGRAPH +0xE398 0x7E94 #CJK UNIFIED IDEOGRAPH +0xE399 0x7E96 #CJK UNIFIED IDEOGRAPH +0xE39A 0x7E8E #CJK UNIFIED IDEOGRAPH +0xE39B 0x7E9B #CJK UNIFIED IDEOGRAPH +0xE39C 0x7E9C #CJK UNIFIED IDEOGRAPH +0xE39D 0x7F38 #CJK UNIFIED IDEOGRAPH +0xE39E 0x7F3A #CJK UNIFIED IDEOGRAPH +0xE39F 0x7F45 #CJK UNIFIED IDEOGRAPH +0xE3A0 0x7F4C #CJK UNIFIED IDEOGRAPH +0xE3A1 0x7F4D #CJK UNIFIED IDEOGRAPH +0xE3A2 0x7F4E #CJK UNIFIED IDEOGRAPH +0xE3A3 0x7F50 #CJK UNIFIED IDEOGRAPH +0xE3A4 0x7F51 #CJK UNIFIED IDEOGRAPH +0xE3A5 0x7F55 #CJK UNIFIED IDEOGRAPH +0xE3A6 0x7F54 #CJK UNIFIED IDEOGRAPH +0xE3A7 0x7F58 #CJK UNIFIED IDEOGRAPH +0xE3A8 0x7F5F #CJK UNIFIED IDEOGRAPH +0xE3A9 0x7F60 #CJK UNIFIED IDEOGRAPH +0xE3AA 0x7F68 #CJK UNIFIED IDEOGRAPH +0xE3AB 0x7F69 #CJK UNIFIED IDEOGRAPH +0xE3AC 0x7F67 #CJK UNIFIED IDEOGRAPH +0xE3AD 0x7F78 #CJK UNIFIED IDEOGRAPH +0xE3AE 0x7F82 #CJK UNIFIED IDEOGRAPH +0xE3AF 0x7F86 #CJK UNIFIED IDEOGRAPH +0xE3B0 0x7F83 #CJK UNIFIED IDEOGRAPH +0xE3B1 0x7F88 #CJK UNIFIED IDEOGRAPH +0xE3B2 0x7F87 #CJK UNIFIED IDEOGRAPH +0xE3B3 0x7F8C #CJK UNIFIED IDEOGRAPH +0xE3B4 0x7F94 #CJK UNIFIED IDEOGRAPH +0xE3B5 0x7F9E #CJK UNIFIED IDEOGRAPH +0xE3B6 0x7F9D #CJK UNIFIED IDEOGRAPH +0xE3B7 0x7F9A #CJK UNIFIED IDEOGRAPH +0xE3B8 0x7FA3 #CJK UNIFIED IDEOGRAPH +0xE3B9 0x7FAF #CJK UNIFIED IDEOGRAPH +0xE3BA 0x7FB2 #CJK UNIFIED IDEOGRAPH +0xE3BB 0x7FB9 #CJK UNIFIED IDEOGRAPH +0xE3BC 0x7FAE #CJK UNIFIED IDEOGRAPH +0xE3BD 0x7FB6 #CJK UNIFIED IDEOGRAPH +0xE3BE 0x7FB8 #CJK UNIFIED IDEOGRAPH +0xE3BF 0x8B71 #CJK UNIFIED IDEOGRAPH +0xE3C0 0x7FC5 #CJK UNIFIED IDEOGRAPH +0xE3C1 0x7FC6 #CJK UNIFIED IDEOGRAPH +0xE3C2 0x7FCA #CJK UNIFIED IDEOGRAPH +0xE3C3 0x7FD5 #CJK UNIFIED IDEOGRAPH +0xE3C4 0x7FD4 #CJK UNIFIED IDEOGRAPH +0xE3C5 0x7FE1 #CJK UNIFIED IDEOGRAPH +0xE3C6 0x7FE6 #CJK UNIFIED IDEOGRAPH +0xE3C7 0x7FE9 #CJK UNIFIED IDEOGRAPH +0xE3C8 0x7FF3 #CJK UNIFIED IDEOGRAPH +0xE3C9 0x7FF9 #CJK UNIFIED IDEOGRAPH +0xE3CA 0x98DC #CJK UNIFIED IDEOGRAPH +0xE3CB 0x8006 #CJK UNIFIED IDEOGRAPH +0xE3CC 0x8004 #CJK UNIFIED IDEOGRAPH +0xE3CD 0x800B #CJK UNIFIED IDEOGRAPH +0xE3CE 0x8012 #CJK UNIFIED IDEOGRAPH +0xE3CF 0x8018 #CJK UNIFIED IDEOGRAPH +0xE3D0 0x8019 #CJK UNIFIED IDEOGRAPH +0xE3D1 0x801C #CJK UNIFIED IDEOGRAPH +0xE3D2 0x8021 #CJK UNIFIED IDEOGRAPH +0xE3D3 0x8028 #CJK UNIFIED IDEOGRAPH +0xE3D4 0x803F #CJK UNIFIED IDEOGRAPH +0xE3D5 0x803B #CJK UNIFIED IDEOGRAPH +0xE3D6 0x804A #CJK UNIFIED IDEOGRAPH +0xE3D7 0x8046 #CJK UNIFIED IDEOGRAPH +0xE3D8 0x8052 #CJK UNIFIED IDEOGRAPH +0xE3D9 0x8058 #CJK UNIFIED IDEOGRAPH +0xE3DA 0x805A #CJK UNIFIED IDEOGRAPH +0xE3DB 0x805F #CJK UNIFIED IDEOGRAPH +0xE3DC 0x8062 #CJK UNIFIED IDEOGRAPH +0xE3DD 0x8068 #CJK UNIFIED IDEOGRAPH +0xE3DE 0x8073 #CJK UNIFIED IDEOGRAPH +0xE3DF 0x8072 #CJK UNIFIED IDEOGRAPH +0xE3E0 0x8070 #CJK UNIFIED IDEOGRAPH +0xE3E1 0x8076 #CJK UNIFIED IDEOGRAPH +0xE3E2 0x8079 #CJK UNIFIED IDEOGRAPH +0xE3E3 0x807D #CJK UNIFIED IDEOGRAPH +0xE3E4 0x807F #CJK UNIFIED IDEOGRAPH +0xE3E5 0x8084 #CJK UNIFIED IDEOGRAPH +0xE3E6 0x8086 #CJK UNIFIED IDEOGRAPH +0xE3E7 0x8085 #CJK UNIFIED IDEOGRAPH +0xE3E8 0x809B #CJK UNIFIED IDEOGRAPH +0xE3E9 0x8093 #CJK UNIFIED IDEOGRAPH +0xE3EA 0x809A #CJK UNIFIED IDEOGRAPH +0xE3EB 0x80AD #CJK UNIFIED IDEOGRAPH +0xE3EC 0x5190 #CJK UNIFIED IDEOGRAPH +0xE3ED 0x80AC #CJK UNIFIED IDEOGRAPH +0xE3EE 0x80DB #CJK UNIFIED IDEOGRAPH +0xE3EF 0x80E5 #CJK UNIFIED IDEOGRAPH +0xE3F0 0x80D9 #CJK UNIFIED IDEOGRAPH +0xE3F1 0x80DD #CJK UNIFIED IDEOGRAPH +0xE3F2 0x80C4 #CJK UNIFIED IDEOGRAPH +0xE3F3 0x80DA #CJK UNIFIED IDEOGRAPH +0xE3F4 0x80D6 #CJK UNIFIED IDEOGRAPH +0xE3F5 0x8109 #CJK UNIFIED IDEOGRAPH +0xE3F6 0x80EF #CJK UNIFIED IDEOGRAPH +0xE3F7 0x80F1 #CJK UNIFIED IDEOGRAPH +0xE3F8 0x811B #CJK UNIFIED IDEOGRAPH +0xE3F9 0x8129 #CJK UNIFIED IDEOGRAPH +0xE3FA 0x8123 #CJK UNIFIED IDEOGRAPH +0xE3FB 0x812F #CJK UNIFIED IDEOGRAPH +0xE3FC 0x814B #CJK UNIFIED IDEOGRAPH +0xE440 0x968B #CJK UNIFIED IDEOGRAPH +0xE441 0x8146 #CJK UNIFIED IDEOGRAPH +0xE442 0x813E #CJK UNIFIED IDEOGRAPH +0xE443 0x8153 #CJK UNIFIED IDEOGRAPH +0xE444 0x8151 #CJK UNIFIED IDEOGRAPH +0xE445 0x80FC #CJK UNIFIED IDEOGRAPH +0xE446 0x8171 #CJK UNIFIED IDEOGRAPH +0xE447 0x816E #CJK UNIFIED IDEOGRAPH +0xE448 0x8165 #CJK UNIFIED IDEOGRAPH +0xE449 0x8166 #CJK UNIFIED IDEOGRAPH +0xE44A 0x8174 #CJK UNIFIED IDEOGRAPH +0xE44B 0x8183 #CJK UNIFIED IDEOGRAPH +0xE44C 0x8188 #CJK UNIFIED IDEOGRAPH +0xE44D 0x818A #CJK UNIFIED IDEOGRAPH +0xE44E 0x8180 #CJK UNIFIED IDEOGRAPH +0xE44F 0x8182 #CJK UNIFIED IDEOGRAPH +0xE450 0x81A0 #CJK UNIFIED IDEOGRAPH +0xE451 0x8195 #CJK UNIFIED IDEOGRAPH +0xE452 0x81A4 #CJK UNIFIED IDEOGRAPH +0xE453 0x81A3 #CJK UNIFIED IDEOGRAPH +0xE454 0x815F #CJK UNIFIED IDEOGRAPH +0xE455 0x8193 #CJK UNIFIED IDEOGRAPH +0xE456 0x81A9 #CJK UNIFIED IDEOGRAPH +0xE457 0x81B0 #CJK UNIFIED IDEOGRAPH +0xE458 0x81B5 #CJK UNIFIED IDEOGRAPH +0xE459 0x81BE #CJK UNIFIED IDEOGRAPH +0xE45A 0x81B8 #CJK UNIFIED IDEOGRAPH +0xE45B 0x81BD #CJK UNIFIED IDEOGRAPH +0xE45C 0x81C0 #CJK UNIFIED IDEOGRAPH +0xE45D 0x81C2 #CJK UNIFIED IDEOGRAPH +0xE45E 0x81BA #CJK UNIFIED IDEOGRAPH +0xE45F 0x81C9 #CJK UNIFIED IDEOGRAPH +0xE460 0x81CD #CJK UNIFIED IDEOGRAPH +0xE461 0x81D1 #CJK UNIFIED IDEOGRAPH +0xE462 0x81D9 #CJK UNIFIED IDEOGRAPH +0xE463 0x81D8 #CJK UNIFIED IDEOGRAPH +0xE464 0x81C8 #CJK UNIFIED IDEOGRAPH +0xE465 0x81DA #CJK UNIFIED IDEOGRAPH +0xE466 0x81DF #CJK UNIFIED IDEOGRAPH +0xE467 0x81E0 #CJK UNIFIED IDEOGRAPH +0xE468 0x81E7 #CJK UNIFIED IDEOGRAPH +0xE469 0x81FA #CJK UNIFIED IDEOGRAPH +0xE46A 0x81FB #CJK UNIFIED IDEOGRAPH +0xE46B 0x81FE #CJK UNIFIED IDEOGRAPH +0xE46C 0x8201 #CJK UNIFIED IDEOGRAPH +0xE46D 0x8202 #CJK UNIFIED IDEOGRAPH +0xE46E 0x8205 #CJK UNIFIED IDEOGRAPH +0xE46F 0x8207 #CJK UNIFIED IDEOGRAPH +0xE470 0x820A #CJK UNIFIED IDEOGRAPH +0xE471 0x820D #CJK UNIFIED IDEOGRAPH +0xE472 0x8210 #CJK UNIFIED IDEOGRAPH +0xE473 0x8216 #CJK UNIFIED IDEOGRAPH +0xE474 0x8229 #CJK UNIFIED IDEOGRAPH +0xE475 0x822B #CJK UNIFIED IDEOGRAPH +0xE476 0x8238 #CJK UNIFIED IDEOGRAPH +0xE477 0x8233 #CJK UNIFIED IDEOGRAPH +0xE478 0x8240 #CJK UNIFIED IDEOGRAPH +0xE479 0x8259 #CJK UNIFIED IDEOGRAPH +0xE47A 0x8258 #CJK UNIFIED IDEOGRAPH +0xE47B 0x825D #CJK UNIFIED IDEOGRAPH +0xE47C 0x825A #CJK UNIFIED IDEOGRAPH +0xE47D 0x825F #CJK UNIFIED IDEOGRAPH +0xE47E 0x8264 #CJK UNIFIED IDEOGRAPH +0xE480 0x8262 #CJK UNIFIED IDEOGRAPH +0xE481 0x8268 #CJK UNIFIED IDEOGRAPH +0xE482 0x826A #CJK UNIFIED IDEOGRAPH +0xE483 0x826B #CJK UNIFIED IDEOGRAPH +0xE484 0x822E #CJK UNIFIED IDEOGRAPH +0xE485 0x8271 #CJK UNIFIED IDEOGRAPH +0xE486 0x8277 #CJK UNIFIED IDEOGRAPH +0xE487 0x8278 #CJK UNIFIED IDEOGRAPH +0xE488 0x827E #CJK UNIFIED IDEOGRAPH +0xE489 0x828D #CJK UNIFIED IDEOGRAPH +0xE48A 0x8292 #CJK UNIFIED IDEOGRAPH +0xE48B 0x82AB #CJK UNIFIED IDEOGRAPH +0xE48C 0x829F #CJK UNIFIED IDEOGRAPH +0xE48D 0x82BB #CJK UNIFIED IDEOGRAPH +0xE48E 0x82AC #CJK UNIFIED IDEOGRAPH +0xE48F 0x82E1 #CJK UNIFIED IDEOGRAPH +0xE490 0x82E3 #CJK UNIFIED IDEOGRAPH +0xE491 0x82DF #CJK UNIFIED IDEOGRAPH +0xE492 0x82D2 #CJK UNIFIED IDEOGRAPH +0xE493 0x82F4 #CJK UNIFIED IDEOGRAPH +0xE494 0x82F3 #CJK UNIFIED IDEOGRAPH +0xE495 0x82FA #CJK UNIFIED IDEOGRAPH +0xE496 0x8393 #CJK UNIFIED IDEOGRAPH +0xE497 0x8303 #CJK UNIFIED IDEOGRAPH +0xE498 0x82FB #CJK UNIFIED IDEOGRAPH +0xE499 0x82F9 #CJK UNIFIED IDEOGRAPH +0xE49A 0x82DE #CJK UNIFIED IDEOGRAPH +0xE49B 0x8306 #CJK UNIFIED IDEOGRAPH +0xE49C 0x82DC #CJK UNIFIED IDEOGRAPH +0xE49D 0x8309 #CJK UNIFIED IDEOGRAPH +0xE49E 0x82D9 #CJK UNIFIED IDEOGRAPH +0xE49F 0x8335 #CJK UNIFIED IDEOGRAPH +0xE4A0 0x8334 #CJK UNIFIED IDEOGRAPH +0xE4A1 0x8316 #CJK UNIFIED IDEOGRAPH +0xE4A2 0x8332 #CJK UNIFIED IDEOGRAPH +0xE4A3 0x8331 #CJK UNIFIED IDEOGRAPH +0xE4A4 0x8340 #CJK UNIFIED IDEOGRAPH +0xE4A5 0x8339 #CJK UNIFIED IDEOGRAPH +0xE4A6 0x8350 #CJK UNIFIED IDEOGRAPH +0xE4A7 0x8345 #CJK UNIFIED IDEOGRAPH +0xE4A8 0x832F #CJK UNIFIED IDEOGRAPH +0xE4A9 0x832B #CJK UNIFIED IDEOGRAPH +0xE4AA 0x8317 #CJK UNIFIED IDEOGRAPH +0xE4AB 0x8318 #CJK UNIFIED IDEOGRAPH +0xE4AC 0x8385 #CJK UNIFIED IDEOGRAPH +0xE4AD 0x839A #CJK UNIFIED IDEOGRAPH +0xE4AE 0x83AA #CJK UNIFIED IDEOGRAPH +0xE4AF 0x839F #CJK UNIFIED IDEOGRAPH +0xE4B0 0x83A2 #CJK UNIFIED IDEOGRAPH +0xE4B1 0x8396 #CJK UNIFIED IDEOGRAPH +0xE4B2 0x8323 #CJK UNIFIED IDEOGRAPH +0xE4B3 0x838E #CJK UNIFIED IDEOGRAPH +0xE4B4 0x8387 #CJK UNIFIED IDEOGRAPH +0xE4B5 0x838A #CJK UNIFIED IDEOGRAPH +0xE4B6 0x837C #CJK UNIFIED IDEOGRAPH +0xE4B7 0x83B5 #CJK UNIFIED IDEOGRAPH +0xE4B8 0x8373 #CJK UNIFIED IDEOGRAPH +0xE4B9 0x8375 #CJK UNIFIED IDEOGRAPH +0xE4BA 0x83A0 #CJK UNIFIED IDEOGRAPH +0xE4BB 0x8389 #CJK UNIFIED IDEOGRAPH +0xE4BC 0x83A8 #CJK UNIFIED IDEOGRAPH +0xE4BD 0x83F4 #CJK UNIFIED IDEOGRAPH +0xE4BE 0x8413 #CJK UNIFIED IDEOGRAPH +0xE4BF 0x83EB #CJK UNIFIED IDEOGRAPH +0xE4C0 0x83CE #CJK UNIFIED IDEOGRAPH +0xE4C1 0x83FD #CJK UNIFIED IDEOGRAPH +0xE4C2 0x8403 #CJK UNIFIED IDEOGRAPH +0xE4C3 0x83D8 #CJK UNIFIED IDEOGRAPH +0xE4C4 0x840B #CJK UNIFIED IDEOGRAPH +0xE4C5 0x83C1 #CJK UNIFIED IDEOGRAPH +0xE4C6 0x83F7 #CJK UNIFIED IDEOGRAPH +0xE4C7 0x8407 #CJK UNIFIED IDEOGRAPH +0xE4C8 0x83E0 #CJK UNIFIED IDEOGRAPH +0xE4C9 0x83F2 #CJK UNIFIED IDEOGRAPH +0xE4CA 0x840D #CJK UNIFIED IDEOGRAPH +0xE4CB 0x8422 #CJK UNIFIED IDEOGRAPH +0xE4CC 0x8420 #CJK UNIFIED IDEOGRAPH +0xE4CD 0x83BD #CJK UNIFIED IDEOGRAPH +0xE4CE 0x8438 #CJK UNIFIED IDEOGRAPH +0xE4CF 0x8506 #CJK UNIFIED IDEOGRAPH +0xE4D0 0x83FB #CJK UNIFIED IDEOGRAPH +0xE4D1 0x846D #CJK UNIFIED IDEOGRAPH +0xE4D2 0x842A #CJK UNIFIED IDEOGRAPH +0xE4D3 0x843C #CJK UNIFIED IDEOGRAPH +0xE4D4 0x855A #CJK UNIFIED IDEOGRAPH +0xE4D5 0x8484 #CJK UNIFIED IDEOGRAPH +0xE4D6 0x8477 #CJK UNIFIED IDEOGRAPH +0xE4D7 0x846B #CJK UNIFIED IDEOGRAPH +0xE4D8 0x84AD #CJK UNIFIED IDEOGRAPH +0xE4D9 0x846E #CJK UNIFIED IDEOGRAPH +0xE4DA 0x8482 #CJK UNIFIED IDEOGRAPH +0xE4DB 0x8469 #CJK UNIFIED IDEOGRAPH +0xE4DC 0x8446 #CJK UNIFIED IDEOGRAPH +0xE4DD 0x842C #CJK UNIFIED IDEOGRAPH +0xE4DE 0x846F #CJK UNIFIED IDEOGRAPH +0xE4DF 0x8479 #CJK UNIFIED IDEOGRAPH +0xE4E0 0x8435 #CJK UNIFIED IDEOGRAPH +0xE4E1 0x84CA #CJK UNIFIED IDEOGRAPH +0xE4E2 0x8462 #CJK UNIFIED IDEOGRAPH +0xE4E3 0x84B9 #CJK UNIFIED IDEOGRAPH +0xE4E4 0x84BF #CJK UNIFIED IDEOGRAPH +0xE4E5 0x849F #CJK UNIFIED IDEOGRAPH +0xE4E6 0x84D9 #CJK UNIFIED IDEOGRAPH +0xE4E7 0x84CD #CJK UNIFIED IDEOGRAPH +0xE4E8 0x84BB #CJK UNIFIED IDEOGRAPH +0xE4E9 0x84DA #CJK UNIFIED IDEOGRAPH +0xE4EA 0x84D0 #CJK UNIFIED IDEOGRAPH +0xE4EB 0x84C1 #CJK UNIFIED IDEOGRAPH +0xE4EC 0x84C6 #CJK UNIFIED IDEOGRAPH +0xE4ED 0x84D6 #CJK UNIFIED IDEOGRAPH +0xE4EE 0x84A1 #CJK UNIFIED IDEOGRAPH +0xE4EF 0x8521 #CJK UNIFIED IDEOGRAPH +0xE4F0 0x84FF #CJK UNIFIED IDEOGRAPH +0xE4F1 0x84F4 #CJK UNIFIED IDEOGRAPH +0xE4F2 0x8517 #CJK UNIFIED IDEOGRAPH +0xE4F3 0x8518 #CJK UNIFIED IDEOGRAPH +0xE4F4 0x852C #CJK UNIFIED IDEOGRAPH +0xE4F5 0x851F #CJK UNIFIED IDEOGRAPH +0xE4F6 0x8515 #CJK UNIFIED IDEOGRAPH +0xE4F7 0x8514 #CJK UNIFIED IDEOGRAPH +0xE4F8 0x84FC #CJK UNIFIED IDEOGRAPH +0xE4F9 0x8540 #CJK UNIFIED IDEOGRAPH +0xE4FA 0x8563 #CJK UNIFIED IDEOGRAPH +0xE4FB 0x8558 #CJK UNIFIED IDEOGRAPH +0xE4FC 0x8548 #CJK UNIFIED IDEOGRAPH +0xE540 0x8541 #CJK UNIFIED IDEOGRAPH +0xE541 0x8602 #CJK UNIFIED IDEOGRAPH +0xE542 0x854B #CJK UNIFIED IDEOGRAPH +0xE543 0x8555 #CJK UNIFIED IDEOGRAPH +0xE544 0x8580 #CJK UNIFIED IDEOGRAPH +0xE545 0x85A4 #CJK UNIFIED IDEOGRAPH +0xE546 0x8588 #CJK UNIFIED IDEOGRAPH +0xE547 0x8591 #CJK UNIFIED IDEOGRAPH +0xE548 0x858A #CJK UNIFIED IDEOGRAPH +0xE549 0x85A8 #CJK UNIFIED IDEOGRAPH +0xE54A 0x856D #CJK UNIFIED IDEOGRAPH +0xE54B 0x8594 #CJK UNIFIED IDEOGRAPH +0xE54C 0x859B #CJK UNIFIED IDEOGRAPH +0xE54D 0x85EA #CJK UNIFIED IDEOGRAPH +0xE54E 0x8587 #CJK UNIFIED IDEOGRAPH +0xE54F 0x859C #CJK UNIFIED IDEOGRAPH +0xE550 0x8577 #CJK UNIFIED IDEOGRAPH +0xE551 0x857E #CJK UNIFIED IDEOGRAPH +0xE552 0x8590 #CJK UNIFIED IDEOGRAPH +0xE553 0x85C9 #CJK UNIFIED IDEOGRAPH +0xE554 0x85BA #CJK UNIFIED IDEOGRAPH +0xE555 0x85CF #CJK UNIFIED IDEOGRAPH +0xE556 0x85B9 #CJK UNIFIED IDEOGRAPH +0xE557 0x85D0 #CJK UNIFIED IDEOGRAPH +0xE558 0x85D5 #CJK UNIFIED IDEOGRAPH +0xE559 0x85DD #CJK UNIFIED IDEOGRAPH +0xE55A 0x85E5 #CJK UNIFIED IDEOGRAPH +0xE55B 0x85DC #CJK UNIFIED IDEOGRAPH +0xE55C 0x85F9 #CJK UNIFIED IDEOGRAPH +0xE55D 0x860A #CJK UNIFIED IDEOGRAPH +0xE55E 0x8613 #CJK UNIFIED IDEOGRAPH +0xE55F 0x860B #CJK UNIFIED IDEOGRAPH +0xE560 0x85FE #CJK UNIFIED IDEOGRAPH +0xE561 0x85FA #CJK UNIFIED IDEOGRAPH +0xE562 0x8606 #CJK UNIFIED IDEOGRAPH +0xE563 0x8622 #CJK UNIFIED IDEOGRAPH +0xE564 0x861A #CJK UNIFIED IDEOGRAPH +0xE565 0x8630 #CJK UNIFIED IDEOGRAPH +0xE566 0x863F #CJK UNIFIED IDEOGRAPH +0xE567 0x864D #CJK UNIFIED IDEOGRAPH +0xE568 0x4E55 #CJK UNIFIED IDEOGRAPH +0xE569 0x8654 #CJK UNIFIED IDEOGRAPH +0xE56A 0x865F #CJK UNIFIED IDEOGRAPH +0xE56B 0x8667 #CJK UNIFIED IDEOGRAPH +0xE56C 0x8671 #CJK UNIFIED IDEOGRAPH +0xE56D 0x8693 #CJK UNIFIED IDEOGRAPH +0xE56E 0x86A3 #CJK UNIFIED IDEOGRAPH +0xE56F 0x86A9 #CJK UNIFIED IDEOGRAPH +0xE570 0x86AA #CJK UNIFIED IDEOGRAPH +0xE571 0x868B #CJK UNIFIED IDEOGRAPH +0xE572 0x868C #CJK UNIFIED IDEOGRAPH +0xE573 0x86B6 #CJK UNIFIED IDEOGRAPH +0xE574 0x86AF #CJK UNIFIED IDEOGRAPH +0xE575 0x86C4 #CJK UNIFIED IDEOGRAPH +0xE576 0x86C6 #CJK UNIFIED IDEOGRAPH +0xE577 0x86B0 #CJK UNIFIED IDEOGRAPH +0xE578 0x86C9 #CJK UNIFIED IDEOGRAPH +0xE579 0x8823 #CJK UNIFIED IDEOGRAPH +0xE57A 0x86AB #CJK UNIFIED IDEOGRAPH +0xE57B 0x86D4 #CJK UNIFIED IDEOGRAPH +0xE57C 0x86DE #CJK UNIFIED IDEOGRAPH +0xE57D 0x86E9 #CJK UNIFIED IDEOGRAPH +0xE57E 0x86EC #CJK UNIFIED IDEOGRAPH +0xE580 0x86DF #CJK UNIFIED IDEOGRAPH +0xE581 0x86DB #CJK UNIFIED IDEOGRAPH +0xE582 0x86EF #CJK UNIFIED IDEOGRAPH +0xE583 0x8712 #CJK UNIFIED IDEOGRAPH +0xE584 0x8706 #CJK UNIFIED IDEOGRAPH +0xE585 0x8708 #CJK UNIFIED IDEOGRAPH +0xE586 0x8700 #CJK UNIFIED IDEOGRAPH +0xE587 0x8703 #CJK UNIFIED IDEOGRAPH +0xE588 0x86FB #CJK UNIFIED IDEOGRAPH +0xE589 0x8711 #CJK UNIFIED IDEOGRAPH +0xE58A 0x8709 #CJK UNIFIED IDEOGRAPH +0xE58B 0x870D #CJK UNIFIED IDEOGRAPH +0xE58C 0x86F9 #CJK UNIFIED IDEOGRAPH +0xE58D 0x870A #CJK UNIFIED IDEOGRAPH +0xE58E 0x8734 #CJK UNIFIED IDEOGRAPH +0xE58F 0x873F #CJK UNIFIED IDEOGRAPH +0xE590 0x8737 #CJK UNIFIED IDEOGRAPH +0xE591 0x873B #CJK UNIFIED IDEOGRAPH +0xE592 0x8725 #CJK UNIFIED IDEOGRAPH +0xE593 0x8729 #CJK UNIFIED IDEOGRAPH +0xE594 0x871A #CJK UNIFIED IDEOGRAPH +0xE595 0x8760 #CJK UNIFIED IDEOGRAPH +0xE596 0x875F #CJK UNIFIED IDEOGRAPH +0xE597 0x8778 #CJK UNIFIED IDEOGRAPH +0xE598 0x874C #CJK UNIFIED IDEOGRAPH +0xE599 0x874E #CJK UNIFIED IDEOGRAPH +0xE59A 0x8774 #CJK UNIFIED IDEOGRAPH +0xE59B 0x8757 #CJK UNIFIED IDEOGRAPH +0xE59C 0x8768 #CJK UNIFIED IDEOGRAPH +0xE59D 0x876E #CJK UNIFIED IDEOGRAPH +0xE59E 0x8759 #CJK UNIFIED IDEOGRAPH +0xE59F 0x8753 #CJK UNIFIED IDEOGRAPH +0xE5A0 0x8763 #CJK UNIFIED IDEOGRAPH +0xE5A1 0x876A #CJK UNIFIED IDEOGRAPH +0xE5A2 0x8805 #CJK UNIFIED IDEOGRAPH +0xE5A3 0x87A2 #CJK UNIFIED IDEOGRAPH +0xE5A4 0x879F #CJK UNIFIED IDEOGRAPH +0xE5A5 0x8782 #CJK UNIFIED IDEOGRAPH +0xE5A6 0x87AF #CJK UNIFIED IDEOGRAPH +0xE5A7 0x87CB #CJK UNIFIED IDEOGRAPH +0xE5A8 0x87BD #CJK UNIFIED IDEOGRAPH +0xE5A9 0x87C0 #CJK UNIFIED IDEOGRAPH +0xE5AA 0x87D0 #CJK UNIFIED IDEOGRAPH +0xE5AB 0x96D6 #CJK UNIFIED IDEOGRAPH +0xE5AC 0x87AB #CJK UNIFIED IDEOGRAPH +0xE5AD 0x87C4 #CJK UNIFIED IDEOGRAPH +0xE5AE 0x87B3 #CJK UNIFIED IDEOGRAPH +0xE5AF 0x87C7 #CJK UNIFIED IDEOGRAPH +0xE5B0 0x87C6 #CJK UNIFIED IDEOGRAPH +0xE5B1 0x87BB #CJK UNIFIED IDEOGRAPH +0xE5B2 0x87EF #CJK UNIFIED IDEOGRAPH +0xE5B3 0x87F2 #CJK UNIFIED IDEOGRAPH +0xE5B4 0x87E0 #CJK UNIFIED IDEOGRAPH +0xE5B5 0x880F #CJK UNIFIED IDEOGRAPH +0xE5B6 0x880D #CJK UNIFIED IDEOGRAPH +0xE5B7 0x87FE #CJK UNIFIED IDEOGRAPH +0xE5B8 0x87F6 #CJK UNIFIED IDEOGRAPH +0xE5B9 0x87F7 #CJK UNIFIED IDEOGRAPH +0xE5BA 0x880E #CJK UNIFIED IDEOGRAPH +0xE5BB 0x87D2 #CJK UNIFIED IDEOGRAPH +0xE5BC 0x8811 #CJK UNIFIED IDEOGRAPH +0xE5BD 0x8816 #CJK UNIFIED IDEOGRAPH +0xE5BE 0x8815 #CJK UNIFIED IDEOGRAPH +0xE5BF 0x8822 #CJK UNIFIED IDEOGRAPH +0xE5C0 0x8821 #CJK UNIFIED IDEOGRAPH +0xE5C1 0x8831 #CJK UNIFIED IDEOGRAPH +0xE5C2 0x8836 #CJK UNIFIED IDEOGRAPH +0xE5C3 0x8839 #CJK UNIFIED IDEOGRAPH +0xE5C4 0x8827 #CJK UNIFIED IDEOGRAPH +0xE5C5 0x883B #CJK UNIFIED IDEOGRAPH +0xE5C6 0x8844 #CJK UNIFIED IDEOGRAPH +0xE5C7 0x8842 #CJK UNIFIED IDEOGRAPH +0xE5C8 0x8852 #CJK UNIFIED IDEOGRAPH +0xE5C9 0x8859 #CJK UNIFIED IDEOGRAPH +0xE5CA 0x885E #CJK UNIFIED IDEOGRAPH +0xE5CB 0x8862 #CJK UNIFIED IDEOGRAPH +0xE5CC 0x886B #CJK UNIFIED IDEOGRAPH +0xE5CD 0x8881 #CJK UNIFIED IDEOGRAPH +0xE5CE 0x887E #CJK UNIFIED IDEOGRAPH +0xE5CF 0x889E #CJK UNIFIED IDEOGRAPH +0xE5D0 0x8875 #CJK UNIFIED IDEOGRAPH +0xE5D1 0x887D #CJK UNIFIED IDEOGRAPH +0xE5D2 0x88B5 #CJK UNIFIED IDEOGRAPH +0xE5D3 0x8872 #CJK UNIFIED IDEOGRAPH +0xE5D4 0x8882 #CJK UNIFIED IDEOGRAPH +0xE5D5 0x8897 #CJK UNIFIED IDEOGRAPH +0xE5D6 0x8892 #CJK UNIFIED IDEOGRAPH +0xE5D7 0x88AE #CJK UNIFIED IDEOGRAPH +0xE5D8 0x8899 #CJK UNIFIED IDEOGRAPH +0xE5D9 0x88A2 #CJK UNIFIED IDEOGRAPH +0xE5DA 0x888D #CJK UNIFIED IDEOGRAPH +0xE5DB 0x88A4 #CJK UNIFIED IDEOGRAPH +0xE5DC 0x88B0 #CJK UNIFIED IDEOGRAPH +0xE5DD 0x88BF #CJK UNIFIED IDEOGRAPH +0xE5DE 0x88B1 #CJK UNIFIED IDEOGRAPH +0xE5DF 0x88C3 #CJK UNIFIED IDEOGRAPH +0xE5E0 0x88C4 #CJK UNIFIED IDEOGRAPH +0xE5E1 0x88D4 #CJK UNIFIED IDEOGRAPH +0xE5E2 0x88D8 #CJK UNIFIED IDEOGRAPH +0xE5E3 0x88D9 #CJK UNIFIED IDEOGRAPH +0xE5E4 0x88DD #CJK UNIFIED IDEOGRAPH +0xE5E5 0x88F9 #CJK UNIFIED IDEOGRAPH +0xE5E6 0x8902 #CJK UNIFIED IDEOGRAPH +0xE5E7 0x88FC #CJK UNIFIED IDEOGRAPH +0xE5E8 0x88F4 #CJK UNIFIED IDEOGRAPH +0xE5E9 0x88E8 #CJK UNIFIED IDEOGRAPH +0xE5EA 0x88F2 #CJK UNIFIED IDEOGRAPH +0xE5EB 0x8904 #CJK UNIFIED IDEOGRAPH +0xE5EC 0x890C #CJK UNIFIED IDEOGRAPH +0xE5ED 0x890A #CJK UNIFIED IDEOGRAPH +0xE5EE 0x8913 #CJK UNIFIED IDEOGRAPH +0xE5EF 0x8943 #CJK UNIFIED IDEOGRAPH +0xE5F0 0x891E #CJK UNIFIED IDEOGRAPH +0xE5F1 0x8925 #CJK UNIFIED IDEOGRAPH +0xE5F2 0x892A #CJK UNIFIED IDEOGRAPH +0xE5F3 0x892B #CJK UNIFIED IDEOGRAPH +0xE5F4 0x8941 #CJK UNIFIED IDEOGRAPH +0xE5F5 0x8944 #CJK UNIFIED IDEOGRAPH +0xE5F6 0x893B #CJK UNIFIED IDEOGRAPH +0xE5F7 0x8936 #CJK UNIFIED IDEOGRAPH +0xE5F8 0x8938 #CJK UNIFIED IDEOGRAPH +0xE5F9 0x894C #CJK UNIFIED IDEOGRAPH +0xE5FA 0x891D #CJK UNIFIED IDEOGRAPH +0xE5FB 0x8960 #CJK UNIFIED IDEOGRAPH +0xE5FC 0x895E #CJK UNIFIED IDEOGRAPH +0xE640 0x8966 #CJK UNIFIED IDEOGRAPH +0xE641 0x8964 #CJK UNIFIED IDEOGRAPH +0xE642 0x896D #CJK UNIFIED IDEOGRAPH +0xE643 0x896A #CJK UNIFIED IDEOGRAPH +0xE644 0x896F #CJK UNIFIED IDEOGRAPH +0xE645 0x8974 #CJK UNIFIED IDEOGRAPH +0xE646 0x8977 #CJK UNIFIED IDEOGRAPH +0xE647 0x897E #CJK UNIFIED IDEOGRAPH +0xE648 0x8983 #CJK UNIFIED IDEOGRAPH +0xE649 0x8988 #CJK UNIFIED IDEOGRAPH +0xE64A 0x898A #CJK UNIFIED IDEOGRAPH +0xE64B 0x8993 #CJK UNIFIED IDEOGRAPH +0xE64C 0x8998 #CJK UNIFIED IDEOGRAPH +0xE64D 0x89A1 #CJK UNIFIED IDEOGRAPH +0xE64E 0x89A9 #CJK UNIFIED IDEOGRAPH +0xE64F 0x89A6 #CJK UNIFIED IDEOGRAPH +0xE650 0x89AC #CJK UNIFIED IDEOGRAPH +0xE651 0x89AF #CJK UNIFIED IDEOGRAPH +0xE652 0x89B2 #CJK UNIFIED IDEOGRAPH +0xE653 0x89BA #CJK UNIFIED IDEOGRAPH +0xE654 0x89BD #CJK UNIFIED IDEOGRAPH +0xE655 0x89BF #CJK UNIFIED IDEOGRAPH +0xE656 0x89C0 #CJK UNIFIED IDEOGRAPH +0xE657 0x89DA #CJK UNIFIED IDEOGRAPH +0xE658 0x89DC #CJK UNIFIED IDEOGRAPH +0xE659 0x89DD #CJK UNIFIED IDEOGRAPH +0xE65A 0x89E7 #CJK UNIFIED IDEOGRAPH +0xE65B 0x89F4 #CJK UNIFIED IDEOGRAPH +0xE65C 0x89F8 #CJK UNIFIED IDEOGRAPH +0xE65D 0x8A03 #CJK UNIFIED IDEOGRAPH +0xE65E 0x8A16 #CJK UNIFIED IDEOGRAPH +0xE65F 0x8A10 #CJK UNIFIED IDEOGRAPH +0xE660 0x8A0C #CJK UNIFIED IDEOGRAPH +0xE661 0x8A1B #CJK UNIFIED IDEOGRAPH +0xE662 0x8A1D #CJK UNIFIED IDEOGRAPH +0xE663 0x8A25 #CJK UNIFIED IDEOGRAPH +0xE664 0x8A36 #CJK UNIFIED IDEOGRAPH +0xE665 0x8A41 #CJK UNIFIED IDEOGRAPH +0xE666 0x8A5B #CJK UNIFIED IDEOGRAPH +0xE667 0x8A52 #CJK UNIFIED IDEOGRAPH +0xE668 0x8A46 #CJK UNIFIED IDEOGRAPH +0xE669 0x8A48 #CJK UNIFIED IDEOGRAPH +0xE66A 0x8A7C #CJK UNIFIED IDEOGRAPH +0xE66B 0x8A6D #CJK UNIFIED IDEOGRAPH +0xE66C 0x8A6C #CJK UNIFIED IDEOGRAPH +0xE66D 0x8A62 #CJK UNIFIED IDEOGRAPH +0xE66E 0x8A85 #CJK UNIFIED IDEOGRAPH +0xE66F 0x8A82 #CJK UNIFIED IDEOGRAPH +0xE670 0x8A84 #CJK UNIFIED IDEOGRAPH +0xE671 0x8AA8 #CJK UNIFIED IDEOGRAPH +0xE672 0x8AA1 #CJK UNIFIED IDEOGRAPH +0xE673 0x8A91 #CJK UNIFIED IDEOGRAPH +0xE674 0x8AA5 #CJK UNIFIED IDEOGRAPH +0xE675 0x8AA6 #CJK UNIFIED IDEOGRAPH +0xE676 0x8A9A #CJK UNIFIED IDEOGRAPH +0xE677 0x8AA3 #CJK UNIFIED IDEOGRAPH +0xE678 0x8AC4 #CJK UNIFIED IDEOGRAPH +0xE679 0x8ACD #CJK UNIFIED IDEOGRAPH +0xE67A 0x8AC2 #CJK UNIFIED IDEOGRAPH +0xE67B 0x8ADA #CJK UNIFIED IDEOGRAPH +0xE67C 0x8AEB #CJK UNIFIED IDEOGRAPH +0xE67D 0x8AF3 #CJK UNIFIED IDEOGRAPH +0xE67E 0x8AE7 #CJK UNIFIED IDEOGRAPH +0xE680 0x8AE4 #CJK UNIFIED IDEOGRAPH +0xE681 0x8AF1 #CJK UNIFIED IDEOGRAPH +0xE682 0x8B14 #CJK UNIFIED IDEOGRAPH +0xE683 0x8AE0 #CJK UNIFIED IDEOGRAPH +0xE684 0x8AE2 #CJK UNIFIED IDEOGRAPH +0xE685 0x8AF7 #CJK UNIFIED IDEOGRAPH +0xE686 0x8ADE #CJK UNIFIED IDEOGRAPH +0xE687 0x8ADB #CJK UNIFIED IDEOGRAPH +0xE688 0x8B0C #CJK UNIFIED IDEOGRAPH +0xE689 0x8B07 #CJK UNIFIED IDEOGRAPH +0xE68A 0x8B1A #CJK UNIFIED IDEOGRAPH +0xE68B 0x8AE1 #CJK UNIFIED IDEOGRAPH +0xE68C 0x8B16 #CJK UNIFIED IDEOGRAPH +0xE68D 0x8B10 #CJK UNIFIED IDEOGRAPH +0xE68E 0x8B17 #CJK UNIFIED IDEOGRAPH +0xE68F 0x8B20 #CJK UNIFIED IDEOGRAPH +0xE690 0x8B33 #CJK UNIFIED IDEOGRAPH +0xE691 0x97AB #CJK UNIFIED IDEOGRAPH +0xE692 0x8B26 #CJK UNIFIED IDEOGRAPH +0xE693 0x8B2B #CJK UNIFIED IDEOGRAPH +0xE694 0x8B3E #CJK UNIFIED IDEOGRAPH +0xE695 0x8B28 #CJK UNIFIED IDEOGRAPH +0xE696 0x8B41 #CJK UNIFIED IDEOGRAPH +0xE697 0x8B4C #CJK UNIFIED IDEOGRAPH +0xE698 0x8B4F #CJK UNIFIED IDEOGRAPH +0xE699 0x8B4E #CJK UNIFIED IDEOGRAPH +0xE69A 0x8B49 #CJK UNIFIED IDEOGRAPH +0xE69B 0x8B56 #CJK UNIFIED IDEOGRAPH +0xE69C 0x8B5B #CJK UNIFIED IDEOGRAPH +0xE69D 0x8B5A #CJK UNIFIED IDEOGRAPH +0xE69E 0x8B6B #CJK UNIFIED IDEOGRAPH +0xE69F 0x8B5F #CJK UNIFIED IDEOGRAPH +0xE6A0 0x8B6C #CJK UNIFIED IDEOGRAPH +0xE6A1 0x8B6F #CJK UNIFIED IDEOGRAPH +0xE6A2 0x8B74 #CJK UNIFIED IDEOGRAPH +0xE6A3 0x8B7D #CJK UNIFIED IDEOGRAPH +0xE6A4 0x8B80 #CJK UNIFIED IDEOGRAPH +0xE6A5 0x8B8C #CJK UNIFIED IDEOGRAPH +0xE6A6 0x8B8E #CJK UNIFIED IDEOGRAPH +0xE6A7 0x8B92 #CJK UNIFIED IDEOGRAPH +0xE6A8 0x8B93 #CJK UNIFIED IDEOGRAPH +0xE6A9 0x8B96 #CJK UNIFIED IDEOGRAPH +0xE6AA 0x8B99 #CJK UNIFIED IDEOGRAPH +0xE6AB 0x8B9A #CJK UNIFIED IDEOGRAPH +0xE6AC 0x8C3A #CJK UNIFIED IDEOGRAPH +0xE6AD 0x8C41 #CJK UNIFIED IDEOGRAPH +0xE6AE 0x8C3F #CJK UNIFIED IDEOGRAPH +0xE6AF 0x8C48 #CJK UNIFIED IDEOGRAPH +0xE6B0 0x8C4C #CJK UNIFIED IDEOGRAPH +0xE6B1 0x8C4E #CJK UNIFIED IDEOGRAPH +0xE6B2 0x8C50 #CJK UNIFIED IDEOGRAPH +0xE6B3 0x8C55 #CJK UNIFIED IDEOGRAPH +0xE6B4 0x8C62 #CJK UNIFIED IDEOGRAPH +0xE6B5 0x8C6C #CJK UNIFIED IDEOGRAPH +0xE6B6 0x8C78 #CJK UNIFIED IDEOGRAPH +0xE6B7 0x8C7A #CJK UNIFIED IDEOGRAPH +0xE6B8 0x8C82 #CJK UNIFIED IDEOGRAPH +0xE6B9 0x8C89 #CJK UNIFIED IDEOGRAPH +0xE6BA 0x8C85 #CJK UNIFIED IDEOGRAPH +0xE6BB 0x8C8A #CJK UNIFIED IDEOGRAPH +0xE6BC 0x8C8D #CJK UNIFIED IDEOGRAPH +0xE6BD 0x8C8E #CJK UNIFIED IDEOGRAPH +0xE6BE 0x8C94 #CJK UNIFIED IDEOGRAPH +0xE6BF 0x8C7C #CJK UNIFIED IDEOGRAPH +0xE6C0 0x8C98 #CJK UNIFIED IDEOGRAPH +0xE6C1 0x621D #CJK UNIFIED IDEOGRAPH +0xE6C2 0x8CAD #CJK UNIFIED IDEOGRAPH +0xE6C3 0x8CAA #CJK UNIFIED IDEOGRAPH +0xE6C4 0x8CBD #CJK UNIFIED IDEOGRAPH +0xE6C5 0x8CB2 #CJK UNIFIED IDEOGRAPH +0xE6C6 0x8CB3 #CJK UNIFIED IDEOGRAPH +0xE6C7 0x8CAE #CJK UNIFIED IDEOGRAPH +0xE6C8 0x8CB6 #CJK UNIFIED IDEOGRAPH +0xE6C9 0x8CC8 #CJK UNIFIED IDEOGRAPH +0xE6CA 0x8CC1 #CJK UNIFIED IDEOGRAPH +0xE6CB 0x8CE4 #CJK UNIFIED IDEOGRAPH +0xE6CC 0x8CE3 #CJK UNIFIED IDEOGRAPH +0xE6CD 0x8CDA #CJK UNIFIED IDEOGRAPH +0xE6CE 0x8CFD #CJK UNIFIED IDEOGRAPH +0xE6CF 0x8CFA #CJK UNIFIED IDEOGRAPH +0xE6D0 0x8CFB #CJK UNIFIED IDEOGRAPH +0xE6D1 0x8D04 #CJK UNIFIED IDEOGRAPH +0xE6D2 0x8D05 #CJK UNIFIED IDEOGRAPH +0xE6D3 0x8D0A #CJK UNIFIED IDEOGRAPH +0xE6D4 0x8D07 #CJK UNIFIED IDEOGRAPH +0xE6D5 0x8D0F #CJK UNIFIED IDEOGRAPH +0xE6D6 0x8D0D #CJK UNIFIED IDEOGRAPH +0xE6D7 0x8D10 #CJK UNIFIED IDEOGRAPH +0xE6D8 0x9F4E #CJK UNIFIED IDEOGRAPH +0xE6D9 0x8D13 #CJK UNIFIED IDEOGRAPH +0xE6DA 0x8CCD #CJK UNIFIED IDEOGRAPH +0xE6DB 0x8D14 #CJK UNIFIED IDEOGRAPH +0xE6DC 0x8D16 #CJK UNIFIED IDEOGRAPH +0xE6DD 0x8D67 #CJK UNIFIED IDEOGRAPH +0xE6DE 0x8D6D #CJK UNIFIED IDEOGRAPH +0xE6DF 0x8D71 #CJK UNIFIED IDEOGRAPH +0xE6E0 0x8D73 #CJK UNIFIED IDEOGRAPH +0xE6E1 0x8D81 #CJK UNIFIED IDEOGRAPH +0xE6E2 0x8D99 #CJK UNIFIED IDEOGRAPH +0xE6E3 0x8DC2 #CJK UNIFIED IDEOGRAPH +0xE6E4 0x8DBE #CJK UNIFIED IDEOGRAPH +0xE6E5 0x8DBA #CJK UNIFIED IDEOGRAPH +0xE6E6 0x8DCF #CJK UNIFIED IDEOGRAPH +0xE6E7 0x8DDA #CJK UNIFIED IDEOGRAPH +0xE6E8 0x8DD6 #CJK UNIFIED IDEOGRAPH +0xE6E9 0x8DCC #CJK UNIFIED IDEOGRAPH +0xE6EA 0x8DDB #CJK UNIFIED IDEOGRAPH +0xE6EB 0x8DCB #CJK UNIFIED IDEOGRAPH +0xE6EC 0x8DEA #CJK UNIFIED IDEOGRAPH +0xE6ED 0x8DEB #CJK UNIFIED IDEOGRAPH +0xE6EE 0x8DDF #CJK UNIFIED IDEOGRAPH +0xE6EF 0x8DE3 #CJK UNIFIED IDEOGRAPH +0xE6F0 0x8DFC #CJK UNIFIED IDEOGRAPH +0xE6F1 0x8E08 #CJK UNIFIED IDEOGRAPH +0xE6F2 0x8E09 #CJK UNIFIED IDEOGRAPH +0xE6F3 0x8DFF #CJK UNIFIED IDEOGRAPH +0xE6F4 0x8E1D #CJK UNIFIED IDEOGRAPH +0xE6F5 0x8E1E #CJK UNIFIED IDEOGRAPH +0xE6F6 0x8E10 #CJK UNIFIED IDEOGRAPH +0xE6F7 0x8E1F #CJK UNIFIED IDEOGRAPH +0xE6F8 0x8E42 #CJK UNIFIED IDEOGRAPH +0xE6F9 0x8E35 #CJK UNIFIED IDEOGRAPH +0xE6FA 0x8E30 #CJK UNIFIED IDEOGRAPH +0xE6FB 0x8E34 #CJK UNIFIED IDEOGRAPH +0xE6FC 0x8E4A #CJK UNIFIED IDEOGRAPH +0xE740 0x8E47 #CJK UNIFIED IDEOGRAPH +0xE741 0x8E49 #CJK UNIFIED IDEOGRAPH +0xE742 0x8E4C #CJK UNIFIED IDEOGRAPH +0xE743 0x8E50 #CJK UNIFIED IDEOGRAPH +0xE744 0x8E48 #CJK UNIFIED IDEOGRAPH +0xE745 0x8E59 #CJK UNIFIED IDEOGRAPH +0xE746 0x8E64 #CJK UNIFIED IDEOGRAPH +0xE747 0x8E60 #CJK UNIFIED IDEOGRAPH +0xE748 0x8E2A #CJK UNIFIED IDEOGRAPH +0xE749 0x8E63 #CJK UNIFIED IDEOGRAPH +0xE74A 0x8E55 #CJK UNIFIED IDEOGRAPH +0xE74B 0x8E76 #CJK UNIFIED IDEOGRAPH +0xE74C 0x8E72 #CJK UNIFIED IDEOGRAPH +0xE74D 0x8E7C #CJK UNIFIED IDEOGRAPH +0xE74E 0x8E81 #CJK UNIFIED IDEOGRAPH +0xE74F 0x8E87 #CJK UNIFIED IDEOGRAPH +0xE750 0x8E85 #CJK UNIFIED IDEOGRAPH +0xE751 0x8E84 #CJK UNIFIED IDEOGRAPH +0xE752 0x8E8B #CJK UNIFIED IDEOGRAPH +0xE753 0x8E8A #CJK UNIFIED IDEOGRAPH +0xE754 0x8E93 #CJK UNIFIED IDEOGRAPH +0xE755 0x8E91 #CJK UNIFIED IDEOGRAPH +0xE756 0x8E94 #CJK UNIFIED IDEOGRAPH +0xE757 0x8E99 #CJK UNIFIED IDEOGRAPH +0xE758 0x8EAA #CJK UNIFIED IDEOGRAPH +0xE759 0x8EA1 #CJK UNIFIED IDEOGRAPH +0xE75A 0x8EAC #CJK UNIFIED IDEOGRAPH +0xE75B 0x8EB0 #CJK UNIFIED IDEOGRAPH +0xE75C 0x8EC6 #CJK UNIFIED IDEOGRAPH +0xE75D 0x8EB1 #CJK UNIFIED IDEOGRAPH +0xE75E 0x8EBE #CJK UNIFIED IDEOGRAPH +0xE75F 0x8EC5 #CJK UNIFIED IDEOGRAPH +0xE760 0x8EC8 #CJK UNIFIED IDEOGRAPH +0xE761 0x8ECB #CJK UNIFIED IDEOGRAPH +0xE762 0x8EDB #CJK UNIFIED IDEOGRAPH +0xE763 0x8EE3 #CJK UNIFIED IDEOGRAPH +0xE764 0x8EFC #CJK UNIFIED IDEOGRAPH +0xE765 0x8EFB #CJK UNIFIED IDEOGRAPH +0xE766 0x8EEB #CJK UNIFIED IDEOGRAPH +0xE767 0x8EFE #CJK UNIFIED IDEOGRAPH +0xE768 0x8F0A #CJK UNIFIED IDEOGRAPH +0xE769 0x8F05 #CJK UNIFIED IDEOGRAPH +0xE76A 0x8F15 #CJK UNIFIED IDEOGRAPH +0xE76B 0x8F12 #CJK UNIFIED IDEOGRAPH +0xE76C 0x8F19 #CJK UNIFIED IDEOGRAPH +0xE76D 0x8F13 #CJK UNIFIED IDEOGRAPH +0xE76E 0x8F1C #CJK UNIFIED IDEOGRAPH +0xE76F 0x8F1F #CJK UNIFIED IDEOGRAPH +0xE770 0x8F1B #CJK UNIFIED IDEOGRAPH +0xE771 0x8F0C #CJK UNIFIED IDEOGRAPH +0xE772 0x8F26 #CJK UNIFIED IDEOGRAPH +0xE773 0x8F33 #CJK UNIFIED IDEOGRAPH +0xE774 0x8F3B #CJK UNIFIED IDEOGRAPH +0xE775 0x8F39 #CJK UNIFIED IDEOGRAPH +0xE776 0x8F45 #CJK UNIFIED IDEOGRAPH +0xE777 0x8F42 #CJK UNIFIED IDEOGRAPH +0xE778 0x8F3E #CJK UNIFIED IDEOGRAPH +0xE779 0x8F4C #CJK UNIFIED IDEOGRAPH +0xE77A 0x8F49 #CJK UNIFIED IDEOGRAPH +0xE77B 0x8F46 #CJK UNIFIED IDEOGRAPH +0xE77C 0x8F4E #CJK UNIFIED IDEOGRAPH +0xE77D 0x8F57 #CJK UNIFIED IDEOGRAPH +0xE77E 0x8F5C #CJK UNIFIED IDEOGRAPH +0xE780 0x8F62 #CJK UNIFIED IDEOGRAPH +0xE781 0x8F63 #CJK UNIFIED IDEOGRAPH +0xE782 0x8F64 #CJK UNIFIED IDEOGRAPH +0xE783 0x8F9C #CJK UNIFIED IDEOGRAPH +0xE784 0x8F9F #CJK UNIFIED IDEOGRAPH +0xE785 0x8FA3 #CJK UNIFIED IDEOGRAPH +0xE786 0x8FAD #CJK UNIFIED IDEOGRAPH +0xE787 0x8FAF #CJK UNIFIED IDEOGRAPH +0xE788 0x8FB7 #CJK UNIFIED IDEOGRAPH +0xE789 0x8FDA #CJK UNIFIED IDEOGRAPH +0xE78A 0x8FE5 #CJK UNIFIED IDEOGRAPH +0xE78B 0x8FE2 #CJK UNIFIED IDEOGRAPH +0xE78C 0x8FEA #CJK UNIFIED IDEOGRAPH +0xE78D 0x8FEF #CJK UNIFIED IDEOGRAPH +0xE78E 0x9087 #CJK UNIFIED IDEOGRAPH +0xE78F 0x8FF4 #CJK UNIFIED IDEOGRAPH +0xE790 0x9005 #CJK UNIFIED IDEOGRAPH +0xE791 0x8FF9 #CJK UNIFIED IDEOGRAPH +0xE792 0x8FFA #CJK UNIFIED IDEOGRAPH +0xE793 0x9011 #CJK UNIFIED IDEOGRAPH +0xE794 0x9015 #CJK UNIFIED IDEOGRAPH +0xE795 0x9021 #CJK UNIFIED IDEOGRAPH +0xE796 0x900D #CJK UNIFIED IDEOGRAPH +0xE797 0x901E #CJK UNIFIED IDEOGRAPH +0xE798 0x9016 #CJK UNIFIED IDEOGRAPH +0xE799 0x900B #CJK UNIFIED IDEOGRAPH +0xE79A 0x9027 #CJK UNIFIED IDEOGRAPH +0xE79B 0x9036 #CJK UNIFIED IDEOGRAPH +0xE79C 0x9035 #CJK UNIFIED IDEOGRAPH +0xE79D 0x9039 #CJK UNIFIED IDEOGRAPH +0xE79E 0x8FF8 #CJK UNIFIED IDEOGRAPH +0xE79F 0x904F #CJK UNIFIED IDEOGRAPH +0xE7A0 0x9050 #CJK UNIFIED IDEOGRAPH +0xE7A1 0x9051 #CJK UNIFIED IDEOGRAPH +0xE7A2 0x9052 #CJK UNIFIED IDEOGRAPH +0xE7A3 0x900E #CJK UNIFIED IDEOGRAPH +0xE7A4 0x9049 #CJK UNIFIED IDEOGRAPH +0xE7A5 0x903E #CJK UNIFIED IDEOGRAPH +0xE7A6 0x9056 #CJK UNIFIED IDEOGRAPH +0xE7A7 0x9058 #CJK UNIFIED IDEOGRAPH +0xE7A8 0x905E #CJK UNIFIED IDEOGRAPH +0xE7A9 0x9068 #CJK UNIFIED IDEOGRAPH +0xE7AA 0x906F #CJK UNIFIED IDEOGRAPH +0xE7AB 0x9076 #CJK UNIFIED IDEOGRAPH +0xE7AC 0x96A8 #CJK UNIFIED IDEOGRAPH +0xE7AD 0x9072 #CJK UNIFIED IDEOGRAPH +0xE7AE 0x9082 #CJK UNIFIED IDEOGRAPH +0xE7AF 0x907D #CJK UNIFIED IDEOGRAPH +0xE7B0 0x9081 #CJK UNIFIED IDEOGRAPH +0xE7B1 0x9080 #CJK UNIFIED IDEOGRAPH +0xE7B2 0x908A #CJK UNIFIED IDEOGRAPH +0xE7B3 0x9089 #CJK UNIFIED IDEOGRAPH +0xE7B4 0x908F #CJK UNIFIED IDEOGRAPH +0xE7B5 0x90A8 #CJK UNIFIED IDEOGRAPH +0xE7B6 0x90AF #CJK UNIFIED IDEOGRAPH +0xE7B7 0x90B1 #CJK UNIFIED IDEOGRAPH +0xE7B8 0x90B5 #CJK UNIFIED IDEOGRAPH +0xE7B9 0x90E2 #CJK UNIFIED IDEOGRAPH +0xE7BA 0x90E4 #CJK UNIFIED IDEOGRAPH +0xE7BB 0x6248 #CJK UNIFIED IDEOGRAPH +0xE7BC 0x90DB #CJK UNIFIED IDEOGRAPH +0xE7BD 0x9102 #CJK UNIFIED IDEOGRAPH +0xE7BE 0x9112 #CJK UNIFIED IDEOGRAPH +0xE7BF 0x9119 #CJK UNIFIED IDEOGRAPH +0xE7C0 0x9132 #CJK UNIFIED IDEOGRAPH +0xE7C1 0x9130 #CJK UNIFIED IDEOGRAPH +0xE7C2 0x914A #CJK UNIFIED IDEOGRAPH +0xE7C3 0x9156 #CJK UNIFIED IDEOGRAPH +0xE7C4 0x9158 #CJK UNIFIED IDEOGRAPH +0xE7C5 0x9163 #CJK UNIFIED IDEOGRAPH +0xE7C6 0x9165 #CJK UNIFIED IDEOGRAPH +0xE7C7 0x9169 #CJK UNIFIED IDEOGRAPH +0xE7C8 0x9173 #CJK UNIFIED IDEOGRAPH +0xE7C9 0x9172 #CJK UNIFIED IDEOGRAPH +0xE7CA 0x918B #CJK UNIFIED IDEOGRAPH +0xE7CB 0x9189 #CJK UNIFIED IDEOGRAPH +0xE7CC 0x9182 #CJK UNIFIED IDEOGRAPH +0xE7CD 0x91A2 #CJK UNIFIED IDEOGRAPH +0xE7CE 0x91AB #CJK UNIFIED IDEOGRAPH +0xE7CF 0x91AF #CJK UNIFIED IDEOGRAPH +0xE7D0 0x91AA #CJK UNIFIED IDEOGRAPH +0xE7D1 0x91B5 #CJK UNIFIED IDEOGRAPH +0xE7D2 0x91B4 #CJK UNIFIED IDEOGRAPH +0xE7D3 0x91BA #CJK UNIFIED IDEOGRAPH +0xE7D4 0x91C0 #CJK UNIFIED IDEOGRAPH +0xE7D5 0x91C1 #CJK UNIFIED IDEOGRAPH +0xE7D6 0x91C9 #CJK UNIFIED IDEOGRAPH +0xE7D7 0x91CB #CJK UNIFIED IDEOGRAPH +0xE7D8 0x91D0 #CJK UNIFIED IDEOGRAPH +0xE7D9 0x91D6 #CJK UNIFIED IDEOGRAPH +0xE7DA 0x91DF #CJK UNIFIED IDEOGRAPH +0xE7DB 0x91E1 #CJK UNIFIED IDEOGRAPH +0xE7DC 0x91DB #CJK UNIFIED IDEOGRAPH +0xE7DD 0x91FC #CJK UNIFIED IDEOGRAPH +0xE7DE 0x91F5 #CJK UNIFIED IDEOGRAPH +0xE7DF 0x91F6 #CJK UNIFIED IDEOGRAPH +0xE7E0 0x921E #CJK UNIFIED IDEOGRAPH +0xE7E1 0x91FF #CJK UNIFIED IDEOGRAPH +0xE7E2 0x9214 #CJK UNIFIED IDEOGRAPH +0xE7E3 0x922C #CJK UNIFIED IDEOGRAPH +0xE7E4 0x9215 #CJK UNIFIED IDEOGRAPH +0xE7E5 0x9211 #CJK UNIFIED IDEOGRAPH +0xE7E6 0x925E #CJK UNIFIED IDEOGRAPH +0xE7E7 0x9257 #CJK UNIFIED IDEOGRAPH +0xE7E8 0x9245 #CJK UNIFIED IDEOGRAPH +0xE7E9 0x9249 #CJK UNIFIED IDEOGRAPH +0xE7EA 0x9264 #CJK UNIFIED IDEOGRAPH +0xE7EB 0x9248 #CJK UNIFIED IDEOGRAPH +0xE7EC 0x9295 #CJK UNIFIED IDEOGRAPH +0xE7ED 0x923F #CJK UNIFIED IDEOGRAPH +0xE7EE 0x924B #CJK UNIFIED IDEOGRAPH +0xE7EF 0x9250 #CJK UNIFIED IDEOGRAPH +0xE7F0 0x929C #CJK UNIFIED IDEOGRAPH +0xE7F1 0x9296 #CJK UNIFIED IDEOGRAPH +0xE7F2 0x9293 #CJK UNIFIED IDEOGRAPH +0xE7F3 0x929B #CJK UNIFIED IDEOGRAPH +0xE7F4 0x925A #CJK UNIFIED IDEOGRAPH +0xE7F5 0x92CF #CJK UNIFIED IDEOGRAPH +0xE7F6 0x92B9 #CJK UNIFIED IDEOGRAPH +0xE7F7 0x92B7 #CJK UNIFIED IDEOGRAPH +0xE7F8 0x92E9 #CJK UNIFIED IDEOGRAPH +0xE7F9 0x930F #CJK UNIFIED IDEOGRAPH +0xE7FA 0x92FA #CJK UNIFIED IDEOGRAPH +0xE7FB 0x9344 #CJK UNIFIED IDEOGRAPH +0xE7FC 0x932E #CJK UNIFIED IDEOGRAPH +0xE840 0x9319 #CJK UNIFIED IDEOGRAPH +0xE841 0x9322 #CJK UNIFIED IDEOGRAPH +0xE842 0x931A #CJK UNIFIED IDEOGRAPH +0xE843 0x9323 #CJK UNIFIED IDEOGRAPH +0xE844 0x933A #CJK UNIFIED IDEOGRAPH +0xE845 0x9335 #CJK UNIFIED IDEOGRAPH +0xE846 0x933B #CJK UNIFIED IDEOGRAPH +0xE847 0x935C #CJK UNIFIED IDEOGRAPH +0xE848 0x9360 #CJK UNIFIED IDEOGRAPH +0xE849 0x937C #CJK UNIFIED IDEOGRAPH +0xE84A 0x936E #CJK UNIFIED IDEOGRAPH +0xE84B 0x9356 #CJK UNIFIED IDEOGRAPH +0xE84C 0x93B0 #CJK UNIFIED IDEOGRAPH +0xE84D 0x93AC #CJK UNIFIED IDEOGRAPH +0xE84E 0x93AD #CJK UNIFIED IDEOGRAPH +0xE84F 0x9394 #CJK UNIFIED IDEOGRAPH +0xE850 0x93B9 #CJK UNIFIED IDEOGRAPH +0xE851 0x93D6 #CJK UNIFIED IDEOGRAPH +0xE852 0x93D7 #CJK UNIFIED IDEOGRAPH +0xE853 0x93E8 #CJK UNIFIED IDEOGRAPH +0xE854 0x93E5 #CJK UNIFIED IDEOGRAPH +0xE855 0x93D8 #CJK UNIFIED IDEOGRAPH +0xE856 0x93C3 #CJK UNIFIED IDEOGRAPH +0xE857 0x93DD #CJK UNIFIED IDEOGRAPH +0xE858 0x93D0 #CJK UNIFIED IDEOGRAPH +0xE859 0x93C8 #CJK UNIFIED IDEOGRAPH +0xE85A 0x93E4 #CJK UNIFIED IDEOGRAPH +0xE85B 0x941A #CJK UNIFIED IDEOGRAPH +0xE85C 0x9414 #CJK UNIFIED IDEOGRAPH +0xE85D 0x9413 #CJK UNIFIED IDEOGRAPH +0xE85E 0x9403 #CJK UNIFIED IDEOGRAPH +0xE85F 0x9407 #CJK UNIFIED IDEOGRAPH +0xE860 0x9410 #CJK UNIFIED IDEOGRAPH +0xE861 0x9436 #CJK UNIFIED IDEOGRAPH +0xE862 0x942B #CJK UNIFIED IDEOGRAPH +0xE863 0x9435 #CJK UNIFIED IDEOGRAPH +0xE864 0x9421 #CJK UNIFIED IDEOGRAPH +0xE865 0x943A #CJK UNIFIED IDEOGRAPH +0xE866 0x9441 #CJK UNIFIED IDEOGRAPH +0xE867 0x9452 #CJK UNIFIED IDEOGRAPH +0xE868 0x9444 #CJK UNIFIED IDEOGRAPH +0xE869 0x945B #CJK UNIFIED IDEOGRAPH +0xE86A 0x9460 #CJK UNIFIED IDEOGRAPH +0xE86B 0x9462 #CJK UNIFIED IDEOGRAPH +0xE86C 0x945E #CJK UNIFIED IDEOGRAPH +0xE86D 0x946A #CJK UNIFIED IDEOGRAPH +0xE86E 0x9229 #CJK UNIFIED IDEOGRAPH +0xE86F 0x9470 #CJK UNIFIED IDEOGRAPH +0xE870 0x9475 #CJK UNIFIED IDEOGRAPH +0xE871 0x9477 #CJK UNIFIED IDEOGRAPH +0xE872 0x947D #CJK UNIFIED IDEOGRAPH +0xE873 0x945A #CJK UNIFIED IDEOGRAPH +0xE874 0x947C #CJK UNIFIED IDEOGRAPH +0xE875 0x947E #CJK UNIFIED IDEOGRAPH +0xE876 0x9481 #CJK UNIFIED IDEOGRAPH +0xE877 0x947F #CJK UNIFIED IDEOGRAPH +0xE878 0x9582 #CJK UNIFIED IDEOGRAPH +0xE879 0x9587 #CJK UNIFIED IDEOGRAPH +0xE87A 0x958A #CJK UNIFIED IDEOGRAPH +0xE87B 0x9594 #CJK UNIFIED IDEOGRAPH +0xE87C 0x9596 #CJK UNIFIED IDEOGRAPH +0xE87D 0x9598 #CJK UNIFIED IDEOGRAPH +0xE87E 0x9599 #CJK UNIFIED IDEOGRAPH +0xE880 0x95A0 #CJK UNIFIED IDEOGRAPH +0xE881 0x95A8 #CJK UNIFIED IDEOGRAPH +0xE882 0x95A7 #CJK UNIFIED IDEOGRAPH +0xE883 0x95AD #CJK UNIFIED IDEOGRAPH +0xE884 0x95BC #CJK UNIFIED IDEOGRAPH +0xE885 0x95BB #CJK UNIFIED IDEOGRAPH +0xE886 0x95B9 #CJK UNIFIED IDEOGRAPH +0xE887 0x95BE #CJK UNIFIED IDEOGRAPH +0xE888 0x95CA #CJK UNIFIED IDEOGRAPH +0xE889 0x6FF6 #CJK UNIFIED IDEOGRAPH +0xE88A 0x95C3 #CJK UNIFIED IDEOGRAPH +0xE88B 0x95CD #CJK UNIFIED IDEOGRAPH +0xE88C 0x95CC #CJK UNIFIED IDEOGRAPH +0xE88D 0x95D5 #CJK UNIFIED IDEOGRAPH +0xE88E 0x95D4 #CJK UNIFIED IDEOGRAPH +0xE88F 0x95D6 #CJK UNIFIED IDEOGRAPH +0xE890 0x95DC #CJK UNIFIED IDEOGRAPH +0xE891 0x95E1 #CJK UNIFIED IDEOGRAPH +0xE892 0x95E5 #CJK UNIFIED IDEOGRAPH +0xE893 0x95E2 #CJK UNIFIED IDEOGRAPH +0xE894 0x9621 #CJK UNIFIED IDEOGRAPH +0xE895 0x9628 #CJK UNIFIED IDEOGRAPH +0xE896 0x962E #CJK UNIFIED IDEOGRAPH +0xE897 0x962F #CJK UNIFIED IDEOGRAPH +0xE898 0x9642 #CJK UNIFIED IDEOGRAPH +0xE899 0x964C #CJK UNIFIED IDEOGRAPH +0xE89A 0x964F #CJK UNIFIED IDEOGRAPH +0xE89B 0x964B #CJK UNIFIED IDEOGRAPH +0xE89C 0x9677 #CJK UNIFIED IDEOGRAPH +0xE89D 0x965C #CJK UNIFIED IDEOGRAPH +0xE89E 0x965E #CJK UNIFIED IDEOGRAPH +0xE89F 0x965D #CJK UNIFIED IDEOGRAPH +0xE8A0 0x965F #CJK UNIFIED IDEOGRAPH +0xE8A1 0x9666 #CJK UNIFIED IDEOGRAPH +0xE8A2 0x9672 #CJK UNIFIED IDEOGRAPH +0xE8A3 0x966C #CJK UNIFIED IDEOGRAPH +0xE8A4 0x968D #CJK UNIFIED IDEOGRAPH +0xE8A5 0x9698 #CJK UNIFIED IDEOGRAPH +0xE8A6 0x9695 #CJK UNIFIED IDEOGRAPH +0xE8A7 0x9697 #CJK UNIFIED IDEOGRAPH +0xE8A8 0x96AA #CJK UNIFIED IDEOGRAPH +0xE8A9 0x96A7 #CJK UNIFIED IDEOGRAPH +0xE8AA 0x96B1 #CJK UNIFIED IDEOGRAPH +0xE8AB 0x96B2 #CJK UNIFIED IDEOGRAPH +0xE8AC 0x96B0 #CJK UNIFIED IDEOGRAPH +0xE8AD 0x96B4 #CJK UNIFIED IDEOGRAPH +0xE8AE 0x96B6 #CJK UNIFIED IDEOGRAPH +0xE8AF 0x96B8 #CJK UNIFIED IDEOGRAPH +0xE8B0 0x96B9 #CJK UNIFIED IDEOGRAPH +0xE8B1 0x96CE #CJK UNIFIED IDEOGRAPH +0xE8B2 0x96CB #CJK UNIFIED IDEOGRAPH +0xE8B3 0x96C9 #CJK UNIFIED IDEOGRAPH +0xE8B4 0x96CD #CJK UNIFIED IDEOGRAPH +0xE8B5 0x894D #CJK UNIFIED IDEOGRAPH +0xE8B6 0x96DC #CJK UNIFIED IDEOGRAPH +0xE8B7 0x970D #CJK UNIFIED IDEOGRAPH +0xE8B8 0x96D5 #CJK UNIFIED IDEOGRAPH +0xE8B9 0x96F9 #CJK UNIFIED IDEOGRAPH +0xE8BA 0x9704 #CJK UNIFIED IDEOGRAPH +0xE8BB 0x9706 #CJK UNIFIED IDEOGRAPH +0xE8BC 0x9708 #CJK UNIFIED IDEOGRAPH +0xE8BD 0x9713 #CJK UNIFIED IDEOGRAPH +0xE8BE 0x970E #CJK UNIFIED IDEOGRAPH +0xE8BF 0x9711 #CJK UNIFIED IDEOGRAPH +0xE8C0 0x970F #CJK UNIFIED IDEOGRAPH +0xE8C1 0x9716 #CJK UNIFIED IDEOGRAPH +0xE8C2 0x9719 #CJK UNIFIED IDEOGRAPH +0xE8C3 0x9724 #CJK UNIFIED IDEOGRAPH +0xE8C4 0x972A #CJK UNIFIED IDEOGRAPH +0xE8C5 0x9730 #CJK UNIFIED IDEOGRAPH +0xE8C6 0x9739 #CJK UNIFIED IDEOGRAPH +0xE8C7 0x973D #CJK UNIFIED IDEOGRAPH +0xE8C8 0x973E #CJK UNIFIED IDEOGRAPH +0xE8C9 0x9744 #CJK UNIFIED IDEOGRAPH +0xE8CA 0x9746 #CJK UNIFIED IDEOGRAPH +0xE8CB 0x9748 #CJK UNIFIED IDEOGRAPH +0xE8CC 0x9742 #CJK UNIFIED IDEOGRAPH +0xE8CD 0x9749 #CJK UNIFIED IDEOGRAPH +0xE8CE 0x975C #CJK UNIFIED IDEOGRAPH +0xE8CF 0x9760 #CJK UNIFIED IDEOGRAPH +0xE8D0 0x9764 #CJK UNIFIED IDEOGRAPH +0xE8D1 0x9766 #CJK UNIFIED IDEOGRAPH +0xE8D2 0x9768 #CJK UNIFIED IDEOGRAPH +0xE8D3 0x52D2 #CJK UNIFIED IDEOGRAPH +0xE8D4 0x976B #CJK UNIFIED IDEOGRAPH +0xE8D5 0x9771 #CJK UNIFIED IDEOGRAPH +0xE8D6 0x9779 #CJK UNIFIED IDEOGRAPH +0xE8D7 0x9785 #CJK UNIFIED IDEOGRAPH +0xE8D8 0x977C #CJK UNIFIED IDEOGRAPH +0xE8D9 0x9781 #CJK UNIFIED IDEOGRAPH +0xE8DA 0x977A #CJK UNIFIED IDEOGRAPH +0xE8DB 0x9786 #CJK UNIFIED IDEOGRAPH +0xE8DC 0x978B #CJK UNIFIED IDEOGRAPH +0xE8DD 0x978F #CJK UNIFIED IDEOGRAPH +0xE8DE 0x9790 #CJK UNIFIED IDEOGRAPH +0xE8DF 0x979C #CJK UNIFIED IDEOGRAPH +0xE8E0 0x97A8 #CJK UNIFIED IDEOGRAPH +0xE8E1 0x97A6 #CJK UNIFIED IDEOGRAPH +0xE8E2 0x97A3 #CJK UNIFIED IDEOGRAPH +0xE8E3 0x97B3 #CJK UNIFIED IDEOGRAPH +0xE8E4 0x97B4 #CJK UNIFIED IDEOGRAPH +0xE8E5 0x97C3 #CJK UNIFIED IDEOGRAPH +0xE8E6 0x97C6 #CJK UNIFIED IDEOGRAPH +0xE8E7 0x97C8 #CJK UNIFIED IDEOGRAPH +0xE8E8 0x97CB #CJK UNIFIED IDEOGRAPH +0xE8E9 0x97DC #CJK UNIFIED IDEOGRAPH +0xE8EA 0x97ED #CJK UNIFIED IDEOGRAPH +0xE8EB 0x9F4F #CJK UNIFIED IDEOGRAPH +0xE8EC 0x97F2 #CJK UNIFIED IDEOGRAPH +0xE8ED 0x7ADF #CJK UNIFIED IDEOGRAPH +0xE8EE 0x97F6 #CJK UNIFIED IDEOGRAPH +0xE8EF 0x97F5 #CJK UNIFIED IDEOGRAPH +0xE8F0 0x980F #CJK UNIFIED IDEOGRAPH +0xE8F1 0x980C #CJK UNIFIED IDEOGRAPH +0xE8F2 0x9838 #CJK UNIFIED IDEOGRAPH +0xE8F3 0x9824 #CJK UNIFIED IDEOGRAPH +0xE8F4 0x9821 #CJK UNIFIED IDEOGRAPH +0xE8F5 0x9837 #CJK UNIFIED IDEOGRAPH +0xE8F6 0x983D #CJK UNIFIED IDEOGRAPH +0xE8F7 0x9846 #CJK UNIFIED IDEOGRAPH +0xE8F8 0x984F #CJK UNIFIED IDEOGRAPH +0xE8F9 0x984B #CJK UNIFIED IDEOGRAPH +0xE8FA 0x986B #CJK UNIFIED IDEOGRAPH +0xE8FB 0x986F #CJK UNIFIED IDEOGRAPH +0xE8FC 0x9870 #CJK UNIFIED IDEOGRAPH +0xE940 0x9871 #CJK UNIFIED IDEOGRAPH +0xE941 0x9874 #CJK UNIFIED IDEOGRAPH +0xE942 0x9873 #CJK UNIFIED IDEOGRAPH +0xE943 0x98AA #CJK UNIFIED IDEOGRAPH +0xE944 0x98AF #CJK UNIFIED IDEOGRAPH +0xE945 0x98B1 #CJK UNIFIED IDEOGRAPH +0xE946 0x98B6 #CJK UNIFIED IDEOGRAPH +0xE947 0x98C4 #CJK UNIFIED IDEOGRAPH +0xE948 0x98C3 #CJK UNIFIED IDEOGRAPH +0xE949 0x98C6 #CJK UNIFIED IDEOGRAPH +0xE94A 0x98E9 #CJK UNIFIED IDEOGRAPH +0xE94B 0x98EB #CJK UNIFIED IDEOGRAPH +0xE94C 0x9903 #CJK UNIFIED IDEOGRAPH +0xE94D 0x9909 #CJK UNIFIED IDEOGRAPH +0xE94E 0x9912 #CJK UNIFIED IDEOGRAPH +0xE94F 0x9914 #CJK UNIFIED IDEOGRAPH +0xE950 0x9918 #CJK UNIFIED IDEOGRAPH +0xE951 0x9921 #CJK UNIFIED IDEOGRAPH +0xE952 0x991D #CJK UNIFIED IDEOGRAPH +0xE953 0x991E #CJK UNIFIED IDEOGRAPH +0xE954 0x9924 #CJK UNIFIED IDEOGRAPH +0xE955 0x9920 #CJK UNIFIED IDEOGRAPH +0xE956 0x992C #CJK UNIFIED IDEOGRAPH +0xE957 0x992E #CJK UNIFIED IDEOGRAPH +0xE958 0x993D #CJK UNIFIED IDEOGRAPH +0xE959 0x993E #CJK UNIFIED IDEOGRAPH +0xE95A 0x9942 #CJK UNIFIED IDEOGRAPH +0xE95B 0x9949 #CJK UNIFIED IDEOGRAPH +0xE95C 0x9945 #CJK UNIFIED IDEOGRAPH +0xE95D 0x9950 #CJK UNIFIED IDEOGRAPH +0xE95E 0x994B #CJK UNIFIED IDEOGRAPH +0xE95F 0x9951 #CJK UNIFIED IDEOGRAPH +0xE960 0x9952 #CJK UNIFIED IDEOGRAPH +0xE961 0x994C #CJK UNIFIED IDEOGRAPH +0xE962 0x9955 #CJK UNIFIED IDEOGRAPH +0xE963 0x9997 #CJK UNIFIED IDEOGRAPH +0xE964 0x9998 #CJK UNIFIED IDEOGRAPH +0xE965 0x99A5 #CJK UNIFIED IDEOGRAPH +0xE966 0x99AD #CJK UNIFIED IDEOGRAPH +0xE967 0x99AE #CJK UNIFIED IDEOGRAPH +0xE968 0x99BC #CJK UNIFIED IDEOGRAPH +0xE969 0x99DF #CJK UNIFIED IDEOGRAPH +0xE96A 0x99DB #CJK UNIFIED IDEOGRAPH +0xE96B 0x99DD #CJK UNIFIED IDEOGRAPH +0xE96C 0x99D8 #CJK UNIFIED IDEOGRAPH +0xE96D 0x99D1 #CJK UNIFIED IDEOGRAPH +0xE96E 0x99ED #CJK UNIFIED IDEOGRAPH +0xE96F 0x99EE #CJK UNIFIED IDEOGRAPH +0xE970 0x99F1 #CJK UNIFIED IDEOGRAPH +0xE971 0x99F2 #CJK UNIFIED IDEOGRAPH +0xE972 0x99FB #CJK UNIFIED IDEOGRAPH +0xE973 0x99F8 #CJK UNIFIED IDEOGRAPH +0xE974 0x9A01 #CJK UNIFIED IDEOGRAPH +0xE975 0x9A0F #CJK UNIFIED IDEOGRAPH +0xE976 0x9A05 #CJK UNIFIED IDEOGRAPH +0xE977 0x99E2 #CJK UNIFIED IDEOGRAPH +0xE978 0x9A19 #CJK UNIFIED IDEOGRAPH +0xE979 0x9A2B #CJK UNIFIED IDEOGRAPH +0xE97A 0x9A37 #CJK UNIFIED IDEOGRAPH +0xE97B 0x9A45 #CJK UNIFIED IDEOGRAPH +0xE97C 0x9A42 #CJK UNIFIED IDEOGRAPH +0xE97D 0x9A40 #CJK UNIFIED IDEOGRAPH +0xE97E 0x9A43 #CJK UNIFIED IDEOGRAPH +0xE980 0x9A3E #CJK UNIFIED IDEOGRAPH +0xE981 0x9A55 #CJK UNIFIED IDEOGRAPH +0xE982 0x9A4D #CJK UNIFIED IDEOGRAPH +0xE983 0x9A5B #CJK UNIFIED IDEOGRAPH +0xE984 0x9A57 #CJK UNIFIED IDEOGRAPH +0xE985 0x9A5F #CJK UNIFIED IDEOGRAPH +0xE986 0x9A62 #CJK UNIFIED IDEOGRAPH +0xE987 0x9A65 #CJK UNIFIED IDEOGRAPH +0xE988 0x9A64 #CJK UNIFIED IDEOGRAPH +0xE989 0x9A69 #CJK UNIFIED IDEOGRAPH +0xE98A 0x9A6B #CJK UNIFIED IDEOGRAPH +0xE98B 0x9A6A #CJK UNIFIED IDEOGRAPH +0xE98C 0x9AAD #CJK UNIFIED IDEOGRAPH +0xE98D 0x9AB0 #CJK UNIFIED IDEOGRAPH +0xE98E 0x9ABC #CJK UNIFIED IDEOGRAPH +0xE98F 0x9AC0 #CJK UNIFIED IDEOGRAPH +0xE990 0x9ACF #CJK UNIFIED IDEOGRAPH +0xE991 0x9AD1 #CJK UNIFIED IDEOGRAPH +0xE992 0x9AD3 #CJK UNIFIED IDEOGRAPH +0xE993 0x9AD4 #CJK UNIFIED IDEOGRAPH +0xE994 0x9ADE #CJK UNIFIED IDEOGRAPH +0xE995 0x9ADF #CJK UNIFIED IDEOGRAPH +0xE996 0x9AE2 #CJK UNIFIED IDEOGRAPH +0xE997 0x9AE3 #CJK UNIFIED IDEOGRAPH +0xE998 0x9AE6 #CJK UNIFIED IDEOGRAPH +0xE999 0x9AEF #CJK UNIFIED IDEOGRAPH +0xE99A 0x9AEB #CJK UNIFIED IDEOGRAPH +0xE99B 0x9AEE #CJK UNIFIED IDEOGRAPH +0xE99C 0x9AF4 #CJK UNIFIED IDEOGRAPH +0xE99D 0x9AF1 #CJK UNIFIED IDEOGRAPH +0xE99E 0x9AF7 #CJK UNIFIED IDEOGRAPH +0xE99F 0x9AFB #CJK UNIFIED IDEOGRAPH +0xE9A0 0x9B06 #CJK UNIFIED IDEOGRAPH +0xE9A1 0x9B18 #CJK UNIFIED IDEOGRAPH +0xE9A2 0x9B1A #CJK UNIFIED IDEOGRAPH +0xE9A3 0x9B1F #CJK UNIFIED IDEOGRAPH +0xE9A4 0x9B22 #CJK UNIFIED IDEOGRAPH +0xE9A5 0x9B23 #CJK UNIFIED IDEOGRAPH +0xE9A6 0x9B25 #CJK UNIFIED IDEOGRAPH +0xE9A7 0x9B27 #CJK UNIFIED IDEOGRAPH +0xE9A8 0x9B28 #CJK UNIFIED IDEOGRAPH +0xE9A9 0x9B29 #CJK UNIFIED IDEOGRAPH +0xE9AA 0x9B2A #CJK UNIFIED IDEOGRAPH +0xE9AB 0x9B2E #CJK UNIFIED IDEOGRAPH +0xE9AC 0x9B2F #CJK UNIFIED IDEOGRAPH +0xE9AD 0x9B32 #CJK UNIFIED IDEOGRAPH +0xE9AE 0x9B44 #CJK UNIFIED IDEOGRAPH +0xE9AF 0x9B43 #CJK UNIFIED IDEOGRAPH +0xE9B0 0x9B4F #CJK UNIFIED IDEOGRAPH +0xE9B1 0x9B4D #CJK UNIFIED IDEOGRAPH +0xE9B2 0x9B4E #CJK UNIFIED IDEOGRAPH +0xE9B3 0x9B51 #CJK UNIFIED IDEOGRAPH +0xE9B4 0x9B58 #CJK UNIFIED IDEOGRAPH +0xE9B5 0x9B74 #CJK UNIFIED IDEOGRAPH +0xE9B6 0x9B93 #CJK UNIFIED IDEOGRAPH +0xE9B7 0x9B83 #CJK UNIFIED IDEOGRAPH +0xE9B8 0x9B91 #CJK UNIFIED IDEOGRAPH +0xE9B9 0x9B96 #CJK UNIFIED IDEOGRAPH +0xE9BA 0x9B97 #CJK UNIFIED IDEOGRAPH +0xE9BB 0x9B9F #CJK UNIFIED IDEOGRAPH +0xE9BC 0x9BA0 #CJK UNIFIED IDEOGRAPH +0xE9BD 0x9BA8 #CJK UNIFIED IDEOGRAPH +0xE9BE 0x9BB4 #CJK UNIFIED IDEOGRAPH +0xE9BF 0x9BC0 #CJK UNIFIED IDEOGRAPH +0xE9C0 0x9BCA #CJK UNIFIED IDEOGRAPH +0xE9C1 0x9BB9 #CJK UNIFIED IDEOGRAPH +0xE9C2 0x9BC6 #CJK UNIFIED IDEOGRAPH +0xE9C3 0x9BCF #CJK UNIFIED IDEOGRAPH +0xE9C4 0x9BD1 #CJK UNIFIED IDEOGRAPH +0xE9C5 0x9BD2 #CJK UNIFIED IDEOGRAPH +0xE9C6 0x9BE3 #CJK UNIFIED IDEOGRAPH +0xE9C7 0x9BE2 #CJK UNIFIED IDEOGRAPH +0xE9C8 0x9BE4 #CJK UNIFIED IDEOGRAPH +0xE9C9 0x9BD4 #CJK UNIFIED IDEOGRAPH +0xE9CA 0x9BE1 #CJK UNIFIED IDEOGRAPH +0xE9CB 0x9C3A #CJK UNIFIED IDEOGRAPH +0xE9CC 0x9BF2 #CJK UNIFIED IDEOGRAPH +0xE9CD 0x9BF1 #CJK UNIFIED IDEOGRAPH +0xE9CE 0x9BF0 #CJK UNIFIED IDEOGRAPH +0xE9CF 0x9C15 #CJK UNIFIED IDEOGRAPH +0xE9D0 0x9C14 #CJK UNIFIED IDEOGRAPH +0xE9D1 0x9C09 #CJK UNIFIED IDEOGRAPH +0xE9D2 0x9C13 #CJK UNIFIED IDEOGRAPH +0xE9D3 0x9C0C #CJK UNIFIED IDEOGRAPH +0xE9D4 0x9C06 #CJK UNIFIED IDEOGRAPH +0xE9D5 0x9C08 #CJK UNIFIED IDEOGRAPH +0xE9D6 0x9C12 #CJK UNIFIED IDEOGRAPH +0xE9D7 0x9C0A #CJK UNIFIED IDEOGRAPH +0xE9D8 0x9C04 #CJK UNIFIED IDEOGRAPH +0xE9D9 0x9C2E #CJK UNIFIED IDEOGRAPH +0xE9DA 0x9C1B #CJK UNIFIED IDEOGRAPH +0xE9DB 0x9C25 #CJK UNIFIED IDEOGRAPH +0xE9DC 0x9C24 #CJK UNIFIED IDEOGRAPH +0xE9DD 0x9C21 #CJK UNIFIED IDEOGRAPH +0xE9DE 0x9C30 #CJK UNIFIED IDEOGRAPH +0xE9DF 0x9C47 #CJK UNIFIED IDEOGRAPH +0xE9E0 0x9C32 #CJK UNIFIED IDEOGRAPH +0xE9E1 0x9C46 #CJK UNIFIED IDEOGRAPH +0xE9E2 0x9C3E #CJK UNIFIED IDEOGRAPH +0xE9E3 0x9C5A #CJK UNIFIED IDEOGRAPH +0xE9E4 0x9C60 #CJK UNIFIED IDEOGRAPH +0xE9E5 0x9C67 #CJK UNIFIED IDEOGRAPH +0xE9E6 0x9C76 #CJK UNIFIED IDEOGRAPH +0xE9E7 0x9C78 #CJK UNIFIED IDEOGRAPH +0xE9E8 0x9CE7 #CJK UNIFIED IDEOGRAPH +0xE9E9 0x9CEC #CJK UNIFIED IDEOGRAPH +0xE9EA 0x9CF0 #CJK UNIFIED IDEOGRAPH +0xE9EB 0x9D09 #CJK UNIFIED IDEOGRAPH +0xE9EC 0x9D08 #CJK UNIFIED IDEOGRAPH +0xE9ED 0x9CEB #CJK UNIFIED IDEOGRAPH +0xE9EE 0x9D03 #CJK UNIFIED IDEOGRAPH +0xE9EF 0x9D06 #CJK UNIFIED IDEOGRAPH +0xE9F0 0x9D2A #CJK UNIFIED IDEOGRAPH +0xE9F1 0x9D26 #CJK UNIFIED IDEOGRAPH +0xE9F2 0x9DAF #CJK UNIFIED IDEOGRAPH +0xE9F3 0x9D23 #CJK UNIFIED IDEOGRAPH +0xE9F4 0x9D1F #CJK UNIFIED IDEOGRAPH +0xE9F5 0x9D44 #CJK UNIFIED IDEOGRAPH +0xE9F6 0x9D15 #CJK UNIFIED IDEOGRAPH +0xE9F7 0x9D12 #CJK UNIFIED IDEOGRAPH +0xE9F8 0x9D41 #CJK UNIFIED IDEOGRAPH +0xE9F9 0x9D3F #CJK UNIFIED IDEOGRAPH +0xE9FA 0x9D3E #CJK UNIFIED IDEOGRAPH +0xE9FB 0x9D46 #CJK UNIFIED IDEOGRAPH +0xE9FC 0x9D48 #CJK UNIFIED IDEOGRAPH +0xEA40 0x9D5D #CJK UNIFIED IDEOGRAPH +0xEA41 0x9D5E #CJK UNIFIED IDEOGRAPH +0xEA42 0x9D64 #CJK UNIFIED IDEOGRAPH +0xEA43 0x9D51 #CJK UNIFIED IDEOGRAPH +0xEA44 0x9D50 #CJK UNIFIED IDEOGRAPH +0xEA45 0x9D59 #CJK UNIFIED IDEOGRAPH +0xEA46 0x9D72 #CJK UNIFIED IDEOGRAPH +0xEA47 0x9D89 #CJK UNIFIED IDEOGRAPH +0xEA48 0x9D87 #CJK UNIFIED IDEOGRAPH +0xEA49 0x9DAB #CJK UNIFIED IDEOGRAPH +0xEA4A 0x9D6F #CJK UNIFIED IDEOGRAPH +0xEA4B 0x9D7A #CJK UNIFIED IDEOGRAPH +0xEA4C 0x9D9A #CJK UNIFIED IDEOGRAPH +0xEA4D 0x9DA4 #CJK UNIFIED IDEOGRAPH +0xEA4E 0x9DA9 #CJK UNIFIED IDEOGRAPH +0xEA4F 0x9DB2 #CJK UNIFIED IDEOGRAPH +0xEA50 0x9DC4 #CJK UNIFIED IDEOGRAPH +0xEA51 0x9DC1 #CJK UNIFIED IDEOGRAPH +0xEA52 0x9DBB #CJK UNIFIED IDEOGRAPH +0xEA53 0x9DB8 #CJK UNIFIED IDEOGRAPH +0xEA54 0x9DBA #CJK UNIFIED IDEOGRAPH +0xEA55 0x9DC6 #CJK UNIFIED IDEOGRAPH +0xEA56 0x9DCF #CJK UNIFIED IDEOGRAPH +0xEA57 0x9DC2 #CJK UNIFIED IDEOGRAPH +0xEA58 0x9DD9 #CJK UNIFIED IDEOGRAPH +0xEA59 0x9DD3 #CJK UNIFIED IDEOGRAPH +0xEA5A 0x9DF8 #CJK UNIFIED IDEOGRAPH +0xEA5B 0x9DE6 #CJK UNIFIED IDEOGRAPH +0xEA5C 0x9DED #CJK UNIFIED IDEOGRAPH +0xEA5D 0x9DEF #CJK UNIFIED IDEOGRAPH +0xEA5E 0x9DFD #CJK UNIFIED IDEOGRAPH +0xEA5F 0x9E1A #CJK UNIFIED IDEOGRAPH +0xEA60 0x9E1B #CJK UNIFIED IDEOGRAPH +0xEA61 0x9E1E #CJK UNIFIED IDEOGRAPH +0xEA62 0x9E75 #CJK UNIFIED IDEOGRAPH +0xEA63 0x9E79 #CJK UNIFIED IDEOGRAPH +0xEA64 0x9E7D #CJK UNIFIED IDEOGRAPH +0xEA65 0x9E81 #CJK UNIFIED IDEOGRAPH +0xEA66 0x9E88 #CJK UNIFIED IDEOGRAPH +0xEA67 0x9E8B #CJK UNIFIED IDEOGRAPH +0xEA68 0x9E8C #CJK UNIFIED IDEOGRAPH +0xEA69 0x9E92 #CJK UNIFIED IDEOGRAPH +0xEA6A 0x9E95 #CJK UNIFIED IDEOGRAPH +0xEA6B 0x9E91 #CJK UNIFIED IDEOGRAPH +0xEA6C 0x9E9D #CJK UNIFIED IDEOGRAPH +0xEA6D 0x9EA5 #CJK UNIFIED IDEOGRAPH +0xEA6E 0x9EA9 #CJK UNIFIED IDEOGRAPH +0xEA6F 0x9EB8 #CJK UNIFIED IDEOGRAPH +0xEA70 0x9EAA #CJK UNIFIED IDEOGRAPH +0xEA71 0x9EAD #CJK UNIFIED IDEOGRAPH +0xEA72 0x9761 #CJK UNIFIED IDEOGRAPH +0xEA73 0x9ECC #CJK UNIFIED IDEOGRAPH +0xEA74 0x9ECE #CJK UNIFIED IDEOGRAPH +0xEA75 0x9ECF #CJK UNIFIED IDEOGRAPH +0xEA76 0x9ED0 #CJK UNIFIED IDEOGRAPH +0xEA77 0x9ED4 #CJK UNIFIED IDEOGRAPH +0xEA78 0x9EDC #CJK UNIFIED IDEOGRAPH +0xEA79 0x9EDE #CJK UNIFIED IDEOGRAPH +0xEA7A 0x9EDD #CJK UNIFIED IDEOGRAPH +0xEA7B 0x9EE0 #CJK UNIFIED IDEOGRAPH +0xEA7C 0x9EE5 #CJK UNIFIED IDEOGRAPH +0xEA7D 0x9EE8 #CJK UNIFIED IDEOGRAPH +0xEA7E 0x9EEF #CJK UNIFIED IDEOGRAPH +0xEA80 0x9EF4 #CJK UNIFIED IDEOGRAPH +0xEA81 0x9EF6 #CJK UNIFIED IDEOGRAPH +0xEA82 0x9EF7 #CJK UNIFIED IDEOGRAPH +0xEA83 0x9EF9 #CJK UNIFIED IDEOGRAPH +0xEA84 0x9EFB #CJK UNIFIED IDEOGRAPH +0xEA85 0x9EFC #CJK UNIFIED IDEOGRAPH +0xEA86 0x9EFD #CJK UNIFIED IDEOGRAPH +0xEA87 0x9F07 #CJK UNIFIED IDEOGRAPH +0xEA88 0x9F08 #CJK UNIFIED IDEOGRAPH +0xEA89 0x76B7 #CJK UNIFIED IDEOGRAPH +0xEA8A 0x9F15 #CJK UNIFIED IDEOGRAPH +0xEA8B 0x9F21 #CJK UNIFIED IDEOGRAPH +0xEA8C 0x9F2C #CJK UNIFIED IDEOGRAPH +0xEA8D 0x9F3E #CJK UNIFIED IDEOGRAPH +0xEA8E 0x9F4A #CJK UNIFIED IDEOGRAPH +0xEA8F 0x9F52 #CJK UNIFIED IDEOGRAPH +0xEA90 0x9F54 #CJK UNIFIED IDEOGRAPH +0xEA91 0x9F63 #CJK UNIFIED IDEOGRAPH +0xEA92 0x9F5F #CJK UNIFIED IDEOGRAPH +0xEA93 0x9F60 #CJK UNIFIED IDEOGRAPH +0xEA94 0x9F61 #CJK UNIFIED IDEOGRAPH +0xEA95 0x9F66 #CJK UNIFIED IDEOGRAPH +0xEA96 0x9F67 #CJK UNIFIED IDEOGRAPH +0xEA97 0x9F6C #CJK UNIFIED IDEOGRAPH +0xEA98 0x9F6A #CJK UNIFIED IDEOGRAPH +0xEA99 0x9F77 #CJK UNIFIED IDEOGRAPH +0xEA9A 0x9F72 #CJK UNIFIED IDEOGRAPH +0xEA9B 0x9F76 #CJK UNIFIED IDEOGRAPH +0xEA9C 0x9F95 #CJK UNIFIED IDEOGRAPH +0xEA9D 0x9F9C #CJK UNIFIED IDEOGRAPH +0xEA9E 0x9FA0 #CJK UNIFIED IDEOGRAPH +0xEA9F 0x582F #CJK UNIFIED IDEOGRAPH +0xEAA0 0x69C7 #CJK UNIFIED IDEOGRAPH +0xEAA1 0x9059 #CJK UNIFIED IDEOGRAPH +0xEAA2 0x7464 #CJK UNIFIED IDEOGRAPH +0xEAA3 0x51DC #CJK UNIFIED IDEOGRAPH +0xEAA4 0x7199 #CJK UNIFIED IDEOGRAPH +0xED40 0x7E8A #CJK UNIFIED IDEOGRAPH +0xED41 0x891C #CJK UNIFIED IDEOGRAPH +0xED42 0x9348 #CJK UNIFIED IDEOGRAPH +0xED43 0x9288 #CJK UNIFIED IDEOGRAPH +0xED44 0x84DC #CJK UNIFIED IDEOGRAPH +0xED45 0x4FC9 #CJK UNIFIED IDEOGRAPH +0xED46 0x70BB #CJK UNIFIED IDEOGRAPH +0xED47 0x6631 #CJK UNIFIED IDEOGRAPH +0xED48 0x68C8 #CJK UNIFIED IDEOGRAPH +0xED49 0x92F9 #CJK UNIFIED IDEOGRAPH +0xED4A 0x66FB #CJK UNIFIED IDEOGRAPH +0xED4B 0x5F45 #CJK UNIFIED IDEOGRAPH +0xED4C 0x4E28 #CJK UNIFIED IDEOGRAPH +0xED4D 0x4EE1 #CJK UNIFIED IDEOGRAPH +0xED4E 0x4EFC #CJK UNIFIED IDEOGRAPH +0xED4F 0x4F00 #CJK UNIFIED IDEOGRAPH +0xED50 0x4F03 #CJK UNIFIED IDEOGRAPH +0xED51 0x4F39 #CJK UNIFIED IDEOGRAPH +0xED52 0x4F56 #CJK UNIFIED IDEOGRAPH +0xED53 0x4F92 #CJK UNIFIED IDEOGRAPH +0xED54 0x4F8A #CJK UNIFIED IDEOGRAPH +0xED55 0x4F9A #CJK UNIFIED IDEOGRAPH +0xED56 0x4F94 #CJK UNIFIED IDEOGRAPH +0xED57 0x4FCD #CJK UNIFIED IDEOGRAPH +0xED58 0x5040 #CJK UNIFIED IDEOGRAPH +0xED59 0x5022 #CJK UNIFIED IDEOGRAPH +0xED5A 0x4FFF #CJK UNIFIED IDEOGRAPH +0xED5B 0x501E #CJK UNIFIED IDEOGRAPH +0xED5C 0x5046 #CJK UNIFIED IDEOGRAPH +0xED5D 0x5070 #CJK UNIFIED IDEOGRAPH +0xED5E 0x5042 #CJK UNIFIED IDEOGRAPH +0xED5F 0x5094 #CJK UNIFIED IDEOGRAPH +0xED60 0x50F4 #CJK UNIFIED IDEOGRAPH +0xED61 0x50D8 #CJK UNIFIED IDEOGRAPH +0xED62 0x514A #CJK UNIFIED IDEOGRAPH +0xED63 0x5164 #CJK UNIFIED IDEOGRAPH +0xED64 0x519D #CJK UNIFIED IDEOGRAPH +0xED65 0x51BE #CJK UNIFIED IDEOGRAPH +0xED66 0x51EC #CJK UNIFIED IDEOGRAPH +0xED67 0x5215 #CJK UNIFIED IDEOGRAPH +0xED68 0x529C #CJK UNIFIED IDEOGRAPH +0xED69 0x52A6 #CJK UNIFIED IDEOGRAPH +0xED6A 0x52C0 #CJK UNIFIED IDEOGRAPH +0xED6B 0x52DB #CJK UNIFIED IDEOGRAPH +0xED6C 0x5300 #CJK UNIFIED IDEOGRAPH +0xED6D 0x5307 #CJK UNIFIED IDEOGRAPH +0xED6E 0x5324 #CJK UNIFIED IDEOGRAPH +0xED6F 0x5372 #CJK UNIFIED IDEOGRAPH +0xED70 0x5393 #CJK UNIFIED IDEOGRAPH +0xED71 0x53B2 #CJK UNIFIED IDEOGRAPH +0xED72 0x53DD #CJK UNIFIED IDEOGRAPH +0xED73 0xFA0E #CJK COMPATIBILITY IDEOGRAPH +0xED74 0x549C #CJK UNIFIED IDEOGRAPH +0xED75 0x548A #CJK UNIFIED IDEOGRAPH +0xED76 0x54A9 #CJK UNIFIED IDEOGRAPH +0xED77 0x54FF #CJK UNIFIED IDEOGRAPH +0xED78 0x5586 #CJK UNIFIED IDEOGRAPH +0xED79 0x5759 #CJK UNIFIED IDEOGRAPH +0xED7A 0x5765 #CJK UNIFIED IDEOGRAPH +0xED7B 0x57AC #CJK UNIFIED IDEOGRAPH +0xED7C 0x57C8 #CJK UNIFIED IDEOGRAPH +0xED7D 0x57C7 #CJK UNIFIED IDEOGRAPH +0xED7E 0xFA0F #CJK COMPATIBILITY IDEOGRAPH +0xED80 0xFA10 #CJK COMPATIBILITY IDEOGRAPH +0xED81 0x589E #CJK UNIFIED IDEOGRAPH +0xED82 0x58B2 #CJK UNIFIED IDEOGRAPH +0xED83 0x590B #CJK UNIFIED IDEOGRAPH +0xED84 0x5953 #CJK UNIFIED IDEOGRAPH +0xED85 0x595B #CJK UNIFIED IDEOGRAPH +0xED86 0x595D #CJK UNIFIED IDEOGRAPH +0xED87 0x5963 #CJK UNIFIED IDEOGRAPH +0xED88 0x59A4 #CJK UNIFIED IDEOGRAPH +0xED89 0x59BA #CJK UNIFIED IDEOGRAPH +0xED8A 0x5B56 #CJK UNIFIED IDEOGRAPH +0xED8B 0x5BC0 #CJK UNIFIED IDEOGRAPH +0xED8C 0x752F #CJK UNIFIED IDEOGRAPH +0xED8D 0x5BD8 #CJK UNIFIED IDEOGRAPH +0xED8E 0x5BEC #CJK UNIFIED IDEOGRAPH +0xED8F 0x5C1E #CJK UNIFIED IDEOGRAPH +0xED90 0x5CA6 #CJK UNIFIED IDEOGRAPH +0xED91 0x5CBA #CJK UNIFIED IDEOGRAPH +0xED92 0x5CF5 #CJK UNIFIED IDEOGRAPH +0xED93 0x5D27 #CJK UNIFIED IDEOGRAPH +0xED94 0x5D53 #CJK UNIFIED IDEOGRAPH +0xED95 0xFA11 #CJK COMPATIBILITY IDEOGRAPH +0xED96 0x5D42 #CJK UNIFIED IDEOGRAPH +0xED97 0x5D6D #CJK UNIFIED IDEOGRAPH +0xED98 0x5DB8 #CJK UNIFIED IDEOGRAPH +0xED99 0x5DB9 #CJK UNIFIED IDEOGRAPH +0xED9A 0x5DD0 #CJK UNIFIED IDEOGRAPH +0xED9B 0x5F21 #CJK UNIFIED IDEOGRAPH +0xED9C 0x5F34 #CJK UNIFIED IDEOGRAPH +0xED9D 0x5F67 #CJK UNIFIED IDEOGRAPH +0xED9E 0x5FB7 #CJK UNIFIED IDEOGRAPH +0xED9F 0x5FDE #CJK UNIFIED IDEOGRAPH +0xEDA0 0x605D #CJK UNIFIED IDEOGRAPH +0xEDA1 0x6085 #CJK UNIFIED IDEOGRAPH +0xEDA2 0x608A #CJK UNIFIED IDEOGRAPH +0xEDA3 0x60DE #CJK UNIFIED IDEOGRAPH +0xEDA4 0x60D5 #CJK UNIFIED IDEOGRAPH +0xEDA5 0x6120 #CJK UNIFIED IDEOGRAPH +0xEDA6 0x60F2 #CJK UNIFIED IDEOGRAPH +0xEDA7 0x6111 #CJK UNIFIED IDEOGRAPH +0xEDA8 0x6137 #CJK UNIFIED IDEOGRAPH +0xEDA9 0x6130 #CJK UNIFIED IDEOGRAPH +0xEDAA 0x6198 #CJK UNIFIED IDEOGRAPH +0xEDAB 0x6213 #CJK UNIFIED IDEOGRAPH +0xEDAC 0x62A6 #CJK UNIFIED IDEOGRAPH +0xEDAD 0x63F5 #CJK UNIFIED IDEOGRAPH +0xEDAE 0x6460 #CJK UNIFIED IDEOGRAPH +0xEDAF 0x649D #CJK UNIFIED IDEOGRAPH +0xEDB0 0x64CE #CJK UNIFIED IDEOGRAPH +0xEDB1 0x654E #CJK UNIFIED IDEOGRAPH +0xEDB2 0x6600 #CJK UNIFIED IDEOGRAPH +0xEDB3 0x6615 #CJK UNIFIED IDEOGRAPH +0xEDB4 0x663B #CJK UNIFIED IDEOGRAPH +0xEDB5 0x6609 #CJK UNIFIED IDEOGRAPH +0xEDB6 0x662E #CJK UNIFIED IDEOGRAPH +0xEDB7 0x661E #CJK UNIFIED IDEOGRAPH +0xEDB8 0x6624 #CJK UNIFIED IDEOGRAPH +0xEDB9 0x6665 #CJK UNIFIED IDEOGRAPH +0xEDBA 0x6657 #CJK UNIFIED IDEOGRAPH +0xEDBB 0x6659 #CJK UNIFIED IDEOGRAPH +0xEDBC 0xFA12 #CJK COMPATIBILITY IDEOGRAPH +0xEDBD 0x6673 #CJK UNIFIED IDEOGRAPH +0xEDBE 0x6699 #CJK UNIFIED IDEOGRAPH +0xEDBF 0x66A0 #CJK UNIFIED IDEOGRAPH +0xEDC0 0x66B2 #CJK UNIFIED IDEOGRAPH +0xEDC1 0x66BF #CJK UNIFIED IDEOGRAPH +0xEDC2 0x66FA #CJK UNIFIED IDEOGRAPH +0xEDC3 0x670E #CJK UNIFIED IDEOGRAPH +0xEDC4 0xF929 #CJK COMPATIBILITY IDEOGRAPH +0xEDC5 0x6766 #CJK UNIFIED IDEOGRAPH +0xEDC6 0x67BB #CJK UNIFIED IDEOGRAPH +0xEDC7 0x6852 #CJK UNIFIED IDEOGRAPH +0xEDC8 0x67C0 #CJK UNIFIED IDEOGRAPH +0xEDC9 0x6801 #CJK UNIFIED IDEOGRAPH +0xEDCA 0x6844 #CJK UNIFIED IDEOGRAPH +0xEDCB 0x68CF #CJK UNIFIED IDEOGRAPH +0xEDCC 0xFA13 #CJK COMPATIBILITY IDEOGRAPH +0xEDCD 0x6968 #CJK UNIFIED IDEOGRAPH +0xEDCE 0xFA14 #CJK COMPATIBILITY IDEOGRAPH +0xEDCF 0x6998 #CJK UNIFIED IDEOGRAPH +0xEDD0 0x69E2 #CJK UNIFIED IDEOGRAPH +0xEDD1 0x6A30 #CJK UNIFIED IDEOGRAPH +0xEDD2 0x6A6B #CJK UNIFIED IDEOGRAPH +0xEDD3 0x6A46 #CJK UNIFIED IDEOGRAPH +0xEDD4 0x6A73 #CJK UNIFIED IDEOGRAPH +0xEDD5 0x6A7E #CJK UNIFIED IDEOGRAPH +0xEDD6 0x6AE2 #CJK UNIFIED IDEOGRAPH +0xEDD7 0x6AE4 #CJK UNIFIED IDEOGRAPH +0xEDD8 0x6BD6 #CJK UNIFIED IDEOGRAPH +0xEDD9 0x6C3F #CJK UNIFIED IDEOGRAPH +0xEDDA 0x6C5C #CJK UNIFIED IDEOGRAPH +0xEDDB 0x6C86 #CJK UNIFIED IDEOGRAPH +0xEDDC 0x6C6F #CJK UNIFIED IDEOGRAPH +0xEDDD 0x6CDA #CJK UNIFIED IDEOGRAPH +0xEDDE 0x6D04 #CJK UNIFIED IDEOGRAPH +0xEDDF 0x6D87 #CJK UNIFIED IDEOGRAPH +0xEDE0 0x6D6F #CJK UNIFIED IDEOGRAPH +0xEDE1 0x6D96 #CJK UNIFIED IDEOGRAPH +0xEDE2 0x6DAC #CJK UNIFIED IDEOGRAPH +0xEDE3 0x6DCF #CJK UNIFIED IDEOGRAPH +0xEDE4 0x6DF8 #CJK UNIFIED IDEOGRAPH +0xEDE5 0x6DF2 #CJK UNIFIED IDEOGRAPH +0xEDE6 0x6DFC #CJK UNIFIED IDEOGRAPH +0xEDE7 0x6E39 #CJK UNIFIED IDEOGRAPH +0xEDE8 0x6E5C #CJK UNIFIED IDEOGRAPH +0xEDE9 0x6E27 #CJK UNIFIED IDEOGRAPH +0xEDEA 0x6E3C #CJK UNIFIED IDEOGRAPH +0xEDEB 0x6EBF #CJK UNIFIED IDEOGRAPH +0xEDEC 0x6F88 #CJK UNIFIED IDEOGRAPH +0xEDED 0x6FB5 #CJK UNIFIED IDEOGRAPH +0xEDEE 0x6FF5 #CJK UNIFIED IDEOGRAPH +0xEDEF 0x7005 #CJK UNIFIED IDEOGRAPH +0xEDF0 0x7007 #CJK UNIFIED IDEOGRAPH +0xEDF1 0x7028 #CJK UNIFIED IDEOGRAPH +0xEDF2 0x7085 #CJK UNIFIED IDEOGRAPH +0xEDF3 0x70AB #CJK UNIFIED IDEOGRAPH +0xEDF4 0x710F #CJK UNIFIED IDEOGRAPH +0xEDF5 0x7104 #CJK UNIFIED IDEOGRAPH +0xEDF6 0x715C #CJK UNIFIED IDEOGRAPH +0xEDF7 0x7146 #CJK UNIFIED IDEOGRAPH +0xEDF8 0x7147 #CJK UNIFIED IDEOGRAPH +0xEDF9 0xFA15 #CJK COMPATIBILITY IDEOGRAPH +0xEDFA 0x71C1 #CJK UNIFIED IDEOGRAPH +0xEDFB 0x71FE #CJK UNIFIED IDEOGRAPH +0xEDFC 0x72B1 #CJK UNIFIED IDEOGRAPH +0xEE40 0x72BE #CJK UNIFIED IDEOGRAPH +0xEE41 0x7324 #CJK UNIFIED IDEOGRAPH +0xEE42 0xFA16 #CJK COMPATIBILITY IDEOGRAPH +0xEE43 0x7377 #CJK UNIFIED IDEOGRAPH +0xEE44 0x73BD #CJK UNIFIED IDEOGRAPH +0xEE45 0x73C9 #CJK UNIFIED IDEOGRAPH +0xEE46 0x73D6 #CJK UNIFIED IDEOGRAPH +0xEE47 0x73E3 #CJK UNIFIED IDEOGRAPH +0xEE48 0x73D2 #CJK UNIFIED IDEOGRAPH +0xEE49 0x7407 #CJK UNIFIED IDEOGRAPH +0xEE4A 0x73F5 #CJK UNIFIED IDEOGRAPH +0xEE4B 0x7426 #CJK UNIFIED IDEOGRAPH +0xEE4C 0x742A #CJK UNIFIED IDEOGRAPH +0xEE4D 0x7429 #CJK UNIFIED IDEOGRAPH +0xEE4E 0x742E #CJK UNIFIED IDEOGRAPH +0xEE4F 0x7462 #CJK UNIFIED IDEOGRAPH +0xEE50 0x7489 #CJK UNIFIED IDEOGRAPH +0xEE51 0x749F #CJK UNIFIED IDEOGRAPH +0xEE52 0x7501 #CJK UNIFIED IDEOGRAPH +0xEE53 0x756F #CJK UNIFIED IDEOGRAPH +0xEE54 0x7682 #CJK UNIFIED IDEOGRAPH +0xEE55 0x769C #CJK UNIFIED IDEOGRAPH +0xEE56 0x769E #CJK UNIFIED IDEOGRAPH +0xEE57 0x769B #CJK UNIFIED IDEOGRAPH +0xEE58 0x76A6 #CJK UNIFIED IDEOGRAPH +0xEE59 0xFA17 #CJK COMPATIBILITY IDEOGRAPH +0xEE5A 0x7746 #CJK UNIFIED IDEOGRAPH +0xEE5B 0x52AF #CJK UNIFIED IDEOGRAPH +0xEE5C 0x7821 #CJK UNIFIED IDEOGRAPH +0xEE5D 0x784E #CJK UNIFIED IDEOGRAPH +0xEE5E 0x7864 #CJK UNIFIED IDEOGRAPH +0xEE5F 0x787A #CJK UNIFIED IDEOGRAPH +0xEE60 0x7930 #CJK UNIFIED IDEOGRAPH +0xEE61 0xFA18 #CJK COMPATIBILITY IDEOGRAPH +0xEE62 0xFA19 #CJK COMPATIBILITY IDEOGRAPH +0xEE63 0xFA1A #CJK COMPATIBILITY IDEOGRAPH +0xEE64 0x7994 #CJK UNIFIED IDEOGRAPH +0xEE65 0xFA1B #CJK COMPATIBILITY IDEOGRAPH +0xEE66 0x799B #CJK UNIFIED IDEOGRAPH +0xEE67 0x7AD1 #CJK UNIFIED IDEOGRAPH +0xEE68 0x7AE7 #CJK UNIFIED IDEOGRAPH +0xEE69 0xFA1C #CJK COMPATIBILITY IDEOGRAPH +0xEE6A 0x7AEB #CJK UNIFIED IDEOGRAPH +0xEE6B 0x7B9E #CJK UNIFIED IDEOGRAPH +0xEE6C 0xFA1D #CJK COMPATIBILITY IDEOGRAPH +0xEE6D 0x7D48 #CJK UNIFIED IDEOGRAPH +0xEE6E 0x7D5C #CJK UNIFIED IDEOGRAPH +0xEE6F 0x7DB7 #CJK UNIFIED IDEOGRAPH +0xEE70 0x7DA0 #CJK UNIFIED IDEOGRAPH +0xEE71 0x7DD6 #CJK UNIFIED IDEOGRAPH +0xEE72 0x7E52 #CJK UNIFIED IDEOGRAPH +0xEE73 0x7F47 #CJK UNIFIED IDEOGRAPH +0xEE74 0x7FA1 #CJK UNIFIED IDEOGRAPH +0xEE75 0xFA1E #CJK COMPATIBILITY IDEOGRAPH +0xEE76 0x8301 #CJK UNIFIED IDEOGRAPH +0xEE77 0x8362 #CJK UNIFIED IDEOGRAPH +0xEE78 0x837F #CJK UNIFIED IDEOGRAPH +0xEE79 0x83C7 #CJK UNIFIED IDEOGRAPH +0xEE7A 0x83F6 #CJK UNIFIED IDEOGRAPH +0xEE7B 0x8448 #CJK UNIFIED IDEOGRAPH +0xEE7C 0x84B4 #CJK UNIFIED IDEOGRAPH +0xEE7D 0x8553 #CJK UNIFIED IDEOGRAPH +0xEE7E 0x8559 #CJK UNIFIED IDEOGRAPH +0xEE80 0x856B #CJK UNIFIED IDEOGRAPH +0xEE81 0xFA1F #CJK COMPATIBILITY IDEOGRAPH +0xEE82 0x85B0 #CJK UNIFIED IDEOGRAPH +0xEE83 0xFA20 #CJK COMPATIBILITY IDEOGRAPH +0xEE84 0xFA21 #CJK COMPATIBILITY IDEOGRAPH +0xEE85 0x8807 #CJK UNIFIED IDEOGRAPH +0xEE86 0x88F5 #CJK UNIFIED IDEOGRAPH +0xEE87 0x8A12 #CJK UNIFIED IDEOGRAPH +0xEE88 0x8A37 #CJK UNIFIED IDEOGRAPH +0xEE89 0x8A79 #CJK UNIFIED IDEOGRAPH +0xEE8A 0x8AA7 #CJK UNIFIED IDEOGRAPH +0xEE8B 0x8ABE #CJK UNIFIED IDEOGRAPH +0xEE8C 0x8ADF #CJK UNIFIED IDEOGRAPH +0xEE8D 0xFA22 #CJK COMPATIBILITY IDEOGRAPH +0xEE8E 0x8AF6 #CJK UNIFIED IDEOGRAPH +0xEE8F 0x8B53 #CJK UNIFIED IDEOGRAPH +0xEE90 0x8B7F #CJK UNIFIED IDEOGRAPH +0xEE91 0x8CF0 #CJK UNIFIED IDEOGRAPH +0xEE92 0x8CF4 #CJK UNIFIED IDEOGRAPH +0xEE93 0x8D12 #CJK UNIFIED IDEOGRAPH +0xEE94 0x8D76 #CJK UNIFIED IDEOGRAPH +0xEE95 0xFA23 #CJK COMPATIBILITY IDEOGRAPH +0xEE96 0x8ECF #CJK UNIFIED IDEOGRAPH +0xEE97 0xFA24 #CJK COMPATIBILITY IDEOGRAPH +0xEE98 0xFA25 #CJK COMPATIBILITY IDEOGRAPH +0xEE99 0x9067 #CJK UNIFIED IDEOGRAPH +0xEE9A 0x90DE #CJK UNIFIED IDEOGRAPH +0xEE9B 0xFA26 #CJK COMPATIBILITY IDEOGRAPH +0xEE9C 0x9115 #CJK UNIFIED IDEOGRAPH +0xEE9D 0x9127 #CJK UNIFIED IDEOGRAPH +0xEE9E 0x91DA #CJK UNIFIED IDEOGRAPH +0xEE9F 0x91D7 #CJK UNIFIED IDEOGRAPH +0xEEA0 0x91DE #CJK UNIFIED IDEOGRAPH +0xEEA1 0x91ED #CJK UNIFIED IDEOGRAPH +0xEEA2 0x91EE #CJK UNIFIED IDEOGRAPH +0xEEA3 0x91E4 #CJK UNIFIED IDEOGRAPH +0xEEA4 0x91E5 #CJK UNIFIED IDEOGRAPH +0xEEA5 0x9206 #CJK UNIFIED IDEOGRAPH +0xEEA6 0x9210 #CJK UNIFIED IDEOGRAPH +0xEEA7 0x920A #CJK UNIFIED IDEOGRAPH +0xEEA8 0x923A #CJK UNIFIED IDEOGRAPH +0xEEA9 0x9240 #CJK UNIFIED IDEOGRAPH +0xEEAA 0x923C #CJK UNIFIED IDEOGRAPH +0xEEAB 0x924E #CJK UNIFIED IDEOGRAPH +0xEEAC 0x9259 #CJK UNIFIED IDEOGRAPH +0xEEAD 0x9251 #CJK UNIFIED IDEOGRAPH +0xEEAE 0x9239 #CJK UNIFIED IDEOGRAPH +0xEEAF 0x9267 #CJK UNIFIED IDEOGRAPH +0xEEB0 0x92A7 #CJK UNIFIED IDEOGRAPH +0xEEB1 0x9277 #CJK UNIFIED IDEOGRAPH +0xEEB2 0x9278 #CJK UNIFIED IDEOGRAPH +0xEEB3 0x92E7 #CJK UNIFIED IDEOGRAPH +0xEEB4 0x92D7 #CJK UNIFIED IDEOGRAPH +0xEEB5 0x92D9 #CJK UNIFIED IDEOGRAPH +0xEEB6 0x92D0 #CJK UNIFIED IDEOGRAPH +0xEEB7 0xFA27 #CJK COMPATIBILITY IDEOGRAPH +0xEEB8 0x92D5 #CJK UNIFIED IDEOGRAPH +0xEEB9 0x92E0 #CJK UNIFIED IDEOGRAPH +0xEEBA 0x92D3 #CJK UNIFIED IDEOGRAPH +0xEEBB 0x9325 #CJK UNIFIED IDEOGRAPH +0xEEBC 0x9321 #CJK UNIFIED IDEOGRAPH +0xEEBD 0x92FB #CJK UNIFIED IDEOGRAPH +0xEEBE 0xFA28 #CJK COMPATIBILITY IDEOGRAPH +0xEEBF 0x931E #CJK UNIFIED IDEOGRAPH +0xEEC0 0x92FF #CJK UNIFIED IDEOGRAPH +0xEEC1 0x931D #CJK UNIFIED IDEOGRAPH +0xEEC2 0x9302 #CJK UNIFIED IDEOGRAPH +0xEEC3 0x9370 #CJK UNIFIED IDEOGRAPH +0xEEC4 0x9357 #CJK UNIFIED IDEOGRAPH +0xEEC5 0x93A4 #CJK UNIFIED IDEOGRAPH +0xEEC6 0x93C6 #CJK UNIFIED IDEOGRAPH +0xEEC7 0x93DE #CJK UNIFIED IDEOGRAPH +0xEEC8 0x93F8 #CJK UNIFIED IDEOGRAPH +0xEEC9 0x9431 #CJK UNIFIED IDEOGRAPH +0xEECA 0x9445 #CJK UNIFIED IDEOGRAPH +0xEECB 0x9448 #CJK UNIFIED IDEOGRAPH +0xEECC 0x9592 #CJK UNIFIED IDEOGRAPH +0xEECD 0xF9DC #CJK COMPATIBILITY IDEOGRAPH +0xEECE 0xFA29 #CJK COMPATIBILITY IDEOGRAPH +0xEECF 0x969D #CJK UNIFIED IDEOGRAPH +0xEED0 0x96AF #CJK UNIFIED IDEOGRAPH +0xEED1 0x9733 #CJK UNIFIED IDEOGRAPH +0xEED2 0x973B #CJK UNIFIED IDEOGRAPH +0xEED3 0x9743 #CJK UNIFIED IDEOGRAPH +0xEED4 0x974D #CJK UNIFIED IDEOGRAPH +0xEED5 0x974F #CJK UNIFIED IDEOGRAPH +0xEED6 0x9751 #CJK UNIFIED IDEOGRAPH +0xEED7 0x9755 #CJK UNIFIED IDEOGRAPH +0xEED8 0x9857 #CJK UNIFIED IDEOGRAPH +0xEED9 0x9865 #CJK UNIFIED IDEOGRAPH +0xEEDA 0xFA2A #CJK COMPATIBILITY IDEOGRAPH +0xEEDB 0xFA2B #CJK COMPATIBILITY IDEOGRAPH +0xEEDC 0x9927 #CJK UNIFIED IDEOGRAPH +0xEEDD 0xFA2C #CJK COMPATIBILITY IDEOGRAPH +0xEEDE 0x999E #CJK UNIFIED IDEOGRAPH +0xEEDF 0x9A4E #CJK UNIFIED IDEOGRAPH +0xEEE0 0x9AD9 #CJK UNIFIED IDEOGRAPH +0xEEE1 0x9ADC #CJK UNIFIED IDEOGRAPH +0xEEE2 0x9B75 #CJK UNIFIED IDEOGRAPH +0xEEE3 0x9B72 #CJK UNIFIED IDEOGRAPH +0xEEE4 0x9B8F #CJK UNIFIED IDEOGRAPH +0xEEE5 0x9BB1 #CJK UNIFIED IDEOGRAPH +0xEEE6 0x9BBB #CJK UNIFIED IDEOGRAPH +0xEEE7 0x9C00 #CJK UNIFIED IDEOGRAPH +0xEEE8 0x9D70 #CJK UNIFIED IDEOGRAPH +0xEEE9 0x9D6B #CJK UNIFIED IDEOGRAPH +0xEEEA 0xFA2D #CJK COMPATIBILITY IDEOGRAPH +0xEEEB 0x9E19 #CJK UNIFIED IDEOGRAPH +0xEEEC 0x9ED1 #CJK UNIFIED IDEOGRAPH +0xEEEF 0x2170 #SMALL ROMAN NUMERAL ONE +0xEEF0 0x2171 #SMALL ROMAN NUMERAL TWO +0xEEF1 0x2172 #SMALL ROMAN NUMERAL THREE +0xEEF2 0x2173 #SMALL ROMAN NUMERAL FOUR +0xEEF3 0x2174 #SMALL ROMAN NUMERAL FIVE +0xEEF4 0x2175 #SMALL ROMAN NUMERAL SIX +0xEEF5 0x2176 #SMALL ROMAN NUMERAL SEVEN +0xEEF6 0x2177 #SMALL ROMAN NUMERAL EIGHT +0xEEF7 0x2178 #SMALL ROMAN NUMERAL NINE +0xEEF8 0x2179 #SMALL ROMAN NUMERAL TEN +0xEEF9 0xFFE2 #FULLWIDTH NOT SIGN +0xEEFA 0xFFE4 #FULLWIDTH BROKEN BAR +0xEEFB 0xFF07 #FULLWIDTH APOSTROPHE +0xEEFC 0xFF02 #FULLWIDTH QUOTATION MARK +0xFA40 0x2170 #SMALL ROMAN NUMERAL ONE +0xFA41 0x2171 #SMALL ROMAN NUMERAL TWO +0xFA42 0x2172 #SMALL ROMAN NUMERAL THREE +0xFA43 0x2173 #SMALL ROMAN NUMERAL FOUR +0xFA44 0x2174 #SMALL ROMAN NUMERAL FIVE +0xFA45 0x2175 #SMALL ROMAN NUMERAL SIX +0xFA46 0x2176 #SMALL ROMAN NUMERAL SEVEN +0xFA47 0x2177 #SMALL ROMAN NUMERAL EIGHT +0xFA48 0x2178 #SMALL ROMAN NUMERAL NINE +0xFA49 0x2179 #SMALL ROMAN NUMERAL TEN +0xFA4A 0x2160 #ROMAN NUMERAL ONE +0xFA4B 0x2161 #ROMAN NUMERAL TWO +0xFA4C 0x2162 #ROMAN NUMERAL THREE +0xFA4D 0x2163 #ROMAN NUMERAL FOUR +0xFA4E 0x2164 #ROMAN NUMERAL FIVE +0xFA4F 0x2165 #ROMAN NUMERAL SIX +0xFA50 0x2166 #ROMAN NUMERAL SEVEN +0xFA51 0x2167 #ROMAN NUMERAL EIGHT +0xFA52 0x2168 #ROMAN NUMERAL NINE +0xFA53 0x2169 #ROMAN NUMERAL TEN +0xFA54 0xFFE2 #FULLWIDTH NOT SIGN +0xFA55 0xFFE4 #FULLWIDTH BROKEN BAR +0xFA56 0xFF07 #FULLWIDTH APOSTROPHE +0xFA57 0xFF02 #FULLWIDTH QUOTATION MARK +0xFA58 0x3231 #PARENTHESIZED IDEOGRAPH STOCK +0xFA59 0x2116 #NUMERO SIGN +0xFA5A 0x2121 #TELEPHONE SIGN +0xFA5B 0x2235 #BECAUSE +0xFA5C 0x7E8A #CJK UNIFIED IDEOGRAPH +0xFA5D 0x891C #CJK UNIFIED IDEOGRAPH +0xFA5E 0x9348 #CJK UNIFIED IDEOGRAPH +0xFA5F 0x9288 #CJK UNIFIED IDEOGRAPH +0xFA60 0x84DC #CJK UNIFIED IDEOGRAPH +0xFA61 0x4FC9 #CJK UNIFIED IDEOGRAPH +0xFA62 0x70BB #CJK UNIFIED IDEOGRAPH +0xFA63 0x6631 #CJK UNIFIED IDEOGRAPH +0xFA64 0x68C8 #CJK UNIFIED IDEOGRAPH +0xFA65 0x92F9 #CJK UNIFIED IDEOGRAPH +0xFA66 0x66FB #CJK UNIFIED IDEOGRAPH +0xFA67 0x5F45 #CJK UNIFIED IDEOGRAPH +0xFA68 0x4E28 #CJK UNIFIED IDEOGRAPH +0xFA69 0x4EE1 #CJK UNIFIED IDEOGRAPH +0xFA6A 0x4EFC #CJK UNIFIED IDEOGRAPH +0xFA6B 0x4F00 #CJK UNIFIED IDEOGRAPH +0xFA6C 0x4F03 #CJK UNIFIED IDEOGRAPH +0xFA6D 0x4F39 #CJK UNIFIED IDEOGRAPH +0xFA6E 0x4F56 #CJK UNIFIED IDEOGRAPH +0xFA6F 0x4F92 #CJK UNIFIED IDEOGRAPH +0xFA70 0x4F8A #CJK UNIFIED IDEOGRAPH +0xFA71 0x4F9A #CJK UNIFIED IDEOGRAPH +0xFA72 0x4F94 #CJK UNIFIED IDEOGRAPH +0xFA73 0x4FCD #CJK UNIFIED IDEOGRAPH +0xFA74 0x5040 #CJK UNIFIED IDEOGRAPH +0xFA75 0x5022 #CJK UNIFIED IDEOGRAPH +0xFA76 0x4FFF #CJK UNIFIED IDEOGRAPH +0xFA77 0x501E #CJK UNIFIED IDEOGRAPH +0xFA78 0x5046 #CJK UNIFIED IDEOGRAPH +0xFA79 0x5070 #CJK UNIFIED IDEOGRAPH +0xFA7A 0x5042 #CJK UNIFIED IDEOGRAPH +0xFA7B 0x5094 #CJK UNIFIED IDEOGRAPH +0xFA7C 0x50F4 #CJK UNIFIED IDEOGRAPH +0xFA7D 0x50D8 #CJK UNIFIED IDEOGRAPH +0xFA7E 0x514A #CJK UNIFIED IDEOGRAPH +0xFA80 0x5164 #CJK UNIFIED IDEOGRAPH +0xFA81 0x519D #CJK UNIFIED IDEOGRAPH +0xFA82 0x51BE #CJK UNIFIED IDEOGRAPH +0xFA83 0x51EC #CJK UNIFIED IDEOGRAPH +0xFA84 0x5215 #CJK UNIFIED IDEOGRAPH +0xFA85 0x529C #CJK UNIFIED IDEOGRAPH +0xFA86 0x52A6 #CJK UNIFIED IDEOGRAPH +0xFA87 0x52C0 #CJK UNIFIED IDEOGRAPH +0xFA88 0x52DB #CJK UNIFIED IDEOGRAPH +0xFA89 0x5300 #CJK UNIFIED IDEOGRAPH +0xFA8A 0x5307 #CJK UNIFIED IDEOGRAPH +0xFA8B 0x5324 #CJK UNIFIED IDEOGRAPH +0xFA8C 0x5372 #CJK UNIFIED IDEOGRAPH +0xFA8D 0x5393 #CJK UNIFIED IDEOGRAPH +0xFA8E 0x53B2 #CJK UNIFIED IDEOGRAPH +0xFA8F 0x53DD #CJK UNIFIED IDEOGRAPH +0xFA90 0xFA0E #CJK COMPATIBILITY IDEOGRAPH +0xFA91 0x549C #CJK UNIFIED IDEOGRAPH +0xFA92 0x548A #CJK UNIFIED IDEOGRAPH +0xFA93 0x54A9 #CJK UNIFIED IDEOGRAPH +0xFA94 0x54FF #CJK UNIFIED IDEOGRAPH +0xFA95 0x5586 #CJK UNIFIED IDEOGRAPH +0xFA96 0x5759 #CJK UNIFIED IDEOGRAPH +0xFA97 0x5765 #CJK UNIFIED IDEOGRAPH +0xFA98 0x57AC #CJK UNIFIED IDEOGRAPH +0xFA99 0x57C8 #CJK UNIFIED IDEOGRAPH +0xFA9A 0x57C7 #CJK UNIFIED IDEOGRAPH +0xFA9B 0xFA0F #CJK COMPATIBILITY IDEOGRAPH +0xFA9C 0xFA10 #CJK COMPATIBILITY IDEOGRAPH +0xFA9D 0x589E #CJK UNIFIED IDEOGRAPH +0xFA9E 0x58B2 #CJK UNIFIED IDEOGRAPH +0xFA9F 0x590B #CJK UNIFIED IDEOGRAPH +0xFAA0 0x5953 #CJK UNIFIED IDEOGRAPH +0xFAA1 0x595B #CJK UNIFIED IDEOGRAPH +0xFAA2 0x595D #CJK UNIFIED IDEOGRAPH +0xFAA3 0x5963 #CJK UNIFIED IDEOGRAPH +0xFAA4 0x59A4 #CJK UNIFIED IDEOGRAPH +0xFAA5 0x59BA #CJK UNIFIED IDEOGRAPH +0xFAA6 0x5B56 #CJK UNIFIED IDEOGRAPH +0xFAA7 0x5BC0 #CJK UNIFIED IDEOGRAPH +0xFAA8 0x752F #CJK UNIFIED IDEOGRAPH +0xFAA9 0x5BD8 #CJK UNIFIED IDEOGRAPH +0xFAAA 0x5BEC #CJK UNIFIED IDEOGRAPH +0xFAAB 0x5C1E #CJK UNIFIED IDEOGRAPH +0xFAAC 0x5CA6 #CJK UNIFIED IDEOGRAPH +0xFAAD 0x5CBA #CJK UNIFIED IDEOGRAPH +0xFAAE 0x5CF5 #CJK UNIFIED IDEOGRAPH +0xFAAF 0x5D27 #CJK UNIFIED IDEOGRAPH +0xFAB0 0x5D53 #CJK UNIFIED IDEOGRAPH +0xFAB1 0xFA11 #CJK COMPATIBILITY IDEOGRAPH +0xFAB2 0x5D42 #CJK UNIFIED IDEOGRAPH +0xFAB3 0x5D6D #CJK UNIFIED IDEOGRAPH +0xFAB4 0x5DB8 #CJK UNIFIED IDEOGRAPH +0xFAB5 0x5DB9 #CJK UNIFIED IDEOGRAPH +0xFAB6 0x5DD0 #CJK UNIFIED IDEOGRAPH +0xFAB7 0x5F21 #CJK UNIFIED IDEOGRAPH +0xFAB8 0x5F34 #CJK UNIFIED IDEOGRAPH +0xFAB9 0x5F67 #CJK UNIFIED IDEOGRAPH +0xFABA 0x5FB7 #CJK UNIFIED IDEOGRAPH +0xFABB 0x5FDE #CJK UNIFIED IDEOGRAPH +0xFABC 0x605D #CJK UNIFIED IDEOGRAPH +0xFABD 0x6085 #CJK UNIFIED IDEOGRAPH +0xFABE 0x608A #CJK UNIFIED IDEOGRAPH +0xFABF 0x60DE #CJK UNIFIED IDEOGRAPH +0xFAC0 0x60D5 #CJK UNIFIED IDEOGRAPH +0xFAC1 0x6120 #CJK UNIFIED IDEOGRAPH +0xFAC2 0x60F2 #CJK UNIFIED IDEOGRAPH +0xFAC3 0x6111 #CJK UNIFIED IDEOGRAPH +0xFAC4 0x6137 #CJK UNIFIED IDEOGRAPH +0xFAC5 0x6130 #CJK UNIFIED IDEOGRAPH +0xFAC6 0x6198 #CJK UNIFIED IDEOGRAPH +0xFAC7 0x6213 #CJK UNIFIED IDEOGRAPH +0xFAC8 0x62A6 #CJK UNIFIED IDEOGRAPH +0xFAC9 0x63F5 #CJK UNIFIED IDEOGRAPH +0xFACA 0x6460 #CJK UNIFIED IDEOGRAPH +0xFACB 0x649D #CJK UNIFIED IDEOGRAPH +0xFACC 0x64CE #CJK UNIFIED IDEOGRAPH +0xFACD 0x654E #CJK UNIFIED IDEOGRAPH +0xFACE 0x6600 #CJK UNIFIED IDEOGRAPH +0xFACF 0x6615 #CJK UNIFIED IDEOGRAPH +0xFAD0 0x663B #CJK UNIFIED IDEOGRAPH +0xFAD1 0x6609 #CJK UNIFIED IDEOGRAPH +0xFAD2 0x662E #CJK UNIFIED IDEOGRAPH +0xFAD3 0x661E #CJK UNIFIED IDEOGRAPH +0xFAD4 0x6624 #CJK UNIFIED IDEOGRAPH +0xFAD5 0x6665 #CJK UNIFIED IDEOGRAPH +0xFAD6 0x6657 #CJK UNIFIED IDEOGRAPH +0xFAD7 0x6659 #CJK UNIFIED IDEOGRAPH +0xFAD8 0xFA12 #CJK COMPATIBILITY IDEOGRAPH +0xFAD9 0x6673 #CJK UNIFIED IDEOGRAPH +0xFADA 0x6699 #CJK UNIFIED IDEOGRAPH +0xFADB 0x66A0 #CJK UNIFIED IDEOGRAPH +0xFADC 0x66B2 #CJK UNIFIED IDEOGRAPH +0xFADD 0x66BF #CJK UNIFIED IDEOGRAPH +0xFADE 0x66FA #CJK UNIFIED IDEOGRAPH +0xFADF 0x670E #CJK UNIFIED IDEOGRAPH +0xFAE0 0xF929 #CJK COMPATIBILITY IDEOGRAPH +0xFAE1 0x6766 #CJK UNIFIED IDEOGRAPH +0xFAE2 0x67BB #CJK UNIFIED IDEOGRAPH +0xFAE3 0x6852 #CJK UNIFIED IDEOGRAPH +0xFAE4 0x67C0 #CJK UNIFIED IDEOGRAPH +0xFAE5 0x6801 #CJK UNIFIED IDEOGRAPH +0xFAE6 0x6844 #CJK UNIFIED IDEOGRAPH +0xFAE7 0x68CF #CJK UNIFIED IDEOGRAPH +0xFAE8 0xFA13 #CJK COMPATIBILITY IDEOGRAPH +0xFAE9 0x6968 #CJK UNIFIED IDEOGRAPH +0xFAEA 0xFA14 #CJK COMPATIBILITY IDEOGRAPH +0xFAEB 0x6998 #CJK UNIFIED IDEOGRAPH +0xFAEC 0x69E2 #CJK UNIFIED IDEOGRAPH +0xFAED 0x6A30 #CJK UNIFIED IDEOGRAPH +0xFAEE 0x6A6B #CJK UNIFIED IDEOGRAPH +0xFAEF 0x6A46 #CJK UNIFIED IDEOGRAPH +0xFAF0 0x6A73 #CJK UNIFIED IDEOGRAPH +0xFAF1 0x6A7E #CJK UNIFIED IDEOGRAPH +0xFAF2 0x6AE2 #CJK UNIFIED IDEOGRAPH +0xFAF3 0x6AE4 #CJK UNIFIED IDEOGRAPH +0xFAF4 0x6BD6 #CJK UNIFIED IDEOGRAPH +0xFAF5 0x6C3F #CJK UNIFIED IDEOGRAPH +0xFAF6 0x6C5C #CJK UNIFIED IDEOGRAPH +0xFAF7 0x6C86 #CJK UNIFIED IDEOGRAPH +0xFAF8 0x6C6F #CJK UNIFIED IDEOGRAPH +0xFAF9 0x6CDA #CJK UNIFIED IDEOGRAPH +0xFAFA 0x6D04 #CJK UNIFIED IDEOGRAPH +0xFAFB 0x6D87 #CJK UNIFIED IDEOGRAPH +0xFAFC 0x6D6F #CJK UNIFIED IDEOGRAPH +0xFB40 0x6D96 #CJK UNIFIED IDEOGRAPH +0xFB41 0x6DAC #CJK UNIFIED IDEOGRAPH +0xFB42 0x6DCF #CJK UNIFIED IDEOGRAPH +0xFB43 0x6DF8 #CJK UNIFIED IDEOGRAPH +0xFB44 0x6DF2 #CJK UNIFIED IDEOGRAPH +0xFB45 0x6DFC #CJK UNIFIED IDEOGRAPH +0xFB46 0x6E39 #CJK UNIFIED IDEOGRAPH +0xFB47 0x6E5C #CJK UNIFIED IDEOGRAPH +0xFB48 0x6E27 #CJK UNIFIED IDEOGRAPH +0xFB49 0x6E3C #CJK UNIFIED IDEOGRAPH +0xFB4A 0x6EBF #CJK UNIFIED IDEOGRAPH +0xFB4B 0x6F88 #CJK UNIFIED IDEOGRAPH +0xFB4C 0x6FB5 #CJK UNIFIED IDEOGRAPH +0xFB4D 0x6FF5 #CJK UNIFIED IDEOGRAPH +0xFB4E 0x7005 #CJK UNIFIED IDEOGRAPH +0xFB4F 0x7007 #CJK UNIFIED IDEOGRAPH +0xFB50 0x7028 #CJK UNIFIED IDEOGRAPH +0xFB51 0x7085 #CJK UNIFIED IDEOGRAPH +0xFB52 0x70AB #CJK UNIFIED IDEOGRAPH +0xFB53 0x710F #CJK UNIFIED IDEOGRAPH +0xFB54 0x7104 #CJK UNIFIED IDEOGRAPH +0xFB55 0x715C #CJK UNIFIED IDEOGRAPH +0xFB56 0x7146 #CJK UNIFIED IDEOGRAPH +0xFB57 0x7147 #CJK UNIFIED IDEOGRAPH +0xFB58 0xFA15 #CJK COMPATIBILITY IDEOGRAPH +0xFB59 0x71C1 #CJK UNIFIED IDEOGRAPH +0xFB5A 0x71FE #CJK UNIFIED IDEOGRAPH +0xFB5B 0x72B1 #CJK UNIFIED IDEOGRAPH +0xFB5C 0x72BE #CJK UNIFIED IDEOGRAPH +0xFB5D 0x7324 #CJK UNIFIED IDEOGRAPH +0xFB5E 0xFA16 #CJK COMPATIBILITY IDEOGRAPH +0xFB5F 0x7377 #CJK UNIFIED IDEOGRAPH +0xFB60 0x73BD #CJK UNIFIED IDEOGRAPH +0xFB61 0x73C9 #CJK UNIFIED IDEOGRAPH +0xFB62 0x73D6 #CJK UNIFIED IDEOGRAPH +0xFB63 0x73E3 #CJK UNIFIED IDEOGRAPH +0xFB64 0x73D2 #CJK UNIFIED IDEOGRAPH +0xFB65 0x7407 #CJK UNIFIED IDEOGRAPH +0xFB66 0x73F5 #CJK UNIFIED IDEOGRAPH +0xFB67 0x7426 #CJK UNIFIED IDEOGRAPH +0xFB68 0x742A #CJK UNIFIED IDEOGRAPH +0xFB69 0x7429 #CJK UNIFIED IDEOGRAPH +0xFB6A 0x742E #CJK UNIFIED IDEOGRAPH +0xFB6B 0x7462 #CJK UNIFIED IDEOGRAPH +0xFB6C 0x7489 #CJK UNIFIED IDEOGRAPH +0xFB6D 0x749F #CJK UNIFIED IDEOGRAPH +0xFB6E 0x7501 #CJK UNIFIED IDEOGRAPH +0xFB6F 0x756F #CJK UNIFIED IDEOGRAPH +0xFB70 0x7682 #CJK UNIFIED IDEOGRAPH +0xFB71 0x769C #CJK UNIFIED IDEOGRAPH +0xFB72 0x769E #CJK UNIFIED IDEOGRAPH +0xFB73 0x769B #CJK UNIFIED IDEOGRAPH +0xFB74 0x76A6 #CJK UNIFIED IDEOGRAPH +0xFB75 0xFA17 #CJK COMPATIBILITY IDEOGRAPH +0xFB76 0x7746 #CJK UNIFIED IDEOGRAPH +0xFB77 0x52AF #CJK UNIFIED IDEOGRAPH +0xFB78 0x7821 #CJK UNIFIED IDEOGRAPH +0xFB79 0x784E #CJK UNIFIED IDEOGRAPH +0xFB7A 0x7864 #CJK UNIFIED IDEOGRAPH +0xFB7B 0x787A #CJK UNIFIED IDEOGRAPH +0xFB7C 0x7930 #CJK UNIFIED IDEOGRAPH +0xFB7D 0xFA18 #CJK COMPATIBILITY IDEOGRAPH +0xFB7E 0xFA19 #CJK COMPATIBILITY IDEOGRAPH +0xFB80 0xFA1A #CJK COMPATIBILITY IDEOGRAPH +0xFB81 0x7994 #CJK UNIFIED IDEOGRAPH +0xFB82 0xFA1B #CJK COMPATIBILITY IDEOGRAPH +0xFB83 0x799B #CJK UNIFIED IDEOGRAPH +0xFB84 0x7AD1 #CJK UNIFIED IDEOGRAPH +0xFB85 0x7AE7 #CJK UNIFIED IDEOGRAPH +0xFB86 0xFA1C #CJK COMPATIBILITY IDEOGRAPH +0xFB87 0x7AEB #CJK UNIFIED IDEOGRAPH +0xFB88 0x7B9E #CJK UNIFIED IDEOGRAPH +0xFB89 0xFA1D #CJK COMPATIBILITY IDEOGRAPH +0xFB8A 0x7D48 #CJK UNIFIED IDEOGRAPH +0xFB8B 0x7D5C #CJK UNIFIED IDEOGRAPH +0xFB8C 0x7DB7 #CJK UNIFIED IDEOGRAPH +0xFB8D 0x7DA0 #CJK UNIFIED IDEOGRAPH +0xFB8E 0x7DD6 #CJK UNIFIED IDEOGRAPH +0xFB8F 0x7E52 #CJK UNIFIED IDEOGRAPH +0xFB90 0x7F47 #CJK UNIFIED IDEOGRAPH +0xFB91 0x7FA1 #CJK UNIFIED IDEOGRAPH +0xFB92 0xFA1E #CJK COMPATIBILITY IDEOGRAPH +0xFB93 0x8301 #CJK UNIFIED IDEOGRAPH +0xFB94 0x8362 #CJK UNIFIED IDEOGRAPH +0xFB95 0x837F #CJK UNIFIED IDEOGRAPH +0xFB96 0x83C7 #CJK UNIFIED IDEOGRAPH +0xFB97 0x83F6 #CJK UNIFIED IDEOGRAPH +0xFB98 0x8448 #CJK UNIFIED IDEOGRAPH +0xFB99 0x84B4 #CJK UNIFIED IDEOGRAPH +0xFB9A 0x8553 #CJK UNIFIED IDEOGRAPH +0xFB9B 0x8559 #CJK UNIFIED IDEOGRAPH +0xFB9C 0x856B #CJK UNIFIED IDEOGRAPH +0xFB9D 0xFA1F #CJK COMPATIBILITY IDEOGRAPH +0xFB9E 0x85B0 #CJK UNIFIED IDEOGRAPH +0xFB9F 0xFA20 #CJK COMPATIBILITY IDEOGRAPH +0xFBA0 0xFA21 #CJK COMPATIBILITY IDEOGRAPH +0xFBA1 0x8807 #CJK UNIFIED IDEOGRAPH +0xFBA2 0x88F5 #CJK UNIFIED IDEOGRAPH +0xFBA3 0x8A12 #CJK UNIFIED IDEOGRAPH +0xFBA4 0x8A37 #CJK UNIFIED IDEOGRAPH +0xFBA5 0x8A79 #CJK UNIFIED IDEOGRAPH +0xFBA6 0x8AA7 #CJK UNIFIED IDEOGRAPH +0xFBA7 0x8ABE #CJK UNIFIED IDEOGRAPH +0xFBA8 0x8ADF #CJK UNIFIED IDEOGRAPH +0xFBA9 0xFA22 #CJK COMPATIBILITY IDEOGRAPH +0xFBAA 0x8AF6 #CJK UNIFIED IDEOGRAPH +0xFBAB 0x8B53 #CJK UNIFIED IDEOGRAPH +0xFBAC 0x8B7F #CJK UNIFIED IDEOGRAPH +0xFBAD 0x8CF0 #CJK UNIFIED IDEOGRAPH +0xFBAE 0x8CF4 #CJK UNIFIED IDEOGRAPH +0xFBAF 0x8D12 #CJK UNIFIED IDEOGRAPH +0xFBB0 0x8D76 #CJK UNIFIED IDEOGRAPH +0xFBB1 0xFA23 #CJK COMPATIBILITY IDEOGRAPH +0xFBB2 0x8ECF #CJK UNIFIED IDEOGRAPH +0xFBB3 0xFA24 #CJK COMPATIBILITY IDEOGRAPH +0xFBB4 0xFA25 #CJK COMPATIBILITY IDEOGRAPH +0xFBB5 0x9067 #CJK UNIFIED IDEOGRAPH +0xFBB6 0x90DE #CJK UNIFIED IDEOGRAPH +0xFBB7 0xFA26 #CJK COMPATIBILITY IDEOGRAPH +0xFBB8 0x9115 #CJK UNIFIED IDEOGRAPH +0xFBB9 0x9127 #CJK UNIFIED IDEOGRAPH +0xFBBA 0x91DA #CJK UNIFIED IDEOGRAPH +0xFBBB 0x91D7 #CJK UNIFIED IDEOGRAPH +0xFBBC 0x91DE #CJK UNIFIED IDEOGRAPH +0xFBBD 0x91ED #CJK UNIFIED IDEOGRAPH +0xFBBE 0x91EE #CJK UNIFIED IDEOGRAPH +0xFBBF 0x91E4 #CJK UNIFIED IDEOGRAPH +0xFBC0 0x91E5 #CJK UNIFIED IDEOGRAPH +0xFBC1 0x9206 #CJK UNIFIED IDEOGRAPH +0xFBC2 0x9210 #CJK UNIFIED IDEOGRAPH +0xFBC3 0x920A #CJK UNIFIED IDEOGRAPH +0xFBC4 0x923A #CJK UNIFIED IDEOGRAPH +0xFBC5 0x9240 #CJK UNIFIED IDEOGRAPH +0xFBC6 0x923C #CJK UNIFIED IDEOGRAPH +0xFBC7 0x924E #CJK UNIFIED IDEOGRAPH +0xFBC8 0x9259 #CJK UNIFIED IDEOGRAPH +0xFBC9 0x9251 #CJK UNIFIED IDEOGRAPH +0xFBCA 0x9239 #CJK UNIFIED IDEOGRAPH +0xFBCB 0x9267 #CJK UNIFIED IDEOGRAPH +0xFBCC 0x92A7 #CJK UNIFIED IDEOGRAPH +0xFBCD 0x9277 #CJK UNIFIED IDEOGRAPH +0xFBCE 0x9278 #CJK UNIFIED IDEOGRAPH +0xFBCF 0x92E7 #CJK UNIFIED IDEOGRAPH +0xFBD0 0x92D7 #CJK UNIFIED IDEOGRAPH +0xFBD1 0x92D9 #CJK UNIFIED IDEOGRAPH +0xFBD2 0x92D0 #CJK UNIFIED IDEOGRAPH +0xFBD3 0xFA27 #CJK COMPATIBILITY IDEOGRAPH +0xFBD4 0x92D5 #CJK UNIFIED IDEOGRAPH +0xFBD5 0x92E0 #CJK UNIFIED IDEOGRAPH +0xFBD6 0x92D3 #CJK UNIFIED IDEOGRAPH +0xFBD7 0x9325 #CJK UNIFIED IDEOGRAPH +0xFBD8 0x9321 #CJK UNIFIED IDEOGRAPH +0xFBD9 0x92FB #CJK UNIFIED IDEOGRAPH +0xFBDA 0xFA28 #CJK COMPATIBILITY IDEOGRAPH +0xFBDB 0x931E #CJK UNIFIED IDEOGRAPH +0xFBDC 0x92FF #CJK UNIFIED IDEOGRAPH +0xFBDD 0x931D #CJK UNIFIED IDEOGRAPH +0xFBDE 0x9302 #CJK UNIFIED IDEOGRAPH +0xFBDF 0x9370 #CJK UNIFIED IDEOGRAPH +0xFBE0 0x9357 #CJK UNIFIED IDEOGRAPH +0xFBE1 0x93A4 #CJK UNIFIED IDEOGRAPH +0xFBE2 0x93C6 #CJK UNIFIED IDEOGRAPH +0xFBE3 0x93DE #CJK UNIFIED IDEOGRAPH +0xFBE4 0x93F8 #CJK UNIFIED IDEOGRAPH +0xFBE5 0x9431 #CJK UNIFIED IDEOGRAPH +0xFBE6 0x9445 #CJK UNIFIED IDEOGRAPH +0xFBE7 0x9448 #CJK UNIFIED IDEOGRAPH +0xFBE8 0x9592 #CJK UNIFIED IDEOGRAPH +0xFBE9 0xF9DC #CJK COMPATIBILITY IDEOGRAPH +0xFBEA 0xFA29 #CJK COMPATIBILITY IDEOGRAPH +0xFBEB 0x969D #CJK UNIFIED IDEOGRAPH +0xFBEC 0x96AF #CJK UNIFIED IDEOGRAPH +0xFBED 0x9733 #CJK UNIFIED IDEOGRAPH +0xFBEE 0x973B #CJK UNIFIED IDEOGRAPH +0xFBEF 0x9743 #CJK UNIFIED IDEOGRAPH +0xFBF0 0x974D #CJK UNIFIED IDEOGRAPH +0xFBF1 0x974F #CJK UNIFIED IDEOGRAPH +0xFBF2 0x9751 #CJK UNIFIED IDEOGRAPH +0xFBF3 0x9755 #CJK UNIFIED IDEOGRAPH +0xFBF4 0x9857 #CJK UNIFIED IDEOGRAPH +0xFBF5 0x9865 #CJK UNIFIED IDEOGRAPH +0xFBF6 0xFA2A #CJK COMPATIBILITY IDEOGRAPH +0xFBF7 0xFA2B #CJK COMPATIBILITY IDEOGRAPH +0xFBF8 0x9927 #CJK UNIFIED IDEOGRAPH +0xFBF9 0xFA2C #CJK COMPATIBILITY IDEOGRAPH +0xFBFA 0x999E #CJK UNIFIED IDEOGRAPH +0xFBFB 0x9A4E #CJK UNIFIED IDEOGRAPH +0xFBFC 0x9AD9 #CJK UNIFIED IDEOGRAPH +0xFC40 0x9ADC #CJK UNIFIED IDEOGRAPH +0xFC41 0x9B75 #CJK UNIFIED IDEOGRAPH +0xFC42 0x9B72 #CJK UNIFIED IDEOGRAPH +0xFC43 0x9B8F #CJK UNIFIED IDEOGRAPH +0xFC44 0x9BB1 #CJK UNIFIED IDEOGRAPH +0xFC45 0x9BBB #CJK UNIFIED IDEOGRAPH +0xFC46 0x9C00 #CJK UNIFIED IDEOGRAPH +0xFC47 0x9D70 #CJK UNIFIED IDEOGRAPH +0xFC48 0x9D6B #CJK UNIFIED IDEOGRAPH +0xFC49 0xFA2D #CJK COMPATIBILITY IDEOGRAPH +0xFC4A 0x9E19 #CJK UNIFIED IDEOGRAPH +0xFC4B 0x9ED1 #CJK UNIFIED IDEOGRAPH diff --git a/lib/unicode.nim b/lib/unicode.nim index de3b80c942..e6665fbe23 100644 --- a/lib/unicode.nim +++ b/lib/unicode.nim @@ -7,6 +7,8 @@ # distribution, for details about the copyright. # +## This module provides a way to handle various Unicode (or other) encodings. + type TUniChar* = int32 ## type that can hold any Unicode character TUniChar16* = int16 ## 16 bit Unicode character @@ -17,19 +19,15 @@ proc uniCharLen*(s: string): int = ## returns the number of Unicode characters of the string `s`. var i = 0 while i < len(s): - if ord(s[i]) <= 127: - inc(i) - elif ord(s[i]) shr 5 == 0b110: - inc(i, 2) - elif ord(s[i]) shr 4 == 0b1110: - inc(i, 3) - elif ord(s[i]) shr 3 == 0b11110: - inc(i, 4) - else: - assert(false) + if ord(s[i]) <= 127: inc(i) + elif ord(s[i]) shr 5 == 0b110: inc(i, 2) + elif ord(s[i]) shr 4 == 0b1110: inc(i, 3) + elif ord(s[i]) shr 3 == 0b11110: inc(i, 4) + else: assert(false) inc(result) proc uniCharAt*(s: string, i: int): TUniChar = + ## returns the unicode character in `s` at byte index `i` if ord(s[i]) <= 127: result = ord(s[i]) elif ord(s[i]) shr 5 == 0b110: @@ -53,8 +51,7 @@ proc uniCharAt*(s: string, i: int): TUniChar = assert(false) iterator unichars*(s: string): TUniChar = - ## iterates over any unicode character of the string `s`. Fastest possible - ## method. + ## iterates over any unicode character of the string `s`. var i = 0 result: TUniChar @@ -79,6 +76,59 @@ iterator unichars*(s: string): TUniChar = else: assert(false) yield result + +type + TCharacterSet = enum + cs8859_1, cs8859_2 + +const + characterSetToName: array [TCharacterSet, string] = [ + "ISO/IEC 8859-1:1998", + "ISO 8859-2:1999", + "", + "" + ] + + cs8859_2toUnicode: array [0xA1..0xff, TUniChar16] = [ + 0x0104'i16, 0x02D8'i16, 0x0141'i16, 0x00A4'i16, 0x013D'i16, 0x015A'i16, + 0x00A7'i16, 0x00A8'i16, 0x0160'i16, 0x015E'i16, 0x0164'i16, 0x0179'i16, + 0x00AD'i16, 0x017D'i16, 0x017B'i16, 0x00B0'i16, 0x0105'i16, 0x02DB'i16, + 0x0142'i16, 0x00B4'i16, 0x013E'i16, 0x015B'i16, 0x02C7'i16, 0x00B8'i16, + 0x0161'i16, 0x015F'i16, 0x0165'i16, 0x017A'i16, 0x02DD'i16, 0x017E'i16, + 0x017C'i16, 0x0154'i16, 0x00C1'i16, 0x00C2'i16, 0x0102'i16, 0x00C4'i16, + 0x0139'i16, 0x0106'i16, 0x00C7'i16, 0x010C'i16, 0x00C9'i16, 0x0118'i16, + 0x00CB'i16, 0x011A'i16, 0x00CD'i16, 0x00CE'i16, 0x010E'i16, 0x0110'i16, + 0x0143'i16, 0x0147'i16, 0x00D3'i16, 0x00D4'i16, 0x0150'i16, 0x00D6'i16, + 0x00D7'i16, 0x0158'i16, 0x016E'i16, 0x00DA'i16, 0x0170'i16, 0x00DC'i16, + 0x00DD'i16, 0x0162'i16, 0x00DF'i16, 0x0155'i16, 0x00E1'i16, 0x00E2'i16, + 0x0103'i16, 0x00E4'i16, 0x013A'i16, 0x0107'i16, 0x00E7'i16, 0x010D'i16, + 0x00E9'i16, 0x0119'i16, 0x00EB'i16, 0x011B'i16, 0x00ED'i16, 0x00EE'i16, + 0x010F'i16, 0x0111'i16, 0x0144'i16, 0x0148'i16, 0x00F3'i16, 0x00F4'i16, + 0x0151'i16, 0x00F6'i16, 0x00F7'i16, 0x0159'i16, 0x016F'i16, 0x00FA'i16, + 0x0171'i16, 0x00FC'i16, 0x00FD'i16, 0x0163'i16, 0x02D9'i16] + +proc searchTable(tab: openarray[TUniChar16], u: TUniChar16): int8 = + var idx = find(tab, u) + assert(idx > 0) + result = toU8(idx) + +proc csToUnicode(cs: TCharacterSet, c: int8): TUniChar16 = + case cs + of cs8859_1: result = ze16(c) # no table lookup necessary + of cs8859_2: + if c <=% 0xA0'i8: + result = ze16(c) + else: + result = cs8859_2toUnicode[ze(c)] + +proc unicodeToCS(cs: TCharacterSet, u: TUniChar16): int8 = + case cs + of cs8859_1: result = toU8(u) # no table lookup necessary + of cs8859_2: + if u <=% 0x00A0'i16: + result = toU8(u) + else: + result = searchTable(cs8859_2toUnicode, u) +% 0xA1'8 proc utf8toLocale*(s: string): string proc localeToUtf8*(s: string): string diff --git a/lib/windows/windows.nim b/lib/windows/windows.nim index d14f56d123..2ac5fd7b67 100644 --- a/lib/windows/windows.nim +++ b/lib/windows/windows.nim @@ -7362,8 +7362,6 @@ when defined(x86_64): TXmmSaveArea* = XMM_SAVE_AREA32 PXmmSaveArea* = ptr TXmmSaveArea - const - LEGACY_SAVE_AREA_LENGTH* = sizeof(XMM_SAVE_AREA32) type CONTEXT* {.final, pure.} = object P1Home*: DWORD64 diff --git a/nim/ast.pas b/nim/ast.pas index c84262db44..899554c4ea 100644 --- a/nim/ast.pas +++ b/nim/ast.pas @@ -65,148 +65,148 @@ for key, val in enums.items(): cog.out(a) cog.out(b) ]]]*) -type - TTypeFlag = ( - tfVarargs, tfFinal, tfAcyclic, tfEnumHasWholes); - TTypeFlags = set of TTypeFlag; -const - TypeFlagToStr: array [TTypeFlag] of string = ( - 'tfVarargs', 'tfFinal', 'tfAcyclic', 'tfEnumHasWholes'); -type - TTypeKind = ( - tyNone, tyBool, tyChar, tyEmpty, - tyArrayConstr, tyNil, tyGeneric, tyGenericInst, - tyGenericParam, tyEnum, tyAnyEnum, tyArray, - tyObject, tyTuple, tySet, tyRange, - tyPtr, tyRef, tyVar, tySequence, - tyProc, tyPointer, tyOpenArray, tyString, - tyCString, tyForward, tyInt, tyInt8, - tyInt16, tyInt32, tyInt64, tyFloat, - tyFloat32, tyFloat64, tyFloat128); - TTypeKinds = set of TTypeKind; -const - TypeKindToStr: array [TTypeKind] of string = ( - 'tyNone', 'tyBool', 'tyChar', 'tyEmpty', - 'tyArrayConstr', 'tyNil', 'tyGeneric', 'tyGenericInst', - 'tyGenericParam', 'tyEnum', 'tyAnyEnum', 'tyArray', - 'tyObject', 'tyTuple', 'tySet', 'tyRange', - 'tyPtr', 'tyRef', 'tyVar', 'tySequence', - 'tyProc', 'tyPointer', 'tyOpenArray', 'tyString', - 'tyCString', 'tyForward', 'tyInt', 'tyInt8', - 'tyInt16', 'tyInt32', 'tyInt64', 'tyFloat', - 'tyFloat32', 'tyFloat64', 'tyFloat128'); -type - TSymFlag = ( - sfUsed, sfStar, sfMinus, sfInInterface, - sfFromGeneric, sfGlobal, sfForward, sfImportc, - sfExportc, sfVolatile, sfRegister, sfPure, - sfResult, sfNoSideEffect, sfMainModule, sfSystemModule, - sfNoReturn, sfAddrTaken, sfCompilerProc, sfCppMethod, - sfDiscriminant, sfDeprecated, sfInClosure, sfTypeCheck, - sfCompileTime, sfThreadVar, sfMerge); - TSymFlags = set of TSymFlag; -const - SymFlagToStr: array [TSymFlag] of string = ( - 'sfUsed', 'sfStar', 'sfMinus', 'sfInInterface', - 'sfFromGeneric', 'sfGlobal', 'sfForward', 'sfImportc', - 'sfExportc', 'sfVolatile', 'sfRegister', 'sfPure', - 'sfResult', 'sfNoSideEffect', 'sfMainModule', 'sfSystemModule', - 'sfNoReturn', 'sfAddrTaken', 'sfCompilerProc', 'sfCppMethod', - 'sfDiscriminant', 'sfDeprecated', 'sfInClosure', 'sfTypeCheck', - 'sfCompileTime', 'sfThreadVar', 'sfMerge'); -type - TNodeFlag = ( - nfNone, nfBase2, nfBase8, nfBase16, - nfAllConst, nfTransf, nfSem); - TNodeFlags = set of TNodeFlag; -const - NodeFlagToStr: array [TNodeFlag] of string = ( - 'nfNone', 'nfBase2', 'nfBase8', 'nfBase16', - 'nfAllConst', 'nfTransf', 'nfSem'); -type - TSymKind = ( - skUnknownSym, skConditional, skDynLib, skParam, - skTypeParam, skTemp, skType, skConst, - skVar, skProc, skIterator, skConverter, - skMacro, skTemplate, skField, skEnumField, - skForVar, skModule, skLabel, skStub); - TSymKinds = set of TSymKind; -const - SymKindToStr: array [TSymKind] of string = ( - 'skUnknownSym', 'skConditional', 'skDynLib', 'skParam', - 'skTypeParam', 'skTemp', 'skType', 'skConst', - 'skVar', 'skProc', 'skIterator', 'skConverter', - 'skMacro', 'skTemplate', 'skField', 'skEnumField', - 'skForVar', 'skModule', 'skLabel', 'skStub'); -type - TNodeKind = ( - nkNone, nkEmpty, nkIdent, nkSym, - nkType, nkCharLit, nkIntLit, nkInt8Lit, - nkInt16Lit, nkInt32Lit, nkInt64Lit, nkFloatLit, - nkFloat32Lit, nkFloat64Lit, nkStrLit, nkRStrLit, - nkTripleStrLit, nkMetaNode, nkNilLit, nkDotCall, - nkCommand, nkCall, nkGenericCall, nkExplicitTypeListCall, - nkExprEqExpr, nkExprColonExpr, nkIdentDefs, nkInfix, - nkPrefix, nkPostfix, nkPar, nkCurly, - nkBracket, nkBracketExpr, nkPragmaExpr, nkRange, - nkDotExpr, nkCheckedFieldExpr, nkDerefExpr, nkIfExpr, - nkElifExpr, nkElseExpr, nkLambda, nkAccQuoted, - nkHeaderQuoted, nkTableConstr, nkQualified, nkHiddenStdConv, - nkHiddenSubConv, nkHiddenCallConv, nkConv, nkCast, - nkAddr, nkHiddenAddr, nkHiddenDeref, nkObjDownConv, - nkObjUpConv, nkChckRangeF, nkChckRange64, nkChckRange, - nkStringToCString, nkCStringToString, nkPassAsOpenArray, nkAsgn, - nkDefaultTypeParam, nkGenericParams, nkFormalParams, nkOfInherit, - nkModule, nkProcDef, nkConverterDef, nkMacroDef, - nkTemplateDef, nkIteratorDef, nkOfBranch, nkElifBranch, - nkExceptBranch, nkElse, nkMacroStmt, nkAsmStmt, - nkPragma, nkIfStmt, nkWhenStmt, nkForStmt, - nkWhileStmt, nkCaseStmt, nkVarSection, nkConstSection, - nkConstDef, nkTypeSection, nkTypeDef, nkYieldStmt, - nkTryStmt, nkFinally, nkRaiseStmt, nkReturnStmt, - nkBreakStmt, nkContinueStmt, nkBlockStmt, nkDiscardStmt, - nkStmtList, nkImportStmt, nkFromStmt, nkImportAs, - nkIncludeStmt, nkAccessStmt, nkCommentStmt, nkStmtListExpr, - nkBlockExpr, nkStmtListType, nkBlockType, nkVm, - nkTypeOfExpr, nkObjectTy, nkTupleTy, nkRecList, - nkRecCase, nkRecWhen, nkRefTy, nkPtrTy, - nkVarTy, nkProcTy, nkEnumTy, nkEnumFieldDef, - nkReturnToken); - TNodeKinds = set of TNodeKind; -const - NodeKindToStr: array [TNodeKind] of string = ( - 'nkNone', 'nkEmpty', 'nkIdent', 'nkSym', - 'nkType', 'nkCharLit', 'nkIntLit', 'nkInt8Lit', - 'nkInt16Lit', 'nkInt32Lit', 'nkInt64Lit', 'nkFloatLit', - 'nkFloat32Lit', 'nkFloat64Lit', 'nkStrLit', 'nkRStrLit', - 'nkTripleStrLit', 'nkMetaNode', 'nkNilLit', 'nkDotCall', - 'nkCommand', 'nkCall', 'nkGenericCall', 'nkExplicitTypeListCall', - 'nkExprEqExpr', 'nkExprColonExpr', 'nkIdentDefs', 'nkInfix', - 'nkPrefix', 'nkPostfix', 'nkPar', 'nkCurly', - 'nkBracket', 'nkBracketExpr', 'nkPragmaExpr', 'nkRange', - 'nkDotExpr', 'nkCheckedFieldExpr', 'nkDerefExpr', 'nkIfExpr', - 'nkElifExpr', 'nkElseExpr', 'nkLambda', 'nkAccQuoted', - 'nkHeaderQuoted', 'nkTableConstr', 'nkQualified', 'nkHiddenStdConv', - 'nkHiddenSubConv', 'nkHiddenCallConv', 'nkConv', 'nkCast', - 'nkAddr', 'nkHiddenAddr', 'nkHiddenDeref', 'nkObjDownConv', - 'nkObjUpConv', 'nkChckRangeF', 'nkChckRange64', 'nkChckRange', - 'nkStringToCString', 'nkCStringToString', 'nkPassAsOpenArray', 'nkAsgn', - 'nkDefaultTypeParam', 'nkGenericParams', 'nkFormalParams', 'nkOfInherit', - 'nkModule', 'nkProcDef', 'nkConverterDef', 'nkMacroDef', - 'nkTemplateDef', 'nkIteratorDef', 'nkOfBranch', 'nkElifBranch', - 'nkExceptBranch', 'nkElse', 'nkMacroStmt', 'nkAsmStmt', - 'nkPragma', 'nkIfStmt', 'nkWhenStmt', 'nkForStmt', - 'nkWhileStmt', 'nkCaseStmt', 'nkVarSection', 'nkConstSection', - 'nkConstDef', 'nkTypeSection', 'nkTypeDef', 'nkYieldStmt', - 'nkTryStmt', 'nkFinally', 'nkRaiseStmt', 'nkReturnStmt', - 'nkBreakStmt', 'nkContinueStmt', 'nkBlockStmt', 'nkDiscardStmt', - 'nkStmtList', 'nkImportStmt', 'nkFromStmt', 'nkImportAs', - 'nkIncludeStmt', 'nkAccessStmt', 'nkCommentStmt', 'nkStmtListExpr', - 'nkBlockExpr', 'nkStmtListType', 'nkBlockType', 'nkVm', - 'nkTypeOfExpr', 'nkObjectTy', 'nkTupleTy', 'nkRecList', - 'nkRecCase', 'nkRecWhen', 'nkRefTy', 'nkPtrTy', - 'nkVarTy', 'nkProcTy', 'nkEnumTy', 'nkEnumFieldDef', - 'nkReturnToken'); +type + TNodeKind = ( + nkNone, nkEmpty, nkIdent, nkSym, + nkType, nkCharLit, nkIntLit, nkInt8Lit, + nkInt16Lit, nkInt32Lit, nkInt64Lit, nkFloatLit, + nkFloat32Lit, nkFloat64Lit, nkStrLit, nkRStrLit, + nkTripleStrLit, nkMetaNode, nkNilLit, nkDotCall, + nkCommand, nkCall, nkGenericCall, nkExplicitTypeListCall, + nkExprEqExpr, nkExprColonExpr, nkIdentDefs, nkInfix, + nkPrefix, nkPostfix, nkPar, nkCurly, + nkBracket, nkBracketExpr, nkPragmaExpr, nkRange, + nkDotExpr, nkCheckedFieldExpr, nkDerefExpr, nkIfExpr, + nkElifExpr, nkElseExpr, nkLambda, nkAccQuoted, + nkHeaderQuoted, nkTableConstr, nkQualified, nkHiddenStdConv, + nkHiddenSubConv, nkHiddenCallConv, nkConv, nkCast, + nkAddr, nkHiddenAddr, nkHiddenDeref, nkObjDownConv, + nkObjUpConv, nkChckRangeF, nkChckRange64, nkChckRange, + nkStringToCString, nkCStringToString, nkPassAsOpenArray, nkAsgn, + nkDefaultTypeParam, nkGenericParams, nkFormalParams, nkOfInherit, + nkModule, nkProcDef, nkConverterDef, nkMacroDef, + nkTemplateDef, nkIteratorDef, nkOfBranch, nkElifBranch, + nkExceptBranch, nkElse, nkMacroStmt, nkAsmStmt, + nkPragma, nkIfStmt, nkWhenStmt, nkForStmt, + nkWhileStmt, nkCaseStmt, nkVarSection, nkConstSection, + nkConstDef, nkTypeSection, nkTypeDef, nkYieldStmt, + nkTryStmt, nkFinally, nkRaiseStmt, nkReturnStmt, + nkBreakStmt, nkContinueStmt, nkBlockStmt, nkDiscardStmt, + nkStmtList, nkImportStmt, nkFromStmt, nkImportAs, + nkIncludeStmt, nkAccessStmt, nkCommentStmt, nkStmtListExpr, + nkBlockExpr, nkStmtListType, nkBlockType, nkVm, + nkTypeOfExpr, nkObjectTy, nkTupleTy, nkRecList, + nkRecCase, nkRecWhen, nkRefTy, nkPtrTy, + nkVarTy, nkProcTy, nkEnumTy, nkEnumFieldDef, + nkReturnToken); + TNodeKinds = set of TNodeKind; +const + NodeKindToStr: array [TNodeKind] of string = ( + 'nkNone', 'nkEmpty', 'nkIdent', 'nkSym', + 'nkType', 'nkCharLit', 'nkIntLit', 'nkInt8Lit', + 'nkInt16Lit', 'nkInt32Lit', 'nkInt64Lit', 'nkFloatLit', + 'nkFloat32Lit', 'nkFloat64Lit', 'nkStrLit', 'nkRStrLit', + 'nkTripleStrLit', 'nkMetaNode', 'nkNilLit', 'nkDotCall', + 'nkCommand', 'nkCall', 'nkGenericCall', 'nkExplicitTypeListCall', + 'nkExprEqExpr', 'nkExprColonExpr', 'nkIdentDefs', 'nkInfix', + 'nkPrefix', 'nkPostfix', 'nkPar', 'nkCurly', + 'nkBracket', 'nkBracketExpr', 'nkPragmaExpr', 'nkRange', + 'nkDotExpr', 'nkCheckedFieldExpr', 'nkDerefExpr', 'nkIfExpr', + 'nkElifExpr', 'nkElseExpr', 'nkLambda', 'nkAccQuoted', + 'nkHeaderQuoted', 'nkTableConstr', 'nkQualified', 'nkHiddenStdConv', + 'nkHiddenSubConv', 'nkHiddenCallConv', 'nkConv', 'nkCast', + 'nkAddr', 'nkHiddenAddr', 'nkHiddenDeref', 'nkObjDownConv', + 'nkObjUpConv', 'nkChckRangeF', 'nkChckRange64', 'nkChckRange', + 'nkStringToCString', 'nkCStringToString', 'nkPassAsOpenArray', 'nkAsgn', + 'nkDefaultTypeParam', 'nkGenericParams', 'nkFormalParams', 'nkOfInherit', + 'nkModule', 'nkProcDef', 'nkConverterDef', 'nkMacroDef', + 'nkTemplateDef', 'nkIteratorDef', 'nkOfBranch', 'nkElifBranch', + 'nkExceptBranch', 'nkElse', 'nkMacroStmt', 'nkAsmStmt', + 'nkPragma', 'nkIfStmt', 'nkWhenStmt', 'nkForStmt', + 'nkWhileStmt', 'nkCaseStmt', 'nkVarSection', 'nkConstSection', + 'nkConstDef', 'nkTypeSection', 'nkTypeDef', 'nkYieldStmt', + 'nkTryStmt', 'nkFinally', 'nkRaiseStmt', 'nkReturnStmt', + 'nkBreakStmt', 'nkContinueStmt', 'nkBlockStmt', 'nkDiscardStmt', + 'nkStmtList', 'nkImportStmt', 'nkFromStmt', 'nkImportAs', + 'nkIncludeStmt', 'nkAccessStmt', 'nkCommentStmt', 'nkStmtListExpr', + 'nkBlockExpr', 'nkStmtListType', 'nkBlockType', 'nkVm', + 'nkTypeOfExpr', 'nkObjectTy', 'nkTupleTy', 'nkRecList', + 'nkRecCase', 'nkRecWhen', 'nkRefTy', 'nkPtrTy', + 'nkVarTy', 'nkProcTy', 'nkEnumTy', 'nkEnumFieldDef', + 'nkReturnToken'); +type + TSymFlag = ( + sfUsed, sfStar, sfMinus, sfInInterface, + sfFromGeneric, sfGlobal, sfForward, sfImportc, + sfExportc, sfVolatile, sfRegister, sfPure, + sfResult, sfNoSideEffect, sfMainModule, sfSystemModule, + sfNoReturn, sfAddrTaken, sfCompilerProc, sfCppMethod, + sfDiscriminant, sfDeprecated, sfInClosure, sfTypeCheck, + sfCompileTime, sfThreadVar, sfMerge); + TSymFlags = set of TSymFlag; +const + SymFlagToStr: array [TSymFlag] of string = ( + 'sfUsed', 'sfStar', 'sfMinus', 'sfInInterface', + 'sfFromGeneric', 'sfGlobal', 'sfForward', 'sfImportc', + 'sfExportc', 'sfVolatile', 'sfRegister', 'sfPure', + 'sfResult', 'sfNoSideEffect', 'sfMainModule', 'sfSystemModule', + 'sfNoReturn', 'sfAddrTaken', 'sfCompilerProc', 'sfCppMethod', + 'sfDiscriminant', 'sfDeprecated', 'sfInClosure', 'sfTypeCheck', + 'sfCompileTime', 'sfThreadVar', 'sfMerge'); +type + TTypeKind = ( + tyNone, tyBool, tyChar, tyEmpty, + tyArrayConstr, tyNil, tyGeneric, tyGenericInst, + tyGenericParam, tyEnum, tyAnyEnum, tyArray, + tyObject, tyTuple, tySet, tyRange, + tyPtr, tyRef, tyVar, tySequence, + tyProc, tyPointer, tyOpenArray, tyString, + tyCString, tyForward, tyInt, tyInt8, + tyInt16, tyInt32, tyInt64, tyFloat, + tyFloat32, tyFloat64, tyFloat128); + TTypeKinds = set of TTypeKind; +const + TypeKindToStr: array [TTypeKind] of string = ( + 'tyNone', 'tyBool', 'tyChar', 'tyEmpty', + 'tyArrayConstr', 'tyNil', 'tyGeneric', 'tyGenericInst', + 'tyGenericParam', 'tyEnum', 'tyAnyEnum', 'tyArray', + 'tyObject', 'tyTuple', 'tySet', 'tyRange', + 'tyPtr', 'tyRef', 'tyVar', 'tySequence', + 'tyProc', 'tyPointer', 'tyOpenArray', 'tyString', + 'tyCString', 'tyForward', 'tyInt', 'tyInt8', + 'tyInt16', 'tyInt32', 'tyInt64', 'tyFloat', + 'tyFloat32', 'tyFloat64', 'tyFloat128'); +type + TNodeFlag = ( + nfNone, nfBase2, nfBase8, nfBase16, + nfAllConst, nfTransf, nfSem); + TNodeFlags = set of TNodeFlag; +const + NodeFlagToStr: array [TNodeFlag] of string = ( + 'nfNone', 'nfBase2', 'nfBase8', 'nfBase16', + 'nfAllConst', 'nfTransf', 'nfSem'); +type + TTypeFlag = ( + tfVarargs, tfFinal, tfAcyclic, tfEnumHasWholes); + TTypeFlags = set of TTypeFlag; +const + TypeFlagToStr: array [TTypeFlag] of string = ( + 'tfVarargs', 'tfFinal', 'tfAcyclic', 'tfEnumHasWholes'); +type + TSymKind = ( + skUnknownSym, skConditional, skDynLib, skParam, + skTypeParam, skTemp, skType, skConst, + skVar, skProc, skIterator, skConverter, + skMacro, skTemplate, skField, skEnumField, + skForVar, skModule, skLabel, skStub); + TSymKinds = set of TSymKind; +const + SymKindToStr: array [TSymKind] of string = ( + 'skUnknownSym', 'skConditional', 'skDynLib', 'skParam', + 'skTypeParam', 'skTemp', 'skType', 'skConst', + 'skVar', 'skProc', 'skIterator', 'skConverter', + 'skMacro', 'skTemplate', 'skField', 'skEnumField', + 'skForVar', 'skModule', 'skLabel', 'skStub'); {[[[end]]]} type @@ -219,43 +219,43 @@ type // if (i+1) % 6 == 0: cog.outl("") //cog.outl("m" + magics[-1]) //]]] - mNone, mDefined, mLow, mHigh, mSizeOf, mIs, - mSucc, mPred, mInc, mDec, mOrd, mNew, - mNewFinalize, mNewSeq, mRegisterFinalizer, mLengthOpenArray, mLengthStr, mLengthArray, - mLengthSeq, mIncl, mExcl, mCard, mChr, mGCref, - mGCunref, mAddI, mSubI, mMulI, mDivI, mModI, - mAddI64, mSubI64, mMulI64, mDivI64, mModI64, mShrI, - mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI, - mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64, mMinI64, - mMaxI64, mAddF64, mSubF64, mMulF64, mDivF64, mMinF64, - mMaxF64, mAddU, mSubU, mMulU, mDivU, mModU, - mAddU64, mSubU64, mMulU64, mDivU64, mModU64, mEqI, - mLeI, mLtI, mEqI64, mLeI64, mLtI64, mEqF64, - mLeF64, mLtF64, mLeU, mLtU, mLeU64, mLtU64, - mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, - mEqB, mLeB, mLtB, mEqRef, mEqProc, mEqUntracedRef, - mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI, mUnaryMinusI64, - mAbsI, mAbsI64, mNot, mUnaryPlusI, mBitnotI, mUnaryPlusI64, - mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64, - mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, - mToU32, mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, - mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, - mAnd, mOr, mEqStr, mLeStr, mLtStr, mEqSet, - mLeSet, mLtSet, mMulSet, mPlusSet, mMinusSet, mSymDiffSet, - mConStrStr, mConArrArr, mConArrT, mConTArr, mConTT, mSlice, - mAppendStrCh, mAppendStrStr, mAppendSeqElem, mAppendSeqSeq, mInRange, mInSet, - mAsgn, mRepr, mExit, mSetLengthStr, mSetLengthSeq, mAssert, - mSwap, mIsNil, mArrToSeq, mArray, mOpenArray, mRange, - mSet, mSeq, mInt, mInt8, mInt16, mInt32, - mInt64, mFloat, mFloat32, mFloat64, mBool, mChar, - mString, mCstring, mPointer, mAnyEnum, mEmptySet, mIntSetBaseType, - mNil, mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor, - mNimrodMinor, mNimrodPatch, mCpuEndian, mNaN, mInf, mNegInf, - mNLen, mNChild, mNSetChild, mNAdd, mNAddMultiple, mNDel, - mNKind, mNIntVal, mNFloatVal, mNSymbol, mNIdent, mNGetType, - mNStrVal, mNSetIntVal, mNSetFloatVal, mNSetSymbol, mNSetIdent, mNSetType, - mNSetStrVal, mNNewNimNode, mNCopyNimNode, mNCopyNimTree, mStrToIdent, mIdentToStr, - mEqIdent, mNHint, mNWarning, mNError + mNone, mDefined, mLow, mHigh, mSizeOf, mIs, + mSucc, mPred, mInc, mDec, mOrd, mNew, + mNewFinalize, mNewSeq, mRegisterFinalizer, mLengthOpenArray, mLengthStr, mLengthArray, + mLengthSeq, mIncl, mExcl, mCard, mChr, mGCref, + mGCunref, mAddI, mSubI, mMulI, mDivI, mModI, + mAddI64, mSubI64, mMulI64, mDivI64, mModI64, mShrI, + mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI, + mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64, mMinI64, + mMaxI64, mAddF64, mSubF64, mMulF64, mDivF64, mMinF64, + mMaxF64, mAddU, mSubU, mMulU, mDivU, mModU, + mAddU64, mSubU64, mMulU64, mDivU64, mModU64, mEqI, + mLeI, mLtI, mEqI64, mLeI64, mLtI64, mEqF64, + mLeF64, mLtF64, mLeU, mLtU, mLeU64, mLtU64, + mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, + mEqB, mLeB, mLtB, mEqRef, mEqProc, mEqUntracedRef, + mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI, mUnaryMinusI64, + mAbsI, mAbsI64, mNot, mUnaryPlusI, mBitnotI, mUnaryPlusI64, + mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64, + mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, + mToU32, mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, + mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, + mAnd, mOr, mEqStr, mLeStr, mLtStr, mEqSet, + mLeSet, mLtSet, mMulSet, mPlusSet, mMinusSet, mSymDiffSet, + mConStrStr, mConArrArr, mConArrT, mConTArr, mConTT, mSlice, + mAppendStrCh, mAppendStrStr, mAppendSeqElem, mAppendSeqSeq, mInRange, mInSet, + mAsgn, mRepr, mExit, mSetLengthStr, mSetLengthSeq, mAssert, + mSwap, mIsNil, mArrToSeq, mArray, mOpenArray, mRange, + mSet, mSeq, mInt, mInt8, mInt16, mInt32, + mInt64, mFloat, mFloat32, mFloat64, mBool, mChar, + mString, mCstring, mPointer, mAnyEnum, mEmptySet, mIntSetBaseType, + mNil, mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor, + mNimrodMinor, mNimrodPatch, mCpuEndian, mNaN, mInf, mNegInf, + mNLen, mNChild, mNSetChild, mNAdd, mNAddMultiple, mNDel, + mNKind, mNIntVal, mNFloatVal, mNSymbol, mNIdent, mNGetType, + mNStrVal, mNSetIntVal, mNSetFloatVal, mNSetSymbol, mNSetIdent, mNSetType, + mNSetStrVal, mNNewNimNode, mNCopyNimNode, mNCopyNimTree, mStrToIdent, mIdentToStr, + mEqIdent, mNHint, mNWarning, mNError //[[[end]]] ); @@ -319,10 +319,10 @@ type locField, // location is a record field locArrayElem, // location is an array element locExpr, // "location" is really an expression - locImmediate, // location is an immediate value locProc, // location is a proc (an address of a procedure) locData, // location is a constant - locCall, // location is a call expression + locCall, // location is a call expression + locImmediate, // location is an immediate value locOther // location is something other ); @@ -351,9 +351,10 @@ type end; // ---------------- end of backend information ------------------------------ - TLibKind = (libHeader, libDynamic, libDynamicGenerated); + TLibKind = (libHeader, libDynamic); TLib = object(lists.TListEntry) // also misused for headers! kind: TLibKind; + generated: bool; // needed for the backends: name: PRope; path: string; @@ -476,43 +477,43 @@ const // "MagicToStr" array: // if (i+1) % 6 == 0: cog.outl("") //cog.outl("'%s'" % magics[-1]) //]]] - 'None', 'Defined', 'Low', 'High', 'SizeOf', 'Is', - 'Succ', 'Pred', 'Inc', 'Dec', 'Ord', 'New', - 'NewFinalize', 'NewSeq', 'RegisterFinalizer', 'LengthOpenArray', 'LengthStr', 'LengthArray', - 'LengthSeq', 'Incl', 'Excl', 'Card', 'Chr', 'GCref', - 'GCunref', 'AddI', 'SubI', 'MulI', 'DivI', 'ModI', - 'AddI64', 'SubI64', 'MulI64', 'DivI64', 'ModI64', 'ShrI', - 'ShlI', 'BitandI', 'BitorI', 'BitxorI', 'MinI', 'MaxI', - 'ShrI64', 'ShlI64', 'BitandI64', 'BitorI64', 'BitxorI64', 'MinI64', - 'MaxI64', 'AddF64', 'SubF64', 'MulF64', 'DivF64', 'MinF64', - 'MaxF64', 'AddU', 'SubU', 'MulU', 'DivU', 'ModU', - 'AddU64', 'SubU64', 'MulU64', 'DivU64', 'ModU64', 'EqI', - 'LeI', 'LtI', 'EqI64', 'LeI64', 'LtI64', 'EqF64', - 'LeF64', 'LtF64', 'LeU', 'LtU', 'LeU64', 'LtU64', - 'EqEnum', 'LeEnum', 'LtEnum', 'EqCh', 'LeCh', 'LtCh', - 'EqB', 'LeB', 'LtB', 'EqRef', 'EqProc', 'EqUntracedRef', - 'LePtr', 'LtPtr', 'EqCString', 'Xor', 'UnaryMinusI', 'UnaryMinusI64', - 'AbsI', 'AbsI64', 'Not', 'UnaryPlusI', 'BitnotI', 'UnaryPlusI64', - 'BitnotI64', 'UnaryPlusF64', 'UnaryMinusF64', 'AbsF64', 'Ze8ToI', 'Ze8ToI64', - 'Ze16ToI', 'Ze16ToI64', 'Ze32ToI64', 'ZeIToI64', 'ToU8', 'ToU16', - 'ToU32', 'ToFloat', 'ToBiggestFloat', 'ToInt', 'ToBiggestInt', 'CharToStr', - 'BoolToStr', 'IntToStr', 'Int64ToStr', 'FloatToStr', 'CStrToStr', 'StrToStr', - 'And', 'Or', 'EqStr', 'LeStr', 'LtStr', 'EqSet', - 'LeSet', 'LtSet', 'MulSet', 'PlusSet', 'MinusSet', 'SymDiffSet', - 'ConStrStr', 'ConArrArr', 'ConArrT', 'ConTArr', 'ConTT', 'Slice', - 'AppendStrCh', 'AppendStrStr', 'AppendSeqElem', 'AppendSeqSeq', 'InRange', 'InSet', - 'Asgn', 'Repr', 'Exit', 'SetLengthStr', 'SetLengthSeq', 'Assert', - 'Swap', 'IsNil', 'ArrToSeq', 'Array', 'OpenArray', 'Range', - 'Set', 'Seq', 'Int', 'Int8', 'Int16', 'Int32', - 'Int64', 'Float', 'Float32', 'Float64', 'Bool', 'Char', - 'String', 'Cstring', 'Pointer', 'AnyEnum', 'EmptySet', 'IntSetBaseType', - 'Nil', 'IsMainModule', 'CompileDate', 'CompileTime', 'NimrodVersion', 'NimrodMajor', - 'NimrodMinor', 'NimrodPatch', 'CpuEndian', 'NaN', 'Inf', 'NegInf', - 'NLen', 'NChild', 'NSetChild', 'NAdd', 'NAddMultiple', 'NDel', - 'NKind', 'NIntVal', 'NFloatVal', 'NSymbol', 'NIdent', 'NGetType', - 'NStrVal', 'NSetIntVal', 'NSetFloatVal', 'NSetSymbol', 'NSetIdent', 'NSetType', - 'NSetStrVal', 'NNewNimNode', 'NCopyNimNode', 'NCopyNimTree', 'StrToIdent', 'IdentToStr', - 'EqIdent', 'NHint', 'NWarning', 'NError' + 'None', 'Defined', 'Low', 'High', 'SizeOf', 'Is', + 'Succ', 'Pred', 'Inc', 'Dec', 'Ord', 'New', + 'NewFinalize', 'NewSeq', 'RegisterFinalizer', 'LengthOpenArray', 'LengthStr', 'LengthArray', + 'LengthSeq', 'Incl', 'Excl', 'Card', 'Chr', 'GCref', + 'GCunref', 'AddI', 'SubI', 'MulI', 'DivI', 'ModI', + 'AddI64', 'SubI64', 'MulI64', 'DivI64', 'ModI64', 'ShrI', + 'ShlI', 'BitandI', 'BitorI', 'BitxorI', 'MinI', 'MaxI', + 'ShrI64', 'ShlI64', 'BitandI64', 'BitorI64', 'BitxorI64', 'MinI64', + 'MaxI64', 'AddF64', 'SubF64', 'MulF64', 'DivF64', 'MinF64', + 'MaxF64', 'AddU', 'SubU', 'MulU', 'DivU', 'ModU', + 'AddU64', 'SubU64', 'MulU64', 'DivU64', 'ModU64', 'EqI', + 'LeI', 'LtI', 'EqI64', 'LeI64', 'LtI64', 'EqF64', + 'LeF64', 'LtF64', 'LeU', 'LtU', 'LeU64', 'LtU64', + 'EqEnum', 'LeEnum', 'LtEnum', 'EqCh', 'LeCh', 'LtCh', + 'EqB', 'LeB', 'LtB', 'EqRef', 'EqProc', 'EqUntracedRef', + 'LePtr', 'LtPtr', 'EqCString', 'Xor', 'UnaryMinusI', 'UnaryMinusI64', + 'AbsI', 'AbsI64', 'Not', 'UnaryPlusI', 'BitnotI', 'UnaryPlusI64', + 'BitnotI64', 'UnaryPlusF64', 'UnaryMinusF64', 'AbsF64', 'Ze8ToI', 'Ze8ToI64', + 'Ze16ToI', 'Ze16ToI64', 'Ze32ToI64', 'ZeIToI64', 'ToU8', 'ToU16', + 'ToU32', 'ToFloat', 'ToBiggestFloat', 'ToInt', 'ToBiggestInt', 'CharToStr', + 'BoolToStr', 'IntToStr', 'Int64ToStr', 'FloatToStr', 'CStrToStr', 'StrToStr', + 'And', 'Or', 'EqStr', 'LeStr', 'LtStr', 'EqSet', + 'LeSet', 'LtSet', 'MulSet', 'PlusSet', 'MinusSet', 'SymDiffSet', + 'ConStrStr', 'ConArrArr', 'ConArrT', 'ConTArr', 'ConTT', 'Slice', + 'AppendStrCh', 'AppendStrStr', 'AppendSeqElem', 'AppendSeqSeq', 'InRange', 'InSet', + 'Asgn', 'Repr', 'Exit', 'SetLengthStr', 'SetLengthSeq', 'Assert', + 'Swap', 'IsNil', 'ArrToSeq', 'Array', 'OpenArray', 'Range', + 'Set', 'Seq', 'Int', 'Int8', 'Int16', 'Int32', + 'Int64', 'Float', 'Float32', 'Float64', 'Bool', 'Char', + 'String', 'Cstring', 'Pointer', 'AnyEnum', 'EmptySet', 'IntSetBaseType', + 'Nil', 'IsMainModule', 'CompileDate', 'CompileTime', 'NimrodVersion', 'NimrodMajor', + 'NimrodMinor', 'NimrodPatch', 'CpuEndian', 'NaN', 'Inf', 'NegInf', + 'NLen', 'NChild', 'NSetChild', 'NAdd', 'NAddMultiple', 'NDel', + 'NKind', 'NIntVal', 'NFloatVal', 'NSymbol', 'NIdent', 'NGetType', + 'NStrVal', 'NSetIntVal', 'NSetFloatVal', 'NSetSymbol', 'NSetIdent', 'NSetType', + 'NSetStrVal', 'NNewNimNode', 'NCopyNimNode', 'NCopyNimTree', 'StrToIdent', 'IdentToStr', + 'EqIdent', 'NHint', 'NWarning', 'NError' //[[[end]]] ); @@ -629,18 +630,29 @@ function leValue(a, b: PNode): Boolean; // a <= b? a, b are literals function ValueToString(a: PNode): string; // ------------- efficient integer sets ------------------------------------- +{@ignore} +type + TBitScalar = int32; // FPC produces wrong code for ``int`` +{@emit +type + TBitScalar = int; } + const - IntsPerTrunk = 8; InitIntSetSize = 8; // must be a power of two! - BitsPerTrunk = IntsPerTrunk * sizeof(int) * 8; - BitsPerInt = sizeof(int) * 8; + TrunkShift = 9; + BitsPerTrunk = 1 shl TrunkShift; + // needs to be a power of 2 and divisible by 64 + TrunkMask = BitsPerTrunk-1; + IntsPerTrunk = BitsPerTrunk div (sizeof(TBitScalar)*8); + IntShift = 5+ord(sizeof(TBitScalar)=8); // 5 or 6, depending on int width + IntMask = 1 shl IntShift -1; type PTrunk = ^TTrunk; TTrunk = record next: PTrunk; // all nodes are connected with this pointer key: int; // start address at bit 0 - bits: array [0..IntsPerTrunk-1] of int; // a bit vector + bits: array [0..IntsPerTrunk-1] of TBitScalar; // a bit vector end; TTrunkSeq = array of PTrunk; TIntSet = record @@ -661,44 +673,8 @@ const procedure registerID(id: PIdObj); -// owner handling: -function getCurrOwner(): PSym; -procedure PushOwner(owner: PSym); -procedure PopOwner; - implementation -var - gOwners: array of PSym; // owner stack (used for initializing the - // owner field of syms) - // the documentation comment always gets - // assigned to the current owner - // BUGFIX: global array is needed! -{@emit gOwners := @[]; } - -function getCurrOwner(): PSym; -begin - result := gOwners[high(gOwners)]; -end; - -procedure PushOwner(owner: PSym); -var - len: int; -begin - len := length(gOwners); - setLength(gOwners, len+1); - gOwners[len] := owner; -end; - -procedure PopOwner; -var - len: int; -begin - len := length(gOwners); - if (len <= 0) then InternalError('popOwner'); - setLength(gOwners, len - 1); -end; - var usedIds: TIntSet; @@ -1301,8 +1277,7 @@ begin result := nil end; -procedure IntSetRawInsert(const t: TIntSet; var data: TTrunkSeq; - desc: PTrunk); +procedure IntSetRawInsert(const t: TIntSet; var data: TTrunkSeq; desc: PTrunk); var h: int; begin @@ -1365,23 +1340,15 @@ end; // ---------- slightly higher level procs ---------------------------------- -function transform(key: int): int; -begin - if key < 0 then result := 1000000000 + key // avoid negative numbers! - else result := key -end; - function IntSetContains(const s: TIntSet; key: int): bool; var u: int; t: PTrunk; begin - u := transform(key); - t := IntSetGet(s, u div BitsPerTrunk); + t := IntSetGet(s, key shr TrunkShift); if t <> nil then begin - u := u mod BitsPerTrunk; - result := (t.bits[u div BitsPerInt] - and (1 shl (u mod BitsPerInt))) <> 0 + u := key and TrunkMask; + result := (t.bits[u shr IntShift] and (1 shl (u and IntMask))) <> 0 end else result := false @@ -1392,11 +1359,10 @@ var u: int; t: PTrunk; begin - u := transform(key); - t := IntSetPut(s, u div BitsPerTrunk); - u := u mod BitsPerTrunk; - t.bits[u div BitsPerInt] := t.bits[u div BitsPerInt] - or (1 shl (u mod BitsPerInt)); + t := IntSetPut(s, key shr TrunkShift); + u := key and TrunkMask; + t.bits[u shr IntShift] := t.bits[u shr IntShift] + or (1 shl (u and IntMask)); end; function IntSetContainsOrIncl(var s: TIntSet; key: int): bool; @@ -1404,22 +1370,35 @@ var u: int; t: PTrunk; begin - u := transform(key); - t := IntSetGet(s, u div BitsPerTrunk); + t := IntSetGet(s, key shr TrunkShift); if t <> nil then begin - u := u mod BitsPerTrunk; - result := (t.bits[u div BitsPerInt] - and (1 shl (u mod BitsPerInt))) <> 0; + u := key and TrunkMask; + result := (t.bits[u shr IntShift] and (1 shl (u and IntMask))) <> 0; if not result then - t.bits[u div BitsPerInt] := t.bits[u div BitsPerInt] - or (1 shl (u mod BitsPerInt)); + t.bits[u shr IntShift] := t.bits[u shr IntShift] + or (1 shl (u and IntMask)); end else begin IntSetIncl(s, key); result := false end end; - +(* +procedure IntSetDebug(const s: TIntSet); +var + it: PTrunk; + i, j: int; +begin + it := s.head; + while it <> nil do begin + for i := 0 to high(it.bits) do + for j := 0 to BitsPerInt-1 do begin + if (it.bits[j] and (1 shl j)) <> 0 then + MessageOut('Contains key: ' + toString(it.key + i * BitsPerInt + j)); + end; + it := it.next + end +end;*) initialization if debugIDs then IntSetInit(usedIds); diff --git a/nim/astalgo.pas b/nim/astalgo.pas index ddd646efbb..0e31f4ac72 100644 --- a/nim/astalgo.pas +++ b/nim/astalgo.pas @@ -274,11 +274,12 @@ begin res := '"' + ''; for i := strStart to length(s)+strStart-1 do begin if (i-strStart+1) mod MaxLineLength = 0 then begin - res := res +{&} '"' +{&} nl; + addChar(res, '"'); + add(res, nl); app(result, toRope(res)); res := '"'+''; // reset end; - res := res +{&} toYamlChar(s[i]); + add(res, toYamlChar(s[i])); end; addChar(res, '"'); app(result, toRope(res)); diff --git a/nim/ccgexprs.pas b/nim/ccgexprs.pas index 97828680be..f94cff3a4c 100644 --- a/nim/ccgexprs.pas +++ b/nim/ccgexprs.pas @@ -32,7 +32,7 @@ begin end; function genHexLiteral(v: PNode): PRope; -// hex literals are unsigned in C (at least I think so) +// hex literals are unsigned in C // so we don't generate hex literals any longer. begin if not (v.kind in [nkIntLit..nkInt64Lit]) then @@ -58,7 +58,13 @@ begin nkCharLit..nkInt64Lit: begin case skipVarGenericRange(ty).kind of tyChar, tyInt64, tyNil: result := intLiteral(v.intVal); - tyInt..tyInt32: begin + tyInt8: + result := ropef('((NI8) $1)', [intLiteral(biggestInt(int8(v.intVal)))]); + tyInt16: + result := ropef('((NI16) $1)', [intLiteral(biggestInt(int16(v.intVal)))]); + tyInt32: + result := ropef('((NI32) $1)', [intLiteral(biggestInt(int32(v.intVal)))]); + tyInt: begin if (v.intVal >= low(int32)) and (v.intVal <= high(int32)) then result := int32Literal(int32(v.intVal)) else @@ -436,8 +442,6 @@ begin InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); appf(p.s[cpsStmts], frmt, [rdLoc(a), rdLoc(b)]); - freeTemp(p, a); - freeTemp(p, b) end; procedure unaryStmt(p: BProc; e: PNode; var d: TLoc; @@ -449,7 +453,6 @@ begin if magic <> '' then useMagic(p.module, magic); InitLocExpr(p, e.sons[1], a); appf(p.s[cpsStmts], frmt, [rdLoc(a)]); - freeTemp(p, a); end; procedure binaryStmtChar(p: BProc; e: PNode; var d: TLoc; @@ -462,8 +465,6 @@ begin InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); appf(p.s[cpsStmts], frmt, [rdCharLoc(a), rdCharLoc(b)]); - freeTemp(p, a); - freeTemp(p, b) end; procedure binaryExpr(p: BProc; e: PNode; var d: TLoc; @@ -476,12 +477,7 @@ begin assert(e.sons[2].typ <> nil); InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); - putIntoDest(p, d, e.typ, - ropef(frmt, [rdLoc(a), rdLoc(b), getTypeDesc(p.module, e.typ)])); - if d.k <> locExpr then begin // BACKPORT - freeTemp(p, a); - freeTemp(p, b) - end + putIntoDest(p, d, e.typ, ropef(frmt, [rdLoc(a), rdLoc(b)])); end; procedure binaryExprChar(p: BProc; e: PNode; var d: TLoc; @@ -495,10 +491,6 @@ begin InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); putIntoDest(p, d, e.typ, ropef(frmt, [rdCharLoc(a), rdCharLoc(b)])); - if d.k <> locExpr then begin // BACKPORT - freeTemp(p, a); - freeTemp(p, b) - end end; procedure unaryExpr(p: BProc; e: PNode; var d: TLoc; @@ -508,10 +500,7 @@ var begin if magic <> '' then useMagic(p.module, magic); InitLocExpr(p, e.sons[1], a); - putIntoDest(p, d, e.typ, ropef(frmt, - [rdLoc(a), getTypeDesc(p.module, e.typ)])); - if d.k <> locExpr then // BACKPORT - freeTemp(p, a) + putIntoDest(p, d, e.typ, ropef(frmt, [rdLoc(a)])); end; procedure unaryExprChar(p: BProc; e: PNode; var d: TLoc; @@ -522,26 +511,90 @@ begin if magic <> '' then useMagic(p.module, magic); InitLocExpr(p, e.sons[1], a); putIntoDest(p, d, e.typ, ropef(frmt, [rdCharLoc(a)])); - if d.k <> locExpr then // BACKPORT - freeTemp(p, a) end; +procedure binaryArithOverflow(p: BProc; e: PNode; var d: TLoc; m: TMagic); const - binOverflowTab: array [mAddi..mModi64] of string = ( + prc: array [mAddi..mModi64] of string = ( 'addInt', 'subInt', 'mulInt', 'divInt', 'modInt', 'addInt64', 'subInt64', 'mulInt64', 'divInt64', 'modInt64' ); - binWoOverflowTab: array [mAddi..mModi64] of string = ( - '($3)($1 + $2)', '($3)($1 - $2)', '($3)($1 * $2)', '($3)($1 / $2)', - '($3)($1 % $2)', - '($1 + $2)', '($1 - $2)', '($1 * $2)', '($1 / $2)', '($1 % $2)' + opr: array [mAddi..mModi64] of string = ( + '+'+'', '-'+'', '*'+'', '/'+'', '%'+'', + '+'+'', '-'+'', '*'+'', '/'+'', '%'+'' ); +var + a, b: TLoc; + t: PType; +begin + assert(e.sons[1].typ <> nil); + assert(e.sons[2].typ <> nil); + InitLocExpr(p, e.sons[1], a); + InitLocExpr(p, e.sons[2], b); + t := skipGenericRange(e.typ); + if getSize(t) >= platform.IntSize then begin + if optOverflowCheck in p.options then begin + useMagic(p.module, prc[m]); + putIntoDest(p, d, e.typ, ropef('$1($2, $3)', + [toRope(prc[m]), rdLoc(a), rdLoc(b)])); + end + else + putIntoDest(p, d, e.typ, ropef('(NI$4)($2 $1 $3)', + [toRope(opr[m]), rdLoc(a), rdLoc(b), toRope(getSize(t)*8)])); + end + else begin + if optOverflowCheck in p.options then begin + useMagic(p.module, 'raiseOverflow'); + if (m = mModI) or (m = mDivI) then begin + useMagic(p.module, 'raiseDivByZero'); + appf(p.s[cpsStmts], 'if (!$1) raiseDivByZero();$n', [rdLoc(b)]); + end; + a.r := ropef('((NI)($2) $1 (NI)($3))', + [toRope(opr[m]), rdLoc(a), rdLoc(b)]); + if d.k = locNone then getTemp(p, getSysType(tyInt), d); + genAssignment(p, d, a, {@set}[]); + appf(p.s[cpsStmts], 'if ($1 < $2 || $1 > $3) raiseOverflow();$n', + [rdLoc(d), intLiteral(firstOrd(t)), intLiteral(lastOrd(t))]); + d.t := e.typ; + d.r := ropef('(NI$1)($2)', [toRope(getSize(t)*8), rdLoc(d)]); + end + else + putIntoDest(p, d, e.typ, ropef('(NI$4)($2 $1 $3)', + [toRope(opr[m]), rdLoc(a), rdLoc(b), toRope(getSize(t)*8)])); + end +end; + +procedure unaryArithOverflow(p: BProc; e: PNode; var d: TLoc; m: TMagic); +const + opr: array [mUnaryMinusI..mAbsI64] of string = ( + '((NI$2)-($1))', // UnaryMinusI + '-($1)', // UnaryMinusI64 + '(NI$2)abs($1)', // AbsI + '($1 > 0? ($1) : -($1))' // AbsI64 + ); +var + a: TLoc; + t: PType; +begin + assert(e.sons[1].typ <> nil); + InitLocExpr(p, e.sons[1], a); + t := skipGenericRange(e.typ); + if optOverflowCheck in p.options then begin + useMagic(p.module, 'raiseOverflow'); + appf(p.s[cpsStmts], 'if ($1 == $2) raiseOverflow();$n', + [rdLoc(a), intLiteral(firstOrd(t))]); + end; + putIntoDest(p, d, e.typ, ropef(opr[m], [rdLoc(a), toRope(getSize(t)*8)])); +end; + +procedure binaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic); +const binArithTab: array [mShrI..mXor] of string = ( - '($3)((NU)($1) >> (NU)($2))', // ShrI - '($3)((NU)($1) << (NU)($2))', // ShlI - '($3)($1 & $2)', // BitandI - '($3)($1 | $2)', // BitorI - '($3)($1 ^ $2)', // BitxorI + '(NI$3)((NU$3)($1) >> (NU$3)($2))', // ShrI + '(NI$3)((NU$3)($1) << (NU$3)($2))', // ShlI + '(NI$3)($1 & $2)', // BitandI + '(NI$3)($1 | $2)', // BitorI + '(NI$3)($1 ^ $2)', // BitxorI '(($1 <= $2) ? $1 : $2)', // MinI '(($1 >= $2) ? $1 : $2)', // MaxI '(NI64)((NU64)($1) >> (NU64)($2))', // ShrI64 @@ -559,11 +612,11 @@ const '(($1 <= $2) ? $1 : $2)', // MinF64 '(($1 >= $2) ? $1 : $2)', // MaxF64 - '($3)((NU)($1) + (NU)($2))', // AddU - '($3)((NU)($1) - (NU)($2))', // SubU - '($3)((NU)($1) * (NU)($2))', // MulU - '($3)((NU)($1) / (NU)($2))', // DivU - '($3)((NU)($1) % (NU)($2))', // ModU + '(NI$3)((NU$3)($1) + (NU$3)($2))', // AddU + '(NI$3)((NU$3)($1) - (NU$3)($2))', // SubU + '(NI$3)((NU$3)($1) * (NU$3)($2))', // MulU + '(NI$3)((NU$3)($1) / (NU$3)($2))', // DivU + '(NI$3)((NU$3)($1) % (NU$3)($2))', // ModU '(NI64)((NU64)($1) + (NU64)($2))', // AddU64 '(NI64)((NU64)($1) - (NU64)($2))', // SubU64 '(NI64)((NU64)($1) * (NU64)($2))', // MulU64 @@ -580,8 +633,8 @@ const '($1 <= $2)', // LeF64 '($1 < $2)', // LtF64 - '((NU)($1) <= (NU)($2))', // LeU - '((NU)($1) < (NU)($2))', // LtU + '((NU$3)($1) <= (NU$3)($2))', // LeU + '((NU$3)($1) < (NU$3)($2))', // LtU '((NU64)($1) <= (NU64)($2))', // LeU64 '((NU64)($1) < (NU64)($2))', // LtU64 @@ -604,16 +657,32 @@ const '($1 != $2)' // Xor ); +var + a, b: TLoc; + s: biggestInt; +begin + assert(e.sons[1].typ <> nil); + assert(e.sons[2].typ <> nil); + InitLocExpr(p, e.sons[1], a); + InitLocExpr(p, e.sons[2], b); + // BUGFIX: cannot use result-type here, as it may be a boolean + s := max(getSize(a.t), getSize(b.t))*8; + putIntoDest(p, d, e.typ, ropef(binArithTab[op], + [rdLoc(a), rdLoc(b), toRope(s)])); +end; + +procedure unaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic); +const unArithTab: array [mNot..mToBiggestInt] of string = ( '!($1)', // Not '$1', // UnaryPlusI - '(($2) ~($1))', // BitnotI - '+($1)', // UnaryPlusI64 + '(NI$2)((NU$2) ~($1))', // BitnotI + '$1', // UnaryPlusI64 '~($1)', // BitnotI64 - '+($1)', // UnaryPlusF64 + '$1', // UnaryPlusF64 '-($1)', // UnaryMinusF64 - '($1 > 0? ($1) : -($1))', // AbsF64; BUGFIX: fabs() makes problems for Tiny C, so we don't use it - + '($1 > 0? ($1) : -($1))', // AbsF64; BUGFIX: fabs() makes problems + // for Tiny C, so we don't use it '((NI)(NU)(NU8)($1))', // mZe8ToI '((NI64)(NU64)(NU8)($1))', // mZe8ToI64 '((NI)(NU)(NU16)($1))', // mZe16ToI @@ -630,70 +699,15 @@ const 'float64ToInt32($1)', // ToInt XXX: this is not correct! 'float64ToInt64($1)' // ToBiggestInt ); - unOverflowTab: array [mUnaryMinusI..mAbsI64] of string = ( - 'negInt', // UnaryMinusI - 'negInt64', // UnaryMinusI64 - 'absInt', // AbsI - 'absInt64' // AbsI64 - ); - unWoOverflowTab: array [mUnaryMinusI..mAbsI64] of string = ( - '(($2)-($1))', // UnaryMinusI - '-($1)', // UnaryMinusI64 - '($2)abs($1)', // AbsI - '($1 > 0? ($1) : -($1))' // AbsI64 - ); - -procedure binaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic); -begin - binaryExpr(p, e, d, '', binArithTab[op]) -end; - -procedure binaryArithOverflow(p: BProc; e: PNode; var d: TLoc; op: TMagic); var - a, b: TLoc; + a: TLoc; + t: PType; begin - if not (optOverflowCheck in p.options) then - binaryExpr(p, e, d, '', binWoOverflowTab[op]) - else begin - case op of - mAddi..mModi: begin - if (skipGeneric(e.typ).kind = tyInt) then - binaryExpr(p, e, d, binOverflowTab[op], - binOverflowTab[op] + '($1, $2)') - else begin - InitLocExpr(p, e.sons[1], a); - InitLocExpr(p, e.sons[2], b); - UseMagic(p.module, binOverflowTab[op]); - UseMagic(p.module, 'raiseOverflow'); - a.r := ropef(binOverflowTab[op] + '($1, $2)', - [rdLoc(a), rdLoc(b)]); - if d.k = locNone then getTemp(p, getSysType(tyInt), d); - genAssignment(p, d, a, {@set}[]); - appf(p.s[cpsStmts], 'if ($1 < $2 || $1 > $3) raiseOverflow();$n', - [rdLoc(d), intLiteral(firstOrd(e.typ)), - intLiteral(lastOrd(e.typ))]); - d.t := e.typ; - d.r := ropef('($1)($2)', [getTypeDesc(p.module, e.typ), rdLoc(d)]); - end - end; - mAddi64..mModi64: - binaryExpr(p, e, d, binOverflowTab[op], binOverflowTab[op] + '($1, $2)'); - else InternalError(e.info, 'binaryArithOverflow'); - end - end -end; - -procedure unaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic); -begin - unaryExpr(p, e, d, '', unArithTab[op]) -end; - -procedure unaryArithOverflow(p: BProc; e: PNode; var d: TLoc; op: TMagic); -begin - if optOverflowCheck in p.options then - unaryExpr(p, e, d, unOverflowTab[op], '($2)' + unOverflowTab[op] + '($1)') - else - unaryExpr(p, e, d, '', unWoOverflowTab[op]) + assert(e.sons[1].typ <> nil); + InitLocExpr(p, e.sons[1], a); + t := skipGenericRange(e.typ); + putIntoDest(p, d, e.typ, ropef(unArithTab[op], + [rdLoc(a), toRope(getSize(t)*8)])); end; procedure genDeref(p: BProc; e: PNode; var d: TLoc); @@ -707,7 +721,7 @@ begin case skipGeneric(a.t).kind of tyRef: d.s := OnHeap; tyVar: d.s := OnUnknown; - tyPtr: d.s := OnStack; + tyPtr: d.s := OnUnknown; // BUGFIX! else InternalError(e.info, 'genDeref ' + typekindToStr[a.t.kind]); end; putIntoDest(p, d, a.t.sons[0], ropef('(*$1)', [rdLoc(a)])); @@ -723,7 +737,6 @@ begin else begin InitLocExpr(p, e.sons[0], a); putIntoDest(p, d, e.typ, addrLoc(a)); - if d.k <> locExpr then freeTemp(p, a) end end; @@ -834,7 +847,7 @@ begin ty := skipPtrsGeneric(skipVarGenericRange(a.t)); first := intLiteral(firstOrd(ty)); // emit range check: - if (optBoundsCheck in p.options) then + if (optBoundsCheck in p.options) then begin if b.k <> locImmediate then begin // semantic pass has already checked: useMagic(p.module, 'raiseIndexError'); if firstOrd(ty) = 0 then begin @@ -848,11 +861,10 @@ begin 'if ($1 < $2 || $1 > $3) raiseIndexError();$n', [rdCharLoc(b), first, intLiteral(lastOrd(ty))]) end; + end; if d.k = locNone then d.s := a.s; putIntoDest(p, d, elemType(skipVarGeneric(ty)), ropef('$1[($2)-$3]', [rdLoc(a), rdCharLoc(b), first])); - // freeTemp(p, a); // backport - // freeTemp(p, b) end; procedure genCStringElem(p: BProc; e: PNode; var d: TLoc); @@ -866,8 +878,6 @@ begin if d.k = locNone then d.s := a.s; putIntoDest(p, d, elemType(skipVarGeneric(ty)), ropef('$1[$2]', [rdLoc(a), rdCharLoc(b)])); - // freeTemp(p, a); // backport - // freeTemp(p, b) end; procedure genOpenArrayElem(p: BProc; e: PNode; var d: TLoc); @@ -880,13 +890,12 @@ begin if (optBoundsCheck in p.options) then begin useMagic(p.module, 'raiseIndexError'); appf(p.s[cpsStmts], - 'if ((NU)($1) > (NU)($2Len0)) raiseIndexError();$n', [rdLoc(b), rdLoc(a)]) + 'if ((NU)($1) >= (NU)($2Len0)) raiseIndexError();$n', [rdLoc(b), rdLoc(a)]) + // BUGFIX: ``>=`` and not ``>``! end; if d.k = locNone then d.s := a.s; putIntoDest(p, d, elemType(skipVarGeneric(a.t)), ropef('$1[$2]', [rdLoc(a), rdCharLoc(b)])); - // freeTemp(p, a); // backport - // freeTemp(p, b) end; procedure genSeqElem(p: BPRoc; e: PNode; var d: TLoc); @@ -915,8 +924,6 @@ begin a.r := ropef('(*$1)', [a.r]); putIntoDest(p, d, elemType(skipVarGeneric(a.t)), ropef('$1->data[$2]', [rdLoc(a), rdCharLoc(b)])); - // freeTemp(p, a); // backport - // freeTemp(p, b) end; procedure genAndOr(p: BProc; e: PNode; var d: TLoc; m: TMagic); @@ -955,10 +962,8 @@ begin fixLabel(p, L); if d.k = locNone then d := tmp - else begin + else genAssignment(p, d, tmp, {@set}[]); // no need for deep copying - freeTemp(p, tmp); - end end; procedure genIfExpr(p: BProc; n: PNode; var d: TLoc); @@ -989,7 +994,6 @@ begin initLocExpr(p, it.sons[0], a); Lelse := getLabel(p); appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Lelse]); - freeTemp(p, a); expr(p, it.sons[1], tmp); appf(p.s[cpsStmts], 'goto $1;$n', [Lend]); fixLabel(p, Lelse); @@ -1003,10 +1007,8 @@ begin fixLabel(p, Lend); if d.k = locNone then d := tmp - else begin + else genAssignment(p, d, tmp, {@set}[]); // no need for deep copying - freeTemp(p, tmp); - end end; procedure genCall(p: BProc; t: PNode; var d: TLoc); @@ -1111,14 +1113,10 @@ begin appf(p.s[cpsStmts], '$1 = rawNewString($2$3);$n', [tmp.r, lens, toRope(L)]); app(p.s[cpsStmts], appends); - for i := 0 to high(a) do - freeTemp(p, a[i]); if d.k = locNone then d := tmp - else begin + else genAssignment(p, d, tmp, {@set}[]); // no need for deep copying - freeTemp(p, tmp); // BACKPORT - end end; procedure genStrAppend(p: BProc; e: PNode; var d: TLoc); @@ -1170,8 +1168,6 @@ begin appf(p.s[cpsStmts], '$1 = resizeString($1, $2$3);$n', [rdLoc(a[0]), lens, toRope(L)]); app(p.s[cpsStmts], appends); - for i := 0 to high(a) do - freeTemp(p, a[i]) end; procedure genSeqElemAppend(p: BProc; e: PNode; var d: TLoc); @@ -1376,8 +1372,6 @@ begin [addrLoc(a), genTypeInfo(p.module, t)])) end end; - if d.k <> locExpr then - freeTemp(p, a); end; procedure genDollar(p: BProc; n: PNode; var d: TLoc; const magic, frmt: string); @@ -1441,8 +1435,6 @@ begin '$1 = ($3) setLengthSeq(&($1)->Sup, sizeof($4), $2);$n', [rdLoc(a), rdLoc(b), getTypeDesc(p.module, t), getTypeDesc(p.module, t.sons[0])]); - freeTemp(p, a); - freeTemp(p, b) end; procedure genSetLengthStr(p: BProc; e: PNode; var d: TLoc); @@ -1464,7 +1456,6 @@ begin genAssignment(p, tmp, a, {@set}[]); genAssignment(p, a, b, {@set}[]); genAssignment(p, b, tmp, {@set}[]); - freeTemp(p, tmp); // BACKPORT end; // -------------------- set operations ------------------------------------ @@ -1496,10 +1487,6 @@ procedure binaryExprIn(p: BProc; e: PNode; var a, b, d: TLoc; const frmt: string); begin putIntoDest(p, d, e.typ, ropef(frmt, [rdLoc(a), rdSetElemLoc(b, a.t)])); - if d.k <> locExpr then begin - freeTemp(p, a); - freeTemp(p, b) - end end; procedure genInExprAux(p: BProc; e: PNode; var a, b, d: TLoc); @@ -1521,8 +1508,6 @@ begin InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); appf(p.s[cpsStmts], frmt, [rdLoc(a), rdSetElemLoc(b, a.t)]); - freeTemp(p, a); - freeTemp(p, b) end; procedure genInOp(p: BProc; e: PNode; var d: TLoc); @@ -1557,10 +1542,6 @@ begin end; app(b.r, ')'+''); putIntoDest(p, d, e.typ, b.r); - if d.k <> locExpr then begin - for i := 0 to high(c) do freeTemp(p, c[i]); - freeTemp(p, a) - end end else begin assert(e.sons[1].typ <> nil); @@ -1635,9 +1616,6 @@ begin if d.k = locNone then getTemp(p, a.t, d); appf(p.s[cpsStmts], lookupOpr[op], [rdLoc(i), toRope(size), rdLoc(d), rdLoc(a), rdLoc(b)]); - freeTemp(p, a); - freeTemp(p, b); - freeTemp(p, i) end; mEqSet: binaryExprChar(p, e, d, '', @@ -1652,9 +1630,6 @@ begin 'for ($1 = 0; $1 < $2; $1++) $n' + ' $3[$1] = $4[$1] $6 $5[$1];$n', [rdLoc(i), toRope(size), rdLoc(d), rdLoc(a), rdLoc(b), toRope(lookupOpr[op])]); - freeTemp(p, a); - freeTemp(p, b); - freeTemp(p, i) end; mInSet: genInOp(p, e, d); else internalError(e.info, 'genSetOp') @@ -1686,7 +1661,6 @@ begin else putIntoDest(p, d, e.typ, ropef('(($1) ($2))', [getTypeDesc(p.module, e.typ), rdCharLoc(a)])); - if d.k <> locExpr then freeTemp(p, a) end; procedure genRangeChck(p: BProc; n: PNode; var d: TLoc; const magic: string); @@ -1704,11 +1678,11 @@ begin InitLocExpr(p, n.sons[0], a); useMagic(p.module, magic); putIntoDest(p, d, dest, - ropef('(($1)' +{&} magic +{&} '($2, $3, $4))', + ropef('(($1)$5($2, $3, $4))', [getTypeDesc(p.module, dest), rdCharLoc(a), genLiteral(p, n.sons[1], dest), - genLiteral(p, n.sons[2], dest)])); - if d.k <> locExpr then freeTemp(p, a) + genLiteral(p, n.sons[2], dest), + toRope(magic)])); end end; @@ -1722,19 +1696,25 @@ var a: TLoc; dest: PType; begin + while n.sons[0].kind = nkPassAsOpenArray do + n.sons[0] := n.sons[0].sons[0]; // BUGFIX dest := skipVarGeneric(n.typ); - initLocExpr(p, n.sons[0], a); - case skipVarGeneric(a.t).kind of - tyOpenArray: + case skipVarGeneric(n.sons[0].typ).kind of + tyOpenArray: begin + initLocExpr(p, n.sons[0], a); putIntoDest(p, d, dest, ropef('$1, $1Len0', [rdLoc(a)])); - tyString, tySequence: + end; + tyString, tySequence: begin + initLocExpr(p, n.sons[0], a); putIntoDest(p, d, dest, ropef('$1->data, $1->Sup.len', [rdLoc(a)])); - tyArray, tyArrayConstr: + end; + tyArray, tyArrayConstr: begin + initLocExpr(p, n.sons[0], a); putIntoDest(p, d, dest, ropef('$1, $2', [rdLoc(a), toRope(lengthOrd(a.t))])); + end else InternalError(n.sons[0].info, 'passToOpenArray: ' + typeToString(a.t)) - end; - if d.k <> locExpr then freeTemp(p, a) + end end; procedure convStrToCStr(p: BProc; n: PNode; var d: TLoc); @@ -1743,7 +1723,6 @@ var begin initLocExpr(p, n.sons[0], a); putIntoDest(p, d, skipVarGeneric(n.typ), ropef('$1->data', [rdLoc(a)])); - if d.k <> locExpr then freeTemp(p, a) end; procedure convCStrToStr(p: BProc; n: PNode; var d: TLoc); @@ -1754,7 +1733,6 @@ begin initLocExpr(p, n.sons[0], a); putIntoDest(p, d, skipVarGeneric(n.typ), ropef('cstrToNimstr($1)', [rdLoc(a)])); - if d.k <> locExpr then freeTemp(p, a) end; procedure genStrEquals(p: BProc; e: PNode; var d: TLoc); @@ -1846,7 +1824,6 @@ begin InitLocExpr(p, e.sons[1], a); assert(a.t <> nil); expr(p, e.sons[2], a); - freeTemp(p, a) end; mSwap: genSwap(p, e, d); mPred: begin // XXX: range checking? @@ -1978,15 +1955,11 @@ begin '$2[$1/8] |=(1<<($1%8));$n', [rdLoc(idx), rdLoc(d), rdSetElemLoc(a, e.typ), rdSetElemLoc(b, e.typ)]); - freeTemp(p, a); - freeTemp(p, b); - freeTemp(p, idx) end else begin initLocExpr(p, e.sons[i], a); appf(p.s[cpsStmts], '$1[$2/8] |=(1<<($2%8));$n', [rdLoc(d), rdSetElemLoc(a, e.typ)]); - freeTemp(p, a) end end end @@ -2003,9 +1976,6 @@ begin '$2 |=(1<<((' +{&} ts +{&} ')($1)%(sizeof(' +{&}ts+{&}')*8)));$n', [rdLoc(idx), rdLoc(d), rdSetElemLoc(a, e.typ), rdSetElemLoc(b, e.typ)]); - freeTemp(p, a); - freeTemp(p, b); - freeTemp(p, idx) end else begin initLocExpr(p, e.sons[i], a); @@ -2013,7 +1983,6 @@ begin '$1 |=(1<<((' +{&} ts +{&} ')($2)%(sizeof(' +{&}ts+{&} ')*8)));$n', [rdLoc(d), rdSetElemLoc(a, e.typ)]); - freeTemp(p, a) end end end @@ -2191,7 +2160,8 @@ begin nkStrLit..nkTripleStrLit, nkIntLit..nkInt64Lit, nkFloatLit..nkFloat64Lit, nkNilLit, nkCharLit: begin putIntoDest(p, d, e.typ, genLiteral(p, e)); - d.k := locImmediate // for removal of index checks + if d.k in [locNone, locExpr] then + d.k := locImmediate // for removal of index checks end; nkCall, nkHiddenCallConv, nkInfix, nkPrefix, nkPostfix, nkCommand: begin if (e.sons[0].kind = nkSym) and diff --git a/nim/ccgstmts.pas b/nim/ccgstmts.pas index b00751edd5..0e93d6b0fd 100644 --- a/nim/ccgstmts.pas +++ b/nim/ccgstmts.pas @@ -141,7 +141,6 @@ begin initLocExpr(p, it.sons[0], a); Lelse := getLabel(p); appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Lelse]); - freeTemp(p, a); genStmts(p, it.sons[1]); if sonsLen(n) > 1 then appf(p.s[cpsStmts], 'goto $1;$n', [Lend]); @@ -179,7 +178,6 @@ begin p.blocks[len].id := abs(p.blocks[len].id); appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Labl]); end; - freeTemp(p, a); genStmts(p, t.sons[1]); if p.blocks[len].id > 0 then appf(p.s[cpsStmts], '} $1: ;$n', [Labl]) @@ -286,7 +284,6 @@ begin if gCmd <> cmdCompileToCpp then useMagic(p.module, 'raiseException'); InitLocExpr(p, t.sons[0], a); e := rdLoc(a); - freeTemp(p, a); typ := t.sons[0].typ; while typ.kind in [tyVar, tyRef, tyPtr] do typ := typ.sons[0]; appf(p.s[cpsStmts], getRaiseFrmt(p), @@ -306,10 +303,11 @@ end; // ---------------- case statement generation ----------------------------- const - stringCaseThreshold = 1000; //4; // above X strings a hash-switch for strings - // is generated - // this version sets it too high to avoid hashing, because the hashing - // algorithm won't be the same; I don't know why + stringCaseThreshold = 100000; + // above X strings a hash-switch for strings is generated + // this version sets it too high to avoid hashing, because this has not + // been tested for a long time + // XXX test and enable this optimization! procedure genCaseGenericBranch(p: BProc; b: PNode; const e: TLoc; const rangeFormat, eqFormat: TFormatStr; @@ -323,14 +321,11 @@ begin if b.sons[i].kind = nkRange then begin initLocExpr(p, b.sons[i].sons[0], x); initLocExpr(p, b.sons[i].sons[1], y); - freeTemp(p, x); - freeTemp(p, y); appf(p.s[cpsStmts], rangeFormat, [rdCharLoc(e), rdCharLoc(x), rdCharLoc(y), labl]) end else begin initLocExpr(p, b.sons[i], x); - freeTemp(p, x); appf(p.s[cpsStmts], eqFormat, [rdCharLoc(e), rdCharLoc(x), labl]) end @@ -377,7 +372,6 @@ begin end; // second pass: generate statements genCaseSecondPass(p, t, labId); - freeTemp(p, a) end; {@ignore} @@ -402,24 +396,24 @@ begin b := 0; for i := 0 to Length(s)-1 do begin b := b +{%} Ord(s[i]); - b := b +{%} b shl 10; - b := b xor (b shr 6) + b := b +{%} shlu(b, 10); + b := b xor shru(b, 6) end; - b := b +{%} b shl 3; - b := b xor (b shr 11); - b := b +{%} b shl 15; + b := b +{%} shlu(b, 3); + b := b xor shru(b, 11); + b := b +{%} shlu(b, 15); result := b end else begin a := 0; for i := 0 to Length(s)-1 do begin a := a +{%} int32(Ord(s[i])); - a := a +{%} a shl int32(10); - a := a xor (a shr int32(6)); + a := a +{%} shlu(a, int32(10)); + a := a xor shru(a, int32(6)); end; - a := a +{%} a shl int32(3); - a := a xor (a shr int32(11)); - a := a +{%} a shl int32(15); + a := a +{%} shlu(a, int32(3)); + a := a xor shru(a, int32(11)); + a := a +{%} shlu(a, int32(15)); result := a end end; @@ -448,7 +442,6 @@ begin for i := 0 to len - 2 do begin assert(b.sons[i].kind <> nkRange); initLocExpr(p, b.sons[i], x); - freeTemp(p, x); assert(b.sons[i].kind in [nkStrLit..nkTripleStrLit]); j := int(hashString(b.sons[i].strVal) and high(branches)); appf(branches[j], 'if (eqStrings($1, $2)) goto $3;$n', @@ -499,7 +492,6 @@ begin appf(p.s[cpsStmts], 'goto LA$1;$n', [toRope(p.labels)]); // third pass: generate statements genCaseSecondPass(p, t, labId); - freeTemp(p, a); end else genCaseGeneric(p, t, '', 'if (eqStrings($1, $2)) goto $3;$n') @@ -541,7 +533,6 @@ begin if canGenerateSwitch then begin initLocExpr(p, t.sons[0], a); appf(p.s[cpsStmts], 'switch ($1) {$n', [rdCharLoc(a)]); - freeTemp(p, a); for i := 1 to sonsLen(t)-1 do begin if t.sons[i].kind = nkOfBranch then begin len := sonsLen(t.sons[i]); @@ -823,7 +814,6 @@ begin InitLocExpr(p, e.sons[0], a); assert(a.t <> nil); expr(p, e.sons[1], a); - freeTemp(p, a) end; procedure genStmts(p: BProc; t: PNode); @@ -852,13 +842,11 @@ begin nkCall: begin genLineDir(p, t); initLocExpr(p, t, a); - freeTemp(p, a); end; nkAsgn: genAsgn(p, t); nkDiscardStmt: begin genLineDir(p, t); initLocExpr(p, t.sons[0], a); - freeTemp(p, a) end; nkAsmStmt: genAsmStmt(p, t); nkTryStmt: begin @@ -880,8 +868,11 @@ begin if (t.sons[codePos] <> nil) or (lfDynamicLib in prc.loc.flags) then begin // BUGFIX if IntSetContainsOrIncl(p.module.debugDeclared, prc.id) then begin - internalError(t.info, 'genProc()'); // XXX: remove this check! + internalError(t.info, 'genStmts(): ' + toString(prc.id)); + // XXX: remove this check! end; + //if IntSetContains(p.module.debugDeclared, 2642) then + // InternalError(t.info, 'this sucks ' + toString(prc.id)); genProc(p.module, prc) end //else if sfCompilerProc in prc.flags then genProcPrototype(prc); diff --git a/nim/ccgtypes.pas b/nim/ccgtypes.pas index 2c238ce84a..5f4def667e 100644 --- a/nim/ccgtypes.pas +++ b/nim/ccgtypes.pas @@ -33,7 +33,10 @@ begin 'A'..'Z': addChar(result, chr(ord(name[i]) - ord('A') + ord('a'))); '_': begin end; 'a'..'z', '0'..'9': addChar(result, name[i]); - else result := result + 'HEX' +{&} toHex(ord(name[i]), 2); + else begin + add(result, 'HEX'); + add(result, toHex(ord(name[i]), 2)) + end end end end; @@ -92,6 +95,7 @@ begin 1: result := ctUInt8; 2: result := ctUInt16; 4: result := ctInt32; + 8: result := ctInt64; else internalError('mapType'); end end @@ -284,8 +288,10 @@ begin 1: result := typeNameOrLiteral(typ, 'NU8'); 2: result := typeNameOrLiteral(typ, 'NU16'); 4: result := typeNameOrLiteral(typ, 'NI32'); + 8: result := typeNameOrLiteral(typ, 'NI64'); else begin - internalError('getSimpleTypeDesc()'); + internalError(typ.sym.info, + 'getSimpleTypeDesc: ' + toString(getSize(typ))); result := nil end end @@ -885,7 +891,7 @@ begin dataGen := true end; tyObject: begin - if sfPure in t.sym.flags then + if isPureObject(t) then id := getID() else begin id := t.id; @@ -943,7 +949,7 @@ begin genEnumInfo(m, t, ropef('NTI$1', [toRope(t.id)])); end; tyObject: begin - if not (sfPure in t.sym.flags) then begin + if not isPureObject(t) then begin useMagic(m, 'TNimType'); useMagic(m, 'TNimNode'); genObjectInfo(m, t, ropef('NTI$1', [toRope(t.id)])); diff --git a/nim/ccgutils.pas b/nim/ccgutils.pas index 8e3775d22b..05f2ea828f 100644 --- a/nim/ccgutils.pas +++ b/nim/ccgutils.pas @@ -39,7 +39,7 @@ begin if key = nil then exit; case key.Kind of tyEmpty, tyChar, tyBool, tyNil, tyPointer, tyString, tyCString, - tyInt..tyFloat128, tyProc, tyEnum, tyObject, tyAnyEnum: begin end; + tyInt..tyFloat128, tyProc, tyAnyEnum: begin end; tyNone, tyForward: InternalError('GetUniqueType: ' + typeToString(key)); tyGenericParam, tyGeneric, tySequence, @@ -54,6 +54,13 @@ begin end; IdTablePut(gTypeTable, key, key); end; + tyObject, tyEnum: begin + result := PType(IdTableGet(gTypeTable, key)); + if result = nil then begin + IdTablePut(gTypeTable, key, key); + result := key; + end + end; tyGenericInst: result := GetUniqueType(lastSon(key)); end; end; @@ -102,11 +109,14 @@ begin res := '"'+''; for i := strStart to length(s)+strStart-1 do begin if (i-strStart+1) mod MaxLineLength = 0 then begin - res := res +{&} '"' +{&} nl; - app(result, toRope(res)); - res := '"'+''; // reset + add(res, '"'); + add(res, nl); + app(result, toRope(res)); + // reset: + setLength(res, 1); + res[strStart] := '"'; end; - res := res +{&} toCChar(s[i]); + add(res, toCChar(s[i])); end; addChar(res, '"'); app(result, toRope(res)); diff --git a/nim/cgen.pas b/nim/cgen.pas index 2f89c4208b..736d4b7961 100644 --- a/nim/cgen.pas +++ b/nim/cgen.pas @@ -207,10 +207,6 @@ begin result.flags := {@set}[]; end; -procedure freeTemp(p: BProc; const temp: TLoc); -begin -end; - // -------------------------- Variable manager ---------------------------- procedure declareGlobalVar(m: BModule; s: PSym); @@ -318,8 +314,8 @@ var tmp: PRope; begin assert(lib <> nil); - if lib.kind = libDynamic then begin - lib.kind := libDynamicGenerated; + if not lib.generated then begin + lib.generated := true; useMagic(m, 'nimLoadLibrary'); useMagic(m, 'nimUnloadLibrary'); useMagic(m, 'NimStringDesc'); diff --git a/nim/condsyms.pas b/nim/condsyms.pas index c018a37eac..9c5d64d4ba 100644 --- a/nim/condsyms.pas +++ b/nim/condsyms.pas @@ -102,6 +102,7 @@ begin case targetCPU of cpuI386: DefineSymbol('x86'); cpuIa64: DefineSymbol('itanium'); + cpuAmd64: DefineSymbol('x8664'); else begin end end; case targetOS of diff --git a/nim/crc.pas b/nim/crc.pas index 429f0ec303..e147166059 100644 --- a/nim/crc.pas +++ b/nim/crc.pas @@ -126,7 +126,8 @@ const function updateCrc32(val: Byte; crc: TCrc32): TCrc32; overload; begin - result := crc32Table[(int(crc) xor (int(val) and $ff)) and $ff] xor (int(crc) shr 8); + result := TCrc32(crc32Table[(int(crc) xor (int(val) and $ff)) and $ff]) xor + (crc shr TCrc32(8)); end; function updateCrc32(val: Char; crc: TCrc32): TCrc32; overload; diff --git a/nim/debugids.pas b/nim/debugids.pas new file mode 100644 index 0000000000..fff9ed10b6 --- /dev/null +++ b/nim/debugids.pas @@ -0,0 +1,129 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit debugids; + +interface + +{$include 'config.inc'} + +uses + nsystem, nos, strutils, ast; + +const + idfile = 'debugids.txt'; + +// This module implements debugging facilities for the ID mechanism. +procedure registerID(s: PSym); + +procedure writeIDTable(); +procedure loadIDTable(); + +implementation + +type + TIdSymTuple = record{@tuple} // keep id from sym to better detect bugs + id: int; + s: PSym; + end; + TIdSymTupleSeq = array of TIdSymTuple; + TIdSymTable = record + counter: int; + data: TIdSymTupleSeq; + end; + +function TableRawGet(const t: TTable; key: PObject): int; +var + h: THash; +begin + h := hashNode(key) and high(t.data); // start with real hash value + while t.data[h].key <> nil do begin + if (t.data[h].key = key) then begin + result := h; exit + end; + h := nextTry(h, high(t.data)) + end; + result := -1 +end; + +function TableSearch(const t: TTable; key, closure: PObject; + comparator: TCmpProc): PObject; +var + h: THash; +begin + h := hashNode(key) and high(t.data); // start with real hash value + while t.data[h].key <> nil do begin + if (t.data[h].key = key) then + if comparator(t.data[h].val, closure) then begin // BUGFIX 1 + result := t.data[h].val; exit + end; + h := nextTry(h, high(t.data)) + end; + result := nil +end; + +function TableGet(const t: TTable; key: PObject): PObject; +var + index: int; +begin + index := TableRawGet(t, key); + if index >= 0 then result := t.data[index].val + else result := nil +end; + +procedure TableRawInsert(var data: TPairSeq; key, val: PObject); +var + h: THash; +begin + h := HashNode(key) and high(data); + while data[h].key <> nil do begin + assert(data[h].key <> key); + h := nextTry(h, high(data)) + end; + assert(data[h].key = nil); + data[h].key := key; + data[h].val := val; +end; + +procedure TableEnlarge(var t: TTable); +var + n: TPairSeq; + i: int; +begin +{@ignore} + n := emptySeq; + setLength(n, length(t.data) * growthFactor); + fillChar(n[0], length(n)*sizeof(n[0]), 0); +{@emit + newSeq(n, length(t.data) * growthFactor); } + for i := 0 to high(t.data) do + if t.data[i].key <> nil then + TableRawInsert(n, t.data[i].key, t.data[i].val); +{@ignore} + t.data := n; +{@emit + swap(t.data, n); +} +end; + +procedure TablePut(var t: TTable; key, val: PObject); +var + index: int; +begin + index := TableRawGet(t, key); + if index >= 0 then + t.data[index].val := val + else begin + if mustRehash(length(t.data), t.counter) then TableEnlarge(t); + TableRawInsert(t.data, key, val); + inc(t.counter) + end; +end; + + +end. diff --git a/nim/depends.pas b/nim/depends.pas new file mode 100644 index 0000000000..d8b9781425 --- /dev/null +++ b/nim/depends.pas @@ -0,0 +1,97 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit depends; + +// This module implements a dependency file generator. + +interface + +{$include 'config.inc'} + +uses + nsystem, nos, options, ast, astalgo, msgs, ropes, idents, passes, importer; + +function genDependPass(): TPass; +procedure generateDot(const project: string); + +implementation + +type + TGen = object(TPassContext) + module: PSym; + filename: string; + end; + PGen = ^TGen; + +var + gDotGraph: PRope; // the generated DOT file; we need a global variable + +procedure addDependencyAux(const importing, imported: string); +begin + appf(gDotGraph, '$1 -> $2;$n', [toRope(importing), + toRope(imported)]); + // s1 -> s2_4 [label="[0-9]"]; +end; + +function addDotDependency(c: PPassContext; n: PNode): PNode; +var + i: int; + g: PGen; + imported: string; +begin + result := n; + if n = nil then exit; + g := PGen(c); + case n.kind of + nkImportStmt: begin + for i := 0 to sonsLen(n)-1 do begin + imported := getFileTrunk(getModuleFile(n.sons[i])); + addDependencyAux(g.module.name.s, imported); + end + end; + nkFromStmt: begin + imported := getFileTrunk(getModuleFile(n.sons[0])); + addDependencyAux(g.module.name.s, imported); + end; + nkStmtList, nkBlockStmt, nkStmtListExpr, nkBlockExpr: begin + for i := 0 to sonsLen(n)-1 do {@discard} addDotDependency(c, n.sons[i]); + end + else begin end + end +end; + +procedure generateDot(const project: string); +begin + writeRope( + ropef('digraph $1 {$n$2}$n', [ + toRope(changeFileExt(extractFileName(project), '')), gDotGraph]), + changeFileExt(project, 'dot') ); +end; + +function myOpen(module: PSym; const filename: string): PPassContext; +var + g: PGen; +begin + new(g); +{@ignore} + fillChar(g^, sizeof(g^), 0); +{@emit} + g.module := module; + g.filename := filename; + result := g; +end; + +function gendependPass(): TPass; +begin + initPass(result); + result.open := myOpen; + result.process := addDotDependency; +end; + +end. diff --git a/nim/docgen.pas b/nim/docgen.pas index fd835db578..19dc93a918 100644 --- a/nim/docgen.pas +++ b/nim/docgen.pas @@ -209,10 +209,10 @@ end; procedure addXmlChar(var dest: string; c: Char); begin case c of - '&': dest := dest + '&'; - '<': dest := dest + '<'; - '>': dest := dest + '>'; - '"': dest := dest + '"'; + '&': add(dest, '&'); + '<': add(dest, '<'); + '>': add(dest, '>'); + '"': add(dest, '"'); else addChar(dest, c) end end; @@ -292,8 +292,7 @@ var a, h: PRstNode; begin inc(d.id); - result := ropef('$2', - [toRope(d.id), renderAux(d, n)]); + result := ropef('$2', [toRope(d.id), renderAux(d, n)]); h := newRstNode(rnHyperlink); a := newRstNode(rnLeaf, d.indexValFilename +{&} '#' +{&} toString(d.id)); addSon(h, a); @@ -709,8 +708,8 @@ begin g.len+g.start-1+strStart)); else appf(result, '$1', - [toRope(ncopy(m.text, g.start+strStart, - g.len+g.start-1+strStart)), + [toRope(toXml(ncopy(m.text, g.start+strStart, + g.len+g.start-1+strStart))), toRope(tokenClassToStr[g.kind])]); end; end; diff --git a/nim/evals.pas b/nim/evals.pas new file mode 100644 index 0000000000..bb14f8be95 --- /dev/null +++ b/nim/evals.pas @@ -0,0 +1,1308 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit evals; + +// This file implements the evaluator for Nimrod code. +// The evaluator is very slow, but simple. Since this +// is used mainly for evaluating macros and some other +// stuff at compile time, performance is not that +// important. + +interface + +{$include 'config.inc'} + +uses + sysutils, nsystem, charsets, strutils, magicsys, + lists, options, ast, astalgo, trees, treetab, nimsets, + msgs, nos, condsyms, idents, rnimsyn, types, passes, semfold; + +type + PStackFrame = ^TStackFrame; + TStackFrame = record + mapping: TIdNodeTable; // mapping from symbols to nodes + prc: PSym; // current prc; proc that is evaluated + call: PNode; // current for stmt + next: PStackFrame; // for stacking + params: TNodeSeq; // parameters passed to the proc + end; + + TEvalContext = object(passes.TPassContext) + module: PSym; + tos: PStackFrame; // top of a tos tos + lastException: PNode; + end; + PEvalContext = ^TEvalContext; + +function newStackFrame(): PStackFrame; +procedure pushStackFrame(c: PEvalContext; t: PStackFrame); +procedure popStackFrame(c: PEvalContext); + +function newEvalContext(module: PSym; const filename: string): PEvalContext; + +function eval(c: PEvalContext; n: PNode): PNode; +// eval never returns nil! This simplifies the code a lot and +// makes it faster too. + +function evalPass(): TPass; + +implementation + +const + evalMaxIterations = 10000000; // max iterations of all loops + evalMaxRecDepth = 100000; // max recursion depth for evaluation + +var + emptyNode: PNode; + +function newStackFrame(): PStackFrame; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + initIdNodeTable(result.mapping); +{@emit result.params := @[];} +end; + +function newEvalContext(module: PSym; const filename: string): PEvalContext; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.module := module; +end; + +procedure pushStackFrame(c: PEvalContext; t: PStackFrame); +begin + t.next := c.tos; + c.tos := t; +end; + +procedure popStackFrame(c: PEvalContext); +begin + if (c.tos = nil) then InternalError('popStackFrame'); + c.tos := c.tos.next; +end; + +function evalAux(c: PEvalContext; n: PNode): PNode; forward; + +procedure stackTraceAux(x: PStackFrame); +begin + if x <> nil then begin + stackTraceAux(x.next); + messageOut(format('file: $1, line: $2', [toFilename(x.call.info), + toString(toLineNumber(x.call.info))])); + end +end; + +procedure stackTrace(c: PEvalContext; n: PNode; msg: TMsgKind; + const arg: string = ''); +begin + messageOut('stack trace: (most recent call last)'); + stackTraceAux(c.tos); + liMessage(n.info, msg, arg); +end; + +function evalIf(c: PEvalContext; n: PNode): PNode; +var + i, len: int; +begin + i := 0; + len := sonsLen(n); + while (i < len) and (sonsLen(n.sons[i]) >= 2) do begin + result := evalAux(c, n.sons[i].sons[0]); + if result.kind = nkExceptBranch then exit; + if (result.kind = nkIntLit) and (result.intVal <> 0) then begin + result := evalAux(c, n.sons[i].sons[1]); + exit + end; + inc(i) + end; + if (i < len) and (sonsLen(n.sons[i]) < 2) then // eval else-part + result := evalAux(c, n.sons[0]) + else + result := emptyNode +end; + +function evalCase(c: PEvalContext; n: PNode): PNode; +var + i, j: int; + res: PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + res := result; + result := emptyNode; + for i := 1 to sonsLen(n)-1 do begin + if n.sons[i].kind = nkOfBranch then begin + for j := 0 to sonsLen(n.sons[i])-2 do begin + if overlap(res, n.sons[i].sons[j]) then begin + result := evalAux(c, lastSon(n.sons[i])); + exit + end + end + end + else begin + result := evalAux(c, lastSon(n.sons[i])); + end + end; +end; + +var + gWhileCounter: int; // Use a counter to prevend endless loops! + // We make this counter global, because otherwise + // nested loops could make the compiler extremely slow. + gNestedEvals: int; // count the recursive calls to ``evalAux`` to prevent + // endless recursion + +function evalWhile(c: PEvalContext; n: PNode): PNode; +begin + while true do begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + if getOrdValue(result) = 0 then break; + result := evalAux(c, n.sons[1]); + case result.kind of + nkBreakStmt: begin + if result.sons[0] = nil then begin + result := emptyNode; // consume ``break`` token + break + end + end; + nkExceptBranch, nkReturnToken: break; + else begin end + end; + dec(gWhileCounter); + if gWhileCounter <= 0 then begin + stackTrace(c, n, errTooManyIterations); + break; + end + end +end; + +function evalBlock(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkBreakStmt then begin + if result.sons[0] <> nil then begin + assert(result.sons[0].kind = nkSym); + if n.sons[0] <> nil then begin + assert(n.sons[0].kind = nkSym); + if result.sons[0].sym.id = n.sons[0].sym.id then + result := emptyNode + end + end + else + result := emptyNode // consume ``break`` token + end +end; + +function evalFinally(c: PEvalContext; n, exc: PNode): PNode; +var + finallyNode: PNode; +begin + finallyNode := lastSon(n); + if finallyNode.kind = nkFinally then begin + result := evalAux(c, finallyNode); + if result.kind <> nkExceptBranch then + result := exc + end + else + result := exc +end; + +function evalTry(c: PEvalContext; n: PNode): PNode; +var + exc: PNode; + i, j, len, blen: int; +begin + result := evalAux(c, n.sons[0]); + case result.kind of + nkBreakStmt, nkReturnToken: begin end; + nkExceptBranch: begin + // exception token! + exc := result; + i := 1; + len := sonsLen(n); + while (i < len) and (n.sons[i].kind = nkExceptBranch) do begin + blen := sonsLen(n.sons[i]); + if blen = 1 then begin + // general except section: + result := evalAux(c, n.sons[i].sons[0]); + exc := result; + break + end + else begin + for j := 0 to blen-2 do begin + assert(n.sons[i].sons[j].kind = nkType); + if exc.typ.id = n.sons[i].sons[j].typ.id then begin + result := evalAux(c, n.sons[i].sons[blen-1]); + exc := result; + break + end + end + end; + inc(i); + end; + result := evalFinally(c, n, exc); + end; + else + result := evalFinally(c, n, emptyNode); + end +end; + +function getNullValue(typ: PType; const info: TLineInfo): PNode; +var + i: int; + t: PType; +begin + t := skipGenericRange(typ); + result := emptyNode; + case t.kind of + tyBool, tyChar, tyInt..tyInt64: result := newNodeIT(nkIntLit, info, t); + tyFloat..tyFloat128: result := newNodeIt(nkFloatLit, info, t); + tyVar, tyPointer, tyPtr, tyRef, tyCString, tySequence, tyString: + result := newNodeIT(nkNilLit, info, t); + tyObject: begin + result := newNodeIT(nkPar, info, t); + internalError(info, 'init to implement'); + end; + tyArray, tyArrayConstr: begin + result := newNodeIT(nkBracket, info, t); + for i := 0 to int(lengthOrd(t))-1 do + addSon(result, getNullValue(elemType(t), info)); + end; + tyTuple: begin + result := newNodeIT(nkPar, info, t); + for i := 0 to sonsLen(t)-1 do + addSon(result, getNullValue(t.sons[i], info)); + end; + else InternalError('getNullValue') + end +end; + +function evalVar(c: PEvalContext; n: PNode): PNode; +var + i: int; + v: PSym; + a: PNode; +begin + for i := 0 to sonsLen(n)-1 do begin + a := n.sons[i]; + if a.kind = nkCommentStmt then continue; + assert(a.kind = nkIdentDefs); + assert(a.sons[0].kind = nkSym); + v := a.sons[0].sym; + if a.sons[2] <> nil then begin + result := evalAux(c, a.sons[2]); + if result.kind = nkExceptBranch then exit; + end + else + result := getNullValue(a.sons[0].typ, a.sons[0].info); + IdNodeTablePut(c.tos.mapping, v, result); + end; + result := emptyNode; +end; + +function evalCall(c: PEvalContext; n: PNode): PNode; +var + d: PStackFrame; + prc: PNode; + i: int; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + prc := result; + // bind the actual params to the local parameter + // of a new binding + d := newStackFrame(); + d.call := n; + if prc.kind = nkSym then begin + d.prc := prc.sym; + if not (prc.sym.kind in [skProc, skConverter]) then + InternalError(n.info, 'evalCall'); + end; + setLength(d.params, sonsLen(n)); + for i := 1 to sonsLen(n)-1 do begin + result := evalAux(c, n.sons[i]); + if result.kind = nkExceptBranch then exit; + d.params[i] := result; + end; + if n.typ <> nil then d.params[0] := getNullValue(n.typ, n.info); + pushStackFrame(c, d); + result := evalAux(c, prc); + if n.typ <> nil then result := d.params[0]; + popStackFrame(c); +end; + +function evalVariable(c: PStackFrame; sym: PSym): PNode; +// We need to return a node to the actual value, +// which can be modified. +var + x: PStackFrame; +begin + x := c; + while x <> nil do begin + if sfResult in sym.flags then begin + result := x.params[0]; + exit + end; + result := IdNodeTableGet(x.mapping, sym); + if result <> nil then exit; + x := x.next + end; + result := emptyNode; +end; + +function evalArrayAccess(c: PEvalContext; n: PNode): PNode; +var + x: PNode; + idx: biggestInt; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + idx := getOrdValue(result); + result := emptyNode; + case x.kind of + nkBracket, nkPar, nkMetaNode: begin + if (idx >= 0) and (idx < sonsLen(x)) then + result := x.sons[int(idx)] + else + stackTrace(c, n, errIndexOutOfBounds); + end; + nkStrLit..nkTripleStrLit: begin + result := newNodeIT(nkCharLit, x.info, getSysType(tyChar)); + if (idx >= 0) and (idx < length(x.strVal)) then + result.intVal := ord(x.strVal[int(idx)+strStart]) + else if idx = length(x.strVal) then begin end + else + stackTrace(c, n, errIndexOutOfBounds); + end; + else + stackTrace(c, n, errIndexNoIntType); + end +end; + +function evalFieldAccess(c: PEvalContext; n: PNode): PNode; +// a real field access; proc calls have already been +// transformed +// XXX: field checks! +var + x: PNode; + field: PSym; + i: int; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + if x.kind <> nkPar then InternalError(n.info, 'evalFieldAccess'); + field := n.sons[1].sym; + for i := 0 to sonsLen(n)-1 do begin + if x.sons[i].kind <> nkExprColonExpr then + InternalError(n.info, 'evalFieldAccess'); + if x.sons[i].sons[0].sym.name.id = field.id then begin + result := x.sons[i].sons[1]; exit + end + end; + stackTrace(c, n, errFieldXNotFound, field.name.s); + result := emptyNode; +end; + +function evalAsgn(c: PEvalContext; n: PNode): PNode; +var + x: PNode; + i: int; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + x.kind := result.kind; + x.typ := result.typ; + case x.kind of + nkCharLit..nkInt64Lit: x.intVal := result.intVal; + nkFloatLit..nkFloat64Lit: x.floatVal := result.floatVal; + nkStrLit..nkTripleStrLit: begin + x.strVal := result.strVal; + end + else begin + if not (x.kind in [nkEmpty..nkNilLit]) then begin + discardSons(x); + for i := 0 to sonsLen(result)-1 do addSon(x, result.sons[i]); + end + end + end; + result := emptyNode +end; + +function evalSwap(c: PEvalContext; n: PNode): PNode; +var + x: PNode; + i: int; + tmpi: biggestInt; + tmpf: biggestFloat; + tmps: string; + tmpn: PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if (x.kind <> result.kind) then + stackTrace(c, n, errCannotInterpretNodeX, nodeKindToStr[n.kind]) + else begin + case x.kind of + nkCharLit..nkInt64Lit: begin + tmpi := x.intVal; + x.intVal := result.intVal; + result.intVal := tmpi + end; + nkFloatLit..nkFloat64Lit: begin + tmpf := x.floatVal; + x.floatVal := result.floatVal; + result.floatVal := tmpf; + end; + nkStrLit..nkTripleStrLit: begin + tmps := x.strVal; + x.strVal := result.strVal; + result.strVal := tmps; + end + else begin + tmpn := copyTree(x); + discardSons(x); + for i := 0 to sonsLen(result)-1 do + addSon(x, result.sons[i]); + discardSons(result); + for i := 0 to sonsLen(tmpn)-1 do + addSon(result, tmpn.sons[i]); + end + end + end; + result := emptyNode +end; + +function evalSym(c: PEvalContext; n: PNode): PNode; +begin + case n.sym.kind of + skProc, skConverter, skMacro: result := n.sym.ast.sons[codePos]; + skVar, skForVar, skTemp: result := evalVariable(c.tos, n.sym); + skParam: result := c.tos.params[n.sym.position+1]; + skConst: result := n.sym.ast; + else begin + stackTrace(c, n, errCannotInterpretNodeX, symKindToStr[n.sym.kind]); + result := emptyNode + end + end; + if result = nil then InternalError(n.info, 'evalSym: ' + n.sym.name.s); +end; + +function evalIncDec(c: PEvalContext; n: PNode; sign: biggestInt): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + case a.kind of + nkCharLit..nkInt64Lit: a.intval := a.intVal + sign * getOrdValue(b); + else internalError(n.info, 'evalIncDec'); + end; + result := emptyNode +end; + +function evalExit(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + liMessage(n.info, hintQuitCalled); + halt(int(getOrdValue(result))); +end; + +function evalOr(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkIntLit then InternalError(n.info, 'evalOr'); + if result.intVal = 0 then result := evalAux(c, n.sons[2]) +end; + +function evalAnd(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkIntLit then InternalError(n.info, 'evalAnd'); + if result.intVal <> 0 then result := evalAux(c, n.sons[2]) +end; + +function evalNew(c: PEvalContext; n: PNode): PNode; +var + t: PType; +begin + t := skipVarGeneric(n.sons[1].typ); + result := newNodeIT(nkRefTy, n.info, t); + addSon(result, getNullValue(t.sons[0], n.info)); +end; + +function evalDeref(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkRefTy then InternalError(n.info, 'evalDeref'); + result := result.sons[0]; +end; + +function evalAddr(c: PEvalContext; n: PNode): PNode; +var + a: PNode; + t: PType; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkRefTy then InternalError(n.info, 'evalDeref'); + a := result; + t := newType(tyPtr, c.module); + addSon(t, a.typ); + result := newNodeIT(nkRefTy, n.info, t); + addSon(result, a); +end; + +function evalConv(c: PEvalContext; n: PNode): PNode; +begin + // hm, I cannot think of any conversions that need to be handled here... + result := evalAux(c, n.sons[1]); + result.typ := n.typ; +end; + +function evalCheckedFieldAccess(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[0]); +end; + +function evalUpConv(c: PEvalContext; n: PNode): PNode; +var + dest, src: PType; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + dest := skipPtrsGeneric(n.typ); + src := skipPtrsGeneric(result.typ); + if inheritanceDiff(src, dest) > 0 then + stackTrace(c, n, errInvalidConversionFromTypeX, typeToString(src)); +end; + +function evalRangeChck(c: PEvalContext; n: PNode): PNode; +var + x, a, b: PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + + if leValueConv(a, x) and leValueConv(x, b) then begin + result := x; // a <= x and x <= b + result.typ := n.typ + end + else + stackTrace(c, n, errGenerated, + format(msgKindToString(errIllegalConvFromXtoY), + [typeToString(n.sons[0].typ), typeToString(n.typ)])); +end; + +function evalConvStrToCStr(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + result.typ := n.typ; +end; + +function evalConvCStrToStr(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + result.typ := n.typ; +end; + +function evalRaise(c: PEvalContext; n: PNode): PNode; +var + a: PNode; +begin + if n.sons[0] <> nil then begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkExceptBranch, n.info, a.typ); + addSon(result, a); + c.lastException := result; + end + else if c.lastException <> nil then + result := c.lastException + else begin + stackTrace(c, n, errExceptionAlreadyHandled); + result := newNodeIT(nkExceptBranch, n.info, nil); + addSon(result, nil); + end +end; + +function evalReturn(c: PEvalContext; n: PNode): PNode; +begin + if n.sons[0] <> nil then begin + result := evalAsgn(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + end; + result := newNodeIT(nkReturnToken, n.info, nil); +end; + +function evalProc(c: PEvalContext; n: PNode): PNode; +var + v: PSym; +begin + if n.sons[genericParamsPos] = nil then begin + if (resultPos < sonsLen(n)) and (n.sons[resultPos] <> nil) then begin + v := n.sons[resultPos].sym; + result := getNullValue(v.typ, n.info); + IdNodeTablePut(c.tos.mapping, v, result); + end; + result := evalAux(c, n.sons[codePos]); + if result.kind = nkReturnToken then + result := IdNodeTableGet(c.tos.mapping, v); + end + else + result := emptyNode +end; + +function evalHigh(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + case skipVarGeneric(n.sons[1].typ).kind of + tyOpenArray, tySequence: + result := newIntNodeT(sonsLen(result), n); + tyString: + result := newIntNodeT(length(result.strVal)-1, n); + else InternalError(n.info, 'evalHigh') + end +end; + +function evalIs(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + result := newIntNodeT(ord(inheritanceDiff(result.typ, n.sons[2].typ) >= 0), n) +end; + +function evalSetLengthStr(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + case a.kind of + nkStrLit..nkTripleStrLit: setLength(a.strVal, int(getOrdValue(b))); + else InternalError(n.info, 'evalSetLengthStr') + end; + result := emptyNode +end; + +function evalSetLengthSeq(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + if a.kind = nkBracket then setLength(a.sons, int(getOrdValue(b))) + else InternalError(n.info, 'evalSetLengthSeq'); + result := emptyNode +end; + +function evalNewSeq(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; + t: PType; + i: int; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + + t := skipVarGeneric(n.sons[1].typ); + result := newNodeIT(nkBracket, n.info, t); + for i := 0 to int(getOrdValue(b))-1 do + addSon(result, getNullValue(t.sons[0], n.info)); + // XXX: assign to `a`? result := emptyNode +end; + +function evalAssert(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if getOrdValue(result) <> 0 then + result := emptyNode + else + stackTrace(c, n, errAssertionFailed) +end; + +function evalIncl(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + if not inSet(a, b) then addSon(a, copyTree(b)); + result := emptyNode; +end; + +function evalExcl(c: PEvalContext; n: PNode): PNode; +var + a, b, r: PNode; + i: int; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := newNodeIT(nkCurly, n.info, n.sons[1].typ); + addSon(b, result); + r := diffSets(a, b); + discardSons(a); + for i := 0 to sonsLen(r)-1 do addSon(a, r.sons[i]); + result := emptyNode; +end; + +function evalAppendStrCh(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + case a.kind of + nkStrLit..nkTripleStrLit: addChar(a.strVal, chr(int(getOrdValue(b)))); + else InternalError(n.info, 'evalAppendStrCh'); + end; + result := emptyNode; +end; + +function getStrValue(n: PNode): string; +begin + case n.kind of + nkStrLit..nkTripleStrLit: result := n.strVal; + else begin InternalError(n.info, 'getStrValue'); result := '' end; + end +end; + +function evalConStrStr(c: PEvalContext; n: PNode): PNode; +// we cannot use ``evalOp`` for this as we can here have more than 2 arguments +var + a: PNode; + i: int; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + for i := 2 to sonsLen(n)-1 do begin + result := evalAux(c, n.sons[i]); + if result.kind = nkExceptBranch then exit; + a.strVal := getStrValue(a) +{&} getStrValue(result); + end; + result := a; +end; + +function evalAppendStrStr(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + case a.kind of + nkStrLit..nkTripleStrLit: a.strVal := a.strVal +{&} getStrValue(b); + else InternalError(n.info, 'evalAppendStrStr'); + end; + result := emptyNode; +end; + +function evalAppendSeqElem(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + if a.kind = nkBracket then addSon(a, copyTree(b)) + else InternalError(n.info, 'evalAppendSeqElem'); + result := emptyNode; +end; + +function evalAppendSeqSeq(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; + i: int; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + if a.kind = nkBracket then + for i := 0 to sonsLen(b)-1 do addSon(a, copyTree(b.sons[i])) + else InternalError(n.info, 'evalAppendSeqSeq'); + result := emptyNode; +end; + +function evalRepr(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + result := newStrNodeT(renderTree(result, {@set}[renderNoComments]), n); +end; + +function evalMagicOrCall(c: PEvalContext; n: PNode): PNode; +var + m: TMagic; + a, b: PNode; + k: biggestInt; + i: int; +begin + m := getMagic(n); + case m of + mNone: result := evalCall(c, n); + mIs: result := evalIs(c, n); + mSizeOf: internalError(n.info, 'sizeof() should have been evaluated'); + mHigh: result := evalHigh(c, n); + mAssert: result := evalAssert(c, n); + mExit: result := evalExit(c, n); + mNew, mNewFinalize: result := evalNew(c, n); + mNewSeq: result := evalNewSeq(c, n); + mSwap: result := evalSwap(c, n); + mInc: result := evalIncDec(c, n, 1); + ast.mDec: result := evalIncDec(c, n, -1); + mSetLengthStr: result := evalSetLengthStr(c, n); + mSetLengthSeq: result := evalSetLengthSeq(c, n); + mIncl: result := evalIncl(c, n); + mExcl: result := evalExcl(c, n); + mAnd: result := evalAnd(c, n); + mOr: result := evalOr(c, n); + + mAppendStrCh: result := evalAppendStrCh(c, n); + mAppendStrStr: result := evalAppendStrStr(c, n); + mAppendSeqElem: result := evalAppendSeqElem(c, n); + mAppendSeqSeq: result := evalAppendSeqSeq(c, n); + + mNLen: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkIntLit, n.info, n.typ); + case a.kind of + nkEmpty..nkNilLit: begin end; + else result.intVal := sonsLen(a); + end + end; + mNChild: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + k := getOrdValue(result); + if (k >= 0) and (k < sonsLen(a)) + and not (a.kind in [nkEmpty..nkNilLit]) then + result := a.sons[int(k)] + else begin + stackTrace(c, n, errIndexOutOfBounds); + result := emptyNode + end; + end; + mNSetChild: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + result := evalAux(c, n.sons[3]); + if result.kind = nkExceptBranch then exit; + k := getOrdValue(b); + if (k >= 0) and (k < sonsLen(a)) + and not (a.kind in [nkEmpty..nkNilLit]) then + a.sons[int(k)] := result + else + stackTrace(c, n, errIndexOutOfBounds); + result := emptyNode; + end; + mNAdd: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + addSon(a, result); + result := emptyNode + end; + mNAddMultiple: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + for i := 0 to sonsLen(result)-1 do addSon(a, result.sons[i]); + result := emptyNode + end; + mNDel: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + result := evalAux(c, n.sons[3]); + if result.kind = nkExceptBranch then exit; + for i := 0 to int(getOrdValue(result))-1 do + delSon(a, int(getOrdValue(b))); + result := emptyNode; + end; + mNKind: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkIntLit, n.info, n.typ); + result.intVal := ord(a.kind); + end; + mNIntVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkIntLit, n.info, n.typ); + case a.kind of + nkCharLit..nkInt64Lit: result.intVal := a.intVal; + else InternalError(n.info, 'no int value') + end + end; + mNFloatVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkFloatLit, n.info, n.typ); + case a.kind of + nkFloatLit..nkFloat64Lit: result.floatVal := a.floatVal; + else InternalError(n.info, 'no float value') + end + end; + mNSymbol: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkSym then InternalError(n.info, 'no symbol') + end; + mNIdent: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkIdent then InternalError(n.info, 'no symbol') + end; + mNGetType: result := evalAux(c, n.sons[1]); + mNStrVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkStrLit, n.info, n.typ); + case a.kind of + nkStrLit..nkTripleStrLit: result.strVal := a.strVal; + else InternalError(n.info, 'no string value') + end + end; + mNSetIntVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.intVal := result.intVal; // XXX: exception handling? + result := emptyNode + end; + mNSetFloatVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.floatVal := result.floatVal; // XXX: exception handling? + result := emptyNode + end; + mNSetSymbol: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.sym := result.sym; // XXX: exception handling? + result := emptyNode + end; + mNSetIdent: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.ident := result.ident; // XXX: exception handling? + result := emptyNode + end; + mNSetType: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.typ := result.typ; // XXX: exception handling? + result := emptyNode + end; + mNSetStrVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.strVal := result.strVal; // XXX: exception handling? + result := emptyNode + end; + mNNewNimNode: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + k := getOrdValue(result); + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a := result; + if (k < 0) or (k > ord(high(TNodeKind))) then + internalError(n.info, 'request to create a NimNode with invalid kind'); + if a.kind = nkNilLit then + result := newNodeI(TNodeKind(int(k)), n.info) + else + result := newNodeI(TNodeKind(int(k)), a.info) + end; + mNCopyNimNode: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + result := copyNode(result); + end; + mNCopyNimTree: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + result := copyTree(result); + end; + mStrToIdent: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if not (result.kind in [nkStrLit..nkTripleStrLit]) then + InternalError(n.info, 'no string node'); + a := result; + result := newNodeIT(nkIdent, n.info, n.typ); + result.ident := getIdent(a.strVal); + end; + mIdentToStr: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkIdent then + InternalError(n.info, 'no ident node'); + a := result; + result := newNodeIT(nkStrLit, n.info, n.typ); + result.strVal := a.ident.s; + end; + mEqIdent: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + result := newNodeIT(nkIntLit, n.info, n.typ); + if (a.kind = nkIdent) and (b.kind = nkIdent) then + if a.ident.id = b.ident.id then result.intVal := 1 + end; + mNHint: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + liMessage(n.info, hintUser, getStrValue(result)); + result := emptyNode + end; + mNWarning: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + liMessage(n.info, warnUser, getStrValue(result)); + result := emptyNode + end; + mNError: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + liMessage(n.info, errUser, getStrValue(result)); + result := emptyNode + end; + mConStrStr: result := evalConStrStr(c, n); + mRepr: result := evalRepr(c, n); + else begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + if sonsLen(n) > 2 then begin + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + end + else + result := nil; + result := evalOp(m, n, a, result); + end + end +end; + +function evalAux(c: PEvalContext; n: PNode): PNode; +var + i: int; +begin + result := emptyNode; + dec(gNestedEvals); + if gNestedEvals <= 0 then stackTrace(c, n, errTooManyIterations); + case n.kind of // atoms: + nkEmpty: result := n; + nkSym: result := evalSym(c, n); + nkType..pred(nkNilLit): result := copyNode(n); + nkNilLit: result := n; // end of atoms + + nkCall, nkHiddenCallConv, nkMacroStmt: result := evalMagicOrCall(c, n); + nkCurly, nkBracket: begin + result := copyNode(n); + for i := 0 to sonsLen(n)-1 do addSon(result, evalAux(c, n.sons[i])); + end; + nkPar: begin + result := copyTree(n); + for i := 0 to sonsLen(n)-1 do + result.sons[i].sons[1] := evalAux(c, n.sons[i].sons[1]); + end; + nkBracketExpr: result := evalArrayAccess(c, n); + nkDotExpr: result := evalFieldAccess(c, n); + nkDerefExpr, nkHiddenDeref: result := evalDeref(c, n); + nkAddr, nkHiddenAddr: result := evalAddr(c, n); + nkHiddenStdConv, nkHiddenSubConv, nkConv: result := evalConv(c, n); + nkAsgn: result := evalAsgn(c, n); + nkWhenStmt, nkIfStmt, nkIfExpr: result := evalIf(c, n); + nkWhileStmt: result := evalWhile(c, n); + nkCaseStmt: result := evalCase(c, n); + nkVarSection: result := evalVar(c, n); + nkTryStmt: result := evalTry(c, n); + nkRaiseStmt: result := evalRaise(c, n); + nkReturnStmt: result := evalReturn(c, n); + nkBreakStmt, nkReturnToken: result := n; + nkBlockExpr, nkBlockStmt: result := evalBlock(c, n); + nkDiscardStmt: result := evalAux(c, n.sons[0]); + nkCheckedFieldExpr: result := evalCheckedFieldAccess(c, n); + nkObjDownConv: result := evalAux(c, n.sons[0]); + nkObjUpConv: result := evalUpConv(c, n); + nkChckRangeF, nkChckRange64, nkChckRange: result := evalRangeChck(c, n); + nkStringToCString: result := evalConvStrToCStr(c, n); + nkCStringToString: result := evalConvCStrToStr(c, n); + nkPassAsOpenArray: result := evalAux(c, n.sons[0]); + + nkStmtListExpr, nkStmtList, nkModule: begin + for i := 0 to sonsLen(n)-1 do begin + result := evalAux(c, n.sons[i]); + case result.kind of + nkExceptBranch, nkReturnToken, nkBreakStmt: break; + else begin end + end + end + end; + nkProcDef, nkMacroDef, nkCommentStmt, nkPragma, nkTypeSection, + nkTemplateDef, nkConstSection, nkIteratorDef, nkConverterDef, + nkIncludeStmt, nkImportStmt, nkFromStmt: begin end; + nkIdentDefs, nkCast, nkYieldStmt, nkAsmStmt, nkForStmt, nkPragmaExpr, + nkQualified, nkLambda, nkContinueStmt: + stackTrace(c, n, errCannotInterpretNodeX, nodeKindToStr[n.kind]); + else InternalError(n.info, 'evalAux: ' + nodekindToStr[n.kind]); + end; + if result = nil then + InternalError(n.info, 'evalAux: returned nil ' + nodekindToStr[n.kind]); + inc(gNestedEvals); +end; + +function eval(c: PEvalContext; n: PNode): PNode; +begin + gWhileCounter := evalMaxIterations; + gNestedEvals := evalMaxRecDepth; + result := evalAux(c, n); + if result.kind = nkExceptBranch then + stackTrace(c, n, errUnhandledExceptionX, typeToString(result.typ)); +end; + +function myOpen(module: PSym; const filename: string): PPassContext; +var + c: PEvalContext; +begin + c := newEvalContext(module, filename); + pushStackFrame(c, newStackFrame()); + result := c; +end; + +function myProcess(c: PPassContext; n: PNode): PNode; +begin + result := eval(PEvalContext(c), n); +end; + +function evalPass(): TPass; +begin + initPass(result); + result.open := myOpen; + result.close := myProcess; + result.process := myProcess; +end; + +initialization + new(emptyNode); +{@ignore} + fillChar(emptyNode^, sizeof(emptyNode^), 0); +{@emit} + emptyNode.kind := nkEmpty; +end. diff --git a/nim/hashes.pas b/nim/hashes.pas index cf5ab03bcc..1bd3c7d2a3 100644 --- a/nim/hashes.pas +++ b/nim/hashes.pas @@ -44,9 +44,6 @@ function finishHash(h: THash): THash; implementation -type - TUnsignedHash = cardinal; - {@ignore} {$ifopt Q+} { we need Q- here! } {$define Q_on} @@ -89,7 +86,7 @@ end; function GetDataHash(Data: Pointer; Size: int): THash; var - h: TUnsignedHash; + h: THash; p: PChar; i, s: int; begin @@ -116,7 +113,7 @@ end; function GetHash(str: PChar): THash; var - h: TUnsignedHash; + h: THash; i: int; begin h := 0; @@ -135,7 +132,7 @@ end; function GetHashStr(const s: string): THash; var - h: TUnsignedHash; + h: THash; i: int; begin h := 0; @@ -152,7 +149,7 @@ end; function getNormalizedHash(const s: string): THash; var - h: TUnsignedHash; + h: THash; c: Char; i: int; begin @@ -173,7 +170,7 @@ end; function GetHashStrCI(const s: string): THash; var - h: TUnsignedHash; + h: THash; c: Char; i: int; begin @@ -193,7 +190,7 @@ end; function GetHashCI(str: PChar): THash; var - h: TUnsignedHash; + h: THash; c: Char; i: int; begin diff --git a/nim/hashtest.pas b/nim/hashtest.pas new file mode 100644 index 0000000000..ba7a623728 --- /dev/null +++ b/nim/hashtest.pas @@ -0,0 +1,10 @@ +program hashtest; + +{$include 'config.inc'} + +uses + hashes; + +begin + writeln(output, getNormalizedHash(ParamStr(1))); +end. diff --git a/nim/interact.pas b/nim/interact.pas new file mode 100644 index 0000000000..ac238107f1 --- /dev/null +++ b/nim/interact.pas @@ -0,0 +1,22 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit interact; + +// This file implements interactive sessions. + +interface + +{$include 'config.inc'} + +uses + nsystem, llstream, strutils, charsets, ropes, strtabs, msgs; + +implementation + +end. diff --git a/nim/lists.pas b/nim/lists.pas index 74b1479d9b..e3442eb296 100644 --- a/nim/lists.pas +++ b/nim/lists.pas @@ -8,7 +8,7 @@ // unit lists; -// This unit implements a generic doubled linked list. +// This module implements a generic doubled linked list. interface diff --git a/nim/llstream.pas b/nim/llstream.pas new file mode 100644 index 0000000000..2d4336664c --- /dev/null +++ b/nim/llstream.pas @@ -0,0 +1,250 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit llstream; + +// Low-level streams for high performance. + +interface + +uses + nsystem, charsets, strutils; + +type + TLLStreamKind = ( + llsNone, // null stream: reading and writing has no effect + llsString, // stream encapsulates a string + llsFile, // stream encapsulates a file + llsStdIn); // stream encapsulates stdin + TLLStream = object(NObject) + kind: TLLStreamKind; // exposed for low-level access (lexbase uses this) + f: TBinaryFile; + s: string; + pos: int; // for string streams + end; + PLLStream = ^TLLStream; + + +function LLStreamOpen(const data: string): PLLStream; overload; +function LLStreamOpen(var f: TBinaryFile): PLLStream; overload; +function LLStreamOpen(const filename: string; mode: TFileMode): PLLStream; overload; +function LLStreamOpen(): PLLStream; overload; +function LLStreamOpenStdIn(): PLLStream; + +procedure LLStreamClose(s: PLLStream); + +function LLStreamRead(s: PLLStream; buf: pointer; bufLen: int): int; +function LLStreamReadLine(s: PLLStream): string; +function LLStreamReadAll(s: PLLStream): string; + +procedure LLStreamWrite(s: PLLStream; const data: string); overload; +procedure LLStreamWrite(s: PLLStream; data: Char); overload; +procedure LLStreamWrite(s: PLLStream; buf: pointer; buflen: int); overload; + +function LLStreamAtEnd(s: PLLStream): bool; + +implementation + +function LLStreamOpen(const data: string): PLLStream; overload; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.s := data; + result.kind := llsString; +end; + +function LLStreamOpen(var f: TBinaryFile): PLLStream; overload; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.f := f; + result.kind := llsFile; +end; + +function LLStreamOpen(const filename: string; mode: TFileMode): PLLStream; overload; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.kind := llsFile; + if not OpenFile(result.f, filename, mode) then result := nil; +end; + +function LLStreamOpen(): PLLStream; overload; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.kind := llsNone; +end; + +function LLStreamOpenStdIn(): PLLStream; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.kind := llsStdIn; + result.s := ''; + result.pos := -1; +end; + +procedure LLStreamClose(s: PLLStream); +begin + case s.kind of + llsNone, llsString, llsStdIn: begin end; + llsFile: nimCloseFile(s.f); + end +end; + +function LLreadFromStdin(s: PLLStream; buf: pointer; bufLen: int): int; +var + line: string; + L: int; +begin + s.s := ''; + s.pos := 0; + while true do begin + write(output, 'Nimrod> '); + line := readLine(input); + L := length(line); + add(s.s, line); + add(s.s, nl); + if (L > 0) and (line[L-1+strStart] = '#') then break; + end; + result := min(bufLen, length(s.s)-s.pos); + if result > 0 then begin + copyMem(buf, addr(s.s[strStart+s.pos]), result); + inc(s.pos, result) + end +end; + +function LLStreamRead(s: PLLStream; buf: pointer; bufLen: int): int; +begin + case s.kind of + llsNone: result := 0; + llsString: begin + result := min(bufLen, length(s.s)-s.pos); + if result > 0 then begin + copyMem(buf, addr(s.s[strStart+s.pos]), result); + inc(s.pos, result) + end + end; + llsFile: result := readBuffer(s.f, buf, bufLen); + llsStdIn: result := LLreadFromStdin(s, buf, bufLen); + end +end; + +function LLStreamReadLine(s: PLLStream): string; +begin + case s.kind of + llsNone: result := ''; + llsString: begin + result := ''; + while s.pos < length(s.s) do begin + case s.s[s.pos+strStart] of + #13: begin + inc(s.pos); + if s.s[s.pos+strStart] = #10 then inc(s.pos); + break + end; + #10: begin inc(s.pos); break end; + else begin + addChar(result, s.s[s.pos+strStart]); + inc(s.pos); + end + end + end + end; + llsFile: result := readLine(s.f); + llsStdIn: result := readLine(input); + end +end; + +function LLStreamAtEnd(s: PLLStream): bool; +begin + case s.kind of + llsNone: result := true; + llsString: result := s.pos < length(s.s); + llsFile: result := endOfFile(s.f); + llsStdIn: result := false; + end +end; + +procedure LLStreamWrite(s: PLLStream; const data: string); overload; +begin + case s.kind of + llsNone, llsStdIn: begin end; + llsString: add(s.s, data); + llsFile: nimWrite(s.f, data); + end +end; + +procedure LLStreamWrite(s: PLLStream; data: Char); overload; +var + c: char; +begin + case s.kind of + llsNone, llsStdIn: begin end; + llsString: addChar(s.s, data); + llsFile: begin + c := data; + {@discard} writeBuffer(s.f, addr(c), sizeof(c)); + end + end +end; + +procedure LLStreamWrite(s: PLLStream; buf: pointer; buflen: int); overload; +begin + case s.kind of + llsNone, llsStdIn: begin end; + llsString: begin + if bufLen > 0 then begin + setLength(s.s, length(s.s) + bufLen); + copyMem(addr(s.s[strStart+s.pos]), buf, bufLen); + inc(s.pos, bufLen); + end + end; + llsFile: {@discard} writeBuffer(s.f, buf, bufLen); + end +end; + +function LLStreamReadAll(s: PLLStream): string; +const + bufSize = 2048; +var + bytes, i: int; +begin + case s.kind of + llsNone, llsStdIn: result := ''; + llsString: begin + if s.pos = 0 then result := s.s + else result := ncopy(s.s, s.pos+strStart); + s.pos := length(s.s); + end; + llsFile: begin + result := newString(bufSize); + bytes := readBuffer(s.f, addr(result[strStart]), bufSize); + i := bytes; + while bytes = bufSize do begin + setLength(result, i+bufSize); + bytes := readBuffer(s.f, addr(result[i+strStart]), bufSize); + inc(i, bytes); + end; + setLength(result, i); + end + end +end; + +end. diff --git a/nim/lookups.pas b/nim/lookups.pas new file mode 100644 index 0000000000..a9a4a783bb --- /dev/null +++ b/nim/lookups.pas @@ -0,0 +1,289 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit lookups; + +// This module implements lookup helpers. + +interface + +uses + nsystem, ast, astalgo, idents, semdata, types, msgs, options, rodread, + rnimsyn; + +{$include 'config.inc'} + +type + TOverloadIterMode = (oimNoQualifier, oimSelfModule, oimOtherModule); + TOverloadIter = record + stackPtr: int; + it: TIdentIter; + m: PSym; + mode: TOverloadIterMode; + end; + +function getSymRepr(s: PSym): string; + +procedure CloseScope(var tab: TSymTab); + +procedure AddSym(var t: TStrTable; n: PSym); + +procedure addDecl(c: PContext; sym: PSym); +procedure addDeclAt(c: PContext; sym: PSym; at: Natural); +procedure addOverloadableSymAt(c: PContext; fn: PSym; at: Natural); + +procedure addInterfaceDecl(c: PContext; sym: PSym); +procedure addInterfaceOverloadableSymAt(c: PContext; sym: PSym; at: int); + +function lookUp(c: PContext; n: PNode): PSym; +// Looks up a symbol. Generates an error in case of nil. + +function QualifiedLookUp(c: PContext; n: PNode; ambigiousCheck: bool): PSym; + +function InitOverloadIter(out o: TOverloadIter; c: PContext; n: PNode): PSym; +function nextOverloadIter(var o: TOverloadIter; c: PContext; n: PNode): PSym; + +implementation + +function getSymRepr(s: PSym): string; +begin + case s.kind of + skProc, skConverter, skIterator: result := getProcHeader(s); + else result := s.name.s + end +end; + +procedure CloseScope(var tab: TSymTab); +var + it: TTabIter; + s: PSym; +begin + // check if all symbols have been used and defined: + if (tab.tos > length(tab.stack)) then InternalError('CloseScope'); + s := InitTabIter(it, tab.stack[tab.tos-1]); + while s <> nil do begin + if sfForward in s.flags then + liMessage(s.info, errImplOfXexpected, getSymRepr(s)) + else if ([sfUsed, sfInInterface] * s.flags = []) and + (optHints in s.options) then // BUGFIX: check options in s! + if not (s.kind in [skForVar, skParam]) then + liMessage(s.info, hintXDeclaredButNotUsed, getSymRepr(s)); + s := NextIter(it, tab.stack[tab.tos-1]); + end; + astalgo.rawCloseScope(tab); +end; + +procedure AddSym(var t: TStrTable; n: PSym); +begin + if StrTableIncl(t, n) then liMessage(n.info, errAttemptToRedefine, n.name.s); +end; + +procedure addDecl(c: PContext; sym: PSym); +begin + if SymTabAddUnique(c.tab, sym) = Failure then + liMessage(sym.info, errAttemptToRedefine, sym.Name.s); +end; + +procedure addDeclAt(c: PContext; sym: PSym; at: Natural); +begin + if SymTabAddUniqueAt(c.tab, sym, at) = Failure then + liMessage(sym.info, errAttemptToRedefine, sym.Name.s); +end; + +procedure addOverloadableSymAt(c: PContext; fn: PSym; at: Natural); +var + check: PSym; +begin + if not (fn.kind in OverloadableSyms) then + InternalError(fn.info, 'addOverloadableSymAt'); + check := StrTableGet(c.tab.stack[at], fn.name); + if (check <> nil) and (check.Kind <> fn.kind) then + liMessage(fn.info, errAttemptToRedefine, fn.Name.s); + SymTabAddAt(c.tab, fn, at); +end; + +procedure AddInterfaceDeclAux(c: PContext; sym: PSym); +begin + if (sfInInterface in sym.flags) then begin + // add to interface: + if c.module = nil then InternalError(sym.info, 'AddInterfaceDeclAux'); + StrTableAdd(c.module.tab, sym); + end; + if getCurrOwner().kind = skModule then + include(sym.flags, sfGlobal) +end; + +procedure addInterfaceDecl(c: PContext; sym: PSym); +begin // it adds the symbol to the interface if appropriate + addDecl(c, sym); + AddInterfaceDeclAux(c, sym); +end; + +procedure addInterfaceOverloadableSymAt(c: PContext; sym: PSym; at: int); +begin // it adds the symbol to the interface if appropriate + addOverloadableSymAt(c, sym, at); + AddInterfaceDeclAux(c, sym); +end; + +function lookUp(c: PContext; n: PNode): PSym; +// Looks up a symbol. Generates an error in case of nil. +begin + case n.kind of + nkAccQuoted: result := lookup(c, n.sons[0]); + nkSym: begin + result := SymtabGet(c.Tab, n.sym.name); + if result = nil then + liMessage(n.info, errUndeclaredIdentifier, n.sym.name.s); + include(result.flags, sfUsed); + end; + nkIdent: begin + result := SymtabGet(c.Tab, n.ident); + if result = nil then + liMessage(n.info, errUndeclaredIdentifier, n.ident.s); + include(result.flags, sfUsed); + end + else InternalError(n.info, 'lookUp'); + end; + if IntSetContains(c.AmbigiousSymbols, result.id) then + liMessage(n.info, errUseQualifier, result.name.s); + if result.kind = skStub then loadStub(result); +end; + +function QualifiedLookUp(c: PContext; n: PNode; ambigiousCheck: bool): PSym; +var + m: PSym; + ident: PIdent; +begin + case n.kind of + nkIdent: begin + result := SymtabGet(c.Tab, n.ident); + if result = nil then + liMessage(n.info, errUndeclaredIdentifier, n.ident.s) + else if ambigiousCheck + and IntSetContains(c.AmbigiousSymbols, result.id) then + liMessage(n.info, errUseQualifier, n.ident.s) + end; + nkSym: begin + result := SymtabGet(c.Tab, n.sym.name); + if result = nil then + liMessage(n.info, errUndeclaredIdentifier, n.sym.name.s) + else if ambigiousCheck + and IntSetContains(c.AmbigiousSymbols, result.id) then + liMessage(n.info, errUseQualifier, n.sym.name.s) + end; + nkDotExpr, nkQualified: begin + result := nil; + m := qualifiedLookUp(c, n.sons[0], false); + if (m <> nil) and (m.kind = skModule) then begin + ident := nil; + if (n.sons[1].kind = nkIdent) then + ident := n.sons[1].ident + else if (n.sons[1].kind = nkAccQuoted) + and (n.sons[1].sons[0].kind = nkIdent) then + ident := n.sons[1].sons[0].ident; + if ident <> nil then begin + if m = c.module then + // a module may access its private members: + result := StrTableGet(c.tab.stack[ModuleTablePos], ident) + else + result := StrTableGet(m.tab, ident); + if result = nil then + liMessage(n.sons[1].info, errUndeclaredIdentifier, ident.s) + end + else + liMessage(n.sons[1].info, errIdentifierExpected, + renderTree(n.sons[1])); + end + end; + nkAccQuoted: result := QualifiedLookup(c, n.sons[0], ambigiousCheck); + else begin + result := nil; + //liMessage(n.info, errIdentifierExpected, '') + end; + end; + if (result <> nil) and (result.kind = skStub) then loadStub(result); +end; + +function InitOverloadIter(out o: TOverloadIter; c: PContext; n: PNode): PSym; +var + ident: PIdent; +begin + result := nil; + case n.kind of + nkIdent: begin + o.stackPtr := c.tab.tos; + o.mode := oimNoQualifier; + while (result = nil) do begin + dec(o.stackPtr); + if o.stackPtr < 0 then break; + result := InitIdentIter(o.it, c.tab.stack[o.stackPtr], n.ident); + end; + end; + nkSym: begin + o.stackPtr := c.tab.tos; + o.mode := oimNoQualifier; + while (result = nil) do begin + dec(o.stackPtr); + if o.stackPtr < 0 then break; + result := InitIdentIter(o.it, c.tab.stack[o.stackPtr], n.sym.name); + end; + end; + nkDotExpr, nkQualified: begin + o.mode := oimOtherModule; + o.m := qualifiedLookUp(c, n.sons[0], false); + if (o.m <> nil) and (o.m.kind = skModule) then begin + ident := nil; + if (n.sons[1].kind = nkIdent) then + ident := n.sons[1].ident + else if (n.sons[1].kind = nkAccQuoted) + and (n.sons[1].sons[0].kind = nkIdent) then + ident := n.sons[1].sons[0].ident; + if ident <> nil then begin + if o.m = c.module then begin + // a module may access its private members: + result := InitIdentIter(o.it, c.tab.stack[ModuleTablePos], ident); + o.mode := oimSelfModule; + end + else + result := InitIdentIter(o.it, o.m.tab, ident); + end + else + liMessage(n.sons[1].info, errIdentifierExpected, + renderTree(n.sons[1])); + end + end; + nkAccQuoted: result := InitOverloadIter(o, c, n.sons[0]); + else begin end + end; + if (result <> nil) and (result.kind = skStub) then loadStub(result); +end; + +function nextOverloadIter(var o: TOverloadIter; c: PContext; n: PNode): PSym; +begin + case o.mode of + oimNoQualifier: begin + if n.kind = nkAccQuoted then + result := nextOverloadIter(o, c, n.sons[0]) // BUGFIX + else if o.stackPtr >= 0 then begin + result := nextIdentIter(o.it, c.tab.stack[o.stackPtr]); + while (result = nil) do begin + dec(o.stackPtr); + if o.stackPtr < 0 then break; + result := InitIdentIter(o.it, c.tab.stack[o.stackPtr], o.it.name); + // BUGFIX: o.it.name <-> n.ident + end + end + else result := nil; + end; + oimSelfModule: result := nextIdentIter(o.it, c.tab.stack[ModuleTablePos]); + oimOtherModule: result := nextIdentIter(o.it, o.m.tab); + end; + if (result <> nil) and (result.kind = skStub) then loadStub(result); +end; + +end. diff --git a/nim/main.pas b/nim/main.pas index 7cf3fbd0a1..565373685e 100644 --- a/nim/main.pas +++ b/nim/main.pas @@ -127,7 +127,6 @@ begin registerPass(verbosePass()); registerPass(sem.semPass()); registerPass(transf.transfPass()); - registerPass(rodwrite.rodwritePass()); end; procedure CommandGenDepend(const filename: string); @@ -152,6 +151,7 @@ procedure CommandCompileToC(const filename: string); begin semanticPasses(); registerPass(cgen.cgenPass()); + registerPass(rodwrite.rodwritePass()); registerPass(cleanupPass()); compileProject(filename); //for i := low(TTypeKind) to high(TTypeKind) do diff --git a/nim/nsystem.pas b/nim/nsystem.pas index 340477461c..c33236189c 100644 --- a/nim/nsystem.pas +++ b/nim/nsystem.pas @@ -41,6 +41,8 @@ type EOverflow = class(Exception) end; {$endif} + EOutOfRange = class(Exception) + end; float32 = single; float64 = double; @@ -153,6 +155,7 @@ function ltU(a, b: biggestInt): bool; function leU(a, b: biggestInt): bool; function toU8(a: biggestInt): byte; +function toU16(a: biggestInt): int16; function toU32(a: biggestInt): int32; function ze64(a: byte): biggestInt; function ze(a: byte): int; @@ -206,9 +209,25 @@ function readFile(const filename: string): string; procedure nimWrite(var f: tBinaryFile; const str: string); overload; +procedure add(var x: string; const y: string); +// Pascal version of string appending. Terminating zero is ignored. implementation +{@ignore} +procedure add(var x: string; const y: string); +// Pascal version of string appending. Terminating zero is ignored. +var + L: int; +begin + L := length(y); + if L > 0 then begin + if y[L] = #0 then x := x + copy(y, 1, L-1) + else x := x + y; + end +end; +{@emit} + function alloc(size: int): Pointer; begin getMem(result, size); // use standard allocator @@ -284,6 +303,11 @@ begin result := int32(a and $ffffffff); end; +function toU16(a: biggestInt): int16; +begin + result := int16(a and $ffff); +end; + function ze64(a: byte): biggestInt; begin result := a @@ -565,16 +589,30 @@ end; var zero: float; Saved8087CW: Word; + savedExcMask: TFPUExceptionMask; initialization +{$ifdef cpu64} + savedExcMask := SetExceptionMask([exInvalidOp, + exDenormalized, + exPrecision, + exZeroDivide, + exOverflow, + exUnderflow + ]); +{$else} Saved8087CW := Default8087CW; Set8087CW($133f); // Disable all fpu exceptions - +{$endif} zero := 0.0; NaN := 0.0 / zero; inf := 1.0 / zero; NegInf := -inf; finalization +{$ifdef cpu64} + SetExceptionMask(savedExcMask); // set back exception mask +{$else} Set8087CW(Saved8087CW); +{$endif} {$ifdef R_on} {$R+,Q+} {$endif} diff --git a/nim/nversion.pas b/nim/nversion.pas index 51390a0732..9629079b26 100644 --- a/nim/nversion.pas +++ b/nim/nversion.pas @@ -31,10 +31,10 @@ const //cog.outl('VersionMinor = %s;' % ver[1]) //cog.outl('VersionPatch = %s;' % ver[2]) //]]] - VersionAsString = '0.7.0'; + VersionAsString = '0.7.2'; VersionMajor = 0; VersionMinor = 7; - VersionPatch = 0; + VersionPatch = 2; //[[[[end]]]] implementation diff --git a/nim/paslex.pas b/nim/paslex.pas index 678f3af1a0..c0136e4d86 100644 --- a/nim/paslex.pas +++ b/nim/paslex.pas @@ -298,7 +298,7 @@ begin end; '_': inc(pos); '0', '1': begin - xi := (xi shl 1) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 1) or (ord(L.buf[pos]) - ord('0')); inc(pos); inc(bits); end; @@ -330,17 +330,17 @@ begin end; '_': inc(pos); '0'..'9': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('0')); inc(pos); inc(bits, 4); end; 'a'..'f': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('a') + 10); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('a') + 10); inc(pos); inc(bits, 4); end; 'A'..'F': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('A') + 10); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('A') + 10); inc(pos); inc(bits, 4); end; diff --git a/nim/passaux.pas b/nim/passaux.pas new file mode 100644 index 0000000000..6344efb0b7 --- /dev/null +++ b/nim/passaux.pas @@ -0,0 +1,74 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit passaux; + +// implements some little helper passes +{$include 'config.inc'} + +interface + +uses + nsystem, strutils, ast, passes, msgs, options; + +function verbosePass: TPass; +function cleanupPass: TPass; + +implementation + +function verboseOpen(s: PSym; const filename: string): PPassContext; +begin + //MessageOut('compiling ' + s.name.s); + result := nil; // we don't need a context + if gVerbosity > 0 then + rawMessage(hintProcessing, s.name.s); +end; + +function verboseProcess(context: PPassContext; n: PNode): PNode; +begin + result := n; + if context <> nil then InternalError('logpass: context is not nil'); + if gVerbosity = 3 then + liMessage(n.info, hintProcessing, toString(ast.gid)); +end; + +function verbosePass: TPass; +begin + initPass(result); + result.open := verboseOpen; + result.process := verboseProcess; +end; + +function cleanUp(c: PPassContext; n: PNode): PNode; +var + i: int; + s: PSym; +begin + result := n; + case n.kind of + nkStmtList: begin + for i := 0 to sonsLen(n)-1 do {@discard} cleanup(c, n.sons[i]); + end; + nkProcDef: begin + if (n.sons[namePos].kind = nkSym) then begin + s := n.sons[namePos].sym; + if not astNeeded(s) then s.ast.sons[codePos] := nil; // free the memory + end + end + else begin end; + end +end; + +function cleanupPass: TPass; +begin + initPass(result); + result.process := cleanUp; + result.close := cleanUp; +end; + +end. diff --git a/nim/passes.pas b/nim/passes.pas new file mode 100644 index 0000000000..028cfc2a2b --- /dev/null +++ b/nim/passes.pas @@ -0,0 +1,216 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit passes; + +// This module implements the passes functionality. A pass must implement the +// `TPass` interface. + +interface + +{$include 'config.inc'} + +uses + nsystem, charsets, strutils, + lists, options, ast, astalgo, llstream, + msgs, platform, nos, condsyms, idents, rnimsyn, types, + extccomp, nmath, magicsys, nversion, nimsets, pnimsyn, ntime, rodread; + +type + TPassContext = object(NObject) // the pass's context + end; + PPassContext = ^TPassContext; + + TPass = record {@tuple} // a pass is a tuple of procedure vars + open: function (module: PSym; const filename: string): PPassContext; + openCached: function (module: PSym; const filename: string; + rd: PRodReader): PPassContext; + close: function (p: PPassContext; n: PNode): PNode; + process: function (p: PPassContext; topLevelStmt: PNode): PNode; + end; + +// ``TPass.close`` may produce additional nodes. These are passed to the other +// close procedures. This mechanism is needed for the instantiation of +// generics. + +procedure registerPass(const p: TPass); + +procedure initPass(var p: TPass); + +// This implements a memory preserving scheme: Top level statements are +// processed in a pipeline. The compiler never looks at a whole module +// any longer. However, this is simple to change, as new passes may perform +// whole program optimizations. For now, we avoid it to save a lot of memory. + +procedure processModule(module: PSym; const filename: string; + stream: PLLStream; rd: PRodReader); + + +function astNeeded(s: PSym): bool; + // The ``rodwrite`` module uses this to determine if the body of a proc + // needs to be stored. The passes manager frees s.sons[codePos] when + // appropriate to free the procedure body's memory. This is important + // to keep memory usage down. + +// some passes (the semantic checker) need these: +var + gImportModule: function (const filename: string): PSym; + gIncludeFile: function (const filename: string): PNode; + gIncludeTmplFile: function (const filename: string): PNode; + +implementation + +function astNeeded(s: PSym): bool; +begin + if (s.kind = skProc) + and ([sfCompilerProc, sfCompileTime] * s.flags = []) + and (s.typ.callConv <> ccInline) + and (s.ast.sons[genericParamsPos] = nil) then + result := false + else + result := true +end; + +const + maxPasses = 10; + +type + TPassContextArray = array [0..maxPasses-1] of PPassContext; +var + gPasses: array [0..maxPasses-1] of TPass; + gPassesLen: int; + +procedure registerPass(const p: TPass); +begin + gPasses[gPassesLen] := p; + inc(gPassesLen); +end; + +procedure openPasses(var a: TPassContextArray; module: PSym; + const filename: string); +var + i: int; +begin + for i := 0 to gPassesLen-1 do + if assigned(gPasses[i].open) then + a[i] := gPasses[i].open(module, filename) + else + a[i] := nil +end; + +procedure openPassesCached(var a: TPassContextArray; module: PSym; + const filename: string; rd: PRodReader); +var + i: int; +begin + for i := 0 to gPassesLen-1 do + if assigned(gPasses[i].openCached) then + a[i] := gPasses[i].openCached(module, filename, rd) + else + a[i] := nil +end; + +procedure closePasses(var a: TPassContextArray); +var + i: int; + m: PNode; +begin + m := nil; + for i := 0 to gPassesLen-1 do begin + if assigned(gPasses[i].close) then m := gPasses[i].close(a[i], m); + a[i] := nil; // free the memory here + end +end; + +procedure processTopLevelStmt(n: PNode; var a: TPassContextArray); +var + i: int; + m: PNode; +begin + // this implements the code transformation pipeline + m := n; + for i := 0 to gPassesLen-1 do + if assigned(gPasses[i].process) then m := gPasses[i].process(a[i], m); +end; + +procedure processTopLevelStmtCached(n: PNode; var a: TPassContextArray); +var + i: int; + m: PNode; +begin + // this implements the code transformation pipeline + m := n; + for i := 0 to gPassesLen-1 do + if assigned(gPasses[i].openCached) then m := gPasses[i].process(a[i], m); +end; + +procedure closePassesCached(var a: TPassContextArray); +var + i: int; + m: PNode; +begin + m := nil; + for i := 0 to gPassesLen-1 do begin + if assigned(gPasses[i].openCached) and assigned(gPasses[i].close) then + m := gPasses[i].close(a[i], m); + a[i] := nil; // free the memory here + end +end; + +procedure processModule(module: PSym; const filename: string; + stream: PLLStream; rd: PRodReader); +var + p: TParser; + n: PNode; + a: TPassContextArray; + s: PLLStream; + i: int; +begin + if rd = nil then begin + openPasses(a, module, filename); + if stream = nil then begin + s := LLStreamOpen(filename, fmRead); + if s = nil then begin + rawMessage(errCannotOpenFile, filename); + exit + end; + end + else + s := stream; + while true do begin + openParser(p, filename, s); + while true do begin + n := parseTopLevelStmt(p); + if n = nil then break; + processTopLevelStmt(n, a) + end; + closeParser(p); + if s.kind <> llsStdIn then break; + end; + closePasses(a); + // id synchronization point for more consistent code generation: + IDsynchronizationPoint(1000); + end + else begin + openPassesCached(a, module, filename, rd); + n := loadInitSection(rd); + //MessageOut('init section' + renderTree(n)); + for i := 0 to sonsLen(n)-1 do processTopLevelStmtCached(n.sons[i], a); + closePassesCached(a); + end; +end; + +procedure initPass(var p: TPass); +begin + p.open := nil; + p.openCached := nil; + p.close := nil; + p.process := nil; +end; + +end. diff --git a/nim/pragmas.pas b/nim/pragmas.pas index 372d8d4a49..68bc366f17 100644 --- a/nim/pragmas.pas +++ b/nim/pragmas.pas @@ -197,10 +197,10 @@ begin while it <> nil do begin if it.kind = kind then begin if ospCaseInsensitive in platform.OS[targetOS].props then begin - if it.path = path then begin result := it; exit end; + if cmpIgnoreCase(it.path, path) = 0 then begin result := it; exit end; end else begin - if cmpIgnoreCase(it.path, path) = 0 then begin result := it; exit end; + if it.path = path then begin result := it; exit end; end end; it := PLib(it.next) diff --git a/nim/ptmplsyn.pas b/nim/ptmplsyn.pas new file mode 100644 index 0000000000..2368b22c78 --- /dev/null +++ b/nim/ptmplsyn.pas @@ -0,0 +1,270 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit ptmplsyn; + +// This module implements the parser of the Nimrod Template files. + +{$include config.inc} + +interface + +uses + nsystem, llstream, nos, charsets, wordrecg, strutils, + ast, astalgo, msgs, options, pnimsyn; + +function ParseTmplFile(const filename: string): PNode; + + +type + TParseState = (psDirective, psMultiDir, psTempl); + TTmplParser = record + inp: PLLStream; + state: TParseState; + info: TLineInfo; + indent, par: int; + x: string; // the current input line + outp: PLLStream; // the ouput will be parsed by pnimsyn + subsChar: Char; + end; + +function ParseTmpl(var p: TTmplParser): PNode; + +procedure openTmplParser(var p: TTmplParser; const filename: string; + inputStream: PLLStream); +procedure closeTmplParser(var p: TTmplParser); + +implementation + +const + NimDirective = '#'; + PatternChars = ['a'..'z', 'A'..'Z', '0'..'9', #128..#255, '.', '_']; + +procedure newLine(var p: TTmplParser); +begin + LLStreamWrite(p.outp, repeatChar(p.par, ')')); + p.par := 0; + if p.info.line > int16(1) then LLStreamWrite(p.outp, nl); +end; + +procedure parseLine(var p: TTmplParser); +var + d, j, curly: int; + keyw: string; +begin + j := strStart; + while p.x[j] = ' ' do inc(j); + if p.state = psMultiDir then begin + newLine(p); + if p.x[j] = '*' then begin + inc(j); + if p.x[j] = NimDirective then p.state := psTempl; + // ignore the rest of the line + end + else + LLStreamWrite(p.outp, p.x); // simply add the whole line + end + else if p.x[j] = NimDirective then begin + newLine(p); + inc(j); + while p.x[j] = ' ' do inc(j); + d := j; + if p.x[j] = '*' then begin + inc(j); + p.state := psMultiDir; + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, '#*'); + LLStreamWrite(p.outp, ncopy(p.x, j)); // simply add the whole line + end + else begin + keyw := ''; + while p.x[j] in PatternChars do begin + addChar(keyw, p.x[j]); + inc(j); + end; + case whichKeyword(keyw) of + wEnd: begin + if p.indent >= 2 then + dec(p.indent, 2) + else begin + p.info.col := int16(j); + liMessage(p.info, errXNotAllowedHere, 'end'); + end; + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, '#end'); + end; + wSubsChar: begin + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, '#subschar'); + while p.x[j] = ' ' do inc(j); + if p.x[j] in ['+', '-', '*', '/', '<', '>', '!', '?', '^', '.', + '|', '=', '%', '&', '$', '@', '~'] then p.subsChar := p.x[j] + else begin + p.info.col := int16(j); + liMessage(p.info, errXNotAllowedHere, p.x[j]+''); + end + end; + wIf, wWhen, wTry, wWhile, wFor, wBlock, wCase, wProc, wIterator, + wConverter, wMacro, wTemplate: begin + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, ncopy(p.x, d)); + inc(p.indent, 2); + end; + wElif, wOf, wElse, wExcept, wFinally: begin + LLStreamWrite(p.outp, repeatChar(p.indent-2)); + LLStreamWrite(p.outp, ncopy(p.x, d)); + end + else begin + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, ncopy(p.x, d)); + end + end; + p.state := psDirective; + end + end + else begin + // data line + j := strStart; + case p.state of + psTempl: begin + // next line of string literal: + LLStreamWrite(p.outp, ' &'+nl); + LLStreamWrite(p.outp, repeatChar(p.indent + 2)); + LLStreamWrite(p.outp, '"'+''); + end; + psDirective: begin + newLine(p); + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, 'add(result, "'); + inc(p.par); + end; + else InternalError(p.info, 'parser in invalid state'); + end; + p.state := psTempl; + while true do begin + case p.x[j] of + #0: break; + #1..#31, #128..#255: begin + LLStreamWrite(p.outp, '\x'); + LLStreamWrite(p.outp, toHex(ord(p.x[j]), 2)); + inc(j); + end; + '\': begin LLStreamWrite(p.outp, '\\'); inc(j); end; + '''': begin LLStreamWrite(p.outp, '\'''); inc(j); end; + '"': begin LLStreamWrite(p.outp, '\"'); inc(j); end; + else if p.x[j] = p.subsChar then begin // parse Nimrod expression: + inc(j); + case p.x[j] of + '{': begin + p.info.col := int16(j); + LLStreamWrite(p.outp, '" & $('); + inc(j); + curly := 0; + while true do begin + case p.x[j] of + #0: liMessage(p.info, errXExpected, '}'+''); + '{': begin + inc(j); + inc(curly); + LLStreamWrite(p.outp, '{'+''); + end; + '}': begin + inc(j); + if curly = 0 then break; + if curly > 0 then dec(curly); + LLStreamWrite(p.outp, '}'+''); + end; + else begin + LLStreamWrite(p.outp, p.x[j]); + inc(j) + end + end + end; + LLStreamWrite(p.outp, ') & "') + end; + 'A'..'Z', 'a'..'z', '_': begin + LLStreamWrite(p.outp, '" & $'); + while p.x[j] in PatternChars do begin + LLStreamWrite(p.outp, p.x[j]); + inc(j) + end; + LLStreamWrite(p.outp, ' & "') + end; + else if p.x[j] = p.subsChar then begin + LLStreamWrite(p.outp, p.subsChar); + inc(j); + end + else begin + p.info.col := int16(j); + liMessage(p.info, errInvalidExpression, '$'+''); + end + end; + end + else begin + LLStreamWrite(p.outp, p.x[j]); + inc(j); + end + end + end; + LLStreamWrite(p.outp, '\n"'); + end +end; + +function ParseTmpl(var p: TTmplParser): PNode; +var + q: TParser; +begin + while not LLStreamAtEnd(p.inp) do begin + p.x := LLStreamReadLine(p.inp) {@ignore} + #0 {@emit}; + p.info.line := p.info.line + int16(1); + parseLine(p); + end; + newLine(p); + if gVerbosity >= 2 then begin + rawMessage(hintCodeBegin); + messageOut(p.outp.s); + rawMessage(hintCodeEnd); + end; + openParser(q, toFilename(p.info), p.outp); + result := ParseModule(q); + closeParser(q); +end; + +procedure openTmplParser(var p: TTmplParser; const filename: string; + inputStream: PLLStream); +begin +{@ignore} + FillChar(p, sizeof(p), 0); +{@emit} + p.info := newLineInfo(filename, 0, 0); + p.outp := LLStreamOpen(''); + p.inp := inputStream; + p.subsChar := '$'; +end; + +procedure CloseTmplParser(var p: TTmplParser); +begin + LLStreamClose(p.inp); +end; + +function ParseTmplFile(const filename: string): PNode; +var + p: TTmplParser; + f: TBinaryFile; +begin + if not OpenFile(f, filename) then begin + rawMessage(errCannotOpenFile, filename); + result := nil; + exit + end; + OpenTmplParser(p, filename, LLStreamOpen(f)); + result := ParseTmpl(p); + CloseTmplParser(p); +end; + +end. diff --git a/nim/rodread.pas b/nim/rodread.pas new file mode 100644 index 0000000000..549cfec58c --- /dev/null +++ b/nim/rodread.pas @@ -0,0 +1,1134 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit rodread; + +// This module is responsible for loading of rod files. +(* + Reading and writing binary files are really hard to debug. Therefore we use + a special text format. ROD-files only describe the interface of a module. + Thus they are smaller than the source files most of the time. Even if they + are bigger, they are more efficient to process because symbols are only + loaded on demand. + It consists of: + + - a header: + NIM:$fileversion\n + - the module's id (even if the module changed, its ID will not!): + ID:Ax3\n + - CRC value of this module: + CRC:CRC-val\n + - a section containing the compiler options and defines this + module has been compiled with: + OPTIONS:options\n + DEFINES:defines\n + - FILES( + myfile.inc + lib/mymodA + ) + - a include file dependency section: + INCLUDES( + \n # fileidx is the LINE in the file section! + ) + - a module dependency section: + DEPS: \n + - an interface section: + INTERF( + identifier1 id\n # id is the symbol's id + identifier2 id\n + ) + - a compiler proc section: + COMPILERPROCS( + identifier1 id\n # id is the symbol's id + ) + - an index consisting of (ID, linenumber)-pairs: + INDEX( + id-diff idx-diff\n + id-diff idx-diff\n + ) + - an import index consisting of (ID, moduleID)-pairs: + IMPORTS( + id-diff moduleID-diff\n + id-diff moduleID-diff\n + ) + - a list of all exported type converters because they are needed for correct + semantic checking: + CONVERTERS:id id\n # position of the symbol in the DATA section + - an AST section that contains the module's AST: + INIT( + idx\n # position of the node in the DATA section + idx\n + ) + - a data section, where each type, symbol or AST is stored. + DATA( + type + (node) + sym + ) + + We now also do index compression, because an index always needs to be read. +*) + +interface + +{$include 'config.inc'} + +uses + sysutils, nsystem, nos, options, strutils, nversion, ast, astalgo, msgs, + platform, condsyms, ropes, idents, crc; + +type + TReasonForRecompile = ( + rrEmpty, // used by moddeps module + rrNone, // no need to recompile + rrRodDoesNotExist, // rod file does not exist + rrRodInvalid, // rod file is invalid + rrCrcChange, // file has been edited since last recompilation + rrDefines, // defines have changed + rrOptions, // options have changed + rrInclDeps, // an include has changed + rrModDeps // a module this module depends on has been changed + ); +const + reasonToFrmt: array [TReasonForRecompile] of string = ( + '', + 'no need to recompile: $1', + 'symbol file for $1 does not exist', + 'symbol file for $1 has the wrong version', + 'file edited since last compilation: $1', + 'list of conditional symbols changed for: $1', + 'list of options changed for: $1', + 'an include file edited: $1', + 'a module $1 depends on has changed' + ); + +type + TIndex = record // an index with compression + lastIdxKey, lastIdxVal: int; + tab: TIITable; + r: PRope; // writers use this + offset: int; // readers use this + end; + TRodReader = object(NObject) + pos: int; // position; used for parsing + s: string; // the whole file in memory + options: TOptions; + reason: TReasonForRecompile; + modDeps: TStringSeq; + files: TStringSeq; + dataIdx: int; // offset of start of data section + convertersIdx: int; // offset of start of converters section + initIdx, interfIdx, compilerProcsIdx: int; + filename: string; + index, imports: TIndex; + readerIndex: int; + line: int; // only used for debugging, but is always in the code + moduleID: int; + syms: TIdTable; // already processed symbols + end; + PRodReader = ^TRodReader; + +const + FileVersion = '1012'; // modify this if the rod-format changes! + +var + rodCompilerprocs: TStrTable; // global because this is needed by magicsys + + +function handleSymbolFile(module: PSym; const filename: string): PRodReader; +function GetCRC(const filename: string): TCrc32; + +function loadInitSection(r: PRodReader): PNode; + +procedure loadStub(s: PSym); + +function encodeInt(x: BiggestInt): PRope; +function encode(const s: string): PRope; + +implementation + +var + gTypeTable: TIdTable; + +function rrGetSym(r: PRodReader; id: int; const info: TLineInfo): PSym; forward; + // `info` is only used for debugging purposes + +function rrGetType(r: PRodReader; id: int; const info: TLineInfo): PType; forward; + +function decode(r: PRodReader): string; forward; +function decodeInt(r: PRodReader): int; forward; +function decodeBInt(r: PRodReader): biggestInt; forward; + +function encode(const s: string): PRope; +var + i: int; + res: string; +begin + res := ''; + for i := strStart to length(s)+strStart-1 do begin + case s[i] of + '0'..'9', 'a'..'z', 'A'..'Z', '_': + addChar(res, s[i]); + else + res := res +{&} '\' +{&} toHex(ord(s[i]), 2) + end + end; + result := toRope(res); +end; + +procedure encodeIntAux(var str: string; x: BiggestInt); +const + chars: string = + '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; +var + v, rem: biggestInt; + d: char; + idx: int; +begin + v := x; + rem := v mod 190; + if (rem < 0) then begin + str := str + '-'; + v := -(v div 190); + rem := -rem; + end + else + v := v div 190; + idx := int(rem); + if idx < 62 then d := chars[idx+strStart] + else d := chr(idx - 62 + 128); + if (v <> 0) then encodeIntAux(str, v); + addChar(str, d); +end; + +function encodeInt(x: BiggestInt): PRope; +var + res: string; +begin + res := ''; + encodeIntAux(res, x); + result := toRope(res); +end; + + +procedure decodeLineInfo(r: PRodReader; var info: TLineInfo); +begin + if r.s[r.pos] = '?' then begin + inc(r.pos); + if r.s[r.pos] = ',' then + info.col := int16(-1) + else + info.col := int16(decodeInt(r)); + if r.s[r.pos] = ',' then begin + inc(r.pos); + if r.s[r.pos] = ',' then info.line := int16(-1) + else info.line := int16(decodeInt(r)); + if r.s[r.pos] = ',' then begin + inc(r.pos); + info := newLineInfo(r.files[decodeInt(r)], info.line, info.col); + end + end + end +end; + +function decodeNode(r: PRodReader; const fInfo: TLineInfo): PNode; +var + id: int; + fl: string; +begin + result := nil; + if r.s[r.pos] = '(' then begin + inc(r.pos); + if r.s[r.pos] = ')' then begin + inc(r.pos); exit; // nil node + end; + result := newNodeI(TNodeKind(decodeInt(r)), fInfo); + decodeLineInfo(r, result.info); + if r.s[r.pos] = '$' then begin + inc(r.pos); + result.flags := {@cast}TNodeFlags(int32(decodeInt(r))); + end; + if r.s[r.pos] = '^' then begin + inc(r.pos); + id := decodeInt(r); + result.typ := rrGetType(r, id, result.info); + end; + case result.kind of + nkCharLit..nkInt64Lit: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + result.intVal := decodeBInt(r); + end + end; + nkFloatLit..nkFloat64Lit: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + fl := decode(r); + result.floatVal := parseFloat(fl); + end + end; + nkStrLit..nkTripleStrLit: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + result.strVal := decode(r); + end + else + result.strVal := ''; // BUGFIX + end; + nkIdent: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + fl := decode(r); + result.ident := getIdent(fl); + end + else + internalError(result.info, 'decodeNode: nkIdent'); + end; + nkSym: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + id := decodeInt(r); + result.sym := rrGetSym(r, id, result.info); + end + else + internalError(result.info, 'decodeNode: nkSym'); + end; + else begin + while r.s[r.pos] <> ')' do + addSon(result, decodeNode(r, result.info)); + end + end; + if r.s[r.pos] = ')' then inc(r.pos) + else internalError(result.info, 'decodeNode'); + end + else InternalError(result.info, 'decodeNode ' + r.s[r.pos]) +end; + +procedure decodeLoc(r: PRodReader; var loc: TLoc; const info: TLineInfo); +begin + if r.s[r.pos] = '<' then begin + inc(r.pos); + if r.s[r.pos] in ['0'..'9', 'a'..'z', 'A'..'Z'] then + loc.k := TLocKind(decodeInt(r)) + else + loc.k := low(loc.k); + if r.s[r.pos] = '*' then begin + inc(r.pos); + loc.s := TStorageLoc(decodeInt(r)); + end + else + loc.s := low(loc.s); + if r.s[r.pos] = '$' then begin + inc(r.pos); + loc.flags := {@cast}TLocFlags(int32(decodeInt(r))); + end + else + loc.flags := {@set}[]; + if r.s[r.pos] = '^' then begin + inc(r.pos); + loc.t := rrGetType(r, decodeInt(r), info); + end + else + loc.t := nil; + if r.s[r.pos] = '!' then begin + inc(r.pos); + loc.r := toRope(decode(r)); + end + else + loc.r := nil; + if r.s[r.pos] = '?' then begin + inc(r.pos); + loc.a := decodeInt(r); + end + else + loc.a := 0; + if r.s[r.pos] = '>' then inc(r.pos) + else InternalError(info, 'decodeLoc ' + r.s[r.pos]); + end +end; + +function decodeType(r: PRodReader; const info: TLineInfo): PType; +var + d: int; +begin + result := nil; + if r.s[r.pos] = '[' then begin + inc(r.pos); + if r.s[r.pos] = ']' then begin + inc(r.pos); exit; // nil type + end; + end; + new(result); +{@ignore} + FillChar(result^, sizeof(result^), 0); +{@emit} + result.kind := TTypeKind(decodeInt(r)); + if r.s[r.pos] = '+' then begin + inc(r.pos); + result.id := decodeInt(r); + setId(result.id); + if debugIds then registerID(result); + end + else + InternalError(info, 'decodeType: no id'); + IdTablePut(gTypeTable, result, result); // here this also + // avoids endless recursion for recursive type + if r.s[r.pos] = '(' then + result.n := decodeNode(r, UnknownLineInfo()); + if r.s[r.pos] = '$' then begin + inc(r.pos); + result.flags := {@cast}TTypeFlags(int32(decodeInt(r))); + end; + if r.s[r.pos] = '?' then begin + inc(r.pos); + result.callConv := TCallingConvention(decodeInt(r)); + end; + if r.s[r.pos] = '*' then begin + inc(r.pos); + result.owner := rrGetSym(r, decodeInt(r), info); + end; + if r.s[r.pos] = '&' then begin + inc(r.pos); + result.sym := rrGetSym(r, decodeInt(r), info); + end; + if r.s[r.pos] = '/' then begin + inc(r.pos); + result.size := decodeInt(r); + end + else result.size := -1; + if r.s[r.pos] = '=' then begin + inc(r.pos); + result.align := decodeInt(r); + end + else result.align := 2; + if r.s[r.pos] = '@' then begin + inc(r.pos); + result.containerID := decodeInt(r); + end; + decodeLoc(r, result.loc, info); + while r.s[r.pos] = '^' do begin + inc(r.pos); + if r.s[r.pos] = '(' then begin + inc(r.pos); + if r.s[r.pos] = ')' then inc(r.pos) + else InternalError(info, 'decodeType ^(' + r.s[r.pos]); + addSon(result, nil); + end + else begin + d := decodeInt(r); + addSon(result, rrGetType(r, d, info)); + end; + end +end; + +function decodeLib(r: PRodReader): PLib; +begin + result := nil; + if r.s[r.pos] = '|' then begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + inc(r.pos); + result.kind := TLibKind(decodeInt(r)); + if r.s[r.pos] <> '|' then InternalError('decodeLib: 1'); + inc(r.pos); + result.name := toRope(decode(r)); + if r.s[r.pos] <> '|' then InternalError('decodeLib: 2'); + inc(r.pos); + result.path := decode(r); + end +end; + +function decodeSym(r: PRodReader; const info: TLineInfo): PSym; +var + k: TSymKind; + id: int; + ident: PIdent; +begin + result := nil; + if r.s[r.pos] = '{' then begin + inc(r.pos); + if r.s[r.pos] = '}' then begin + inc(r.pos); exit; // nil sym + end + end; + k := TSymKind(decodeInt(r)); + if r.s[r.pos] = '+' then begin + inc(r.pos); + id := decodeInt(r); + setId(id); + end + else + InternalError(info, 'decodeSym: no id'); + if r.s[r.pos] = '&' then begin + inc(r.pos); + ident := getIdent(decode(r)); + end + else + InternalError(info, 'decodeSym: no ident'); + result := PSym(IdTableGet(r.syms, id)); + if result = nil then begin + new(result); + {@ignore} + FillChar(result^, sizeof(result^), 0); + {@emit} + result.id := id; + IdTablePut(r.syms, result, result); + if debugIds then registerID(result); + end + else if (result.id <> id) then + InternalError(info, 'decodeSym: wrong id'); + result.kind := k; + result.name := ident; + // read the rest of the symbol description: + if r.s[r.pos] = '^' then begin + inc(r.pos); + result.typ := rrGetType(r, decodeInt(r), info); + end; + decodeLineInfo(r, result.info); + if r.s[r.pos] = '*' then begin + inc(r.pos); + result.owner := rrGetSym(r, decodeInt(r), result.info); + end; + if r.s[r.pos] = '$' then begin + inc(r.pos); + result.flags := {@cast}TSymFlags(int32(decodeInt(r))); + end; + if r.s[r.pos] = '@' then begin + inc(r.pos); + result.magic := TMagic(decodeInt(r)); + end; + if r.s[r.pos] = '(' then + result.ast := decodeNode(r, result.info); + if r.s[r.pos] = '!' then begin + inc(r.pos); + result.options := {@cast}TOptions(int32(decodeInt(r))); + end + else + result.options := r.options; + if r.s[r.pos] = '%' then begin + inc(r.pos); + result.position := decodeInt(r); + end + else + result.position := 0; // BUGFIX: this may have been misused as reader index! + if r.s[r.pos] = '`' then begin + inc(r.pos); + result.offset := decodeInt(r); + end + else + result.offset := -1; + decodeLoc(r, result.loc, result.info); + result.annex := decodeLib(r); +end; + +function decodeInt(r: PRodReader): int; // base 190 numbers +var + i: int; + sign: int; +begin + i := r.pos; + sign := -1; + assert(r.s[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '-', #128..#255]); + if r.s[i] = '-' then begin + inc(i); + sign := 1 + end; + result := 0; + while true do begin + case r.s[i] of + '0'..'9': result := result * 190 - (ord(r.s[i]) - ord('0')); + 'a'..'z': result := result * 190 - (ord(r.s[i]) - ord('a') + 10); + 'A'..'Z': result := result * 190 - (ord(r.s[i]) - ord('A') + 36); + #128..#255: result := result * 190 - (ord(r.s[i]) - 128 + 62); + else break; + end; + inc(i) + end; + result := result * sign; + r.pos := i +end; + +function decodeBInt(r: PRodReader): biggestInt; +var + i: int; + sign: biggestInt; +begin + i := r.pos; + sign := -1; + assert(r.s[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '-', #128..#255]); + if r.s[i] = '-' then begin + inc(i); + sign := 1 + end; + result := 0; + while true do begin + case r.s[i] of + '0'..'9': result := result * 190 - (ord(r.s[i]) - ord('0')); + 'a'..'z': result := result * 190 - (ord(r.s[i]) - ord('a') + 10); + 'A'..'Z': result := result * 190 - (ord(r.s[i]) - ord('A') + 36); + #128..#255: result := result * 190 - (ord(r.s[i]) - 128 + 62); + else break; + end; + inc(i) + end; + result := result * sign; + r.pos := i +end; + +procedure hexChar(c: char; var xi: int); +begin + case c of + '0'..'9': xi := (xi shl 4) or (ord(c) - ord('0')); + 'a'..'f': xi := (xi shl 4) or (ord(c) - ord('a') + 10); + 'A'..'F': xi := (xi shl 4) or (ord(c) - ord('A') + 10); + else begin end + end +end; + +function decode(r: PRodReader): string; +var + i, xi: int; +begin + i := r.pos; + result := ''; + while true do begin + case r.s[i] of + '\': begin + inc(i, 3); xi := 0; + hexChar(r.s[i-2], xi); + hexChar(r.s[i-1], xi); + addChar(result, chr(xi)); + end; + 'a'..'z', '0'..'9', 'A'..'Z', '_': begin + addChar(result, r.s[i]); + inc(i); + end + else break + end + end; + r.pos := i; +end; + +procedure skipSection(r: PRodReader); +var + c: int; +begin + if r.s[r.pos] = ':' then begin + while r.s[r.pos] > #10 do inc(r.pos); + end + else if r.s[r.pos] = '(' then begin + c := 0; // count () pairs + inc(r.pos); + while true do begin + case r.s[r.pos] of + #10: inc(r.line); + '(': inc(c); + ')': begin + if c = 0 then begin inc(r.pos); break end + else if c > 0 then dec(c); + end; + #0: break; // end of file + else begin end; + end; + inc(r.pos); + end + end + else + InternalError('skipSection ' + toString(r.line)); +end; + +function rdWord(r: PRodReader): string; +begin + result := ''; + while r.s[r.pos] in ['A'..'Z', '_', 'a'..'z', '0'..'9'] do begin + addChar(result, r.s[r.pos]); + inc(r.pos); + end; +end; + +function newStub(r: PRodReader; const name: string; id: int): PSym; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.kind := skStub; + result.id := id; + result.name := getIdent(name); + result.position := r.readerIndex; + setID(id); + //MessageOut(result.name.s); + if debugIds then registerID(result); +end; + +procedure processInterf(r: PRodReader; module: PSym); +var + s: PSym; + w: string; + key: int; +begin + if r.interfIdx = 0 then InternalError('processInterf'); + r.pos := r.interfIdx; + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + w := decode(r); + inc(r.pos); + key := decodeInt(r); + inc(r.pos); // #10 + s := newStub(r, w, key); + s.owner := module; + StrTableAdd(module.tab, s); + IdTablePut(r.syms, s, s); + end; +end; + +procedure processCompilerProcs(r: PRodReader; module: PSym); +var + s: PSym; + w: string; + key: int; +begin + if r.compilerProcsIdx = 0 then InternalError('processCompilerProcs'); + r.pos := r.compilerProcsIdx; + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + w := decode(r); + inc(r.pos); + key := decodeInt(r); + inc(r.pos); // #10 + s := PSym(IdTableGet(r.syms, key)); + if s = nil then begin + s := newStub(r, w, key); + s.owner := module; + IdTablePut(r.syms, s, s); + end; + StrTableAdd(rodCompilerProcs, s); + end; +end; + +procedure processIndex(r: PRodReader; var idx: TIndex); +var + key, val, tmp: int; +begin + inc(r.pos, 2); // skip "(\10" + inc(r.line); + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + tmp := decodeInt(r); + if r.s[r.pos] = ' ' then begin + inc(r.pos); + key := idx.lastIdxKey + tmp; + val := decodeInt(r) + idx.lastIdxVal; + end + else begin + key := idx.lastIdxKey + 1; + val := tmp + idx.lastIdxVal; + end; + IITablePut(idx.tab, key, val); + idx.lastIdxKey := key; + idx.lastIdxVal := val; + setID(key); // ensure that this id will not be used + if r.s[r.pos] = #10 then begin inc(r.pos); inc(r.line) end; + end; + if r.s[r.pos] = ')' then inc(r.pos); +end; + +procedure processRodFile(r: PRodReader; crc: TCrc32); +var + section, w: string; + d, L, inclCrc: int; +begin + while r.s[r.pos] <> #0 do begin + section := rdWord(r); + if r.reason <> rrNone then break; // no need to process this file further + if section = 'CRC' then begin + inc(r.pos); // skip ':' + if int(crc) <> decodeInt(r) then + r.reason := rrCrcChange + end + else if section = 'ID' then begin + inc(r.pos); // skip ':' + r.moduleID := decodeInt(r); + setID(r.moduleID); + end + else if section = 'OPTIONS' then begin + inc(r.pos); // skip ':' + r.options := {@cast}TOptions(int32(decodeInt(r))); + if options.gOptions <> r.options then r.reason := rrOptions + end + else if section = 'DEFINES' then begin + inc(r.pos); // skip ':' + d := 0; + while r.s[r.pos] > #10 do begin + w := decode(r); + inc(d); + if not condsyms.isDefined(getIdent(w)) then begin + r.reason := rrDefines; + //MessageOut('not defined, but should: ' + w); + end; + if r.s[r.pos] = ' ' then inc(r.pos); + end; + if (d <> countDefinedSymbols()) then + r.reason := rrDefines + end + else if section = 'FILES' then begin + inc(r.pos, 2); // skip "(\10" + inc(r.line); + L := 0; + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + setLength(r.files, L+1); + r.files[L] := decode(r); + inc(r.pos); // skip #10 + inc(r.line); + inc(L); + end; + if r.s[r.pos] = ')' then inc(r.pos); + end + else if section = 'INCLUDES' then begin + inc(r.pos, 2); // skip "(\10" + inc(r.line); + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + w := r.files[decodeInt(r)]; + inc(r.pos); // skip ' ' + inclCrc := decodeInt(r); + if r.reason = rrNone then begin + if not ExistsFile(w) or (inclCrc <> int(crcFromFile(w))) then + r.reason := rrInclDeps + end; + if r.s[r.pos] = #10 then begin inc(r.pos); inc(r.line) end; + end; + if r.s[r.pos] = ')' then inc(r.pos); + end + else if section = 'DEPS' then begin + inc(r.pos); // skip ':' + L := 0; + while (r.s[r.pos] > #10) do begin + setLength(r.modDeps, L+1); + r.modDeps[L] := r.files[decodeInt(r)]; + inc(L); + if r.s[r.pos] = ' ' then inc(r.pos); + end; + end + else if section = 'INTERF' then begin + r.interfIdx := r.pos+2; + skipSection(r); + end + else if section = 'COMPILERPROCS' then begin + r.compilerProcsIdx := r.pos+2; + skipSection(r); + end + else if section = 'INDEX' then begin + processIndex(r, r.index); + end + else if section = 'IMPORTS' then begin + processIndex(r, r.imports); + end + else if section = 'CONVERTERS' then begin + r.convertersIdx := r.pos+1; + skipSection(r); + end + else if section = 'DATA' then begin + r.dataIdx := r.pos+2; // "(\10" + // We do not read the DATA section here! We read the needed objects on + // demand. + skipSection(r); + end + else if section = 'INIT' then begin + r.initIdx := r.pos+2; // "(\10" + skipSection(r); + end + else begin + MessageOut('skipping section: ' + toString(r.pos)); + skipSection(r); + end; + if r.s[r.pos] = #10 then begin inc(r.pos); inc(r.line) end; + end +end; + +function newRodReader(const modfilename: string; crc: TCrc32; + readerIndex: int): PRodReader; +var + version: string; + r: PRodReader; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit result.files := @[];} +{@emit result.modDeps := @[];} + r := result; + r.reason := rrNone; + r.pos := strStart; + r.line := 1; + r.readerIndex := readerIndex; + r.filename := modfilename; + InitIdTable(r.syms); + r.s := readFile(modfilename) {@ignore} + #0 {@emit}; + if startsWith(r.s, 'NIM:') then begin + initIITable(r.index.tab); + initIITable(r.imports.tab); + // looks like a ROD file + inc(r.pos, 4); + version := ''; + while not (r.s[r.pos] in [#0,#10]) do begin + addChar(version, r.s[r.pos]); + inc(r.pos); + end; + if r.s[r.pos] = #10 then inc(r.pos); + if version = FileVersion then begin + // since ROD files are only for caching, no backwarts compability is + // needed + processRodFile(r, crc); + end + else + result := nil + end + else + result := nil; +end; + +function rrGetType(r: PRodReader; id: int; const info: TLineInfo): PType; +var + oldPos, d: int; +begin + result := PType(IdTableGet(gTypeTable, id)); + if result = nil then begin + // load the type: + oldPos := r.pos; + d := IITableGet(r.index.tab, id); + if d = invalidKey then InternalError(info, 'rrGetType'); + r.pos := d + r.dataIdx; + result := decodeType(r, info); + r.pos := oldPos; + end; +end; + +type + TFileModuleRec = record + filename: string; + reason: TReasonForRecompile; + rd: PRodReader; + crc: TCrc32; + end; + TFileModuleMap = array of TFileModuleRec; +var + gMods: TFileModuleMap = {@ignore} nil {@emit @[]}; // all compiled modules + +function decodeSymSafePos(rd: PRodReader; offset: int; + const info: TLineInfo): PSym; +var + oldPos: int; +begin + if rd.dataIdx = 0 then InternalError(info, 'dataIdx == 0'); + oldPos := rd.pos; + rd.pos := offset + rd.dataIdx; + result := decodeSym(rd, info); + rd.pos := oldPos; +end; + +function rrGetSym(r: PRodReader; id: int; const info: TLineInfo): PSym; +var + d, i, moduleID: int; + rd: PRodReader; +begin + result := PSym(IdTableGet(r.syms, id)); + if result = nil then begin + // load the symbol: + d := IITableGet(r.index.tab, id); + if d = invalidKey then begin + moduleID := IiTableGet(r.imports.tab, id); + if moduleID < 0 then + InternalError(info, + 'missing from both indexes: +' + ropeToStr(encodeInt(id))); + // find the reader with the correct moduleID: + for i := 0 to high(gMods) do begin + rd := gMods[i].rd; + if (rd <> nil) then begin + if (rd.moduleID = moduleID) then begin + d := IITableGet(rd.index.tab, id); + if d <> invalidKey then begin + result := decodeSymSafePos(rd, d, info); + break + end + else + InternalError(info, + 'rrGetSym: no reader found: +' + ropeToStr(encodeInt(id))); + end + else begin + //if IiTableGet(rd.index.tab, id) <> invalidKey then + // XXX expensive check! + //InternalError(info, + //'id found in other module: +' + ropeToStr(encodeInt(id))) + end + end + end; + end + else begin + // own symbol: + result := decodeSymSafePos(r, d, info); + end; + end; + if (result <> nil) and (result.kind = skStub) then loadStub(result); +end; + +function loadInitSection(r: PRodReader): PNode; +var + d, oldPos, p: int; +begin + if (r.initIdx = 0) or (r.dataIdx = 0) then InternalError('loadInitSection'); + oldPos := r.pos; + r.pos := r.initIdx; + result := newNode(nkStmtList); + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + d := decodeInt(r); + inc(r.pos); // #10 + p := r.pos; + r.pos := d + r.dataIdx; + addSon(result, decodeNode(r, UnknownLineInfo())); + r.pos := p; + end; + r.pos := oldPos; +end; + +procedure loadConverters(r: PRodReader); +var + d: int; +begin + // We have to ensure that no exported converter is a stub anymore. + if (r.convertersIdx = 0) or (r.dataIdx = 0) then + InternalError('importConverters'); + r.pos := r.convertersIdx; + while (r.s[r.pos] > #10) do begin + d := decodeInt(r); + {@discard} rrGetSym(r, d, UnknownLineInfo()); + if r.s[r.pos] = ' ' then inc(r.pos) + end; +end; + +function getModuleIdx(const filename: string): int; +var + i: int; +begin + for i := 0 to high(gMods) do + if sameFile(gMods[i].filename, filename) then begin + result := i; exit + end; + // not found, reserve space: + result := length(gMods); + setLength(gMods, result+1); +end; + +function checkDep(const filename: string): TReasonForRecompile; +var + crc: TCrc32; + r: PRodReader; + rodfile: string; + idx, i: int; + res: TReasonForRecompile; +begin + idx := getModuleIdx(filename); + if gMods[idx].reason <> rrEmpty then begin + // reason has already been computed for this module: + result := gMods[idx].reason; exit + end; + crc := crcFromFile(filename); + gMods[idx].reason := rrNone; // we need to set it here to avoid cycles + gMods[idx].filename := filename; + gMods[idx].crc := crc; + result := rrNone; + r := nil; + rodfile := toGeneratedFile(filename, RodExt); + if ExistsFile(rodfile) then begin + r := newRodReader(rodfile, crc, idx); + if r = nil then + result := rrRodInvalid + else begin + result := r.reason; + if result = rrNone then begin + // check modules it depends on + // NOTE: we need to process the entire module graph so that no ID will + // be used twice! However, compilation speed does not suffer much from + // this, since results are cached. + res := checkDep(JoinPath(options.libpath, + appendFileExt('system', nimExt))); + if res <> rrNone then result := rrModDeps; + for i := 0 to high(r.modDeps) do begin + res := checkDep(r.modDeps[i]); + if res <> rrNone then begin + result := rrModDeps; + //break // BUGFIX: cannot break here! + end + end + end + end + end + else + result := rrRodDoesNotExist; + if (result <> rrNone) and (gVerbosity > 0) then + MessageOut(format(reasonToFrmt[result], [filename])); + if (result <> rrNone) or (optForceFullMake in gGlobalOptions) then begin + // recompilation is necessary: + r := nil; + end; + gMods[idx].rd := r; + gMods[idx].reason := result; // now we know better +end; + +function handleSymbolFile(module: PSym; const filename: string): PRodReader; +var + idx: int; +begin + if not (optSymbolFiles in gGlobalOptions) then begin + module.id := getID(); + result := nil; + exit + end; + {@discard} checkDep(filename); + idx := getModuleIdx(filename); + if gMods[idx].reason = rrEmpty then InternalError('handleSymbolFile'); + result := gMods[idx].rd; + if result <> nil then begin + module.id := result.moduleID; + IdTablePut(result.syms, module, module); + processInterf(result, module); + processCompilerProcs(result, module); + loadConverters(result); + end + else + module.id := getID(); +end; + +function GetCRC(const filename: string): TCrc32; +var + idx: int; +begin + idx := getModuleIdx(filename); + result := gMods[idx].crc; +end; + +procedure loadStub(s: PSym); +var + rd: PRodReader; + d, theId: int; + rs: PSym; +begin + if s.kind <> skStub then InternalError('loadStub'); + //MessageOut('loading stub: ' + s.name.s); + rd := gMods[s.position].rd; + theId := s.id; // used for later check + d := IITableGet(rd.index.tab, s.id); + if d = invalidKey then InternalError('loadStub: invalid key'); + rs := decodeSymSafePos(rd, d, UnknownLineInfo()); + if rs <> s then InternalError(rs.info, 'loadStub: wrong symbol') + else if rs.id <> theId then InternalError(rs.info, 'loadStub: wrong ID'); + //MessageOut('loaded stub: ' + s.name.s); +end; + +initialization + InitIdTable(gTypeTable); + InitStrTable(rodCompilerProcs); +end. diff --git a/nim/rodwrite.pas b/nim/rodwrite.pas new file mode 100644 index 0000000000..64f3d67336 --- /dev/null +++ b/nim/rodwrite.pas @@ -0,0 +1,609 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit rodwrite; + +// This module is responsible for writing of rod files. Note that writing of +// rod files is a pass, reading of rod files is not! This is why reading and +// writing of rod files is split into two different modules. + +interface + +{$include 'config.inc'} + +uses + sysutils, nsystem, nos, options, strutils, nversion, ast, astalgo, msgs, + platform, condsyms, ropes, idents, crc, rodread, passes, importer; + +function rodwritePass(): TPass; + +implementation + +type + TRodWriter = object(TPassContext) + module: PSym; + crc: TCrc32; + options: TOptions; + defines: PRope; + inclDeps: PRope; + modDeps: PRope; + interf: PRope; + compilerProcs: PRope; + index, imports: TIndex; + converters: PRope; + init: PRope; + data: PRope; + filename: string; + sstack: TSymSeq; // a stack of symbols to process + tstack: TTypeSeq; // a stack of types to process + files: TStringSeq; + end; + PRodWriter = ^TRodWriter; + +function newRodWriter(const modfilename: string; crc: TCrc32; + module: PSym): PRodWriter; forward; +procedure addModDep(w: PRodWriter; const dep: string); forward; +procedure addInclDep(w: PRodWriter; const dep: string); forward; +procedure addInterfaceSym(w: PRodWriter; s: PSym); forward; +procedure addStmt(w: PRodWriter; n: PNode); forward; +procedure writeRod(w: PRodWriter); forward; + +function encodeStr(w: PRodWriter; const s: string): PRope; +begin + result := encode(s) +end; + +procedure processStacks(w: PRodWriter); forward; + +function getDefines: PRope; +var + it: TTabIter; + s: PSym; +begin + s := InitTabIter(it, gSymbols); + result := nil; + while s <> nil do begin + if s.position = 1 then begin + if result <> nil then app(result, ' '+''); + app(result, s.name.s); + end; + s := nextIter(it, gSymbols); + end +end; + +function fileIdx(w: PRodWriter; const filename: string): int; +var + i: int; +begin + for i := 0 to high(w.files) do begin + if w.files[i] = filename then begin result := i; exit end; + end; + result := length(w.files); + setLength(w.files, result+1); + w.files[result] := filename; +end; + +function newRodWriter(const modfilename: string; crc: TCrc32; + module: PSym): PRodWriter; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit + result.sstack := @[];} +{@emit + result.tstack := @[];} + InitIITable(result.index.tab); + InitIITable(result.imports.tab); + result.filename := modfilename; + result.crc := crc; + result.module := module; + result.defines := getDefines(); + result.options := options.gOptions; + {@emit result.files := @[];} +end; + +procedure addModDep(w: PRodWriter; const dep: string); +begin + if w.modDeps <> nil then app(w.modDeps, ' '+''); + app(w.modDeps, encodeInt(fileIdx(w, dep))); +end; + +const + rodNL = #10+''; + +procedure addInclDep(w: PRodWriter; const dep: string); +begin + app(w.inclDeps, encodeInt(fileIdx(w, dep))); + app(w.inclDeps, ' '+''); + app(w.inclDeps, encodeInt(crcFromFile(dep))); + app(w.inclDeps, rodNL); +end; + +procedure pushType(w: PRodWriter; t: PType); +var + L: int; +begin + // check so that the stack does not grow too large: + if IiTableGet(w.index.tab, t.id) = invalidKey then begin + L := length(w.tstack); + setLength(w.tstack, L+1); + w.tstack[L] := t; + end +end; + +procedure pushSym(w: PRodWriter; s: PSym); +var + L: int; +begin + // check so that the stack does not grow too large: + if IiTableGet(w.index.tab, s.id) = invalidKey then begin + L := length(w.sstack); + setLength(w.sstack, L+1); + w.sstack[L] := s; + end +end; + +function encodeNode(w: PRodWriter; const fInfo: TLineInfo; n: PNode): PRope; +var + i: int; + f: TNodeFlags; +begin + if n = nil then begin + // nil nodes have to be stored too: + result := toRope('()'); exit + end; + result := toRope('('+''); + app(result, encodeInt(ord(n.kind))); + // we do not write comments for now + // Line information takes easily 20% or more of the filesize! Therefore we + // omit line information if it is the same as the father's line information: + if (finfo.fileIndex <> n.info.fileIndex) then + appf(result, '?$1,$2,$3', [encodeInt(n.info.col), encodeInt(n.info.line), + encodeInt(fileIdx(w, toFilename(n.info)))]) + else if (finfo.line <> n.info.line) then + appf(result, '?$1,$2', [encodeInt(n.info.col), encodeInt(n.info.line)]) + else if (finfo.col <> n.info.col) then + appf(result, '?$1', [encodeInt(n.info.col)]); + // No need to output the file index, as this is the serialization of one + // file. + f := n.flags * PersistentNodeFlags; + if f <> {@set}[] then + appf(result, '$$$1', [encodeInt({@cast}int32(f))]); + if n.typ <> nil then begin + appf(result, '^$1', [encodeInt(n.typ.id)]); + pushType(w, n.typ); + end; + case n.kind of + nkCharLit..nkInt64Lit: begin + if n.intVal <> 0 then + appf(result, '!$1', [encodeInt(n.intVal)]); + end; + nkFloatLit..nkFloat64Lit: begin + if n.floatVal <> 0.0 then + appf(result, '!$1', [encodeStr(w, toStringF(n.floatVal))]); + end; + nkStrLit..nkTripleStrLit: begin + if n.strVal <> '' then + appf(result, '!$1', [encodeStr(w, n.strVal)]); + end; + nkIdent: + appf(result, '!$1', [encodeStr(w, n.ident.s)]); + nkSym: begin + appf(result, '!$1', [encodeInt(n.sym.id)]); + pushSym(w, n.sym); + end; + else begin + for i := 0 to sonsLen(n)-1 do + app(result, encodeNode(w, n.info, n.sons[i])); + end + end; + app(result, ')'+''); +end; + +function encodeLoc(w: PRodWriter; const loc: TLoc): PRope; +begin + result := nil; + if loc.k <> low(loc.k) then + app(result, encodeInt(ord(loc.k))); + if loc.s <> low(loc.s) then + appf(result, '*$1', [encodeInt(ord(loc.s))]); + if loc.flags <> {@set}[] then + appf(result, '$$$1', [encodeInt({@cast}int32(loc.flags))]); + if loc.t <> nil then begin + appf(result, '^$1', [encodeInt(loc.t.id)]); + pushType(w, loc.t); + end; + if loc.r <> nil then + appf(result, '!$1', [encodeStr(w, ropeToStr(loc.r))]); + if loc.a <> 0 then + appf(result, '?$1', [encodeInt(loc.a)]); + if result <> nil then + result := ropef('<$1>', [result]); +end; + +function encodeType(w: PRodWriter; t: PType): PRope; +var + i: int; +begin + if t = nil then begin + // nil nodes have to be stored too: + result := toRope('[]'); exit + end; + result := nil; + if t.kind = tyForward then InternalError('encodeType: tyForward'); + app(result, encodeInt(ord(t.kind))); + appf(result, '+$1', [encodeInt(t.id)]); + if t.n <> nil then + app(result, encodeNode(w, UnknownLineInfo(), t.n)); + if t.flags <> {@set}[] then + appf(result, '$$$1', [encodeInt({@cast}int32(t.flags))]); + if t.callConv <> low(t.callConv) then + appf(result, '?$1', [encodeInt(ord(t.callConv))]); + if t.owner <> nil then begin + appf(result, '*$1', [encodeInt(t.owner.id)]); + pushSym(w, t.owner); + end; + if t.sym <> nil then begin + appf(result, '&$1', [encodeInt(t.sym.id)]); + pushSym(w, t.sym); + end; + if t.size <> -1 then appf(result, '/$1', [encodeInt(t.size)]); + if t.align <> 2 then appf(result, '=$1', [encodeInt(t.align)]); + if t.containerID <> 0 then + appf(result, '@$1', [encodeInt(t.containerID)]); + app(result, encodeLoc(w, t.loc)); + for i := 0 to sonsLen(t)-1 do begin + if t.sons[i] = nil then + app(result, '^()') + else begin + appf(result, '^$1', [encodeInt(t.sons[i].id)]); + pushType(w, t.sons[i]); + end + end; +end; + +function encodeLib(w: PRodWriter; lib: PLib): PRope; +begin + result := nil; + appf(result, '|$1', [encodeInt(ord(lib.kind))]); + appf(result, '|$1', [encodeStr(w, ropeToStr(lib.name))]); + appf(result, '|$1', [encodeStr(w, lib.path)]); +end; + +function encodeSym(w: PRodWriter; s: PSym): PRope; +var + codeAst: PNode; + col, line: PRope; +begin + codeAst := nil; + if s = nil then begin + // nil nodes have to be stored too: + result := toRope('{}'); exit + end; + result := nil; + app(result, encodeInt(ord(s.kind))); + appf(result, '+$1', [encodeInt(s.id)]); + appf(result, '&$1', [encodeStr(w, s.name.s)]); + if s.typ <> nil then begin + appf(result, '^$1', [encodeInt(s.typ.id)]); + pushType(w, s.typ); + end; + if s.info.col = int16(-1) then col := nil + else col := encodeInt(s.info.col); + if s.info.line = int16(-1) then line := nil + else line := encodeInt(s.info.line); + appf(result, '?$1,$2,$3', [col, line, + encodeInt(fileIdx(w, toFilename(s.info)))]); + if s.owner <> nil then begin + appf(result, '*$1', [encodeInt(s.owner.id)]); + pushSym(w, s.owner); + end; + if s.flags <> {@set}[] then + appf(result, '$$$1', [encodeInt({@cast}int32(s.flags))]); + if s.magic <> mNone then + appf(result, '@$1', [encodeInt(ord(s.magic))]); + if (s.ast <> nil) then begin + if not astNeeded(s) then begin + codeAst := s.ast.sons[codePos]; + s.ast.sons[codePos] := nil; + end; + app(result, encodeNode(w, s.info, s.ast)); + if codeAst <> nil then // restore code ast + s.ast.sons[codePos] := codeAst; + end; + if s.options <> w.options then + appf(result, '!$1', [encodeInt({@cast}int32(s.options))]); + if s.position <> 0 then + appf(result, '%$1', [encodeInt(s.position)]); + if s.offset <> -1 then + appf(result, '`$1', [encodeInt(s.offset)]); + app(result, encodeLoc(w, s.loc)); + if s.annex <> nil then + app(result, encodeLib(w, s.annex)); +end; + +procedure addToIndex(var w: TIndex; key, val: int); +begin + if key - w.lastIdxKey = 1 then begin + // we do not store a key-diff of 1 to safe space + app(w.r, encodeInt(val - w.lastIdxVal)); + app(w.r, rodNL); + end + else + appf(w.r, '$1 $2'+rodNL, [encodeInt(key - w.lastIdxKey), + encodeInt(val - w.lastIdxVal)]); + w.lastIdxKey := key; + w.lastIdxVal := val; + IiTablePut(w.tab, key, val); +end; + +var + debugWritten: TIntSet; + +procedure symStack(w: PRodWriter); +var + i, L: int; + s, m: PSym; +begin + i := 0; + while i < length(w.sstack) do begin + s := w.sstack[i]; + if IiTableGet(w.index.tab, s.id) = invalidKey then begin + m := getModule(s); + if m = nil then InternalError('symStack: module nil: ' + s.name.s); + if (m.id = w.module.id) or (sfFromGeneric in s.flags) then begin + // put definition in here + L := ropeLen(w.data); + addToIndex(w.index, s.id, L); + //intSetIncl(debugWritten, s.id); + app(w.data, encodeSym(w, s)); + app(w.data, rodNL); + if sfInInterface in s.flags then + appf(w.interf, '$1 $2'+rodNL, [encode(s.name.s), encodeInt(s.id)]); + if sfCompilerProc in s.flags then + appf(w.compilerProcs, '$1 $2'+rodNL, [encode(s.name.s), encodeInt(s.id)]); + if s.kind = skConverter then begin + if w.converters <> nil then app(w.converters, ' '+''); + app(w.converters, encodeInt(s.id)) + end + end + else if IiTableGet(w.imports.tab, s.id) = invalidKey then begin + addToIndex(w.imports, s.id, m.id); + //if not IntSetContains(debugWritten, s.id) then begin + // MessageOut(w.filename); + // debug(s.owner); + // debug(s); + // InternalError('BUG!!!!'); + //end + end + end; + inc(i); + end; + setLength(w.sstack, 0); +end; + +procedure typeStack(w: PRodWriter); +var + i, L: int; +begin + i := 0; + while i < length(w.tstack) do begin + if IiTableGet(w.index.tab, w.tstack[i].id) = invalidKey then begin + L := ropeLen(w.data); + addToIndex(w.index, w.tstack[i].id, L); + app(w.data, encodeType(w, w.tstack[i])); + app(w.data, rodNL); + end; + inc(i); + end; + setLength(w.tstack, 0); +end; + +procedure processStacks(w: PRodWriter); +begin + while (length(w.tstack) > 0) or (length(w.sstack) > 0) do begin + symStack(w); + typeStack(w); + end +end; + +procedure rawAddInterfaceSym(w: PRodWriter; s: PSym); +begin + pushSym(w, s); + processStacks(w); +end; + +procedure addInterfaceSym(w: PRodWriter; s: PSym); +begin + if w = nil then exit; + if [sfInInterface, sfCompilerProc] * s.flags <> [] then begin + rawAddInterfaceSym(w, s); + end +end; + +procedure addStmt(w: PRodWriter; n: PNode); +begin + app(w.init, encodeInt(ropeLen(w.data))); + app(w.init, rodNL); + app(w.data, encodeNode(w, UnknownLineInfo(), n)); + app(w.data, rodNL); + processStacks(w); +end; + +procedure writeRod(w: PRodWriter); +var + content: PRope; + i: int; +begin + processStacks(w); + // write header: + content := toRope('NIM:'); + app(content, toRope(FileVersion)); + app(content, rodNL); + app(content, toRope('ID:')); + app(content, encodeInt(w.module.id)); + app(content, rodNL); + app(content, toRope('CRC:')); + app(content, encodeInt(w.crc)); + app(content, rodNL); + app(content, toRope('OPTIONS:')); + app(content, encodeInt({@cast}int32(w.options))); + app(content, rodNL); + app(content, toRope('DEFINES:')); + app(content, w.defines); + app(content, rodNL); + app(content, toRope('FILES('+rodNL)); + for i := 0 to high(w.files) do begin + app(content, encode(w.files[i])); + app(content, rodNL); + end; + app(content, toRope(')'+rodNL)); + app(content, toRope('INCLUDES('+rodNL)); + app(content, w.inclDeps); + app(content, toRope(')'+rodNL)); + app(content, toRope('DEPS:')); + app(content, w.modDeps); + app(content, rodNL); + app(content, toRope('INTERF('+rodNL)); + app(content, w.interf); + app(content, toRope(')'+rodNL)); + app(content, toRope('COMPILERPROCS('+rodNL)); + app(content, w.compilerProcs); + app(content, toRope(')'+rodNL)); + app(content, toRope('INDEX('+rodNL)); + app(content, w.index.r); + app(content, toRope(')'+rodNL)); + app(content, toRope('IMPORTS('+rodNL)); + app(content, w.imports.r); + app(content, toRope(')'+rodNL)); + app(content, toRope('CONVERTERS:')); + app(content, w.converters); + app(content, toRope(rodNL)); + app(content, toRope('INIT('+rodNL)); + app(content, w.init); + app(content, toRope(')'+rodNL)); + app(content, toRope('DATA('+rodNL)); + app(content, w.data); + app(content, toRope(')'+rodNL)); + + //MessageOut('interf ' + ToString(ropeLen(w.interf))); + //MessageOut('index ' + ToString(ropeLen(w.indexRope))); + //MessageOut('init ' + ToString(ropeLen(w.init))); + //MessageOut('data ' + ToString(ropeLen(w.data))); + + writeRope(content, + completeGeneratedFilePath(changeFileExt(w.filename, 'rod'))); +end; + +function process(c: PPassContext; n: PNode): PNode; +var + i, j: int; + w: PRodWriter; + a: PNode; + s: PSym; +begin + result := n; + if c = nil then exit; + w := PRodWriter(c); + case n.kind of + nkStmtList: begin + for i := 0 to sonsLen(n)-1 do {@discard} process(c, n.sons[i]); + end; + nkTemplateDef, nkMacroDef: begin + s := n.sons[namePos].sym; + addInterfaceSym(w, s); + end; + nkProcDef, nkIteratorDef, nkConverterDef: begin + s := n.sons[namePos].sym; + if s = nil then InternalError(n.info, 'rodwrite.process'); + if (n.sons[codePos] <> nil) or (s.magic <> mNone) + or not (sfForward in s.flags) then begin + addInterfaceSym(w, s); + end + end; + nkVarSection: begin + for i := 0 to sonsLen(n)-1 do begin + a := n.sons[i]; + if a.kind <> nkIdentDefs then InternalError(a.info, 'rodwrite.process'); + addInterfaceSym(w, a.sons[0].sym); + end + end; + nkConstSection: begin + for i := 0 to sonsLen(n)-1 do begin + a := n.sons[i]; + if a.kind <> nkConstDef then InternalError(a.info, 'rodwrite.process'); + addInterfaceSym(w, a.sons[0].sym); + end + end; + nkTypeSection: begin + for i := 0 to sonsLen(n)-1 do begin + a := n.sons[i]; + if a.sons[0].kind <> nkSym then + InternalError(a.info, 'rodwrite.process'); + s := a.sons[0].sym; + addInterfaceSym(w, s); // this takes care of enum fields too + // Note: The check for ``s.typ.kind = tyEnum`` is wrong for enum + // type aliasing! Otherwise the same enum symbol would be included + // several times! + (* + if (a.sons[2] <> nil) and (a.sons[2].kind = nkEnumTy) then begin + a := s.typ.n; + for j := 0 to sonsLen(a)-1 do + addInterfaceSym(w, a.sons[j].sym); + end *) + end + end; + nkImportStmt: begin + for i := 0 to sonsLen(n)-1 do addModDep(w, getModuleFile(n.sons[i])); + addStmt(w, n); + end; + nkFromStmt: begin + addModDep(w, getModuleFile(n.sons[0])); + addStmt(w, n); + end; + nkIncludeStmt: begin + for i := 0 to sonsLen(n)-1 do addInclDep(w, getModuleFile(n.sons[i])); + end; + nkPragma: addStmt(w, n); + else begin end + end; +end; + +function myOpen(module: PSym; const filename: string): PPassContext; +var + w: PRodWriter; +begin + if module.id < 0 then InternalError('rodwrite: module ID not set'); + w := newRodWriter(filename, rodread.GetCRC(filename), module); + rawAddInterfaceSym(w, module); + result := w; +end; + +function myClose(c: PPassContext; n: PNode): PNode; +var + w: PRodWriter; +begin + w := PRodWriter(c); + writeRod(w); + result := n; +end; + +function rodwritePass(): TPass; +begin + initPass(result); + if optSymbolFiles in gGlobalOptions then begin + result.open := myOpen; + result.close := myClose; + result.process := process; + end +end; + +initialization + IntSetInit(debugWritten); +end. diff --git a/nim/rst.pas b/nim/rst.pas index b5e5846b16..cc92e41eb9 100644 --- a/nim/rst.pas +++ b/nim/rst.pas @@ -469,19 +469,24 @@ end; // --------------------------------------------------------------- -function addNodes(n: PRstNode): string; +procedure addNodesAux(n: PRstNode; var result: string); var i: int; begin if n.kind = rnLeaf then - result := n.text + add(result, n.text) else begin - result := ''; for i := 0 to rsonsLen(n)-1 do - result := result +{&} addNodes(n.sons[i]) + addNodesAux(n.sons[i], result) end end; +function addNodes(n: PRstNode): string; +begin + result := ''; + addNodesAux(n, result); +end; + procedure rstnodeToRefnameAux(n: PRstNode; var r: string; var b: bool); var i: int; @@ -1118,7 +1123,7 @@ begin inc(p.idx); while p.tok[p.idx].kind in [tkWord, tkPunct, tkAdornment, tkOther] do begin if p.tok[p.idx].symbol = '::' then break; - result := result +{&} p.tok[p.idx].symbol; + add(result, p.tok[p.idx].symbol); inc(p.idx); end; if (p.tok[p.idx].kind = tkWhite) then inc(p.idx); @@ -1287,12 +1292,13 @@ begin break; end else begin - n.text := n.text +{&} nl +{&} repeatChar(p.tok[p.idx].ival - indent); + add(n.text, nl); + add(n.text, repeatChar(p.tok[p.idx].ival - indent)); inc(p.idx) end end else begin - n.text := n.text +{&} p.tok[p.idx].symbol; + add(n.text, p.tok[p.idx].symbol); inc(p.idx) end end @@ -1300,7 +1306,7 @@ begin end else begin while not (p.tok[p.idx].kind in [tkIndent, tkEof]) do begin - n.text := n.text +{&} p.tok[p.idx].symbol; + add(n.text, p.tok[p.idx].symbol); inc(p.idx) end end; @@ -1560,7 +1566,7 @@ begin i := 0; while not (p.tok[p.idx].kind in [tkIndent, tkEof]) do begin if (tokEnd(p) <= cols[i]) then begin - row[i] := row[i] +{&} p.tok[p.idx].symbol; + add(row[i], p.tok[p.idx].symbol); inc(p.idx); end else begin diff --git a/nim/scanner.pas b/nim/scanner.pas index 98bb54c07d..83f5c12b0c 100644 --- a/nim/scanner.pas +++ b/nim/scanner.pas @@ -10,12 +10,11 @@ unit scanner; // This scanner is handwritten for efficiency. I used an elegant buffering // scheme which I have not seen anywhere else: -// We guarantee that a hole line is in the buffer (too long lines are reported -// as an error). Thus only when scanning the \n or \r character we have -// to check wether we need to read in the next chunk. (\n or \r already need -// special handling for incrementing the line counter; choosing both \n and \r -// allows the scanner to properly read Unix, DOS or Macintosh text files, even -// when it is not the native format. +// We guarantee that a whole line is in the buffer. Thus only when scanning +// the \n or \r character we have to check wether we need to read in the next +// chunk. (\n or \r already need special handling for incrementing the line +// counter; choosing both \n and \r allows the scanner to properly read Unix, +// DOS or Macintosh text files, even when it is not the native format. interface @@ -29,7 +28,7 @@ uses const MaxLineLength = 80; // lines longer than this lead to a warning - numChars: TCharSet = ['0'..'9','a'..'z','A'..'Z']; // we support up to base 36 + numChars: TCharSet = ['0'..'9','a'..'z','A'..'Z']; SymChars: TCharSet = ['a'..'z', 'A'..'Z', '0'..'9', #128..#255]; SymStartChars: TCharSet = ['a'..'z', 'A'..'Z', #128..#255]; OpChars: TCharSet = ['+', '-', '*', '/', '<', '>', '!', '?', '^', '.', @@ -436,7 +435,7 @@ begin end; '_': inc(pos); '0', '1': begin - xi := (xi shl 1) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 1) or (ord(L.buf[pos]) - ord('0')); inc(pos); end; else break; @@ -453,7 +452,7 @@ begin end; '_': inc(pos); '0'..'7': begin - xi := (xi shl 3) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 3) or (ord(L.buf[pos]) - ord('0')); inc(pos); end; else break; @@ -471,15 +470,15 @@ begin end; '_': inc(pos); '0'..'9': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('0')); inc(pos); end; 'a'..'f': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('a') + 10); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('a') + 10); inc(pos); end; 'A'..'F': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('A') + 10); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('A') + 10); inc(pos); end; else break; @@ -490,8 +489,14 @@ begin end; // now look at the optional type suffix: case result.tokType of - tkIntLit..tkInt64Lit: + tkIntLit, tkInt64Lit: result.iNumber := xi; + tkInt8Lit: + result.iNumber := biggestInt(int8(toU8(int(xi)))); + tkInt16Lit: + result.iNumber := biggestInt(toU16(int(xi))); + tkInt32Lit: + result.iNumber := biggestInt(toU32(xi)); tkFloat32Lit: result.fNumber := ({@cast}PFloat32(addr(xi)))^; // note: this code is endian neutral! @@ -525,6 +530,8 @@ begin {@emit} on EOverflow do lexMessage(L, errNumberOutOfRange, result.literal); + on EOutOfRange do + lexMessage(L, errNumberOutOfRange, result.literal); end; L.bufpos := endpos; end; diff --git a/nim/semdata.pas b/nim/semdata.pas new file mode 100644 index 0000000000..f920fae2a8 --- /dev/null +++ b/nim/semdata.pas @@ -0,0 +1,254 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit semdata; + +// This module contains the data structures for the semantic checking phase. + +interface + +{$include 'config.inc'} + +uses + sysutils, nsystem, charsets, strutils, + lists, options, scanner, ast, astalgo, trees, treetab, wordrecg, + ropes, msgs, platform, nos, condsyms, idents, rnimsyn, types, + extccomp, nmath, magicsys, nversion, nimsets, pnimsyn, ntime, passes, + rodread; + +type + TOptionEntry = object(lists.TListEntry) + // entries to put on a stack for pragma parsing + options: TOptions; + defaultCC: TCallingConvention; + dynlib: PLib; + Notes: TNoteKinds; + end; + POptionEntry = ^TOptionEntry; + + TProcCon = record // procedure context; also used for top-level + // statements + owner: PSym; // the symbol this context belongs to + resultSym: PSym; // the result symbol (if we are in a proc) + nestedLoopCounter: int; // whether we are in a loop or not + nestedBlockCounter: int; // whether we are in a block or not + end; + PProcCon = ^TProcCon; + + PContext = ^TContext; + TContext = object(TPassContext) // a context represents a module + module: PSym; // the module sym belonging to the context + tab: TSymTab; // each module has its own symbol table + AmbigiousSymbols: TIntSet; // contains ids of all ambigious symbols (cannot + // store this info in the syms themselves!) + generics: PNode; // a list of the things to compile; list of + // nkExprEqExpr nodes which contain the generic + // symbol and the instantiated symbol + converters: TSymSeq; // sequence of converters + optionStack: TLinkedList; + libs: TLinkedList; // all libs used by this module + p: PProcCon; // procedure context + fromCache: bool; // is the module read from a cache? + semConstExpr: function (c: PContext; n: PNode): PNode; + // for the pragmas module + end; + +function newContext(module: PSym; const nimfile: string): PContext; +function newProcCon(owner: PSym): PProcCon; + +function lastOptionEntry(c: PContext): POptionEntry; +function newOptionEntry(): POptionEntry; + +procedure addConverter(c: PContext; conv: PSym); + +function newLib(kind: TLibKind): PLib; +procedure addToLib(lib: PLib; sym: PSym); + +function makePtrType(c: PContext; baseType: PType): PType; +function makeVarType(c: PContext; baseType: PType): PType; + +function newTypeS(const kind: TTypeKind; c: PContext): PType; +procedure fillTypeS(dest: PType; const kind: TTypeKind; c: PContext); +function makeRangeType(c: PContext; first, last: biggestInt; + const info: TLineInfo): PType; + +procedure illFormedAst(n: PNode); +function getSon(n: PNode; indx: int): PNode; +procedure checkSonsLen(n: PNode; len: int); +procedure checkMinSonsLen(n: PNode; len: int); + +// owner handling: +function getCurrOwner(): PSym; +procedure PushOwner(owner: PSym); +procedure PopOwner; + +implementation + +var + gOwners: array of PSym; // owner stack (used for initializing the + // owner field of syms) + // the documentation comment always gets + // assigned to the current owner + // BUGFIX: global array is needed! +{@emit gOwners := @[]; } + +function getCurrOwner(): PSym; +begin + result := gOwners[high(gOwners)]; +end; + +procedure PushOwner(owner: PSym); +var + len: int; +begin + len := length(gOwners); + setLength(gOwners, len+1); + gOwners[len] := owner; +end; + +procedure PopOwner; +var + len: int; +begin + len := length(gOwners); + if (len <= 0) then InternalError('popOwner'); + setLength(gOwners, len - 1); +end; + +function lastOptionEntry(c: PContext): POptionEntry; +begin + result := POptionEntry(c.optionStack.tail); +end; + +function newProcCon(owner: PSym): PProcCon; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.owner := owner; +end; + +function newOptionEntry(): POptionEntry; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.options := gOptions; + result.defaultCC := ccDefault; + result.dynlib := nil; + result.notes := gNotes; +end; + +function newContext(module: PSym; const nimfile: string): PContext; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + InitSymTab(result.tab); + IntSetInit(result.AmbigiousSymbols); + initLinkedList(result.optionStack); + initLinkedList(result.libs); + append(result.optionStack, newOptionEntry()); + result.module := module; + result.generics := newNode(nkStmtList); +{@emit result.converters := @[];} +end; + +procedure addConverter(c: PContext; conv: PSym); +var + i, L: int; +begin + L := length(c.converters); + for i := 0 to L-1 do + if c.converters[i].id = conv.id then exit; + setLength(c.converters, L+1); + c.converters[L] := conv; +end; + + +function newLib(kind: TLibKind): PLib; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.kind := kind; + //initObjectSet(result.syms) +end; + +procedure addToLib(lib: PLib; sym: PSym); +begin + //ObjectSetIncl(lib.syms, sym); + if sym.annex <> nil then liMessage(sym.info, errInvalidPragma); + sym.annex := lib +end; + +function makePtrType(c: PContext; baseType: PType): PType; +begin + if (baseType = nil) then InternalError('makePtrType'); + result := newTypeS(tyPtr, c); + addSon(result, baseType); +end; + +function makeVarType(c: PContext; baseType: PType): PType; +begin + if (baseType = nil) then InternalError('makeVarType'); + result := newTypeS(tyVar, c); + addSon(result, baseType); +end; + +function newTypeS(const kind: TTypeKind; c: PContext): PType; +begin + result := newType(kind, getCurrOwner()) +end; + +procedure fillTypeS(dest: PType; const kind: TTypeKind; c: PContext); +begin + dest.kind := kind; + dest.owner := getCurrOwner(); + dest.size := -1; +end; + +function makeRangeType(c: PContext; first, last: biggestInt; + const info: TLineInfo): PType; +var + n: PNode; +begin + n := newNodeI(nkRange, info); + addSon(n, newIntNode(nkIntLit, first)); + addSon(n, newIntNode(nkIntLit, last)); + result := newTypeS(tyRange, c); + result.n := n; + addSon(result, getSysType(tyInt)); // basetype of range +end; + +procedure illFormedAst(n: PNode); +begin + liMessage(n.info, errIllFormedAstX, renderTree(n, {@set}[renderNoComments])); +end; + +function getSon(n: PNode; indx: int): PNode; +begin + if (n <> nil) and (indx < sonsLen(n)) then result := n.sons[indx] + else begin illFormedAst(n); result := nil end; +end; + +procedure checkSonsLen(n: PNode; len: int); +begin + if (n = nil) or (sonsLen(n) <> len) then illFormedAst(n); +end; + +procedure checkMinSonsLen(n: PNode; len: int); +begin + if (n = nil) or (sonsLen(n) < len) then illFormedAst(n); +end; + +end. diff --git a/nim/semexprs.pas b/nim/semexprs.pas index 26e63c8457..2c5672f7fd 100644 --- a/nim/semexprs.pas +++ b/nim/semexprs.pas @@ -637,7 +637,7 @@ begin Consider:: const x = [] proc p(a: openarray[int], i: int) - proc q(a: sequence[char], c: char) + proc q(a: openarray[char], c: char) p(x, 0) q(x, '\0') diff --git a/nim/semfold.pas b/nim/semfold.pas index 9c27c3a162..fa2e976359 100644 --- a/nim/semfold.pas +++ b/nim/semfold.pas @@ -122,7 +122,7 @@ begin end; mZe8ToI, mZe8ToI64, mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64: begin // byte(-128) = 1...1..1000_0000'64 --> 0...0..1000_0000'64 - result := newIntNodeT(getInt(a) and (1 shl a.typ.size*8 - 1), n); + result := newIntNodeT(getInt(a) and (shlu(1, getSize(a.typ)*8) - 1), n); end; mToU8: result := newIntNodeT(getInt(a) and $ff, n); mToU16: result := newIntNodeT(getInt(a) and $ffff, n); @@ -142,8 +142,26 @@ begin if getInt(a) > getInt(b) then result := newIntNodeT(getInt(a), n) else result := newIntNodeT(getInt(b), n); end; - mShlI, mShlI64: result := newIntNodeT(getInt(a) shl getInt(b), n); - mShrI, mShrI64: result := newIntNodeT(getInt(a) shr getInt(b), n); + mShlI, mShlI64: begin + case skipGenericRange(n.typ).kind of + tyInt8: result := newIntNodeT(int8(getInt(a)) shl int8(getInt(b)), n); + tyInt16: result := newIntNodeT(int16(getInt(a)) shl int16(getInt(b)), n); + tyInt32: result := newIntNodeT(int32(getInt(a)) shl int32(getInt(b)), n); + tyInt64, tyInt: + result := newIntNodeT(shlu(getInt(a), getInt(b)), n); + else InternalError(n.info, 'constant folding for shl'); + end + end; + mShrI, mShrI64: begin + case skipGenericRange(n.typ).kind of + tyInt8: result := newIntNodeT(int8(getInt(a)) shr int8(getInt(b)), n); + tyInt16: result := newIntNodeT(int16(getInt(a)) shr int16(getInt(b)), n); + tyInt32: result := newIntNodeT(int32(getInt(a)) shr int32(getInt(b)), n); + tyInt64, tyInt: + result := newIntNodeT(shru(getInt(a), getInt(b)), n); + else InternalError(n.info, 'constant folding for shl'); + end + end; mDivI, mDivI64: result := newIntNodeT(getInt(a) div getInt(b), n); mModI, mModI64: result := newIntNodeT(getInt(a) mod getInt(b), n); @@ -380,7 +398,7 @@ begin result := nil // XXX: size computation for complex types // is still wrong else - result := newIntNodeT(a.typ.size, n); + result := newIntNodeT(getSize(a.typ), n); end; mLow: result := newIntNodeT(firstOrd(n.sons[1].typ), n); mHigh: begin diff --git a/nim/seminst.pas b/nim/seminst.pas new file mode 100644 index 0000000000..4c3d416d48 --- /dev/null +++ b/nim/seminst.pas @@ -0,0 +1,278 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// + +// This module does the instantiation of generic procs and types. + +function generateInstance(c: PContext; fn: PSym; const pt: TIdTable; + const instantiator: TLineInfo): PSym; forward; +// generates an instantiated proc + +type + TInstantiateClosure = object(NObject) + typeMap: TIdTable; // map PType to PType + symMap: TIdTable; // map PSym to PSym + fn: PSym; + module: PSym; + //newOwner: PSym; + instantiator: TLineInfo; + end; + PInstantiateClosure = ^TInstantiateClosure; + PInstClosure = PInstantiateClosure; + +function instantiateTree(c: PInstantiateClosure; t: PNode): PNode; forward; +function instantiateSym(c: PInstantiateClosure; sym: PSym): PSym; forward; +function instantiateType(c: PInstantiateClosure; typ: PType): PType; forward; + +function containsGenericTypeIter(t: PType; closure: PObject): bool; +begin + result := t.kind in GenericTypes; +end; + +function containsGenericType(t: PType): bool; +begin + result := iterOverType(t, containsGenericTypeIter, nil); +end; + +function instTypeNode(c: PInstantiateClosure; n: PNode): PNode; +var + i: int; +begin + result := nil; + if n <> nil then begin + result := copyNode(n); + result.typ := instantiateType(c, n.typ); + case n.kind of + nkNone..nkNilLit: begin // a leaf + end; + else begin + for i := 0 to sonsLen(n)-1 do + addSon(result, instTypeNode(c, n.sons[i])); + end + end + end +end; + +function instantiateType(c: PInstantiateClosure; typ: PType): PType; +var + i: int; +begin + result := PType(idTableGet(c.typeMap, typ)); + if result <> nil then exit; + //if typ.kind = tyOpenArray then + // liMessage(c.instantiator, warnUser, 'instantiating type for: openarray'); + if containsGenericType(typ) then begin + result := copyType(typ, typ.owner, false); + idTablePut(c.typeMap, typ, result); // to avoid cycles + for i := 0 to sonsLen(result)-1 do + result.sons[i] := instantiateType(c, result.sons[i]); + if result.n <> nil then + result.n := instTypeNode(c, result.n); + end + else + result := typ; + if result.Kind in GenericTypes then begin + liMessage(c.instantiator, errCannotInstantiateX, + TypeToString(typ, preferName)); + end + else if result.kind = tyVar then begin + if result.sons[0].kind = tyVar then + liMessage(c.instantiator, errVarVarTypeNotAllowed); + end; +end; + +function instantiateSym(c: PInstantiateClosure; sym: PSym): PSym; +begin + if sym = nil then begin result := nil; exit end; // BUGFIX + result := PSym(idTableGet(c.symMap, sym)); + if (result = nil) then begin + if (sym.owner.id = c.fn.id) then begin // XXX: nested generics? + result := copySym(sym, false); + include(result.flags, sfFromGeneric); + idTablePut(c.symMap, sym, result); // BUGFIX + result.typ := instantiateType(c, sym.typ); + if (result.owner <> nil) and (result.owner.kind = skModule) then + result.owner := c.module // BUGFIX + else + result.owner := instantiateSym(c, result.owner); + if sym.ast <> nil then begin + result.ast := instantiateTree(c, sym.ast); + end + end + else + result := sym // do not copy t! + end +end; + +function instantiateTree(c: PInstantiateClosure; t: PNode): PNode; +var + len, i: int; +begin + if t = nil then begin result := nil; exit end; + result := copyNode(t); + if result.typ <> nil then result.typ := instantiateType(c, result.typ); + case t.kind of + nkNone..pred(nkSym), succ(nkSym)..nkNilLit: begin end; + nkSym: begin + if result.sym <> nil then result.sym := instantiateSym(c, result.sym); + end + else begin + len := sonsLen(t); + if len > 0 then begin + newSons(result, len); + for i := 0 to len-1 do + result.sons[i] := instantiateTree(c, t.sons[i]); + end + end + end +end; + +procedure instantiateGenericParamList(c: PContext; n: PNode; + const pt: TIdTable); +var + i: int; + s, q: PSym; + t: PType; +begin + if (n.kind <> nkGenericParams) then + InternalError(n.info, 'instantiateGenericParamList'); + for i := 0 to sonsLen(n)-1 do begin + if n.sons[i].kind = nkDefaultTypeParam then begin + internalError(n.sons[i].info, + 'instantiateGenericParamList() to implement'); + // XXX + end; + if (n.sons[i].kind <> nkSym) then + InternalError(n.info, 'instantiateGenericParamList'); + q := n.sons[i].sym; + s := newSym(skType, q.name, getCurrOwner()); + t := PType(IdTableGet(pt, q.typ)); + if t = nil then + liMessage(n.sons[i].info, errCannotInstantiateX, s.name.s); + if (t.kind = tyGenericParam) then + InternalError(n.info, 'instantiateGenericParamList'); + s.typ := t; + addDecl(c, s); + end +end; + +function GenericCacheGet(c: PContext; genericSym, instSym: PSym): PSym; +var + i: int; + a, b: PSym; +begin + result := nil; + for i := 0 to sonsLen(c.generics)-1 do begin + if c.generics.sons[i].kind <> nkExprEqExpr then + InternalError(genericSym.info, 'GenericCacheGet'); + a := c.generics.sons[i].sons[0].sym; + if genericSym.id = a.id then begin + b := c.generics.sons[i].sons[1].sym; + if equalParams(b.typ.n, instSym.typ.n) = paramsEqual then begin + //if gVerbosity > 0 then + // MessageOut('found in cache: ' + getProcHeader(instSym)); + result := b; exit + end + end + end +end; + +procedure GenericCacheAdd(c: PContext; genericSym, instSym: PSym); +var + n: PNode; +begin + n := newNode(nkExprEqExpr); + addSon(n, newSymNode(genericSym)); + addSon(n, newSymNode(instSym)); + addSon(c.generics, n); +end; + +procedure semParamList(c: PContext; n: PNode; s: PSym); forward; +procedure addParams(c: PContext; n: PNode); forward; +procedure addResult(c: PContext; t: PType; const info: TLineInfo); forward; +procedure addResultNode(c: PContext; n: PNode); forward; + +function generateInstance(c: PContext; fn: PSym; const pt: TIdTable; + const instantiator: TLineInfo): PSym; +// generates an instantiated proc +var + oldPrc: PSym; + oldP: PProcCon; + n: PNode; +begin + oldP := c.p; // restore later + result := copySym(fn, false); + include(result.flags, sfFromGeneric); + //include(fn.flags, sfFromGeneric); + result.owner := getCurrOwner().owner; + //idTablePut(c.mapping, fn, result); + n := copyTree(fn.ast); + result.ast := n; + pushOwner(result); + openScope(c.tab); + if (n.sons[genericParamsPos] = nil) then + InternalError(n.info, 'generateInstance'); + n.sons[namePos] := newSymNode(result); + pushInfoContext(instantiator); + + instantiateGenericParamList(c, n.sons[genericParamsPos], pt); + n.sons[genericParamsPos] := nil; + // semantic checking for the parameters: + if n.sons[paramsPos] <> nil then begin + semParamList(c, n.sons[ParamsPos], result); + addParams(c, result.typ.n); + end + else begin + result.typ := newTypeS(tyProc, c); + addSon(result.typ, nil); + end; + + // now check if we have already such a proc generated + oldPrc := GenericCacheGet(c, fn, result); + if oldPrc = nil then begin + // add it here, so that recursive generic procs are possible: + addDecl(c, result); + if n.sons[codePos] <> nil then begin + c.p := newProcCon(result); + if result.kind in [skProc, skConverter] then begin + addResult(c, result.typ.sons[0], n.info); + addResultNode(c, n); + end; + n.sons[codePos] := semStmtScope(c, n.sons[codePos]); + end; + GenericCacheAdd(c, fn, result); + end + else + result := oldPrc; + popInfoContext(); + closeScope(c.tab); // close scope for parameters + popOwner(); + c.p := oldP; // restore +end; + +function generateTypeInstance(p: PContext; const pt: TIdTable; + const instantiator: TLineInfo; t: PType): PType; +var + c: PInstantiateClosure; +begin + new(c); +{@ignore} + fillChar(c^, sizeof(c^), 0); +{@emit} + copyIdTable(c.typeMap, pt); + InitIdTable(c.symMap); + c.fn := nil; + c.instantiator := instantiator; + c.module := p.module; + result := instantiateType(c, t); +end; + +function partialSpecialization(c: PContext; n: PNode; s: PSym): PNode; +begin + result := n; +end; diff --git a/nim/semtypes.pas b/nim/semtypes.pas index 00cb019f82..5d9bd626a0 100644 --- a/nim/semtypes.pas +++ b/nim/semtypes.pas @@ -157,7 +157,7 @@ begin liMessage(n.info, errOrdinalTypeExpected); if enumHasWholes(a.typ) then liMessage(n.info, errEnumXHasWholes, a.typ.sym.name.s); - if not leValue(a, b) then + if not leValue(a, b) then liMessage(n.Info, errRangeIsEmpty); addSon(result.n, a); addSon(result.n, b); diff --git a/nim/sigmatch.pas b/nim/sigmatch.pas index 96001ed908..741052f054 100644 --- a/nim/sigmatch.pas +++ b/nim/sigmatch.pas @@ -570,9 +570,10 @@ begin result := copyTree(arg); result.typ := getInstantiatedType(c, arg, m, f); // BUG: f may not be the right key! - if (skipVarGeneric(f).kind in [tyTuple, tyOpenArray]) then + if (skipVarGeneric(result.typ).kind in [tyTuple, tyOpenArray]) then // BUGFIX: must pass length implicitely result := implicitConv(nkHiddenStdConv, f, copyTree(arg), m, c); + // BUGFIX: use ``result.typ`` and not `f` here end; isEqual: begin inc(m.exactMatches); diff --git a/nim/transf.pas b/nim/transf.pas index fb59eeef26..d74f2aa836 100644 --- a/nim/transf.pas +++ b/nim/transf.pas @@ -69,9 +69,15 @@ end; // ------------ helpers ----------------------------------------------------- +function getCurrOwner(c: PTransf): PSym; +begin + if c.transCon <> nil then result := c.transCon.owner + else result := c.module; +end; + function newTemp(c: PTransf; typ: PType; const info: TLineInfo): PSym; begin - result := newSym(skTemp, getIdent(genPrefix), getCurrOwner()); + result := newSym(skTemp, getIdent(genPrefix), getCurrOwner(c)); result.info := info; result.typ := skipGeneric(typ); include(result.flags, sfFromGeneric); @@ -195,7 +201,7 @@ begin for i := 0 to sonsLen(n)-1 do result.sons[i] := transform(c, n.sons[i]); counter := 0; - labl := newSym(skLabel, nil, getCurrOwner()); + labl := newSym(skLabel, nil, getCurrOwner(c)); labl.name := getIdent(genPrefix +{&} ToString(labl.id)); labl.info := result.info; transformContinueAux(c, result, labl, counter); @@ -270,7 +276,7 @@ begin include(newVar.flags, sfFromGeneric); // fixes a strange bug for rodgen: //include(it.sons[0].sym.flags, sfFromGeneric); - newVar.owner := getCurrOwner(); + newVar.owner := getCurrOwner(c); IdNodeTablePut(c.transCon.mapping, it.sons[0].sym, newSymNode(newVar)); it.sons[0] := newSymNode(newVar); it.sons[2] := transform(c, it.sons[2]); @@ -460,7 +466,9 @@ begin // generate a temporary and produce an assignment statement: temp := newTemp(c, formal.typ, formal.info); addVar(v, newSymNode(temp)); - addSon(result, newAsgnStmt(c, newSymNode(temp), copyTree(call.sons[i]))); + // BUGFIX: do not copy call.sons[i], but transform it! + addSon(result, newAsgnStmt(c, newSymNode(temp), + transform(c, call.sons[i]))); IdNodeTablePut(newC.mapping, formal, newSymNode(temp)); // BUGFIX end end; diff --git a/nim/types.pas b/nim/types.pas index bc42f21695..0686a368f8 100644 --- a/nim/types.pas +++ b/nim/types.pas @@ -930,7 +930,7 @@ end; function align(address, alignment: biggestInt): biggestInt; begin - result := address + (alignment-1) and not (alignment-1); + result := (address + (alignment-1)) and not (alignment-1); end; // we compute the size of types lazily: @@ -951,6 +951,7 @@ begin case n.sons[i].kind of nkOfBranch, nkElse: begin res := computeRecSizeAux(lastSon(n.sons[i]), b, currOffset); + if res < 0 then begin result := res; exit end; maxSize := max(maxSize, res); maxAlign := max(maxAlign, b); end; @@ -966,6 +967,7 @@ begin maxAlign := 1; for i := 0 to sonsLen(n)-1 do begin res := computeRecSizeAux(n.sons[i], b, currOffset); + if res < 0 then begin result := res; exit end; currOffset := align(currOffset, b) + res; result := align(result, b) + res; if b > maxAlign then maxAlign := b; @@ -1024,9 +1026,9 @@ begin result := 4 // use signed int32 else begin len := lastOrd(typ); // BUGFIX: use lastOrd! - if len+1 < 1 shl 8 then result := 1 - else if len+1 < 1 shl 16 then result := 2 - else if len+1 < 1 shl 32 then result := 4 + if len+1 < shlu(1, 8) then result := 1 + else if len+1 < shlu(1, 16) then result := 2 + else if len+1 < shlu(biggestInt(1), 32) then result := 4 else result := 8; end; a := result; @@ -1047,6 +1049,7 @@ begin maxAlign := 1; for i := 0 to sonsLen(typ)-1 do begin res := computeSizeAux(typ.sons[i], a); + if res < 0 then begin result := res; exit end; maxAlign := max(maxAlign, a); result := align(result, a) + res; end; @@ -1056,6 +1059,7 @@ begin tyObject: begin if typ.sons[0] <> nil then begin result := computeSizeAux(typ.sons[0], a); + if result < 0 then exit; maxAlign := a end else if typ.kind = tyObject then begin @@ -1066,6 +1070,7 @@ begin end; currOffset := result; result := computeRecSizeAux(typ.n, a, currOffset); + if result < 0 then exit; if a < maxAlign then a := maxAlign; result := align(result, a); end; @@ -1097,4 +1102,3 @@ begin end; end. - diff --git a/objdata.txt b/objdata.txt new file mode 100644 index 0000000000..653ae59311 --- /dev/null +++ b/objdata.txt @@ -0,0 +1,8 @@ +nodes: 2224942 +syms: 39562 +Types: 28189 + +nodes: 2224942 +syms: 39562 +Types: 29054 +Ropes: 1245961 diff --git a/rod/nimrod.cfg b/rod/nimrod.cfg new file mode 100644 index 0000000000..51a9dc52d1 --- /dev/null +++ b/rod/nimrod.cfg @@ -0,0 +1,11 @@ +# Special configuration file for the Nimrod project + +--hint[XDeclaredButNotUsed]=off + +@if llvm_gcc or gcc: + # GCC, LLVM and Visual C++ have a problem to optimize some modules. + # This is really strange. + cgen.speed = "-O1 -fno-strict-aliasing" +@elif vcc: + cgen.speed = "" +@end diff --git a/rod/nimrod.dot b/rod/nimrod.dot new file mode 100644 index 0000000000..8f77bb60db --- /dev/null +++ b/rod/nimrod.dot @@ -0,0 +1,532 @@ +digraph nimrod { +times -> strutils; +os -> strutils; +os -> times; +hashes -> strutils; +strtabs -> os; +strtabs -> hashes; +strtabs -> strutils; +options -> os; +options -> lists; +options -> strutils; +options -> strtabs; +msgs -> options; +msgs -> strutils; +msgs -> os; +nversion -> strutils; +crc -> strutils; +platform -> strutils; +ropes -> msgs; +ropes -> strutils; +ropes -> platform; +ropes -> hashes; +ropes -> crc; +idents -> hashes; +idents -> strutils; +ast -> msgs; +ast -> hashes; +ast -> nversion; +ast -> options; +ast -> strutils; +ast -> crc; +ast -> ropes; +ast -> idents; +ast -> lists; +astalgo -> ast; +astalgo -> hashes; +astalgo -> strutils; +astalgo -> options; +astalgo -> msgs; +astalgo -> ropes; +astalgo -> idents; +condsyms -> ast; +condsyms -> astalgo; +condsyms -> msgs; +condsyms -> hashes; +condsyms -> platform; +condsyms -> strutils; +condsyms -> idents; +extccomp -> lists; +extccomp -> ropes; +extccomp -> os; +extccomp -> strutils; +extccomp -> platform; +extccomp -> condsyms; +extccomp -> options; +extccomp -> msgs; +wordrecg -> hashes; +wordrecg -> strutils; +wordrecg -> idents; +commands -> os; +commands -> msgs; +commands -> options; +commands -> nversion; +commands -> condsyms; +commands -> strutils; +commands -> extccomp; +commands -> platform; +commands -> lists; +commands -> wordrecg; +llstream -> strutils; +lexbase -> llstream; +lexbase -> strutils; +scanner -> hashes; +scanner -> options; +scanner -> msgs; +scanner -> strutils; +scanner -> platform; +scanner -> idents; +scanner -> lexbase; +scanner -> llstream; +scanner -> wordrecg; +nimconf -> llstream; +nimconf -> nversion; +nimconf -> commands; +nimconf -> os; +nimconf -> strutils; +nimconf -> msgs; +nimconf -> platform; +nimconf -> condsyms; +nimconf -> scanner; +nimconf -> options; +nimconf -> idents; +nimconf -> wordrecg; +pnimsyn -> llstream; +pnimsyn -> scanner; +pnimsyn -> idents; +pnimsyn -> strutils; +pnimsyn -> ast; +pnimsyn -> msgs; +rnimsyn -> lexbase; +rnimsyn -> scanner; +rnimsyn -> options; +rnimsyn -> idents; +rnimsyn -> strutils; +rnimsyn -> ast; +rnimsyn -> msgs; +rnimsyn -> lists; +paslex -> hashes; +paslex -> options; +paslex -> msgs; +paslex -> strutils; +paslex -> platform; +paslex -> idents; +paslex -> lexbase; +paslex -> wordrecg; +paslex -> scanner; +pasparse -> os; +pasparse -> llstream; +pasparse -> scanner; +pasparse -> paslex; +pasparse -> idents; +pasparse -> wordrecg; +pasparse -> strutils; +pasparse -> ast; +pasparse -> astalgo; +pasparse -> msgs; +pasparse -> options; +rodread -> os; +rodread -> options; +rodread -> strutils; +rodread -> nversion; +rodread -> ast; +rodread -> astalgo; +rodread -> msgs; +rodread -> platform; +rodread -> condsyms; +rodread -> ropes; +rodread -> idents; +rodread -> crc; +trees -> ast; +trees -> astalgo; +trees -> scanner; +trees -> msgs; +trees -> strutils; +types -> ast; +types -> astalgo; +types -> trees; +types -> msgs; +types -> strutils; +types -> platform; +magicsys -> ast; +magicsys -> astalgo; +magicsys -> hashes; +magicsys -> msgs; +magicsys -> platform; +magicsys -> nversion; +magicsys -> times; +magicsys -> idents; +magicsys -> rodread; +nimsets -> ast; +nimsets -> astalgo; +nimsets -> trees; +nimsets -> nversion; +nimsets -> msgs; +nimsets -> platform; +nimsets -> bitsets; +nimsets -> types; +nimsets -> rnimsyn; +passes -> strutils; +passes -> lists; +passes -> options; +passes -> ast; +passes -> astalgo; +passes -> llstream; +passes -> msgs; +passes -> platform; +passes -> os; +passes -> condsyms; +passes -> idents; +passes -> rnimsyn; +passes -> types; +passes -> extccomp; +passes -> math; +passes -> magicsys; +passes -> nversion; +passes -> nimsets; +passes -> pnimsyn; +passes -> times; +passes -> rodread; +treetab -> hashes; +treetab -> ast; +treetab -> astalgo; +treetab -> types; +semdata -> strutils; +semdata -> lists; +semdata -> options; +semdata -> scanner; +semdata -> ast; +semdata -> astalgo; +semdata -> trees; +semdata -> treetab; +semdata -> wordrecg; +semdata -> ropes; +semdata -> msgs; +semdata -> platform; +semdata -> os; +semdata -> condsyms; +semdata -> idents; +semdata -> rnimsyn; +semdata -> types; +semdata -> extccomp; +semdata -> math; +semdata -> magicsys; +semdata -> nversion; +semdata -> nimsets; +semdata -> pnimsyn; +semdata -> times; +semdata -> passes; +semdata -> rodread; +lookups -> ast; +lookups -> astalgo; +lookups -> idents; +lookups -> semdata; +lookups -> types; +lookups -> msgs; +lookups -> options; +lookups -> rodread; +lookups -> rnimsyn; +importer -> strutils; +importer -> os; +importer -> ast; +importer -> astalgo; +importer -> msgs; +importer -> options; +importer -> idents; +importer -> rodread; +importer -> lookups; +importer -> semdata; +importer -> passes; +rodwrite -> os; +rodwrite -> options; +rodwrite -> strutils; +rodwrite -> nversion; +rodwrite -> ast; +rodwrite -> astalgo; +rodwrite -> msgs; +rodwrite -> platform; +rodwrite -> condsyms; +rodwrite -> ropes; +rodwrite -> idents; +rodwrite -> crc; +rodwrite -> rodread; +rodwrite -> passes; +rodwrite -> importer; +semfold -> strutils; +semfold -> lists; +semfold -> options; +semfold -> ast; +semfold -> astalgo; +semfold -> trees; +semfold -> treetab; +semfold -> nimsets; +semfold -> times; +semfold -> nversion; +semfold -> platform; +semfold -> math; +semfold -> msgs; +semfold -> os; +semfold -> condsyms; +semfold -> idents; +semfold -> rnimsyn; +semfold -> types; +evals -> strutils; +evals -> magicsys; +evals -> lists; +evals -> options; +evals -> ast; +evals -> astalgo; +evals -> trees; +evals -> treetab; +evals -> nimsets; +evals -> msgs; +evals -> os; +evals -> condsyms; +evals -> idents; +evals -> rnimsyn; +evals -> types; +evals -> passes; +evals -> semfold; +procfind -> ast; +procfind -> astalgo; +procfind -> msgs; +procfind -> semdata; +procfind -> types; +pragmas -> os; +pragmas -> platform; +pragmas -> condsyms; +pragmas -> ast; +pragmas -> astalgo; +pragmas -> idents; +pragmas -> semdata; +pragmas -> msgs; +pragmas -> rnimsyn; +pragmas -> wordrecg; +pragmas -> ropes; +pragmas -> options; +pragmas -> strutils; +pragmas -> lists; +pragmas -> extccomp; +pragmas -> math; +pragmas -> magicsys; +sem -> strutils; +sem -> lists; +sem -> options; +sem -> scanner; +sem -> ast; +sem -> astalgo; +sem -> trees; +sem -> treetab; +sem -> wordrecg; +sem -> ropes; +sem -> msgs; +sem -> os; +sem -> condsyms; +sem -> idents; +sem -> rnimsyn; +sem -> types; +sem -> platform; +sem -> math; +sem -> magicsys; +sem -> pnimsyn; +sem -> nversion; +sem -> nimsets; +sem -> semdata; +sem -> evals; +sem -> semfold; +sem -> importer; +sem -> procfind; +sem -> lookups; +sem -> rodread; +sem -> pragmas; +sem -> passes; +rst -> os; +rst -> msgs; +rst -> strutils; +rst -> platform; +rst -> hashes; +rst -> ropes; +rst -> options; +highlite -> hashes; +highlite -> options; +highlite -> msgs; +highlite -> strutils; +highlite -> platform; +highlite -> idents; +highlite -> lexbase; +highlite -> wordrecg; +highlite -> scanner; +docgen -> ast; +docgen -> astalgo; +docgen -> strutils; +docgen -> hashes; +docgen -> options; +docgen -> nversion; +docgen -> msgs; +docgen -> os; +docgen -> ropes; +docgen -> idents; +docgen -> wordrecg; +docgen -> math; +docgen -> pnimsyn; +docgen -> rnimsyn; +docgen -> scanner; +docgen -> rst; +docgen -> times; +docgen -> highlite; +ccgutils -> ast; +ccgutils -> astalgo; +ccgutils -> ropes; +ccgutils -> lists; +ccgutils -> hashes; +ccgutils -> strutils; +ccgutils -> types; +ccgutils -> msgs; +cgen -> ast; +cgen -> astalgo; +cgen -> strutils; +cgen -> hashes; +cgen -> trees; +cgen -> platform; +cgen -> magicsys; +cgen -> extccomp; +cgen -> options; +cgen -> nversion; +cgen -> nimsets; +cgen -> msgs; +cgen -> crc; +cgen -> bitsets; +cgen -> idents; +cgen -> lists; +cgen -> types; +cgen -> ccgutils; +cgen -> os; +cgen -> times; +cgen -> ropes; +cgen -> math; +cgen -> passes; +cgen -> rodread; +cgen -> wordrecg; +cgen -> rnimsyn; +cgen -> treetab; +ecmasgen -> ast; +ecmasgen -> astalgo; +ecmasgen -> strutils; +ecmasgen -> hashes; +ecmasgen -> trees; +ecmasgen -> platform; +ecmasgen -> magicsys; +ecmasgen -> extccomp; +ecmasgen -> options; +ecmasgen -> nversion; +ecmasgen -> nimsets; +ecmasgen -> msgs; +ecmasgen -> crc; +ecmasgen -> bitsets; +ecmasgen -> idents; +ecmasgen -> lists; +ecmasgen -> types; +ecmasgen -> os; +ecmasgen -> times; +ecmasgen -> ropes; +ecmasgen -> math; +ecmasgen -> passes; +ecmasgen -> ccgutils; +ecmasgen -> wordrecg; +ecmasgen -> rnimsyn; +ecmasgen -> rodread; +ptmplsyn -> llstream; +ptmplsyn -> os; +ptmplsyn -> wordrecg; +ptmplsyn -> strutils; +ptmplsyn -> ast; +ptmplsyn -> astalgo; +ptmplsyn -> msgs; +ptmplsyn -> options; +ptmplsyn -> pnimsyn; +interact -> llstream; +interact -> strutils; +interact -> ropes; +interact -> strtabs; +interact -> msgs; +passaux -> strutils; +passaux -> ast; +passaux -> passes; +passaux -> msgs; +passaux -> options; +depends -> os; +depends -> options; +depends -> ast; +depends -> astalgo; +depends -> msgs; +depends -> ropes; +depends -> idents; +depends -> passes; +depends -> importer; +transf -> strutils; +transf -> lists; +transf -> options; +transf -> ast; +transf -> astalgo; +transf -> trees; +transf -> treetab; +transf -> msgs; +transf -> os; +transf -> idents; +transf -> rnimsyn; +transf -> types; +transf -> passes; +transf -> semfold; +main -> llstream; +main -> strutils; +main -> ast; +main -> astalgo; +main -> scanner; +main -> pnimsyn; +main -> rnimsyn; +main -> options; +main -> msgs; +main -> os; +main -> lists; +main -> condsyms; +main -> paslex; +main -> pasparse; +main -> rodread; +main -> rodwrite; +main -> ropes; +main -> trees; +main -> wordrecg; +main -> sem; +main -> semdata; +main -> idents; +main -> passes; +main -> docgen; +main -> extccomp; +main -> cgen; +main -> ecmasgen; +main -> platform; +main -> ptmplsyn; +main -> interact; +main -> nimconf; +main -> importer; +main -> passaux; +main -> depends; +main -> transf; +main -> evals; +parseopt -> os; +parseopt -> strutils; +nimrod -> commands; +nimrod -> scanner; +nimrod -> condsyms; +nimrod -> options; +nimrod -> msgs; +nimrod -> nversion; +nimrod -> nimconf; +nimrod -> ropes; +nimrod -> extccomp; +nimrod -> strutils; +nimrod -> os; +nimrod -> platform; +nimrod -> main; +nimrod -> parseopt; +} diff --git a/rod/nimrod.ini b/rod/nimrod.ini new file mode 100644 index 0000000000..3d0852f3b8 --- /dev/null +++ b/rod/nimrod.ini @@ -0,0 +1,90 @@ +[Project] +Name: "Nimrod" +Version: "$version" +OS: "linux;macosx;freebsd;netbsd;openbsd;solaris;aix" +CPU: "i386;amd64;sparc;powerpc" +Authors: "Andreas Rumpf" +Description: """This is the Nimrod Compiler. Nimrod is a new statically typed, +imperative programming language, that supports procedural, functional, object +oriented and generic programming styles while remaining simple and efficient. +A special feature that Nimrod inherited from Lisp is that Nimrod's abstract +syntax tree (AST) is part of the specification - this allows a powerful macro +system which can be used to create domain specific languages. + +Nimrod is a compiled, garbage-collected systems programming language +which has an excellent productivity/performance ratio. Nimrod's design +focuses on the 3E: efficiency, expressiveness, elegance (in the order of +priority).""" + +App: Console +License: "copying.txt" + +[InstallScript] +[UninstallScript] + +[Common] +Files: "readme.txt;install.txt" +Files: "configure;makefile" +Files: "*.html" +Files: "*.py" +Files: "*.ini" + +Files: "lib/nimbase.h;lib/cycle.h;lib/tlsf.h;lib/target.h;lib/dlmalloc.h" +Files: "lib/tlsf.c;lib/dlmalloc.c" +Files: "lib/*.nim" + +Files: "rod/readme.txt" +Files: "rod/nimrod.ini" +Files: "rod/nimrod.cfg" +Files: "build/empty.txt" +Files: "bin/empty.txt" +Files: "nim/*.*" + +Files: "data/*.yml" +Files: "data/*.txt" +Files: "obj/*.txt" +Files: "diff/*.txt" + +Files: "config/nimdoc.cfg" +Files: "config/nimrod.cfg" + +Files: "doc/*.txt" +Files: "doc/*.html" +Files: "doc/*.cfg" + +Files: "tests/*.nim" +Files: "tests/*.html" +Files: "tests/*.txt" +Files: "tests/*.cfg" +Files: "tests/*.tmpl" +Files: "tests/gtk/*.nim" + +Files: "lib/base/*.c" +Files: "lib/base/*.nim" +Files: "lib/base/gtk/*.nim" +Files: "lib/base/cairo/*.nim" +Files: "lib/base/x11/*.nim" +Files: "lib/base/zip/*.nim" +Files: "lib/base/zip/libzip_all.c" +Files: "lib/windows/*.nim" +Files: "lib/posix/*.nim" +Files: "lib/ecmas/*.nim" +Files: "lib/base/sdl/*.nim" +Files: "lib/base/opengl/*.nim" +Files: "lib/base/lua/*.nim" + +[Windows] +Files: "bin/nimrod.exe" +Files: "dist/llvm-gcc4.2" +BinPath: r"bin;dist\llvm-gcc4.2\bin" + +[Unix] + + +[InnoSetup] +path = r"c:\programme\innosetup5\iscc.exe" +flags = "/Q" + +[C_Compiler] +path = r"" +flags = "-w" diff --git a/tests/cairotest.nim b/tests/cairotest.nim new file mode 100644 index 0000000000..2c28e1abff --- /dev/null +++ b/tests/cairotest.nim @@ -0,0 +1,14 @@ +import cairo + +var surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 240, 80) +var cr = cairo_create(surface) + +cairo_select_font_face(cr, "serif", CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_BOLD) +cairo_set_font_size(cr, 32.0) +cairo_set_source_rgb(cr, 0.0, 0.0, 1.0) +cairo_move_to(cr, 10.0, 50.0) +cairo_show_text(cr, "Hello, world") +cairo_destroy(cr) +discard cairo_surface_write_to_png(surface, "hello.png") +cairo_surface_destroy(surface) diff --git a/tests/cgitest.nim b/tests/cgitest.nim new file mode 100644 index 0000000000..ef115c80b0 --- /dev/null +++ b/tests/cgitest.nim @@ -0,0 +1,15 @@ +# Test the new CGI module +import strtabs, cgi + + +#setTestData("name", "the andreas", "password", "rumpf\t\ttab") + +var myData = readData() +validateData(myData, "name", "password") +writeContentType() + +write(stdout, "\n") +write(stdout, "Test\n") +writeln(stdout, "name: " & myData["name"]) +writeln(stdout, "password: " & myData["password"]) +writeln(stdout, "") diff --git a/tests/stckovfl.nim b/tests/stckovfl.nim new file mode 100644 index 0000000000..799fe0001c --- /dev/null +++ b/tests/stckovfl.nim @@ -0,0 +1,8 @@ +# To test stack overflow message + +proc over(a: int): int = + if a == high(int): return + result = over(a+1)+5 + +Echo($over(0)) + diff --git a/tests/sunset.tmpl b/tests/sunset.tmpl new file mode 100644 index 0000000000..08fa50f563 --- /dev/null +++ b/tests/sunset.tmpl @@ -0,0 +1,67 @@ +#proc sunsetTemplate*(current, ticker, content: string, +# tabs: openarray[array[0..1, string]]): string = +# result = "" + + + + + Nimrod Programming System + + + + + +
    + + +
    + +
    +
    +
    +

    latest news

    +
    +
    + $ticker +
    +
    +
    +
    +

    additional links

    +
    + +
    +
    +
    + $content +
    +
    + +
    + + diff --git a/tests/tambsym2.nim b/tests/tambsym2.nim new file mode 100644 index 0000000000..9178182aaa --- /dev/null +++ b/tests/tambsym2.nim @@ -0,0 +1,18 @@ +# Test overloading of procs with locals + +type + TMyType = object + len: int + data: string + +proc len(x: TMyType): int {.inline.} = return x.len + +proc x(s: TMyType, len: int) = + writeln(stdout, len(s)) + +var + m: TMyType +m.len = 7 +m.data = "1234" + +x(m, 5) #OUT 7 diff --git a/tests/tambsym3.nim b/tests/tambsym3.nim new file mode 100644 index 0000000000..5d0a5f6b2a --- /dev/null +++ b/tests/tambsym3.nim @@ -0,0 +1,8 @@ +# Test ambigious symbols + +import mambsym1, times + +var + v = mDec #ERROR_MSG ambigious identifier + +writeln(stdout, ord(v)) diff --git a/tests/tester.nim b/tests/tester.nim new file mode 100644 index 0000000000..fc75754d5e --- /dev/null +++ b/tests/tester.nim @@ -0,0 +1,161 @@ +# +# +# Nimrod Tester +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This program verifies Nimrod against the testcases. +## The testcases may contain the directives '#ERROR' or '#ERROR_IN'. +## '#ERROR' is used to indicate that the compiler should report +## an error in the marked line (the line that contains the '#ERROR' +## directive.) +## The format for '#ERROR_IN' is: +## #ERROR_IN filename linenumber +## One can omit the extension of the filename ('.nim' is then assumed). +## Tests which contain none of the two directives should compile. Thus they +## are executed after successful compilation and their output is verified +## against the results specified with the '#OUT' directive. +## (Tests which require user interaction are not possible.) +## Tests can have an #ERROR_MSG directive specifiying the error message +## Nimrod shall produce. + +import + strutils, regexprs, os, osproc, streams + +const + cmdTemplate = r"nimrod cc --hints:on $options $filename" + +type + TSpec = object of TObject ## specification object + line: int ## line number where compiler should throw an error + file: string ## file where compiler should throw an error + err: bool ## true if the specification says there should be an error + outp: string ## output that should be produced + puremsg: string ## pure message of compiler + +proc myExec(cmd: string): string = + #echo("Executing: " & cmd) + result = osproc.executeProcess(cmd) + #echo("Received: " & result) + +proc parseTest(filename: string): TSpec = + var i = 0 # the line counter + var matches: array [0..2, string] + result.outp = "" + result.puremsg = "" + result.file = filename + for s in lines(filename): + inc(i) + if find(s, r"\#OUT\s*(.*)", matches): + result.outp = matches[1] + break + if find(s, r"\#ERROR_IN\s*(\S*)\s*(\d+)", matches): + result.file = matches[1] + result.line = parseInt(matches[2]) + result.err = true + break + if find(s, r"\#ERROR_MSG\s*(.*)", matches): + result.line = i + result.outp = matches[1] + result.err = True + break + if find(s, r"\#ERROR$", matches): + result.line = i + result.err = true + break + +proc callCompiler(filename, options: string): TSpec = + var c = parseCmdLine(cmdTemplate % ["filename", filename, "options", options]) + var a: seq[string] = @[] # slicing is not yet implemented :-( + for i in 1 .. c.len-1: add(a, c[i]) + var p = startProcess(command=c[0], args=a, + options={poStdErrToStdOut, poUseShell}) + var outp = p.outputStream + while running(p) or not outp.atEnd(outp): + var s = outp.readLine() + var matches: array [0..3, string] + result.outp = "" + result.puremsg = "" + result.file = "" + result.err = true + if match(s, r"(.*)\((\d+), \d+\) Error\: (.*)", matches): + result.file = matches[1] + result.line = parseInt(matches[2]) + result.outp = matches[0] + result.puremsg = matches[3] + break + elif match(s, r"Error\: (.*)", matches): + result.puremsg = matches[1] + result.outp = matches[0] + result.line = 1 + break + elif match(s, r"Hint\: operation successful", matches): + result.outp = matches[0] + result.err = false + break + +proc cmpResults(filename: string, spec, comp: TSpec): bool = + # short filename for messages (better readability): + var shortfile = os.extractFilename(filename) + + if comp.err and comp.outp == "": + # the compiler did not say "[Error]" nor "operation sucessful" + Echo("[Tester] $1 -- FAILED; COMPILER BROKEN" % shortfile) + elif spec.err != comp.err: + Echo(("[Tester] $1 -- FAILED\n" & + "Compiler says: $2\n" & + "But specification says: $3") % + [shortfile, comp.outp, spec.outp]) + elif spec.err: + if extractFilename(comp.file) != extractFilename(spec.file): + Echo(("[Tester] $1 -- FAILED: file names do not match:\n" & + "Compiler: $2\nSpec: $3") % [shortfile, comp.file, spec.file]) + elif strip(spec.outp) notin strip(comp.puremsg): + Echo(("[Tester] $1 -- FAILED: error messages do not match:\n" & + "Compiler: $2\nSpec: $3") % [shortfile, comp.pureMsg, spec.outp]) + elif comp.line != spec.line: + Echo(("[Tester] $1 -- FAILED: line numbers do not match:\n" & + "Compiler: $2\nSpec: $3") % [shortfile, $comp.line, $spec.line]) + else: + Echo("[Tester] $1 -- OK" % shortfile) + result = true + else: + # we have to run the executable and check its output: + var exeFile = changeFileExt(filename, ExeExt) + if ExistsFile(exeFile): + if len(spec.outp) == 0: + # we have no output to validate against, but compilation succeeded, + # so it's okay: + Echo("[Tester] $1 -- OK" % shortfile) + result = true + else: + var buf = myExec(exeFile) + result = strip(buf) == strip(spec.outp) + if result: + Echo("[Tester] $1 -- compiled program OK" % shortfile) + else: + Echo("[Tester] $1 -- compiled program FAILED" % shortfile) + else: + Echo("[Tester] $1 -- FAILED; executable not found" % shortfile) + +proc main(options: string) = + # runs the complete testsuite + var total = 0 + var passed = 0 + for filename in os.walkFiles("tests/t*.nim"): + if extractFilename(filename) == "tester.nim": continue + var spec = parseTest(filename) + var comp = callCompiler(filename, options) + if cmpResults(filename, spec, comp): inc(passed) + inc(total) + Echo("[Tester] $1/$2 tests passed\n" % [$passed, $total]) + +var + options = "" +for i in 1.. paramCount(): + add(options, " ") + add(options, paramStr(i)) +main(options) diff --git a/tests/tints.nim b/tests/tints.nim new file mode 100644 index 0000000000..f2b52c1349 --- /dev/null +++ b/tests/tints.nim @@ -0,0 +1,41 @@ +# Test the different integer operations + +var testNumber = 0 + +template test(opr, a, b, c: expr): stmt = + # test the expression at compile and runtime + block: + const constExpr = opr(a, b) + when constExpr != c: + {.error: "Test failed " & $constExpr & " " & $c.} + inc(testNumber) + #Echo("Test: " & $testNumber) + var aa = a + var bb = b + var varExpr = opr(aa, bb) + assert(varExpr == c) + +test(`+`, 12'i8, -13'i16, -1'i16) +test(`shl`, 0b11, 0b100, 0b110000) +test(`shl`, 0b11'i32, 0b100'i64, 0b110000'i64) +test(`shl`, 0b11'i32, 0b100'i32, 0b110000'i32) + +test(`or`, 0xf0f0'i16, 0x0d0d'i16, 0xfdfd'i16) +test(`and`, 0xf0f0'i16, 0xfdfd'i16, 0xf0f0'i16) + +test(`shr`, 0xffffffffffffffff'i64, 0x4'i64, 0x0fffffffffffffff'i64) +test(`shr`, 0xffff'i16, 0x4'i16, 0x0fff'i16) +test(`shr`, 0xff'i8, 0x4'i8, 0x0f'i8) + +test(`shr`, 0xffffffff'i64, 0x4'i64, 0x0fffffff'i64) +test(`shr`, 0xffffffff'i32, 0x4'i32, 0x0fffffff'i32) + +test(`shl`, 0xffffffffffffffff'i64, 0x4'i64, 0xfffffffffffffff0'i64) +test(`shl`, 0xffff'i16, 0x4'i16, 0xfff0'i16) +test(`shl`, 0xff'i8, 0x4'i8, 0xf0'i8) + +test(`shl`, 0xffffffff'i64, 0x4'i64, 0xffffffff0'i64) +test(`shl`, 0xffffffff'i32, 0x4'i32, 0xfffffff0'i32) + +Echo("Success") #OUT Success + diff --git a/tests/tisopr.nim b/tests/tisopr.nim new file mode 100644 index 0000000000..d52859b09f --- /dev/null +++ b/tests/tisopr.nim @@ -0,0 +1,20 @@ +# Test is operator + +type + TMyType = object + len: int + data: string + + TOtherType = object of TMyType + +proc p(x: TMyType): bool = + return x is TOtherType + +var + m: TMyType + n: TOtherType + +write(stdout, p(m)) +write(stdout, p(n)) + +#OUT falsetrue diff --git a/tests/tlibs.nim b/tests/tlibs.nim new file mode 100644 index 0000000000..3174307445 --- /dev/null +++ b/tests/tlibs.nim @@ -0,0 +1,19 @@ +# Test wether the bindings at least compile... + +import + osproc, zipfiles, + sdl, smpeg, sdl_gfx, sdl_net, sdl_mixer, sdl_ttf, + sdl_image, sdl_mixer_nosmpeg + cursorfont, xatom, xf86vmode, xkb, xrandr, xshm, xvlib, keysym, xcms, xi, + xkblib, xrender, xutil, x, xf86dga, xinerama, xlib, xresource, xv, + gtk2, glib2, pango, gdk2, + cairowin32, cairoxlib, + odbcsql, + gl, glut, glu, glx, glext, wingl, + zlib + +import "lib/base/lua/lua" +import "lib/base/lua/lualib" +import "lib/base/lua/lauxlib" + +writeln(stdout, "test compilation of binding modules") diff --git a/tests/topenlen.nim b/tests/topenlen.nim new file mode 100644 index 0000000000..b9d7fbc2de --- /dev/null +++ b/tests/topenlen.nim @@ -0,0 +1,12 @@ +# Tests a special bug + +proc choose(b: openArray[string]): string = return b[0] + +proc p(a, b: openarray[string]): int = + result = a.len + b.len - 1 + for j in 0 .. a.len: inc(result) + discard choose(a) + discard choose(b) + +discard choose(["sh", "-c", $p([""], ["a"])]) +echo($p(["", "ha", "abc"], ["xyz"])) #OUT 7 diff --git a/tests/tos.nim b/tests/tos.nim new file mode 100644 index 0000000000..9ab4295f8c --- /dev/null +++ b/tests/tos.nim @@ -0,0 +1,12 @@ +# test some things of the os module + +import os + +proc walkDirTree(root: string) = + for k, f in walkDir(root): + case k + of pcFile, pcLinkToFile: echo(f) + of pcDirectory: walkDirTree(f) + of pcLinkToDirectory: nil + +walkDirTree(".") diff --git a/tests/trectype.nim b/tests/trectype.nim index 8e68767b50..3161b02559 100644 --- a/tests/trectype.nim +++ b/tests/trectype.nim @@ -13,3 +13,5 @@ type PB = ref TB TB = array [0..3, P1] T1 = array [0..6, PB] +#ERROR_MSG internal error: cannot generate C type for: PA + diff --git a/tests/tsets.nim b/tests/tsets.nim index 2a01292f31..08ab3e54be 100644 --- a/tests/tsets.nim +++ b/tests/tsets.nim @@ -34,7 +34,8 @@ type TTokTypes* = set[TTokTypeRange] const - toktypes: TTokTypes = {tkSymbol..pred(tkIntLit), tkStrLit..tkTripleStrLit} + toktypes: TTokTypes = {TTokTypeRange(tkSymbol)..pred(tkIntLit), + tkStrLit..tkTripleStrLit} var s: set[char] @@ -46,11 +47,12 @@ else: write(stdout, "BUG: F ist nicht in s!\n") a = {} #{'a'..'z'} for x in low(TAZ) .. high(TAZ): incl(a, x) - if x in a: write(stdout, x & " ") + if x in a: nil else: write(stdout, "BUG: something not in a!\n") for x in low(TTokTypeRange) .. high(TTokTypeRange): if x in tokTypes: - writeln(stdout, "the token '$1' is in the set" % repr(x)) + nil + #writeln(stdout, "the token '$1' is in the set" % repr(x)) #OUT Ha ein F ist in s! diff --git a/tests/tstreams.nim b/tests/tstreams.nim new file mode 100644 index 0000000000..68ca8eeebc --- /dev/null +++ b/tests/tstreams.nim @@ -0,0 +1,7 @@ +import streams + +var outp = newFileStream(stdout) +var inp = newFileStream(stdin) +write(outp, "Hallo! What is your name?") +var line = readLine(inp) +write(outp, "nice name: " & line) diff --git a/tests/ttempl.nim b/tests/ttempl.nim new file mode 100644 index 0000000000..dcf096671b --- /dev/null +++ b/tests/ttempl.nim @@ -0,0 +1,27 @@ +# Test the new template file mechanism + +import + os, times + +include "sunset.tmpl" + +const + tabs = [["home", "index"], + ["news", "news"], + ["documentation", "documentation"], + ["download", "download"], + ["FAQ", "question"], + ["links", "links"]] + + +var i = 0 +for item in items(tabs): + var content = $i + var file: TFile + if openFile(file, changeFileExt(item[1], "html"), fmWrite): + write(file, sunsetTemplate(current=item[1], ticker="", content=content, + tabs=tabs)) + closeFile(file) + else: + write(stdout, "cannot open file for writing") + inc(i) diff --git a/tests/tvarnums.nim b/tests/tvarnums.nim index 5079e0e168..1b683ad940 100644 --- a/tests/tvarnums.nim +++ b/tests/tvarnums.nim @@ -66,13 +66,13 @@ proc toNum(b: TBuffer): int32 = result = ze(b[0]) and 63 var i = 0 - Shift = 6 + Shift = 6'i32 while (ze(b[i]) and 128) != 0: inc(i) - result = result or int32((ze(b[i]) and 127) shl Shift) - inc(Shift, 7) + result = result or ((int32(ze(b[i])) and 127'i32) shl Shift) + Shift = shift + 7'i32 if (ze(b[0]) and (1 shl 6)) != 0: # sign bit set? - result = not int(result) +% 1 + result = (not result) +% 1'i32 # this is the same as ``- result`` # but gives no overflow error for low(int) diff --git a/tests/typalias.nim b/tests/typalias.nim new file mode 100644 index 0000000000..ba9f38ed90 --- /dev/null +++ b/tests/typalias.nim @@ -0,0 +1,15 @@ + +type + TMyObj = TYourObj + TYourObj = object of TObject + x, y: int + +proc init: TYourObj = + result.x = 0 + result.y = -1 + +proc f(x: var TYourObj) = + nil + +var m: TMyObj = init() +f(m) diff --git a/tests/x11test.nim b/tests/x11test.nim new file mode 100644 index 0000000000..2769b6c74a --- /dev/null +++ b/tests/x11test.nim @@ -0,0 +1,71 @@ +import xlib, xutil, x, keysym + +const + WINDOW_WIDTH = 400 + WINDOW_HEIGHT = 300 + +var + width, height: int + display: PDisplay + screen: cint + depth: int + win: TWindow + sizeHints: TXSizeHints + +proc create_window = + width = WINDOW_WIDTH + height = WINDOW_HEIGHT + + display = XOpenDisplay(nil) + if display == nil: + echo("Verbindung zum X-Server fehlgeschlagen") + quit(1) + + screen = XDefaultScreen(display) + depth = XDefaultDepth(display, screen) + var rootwin = XRootWindow(display, screen) + win = XCreateSimpleWindow(display, rootwin, 100, 10, + width, height, 5, + XBlackPixel(display, screen), + XWhitePixel(display, screen)) + size_hints.flags = PSize or PMinSize or PMaxSize + size_hints.min_width = width + size_hints.max_width = width + size_hints.min_height = height + size_hints.max_height = height + discard XSetStandardProperties(display, win, "Simple Window", "window", + 0, nil, 0, addr(size_hints)) + discard XSelectInput(display, win, ButtonPressMask or KeyPressMask or + PointerMotionMask) + discard XMapWindow(display, win) + +proc close_window = + discard XDestroyWindow(display, win) + discard XCloseDisplay(display) + +var + xev: TXEvent + +proc process_event = + var key: TKeySym + case int(xev.theType) + of KeyPress: + key = XLookupKeysym(cast[ptr TXKeyEvent](addr(xev)), 0) + if key != 0: + echo("keyboard event") + of ButtonPressMask, PointerMotionMask: + Echo("Mouse event") + else: nil + +proc eventloop = + discard XFlush(display) + var num_events = int(XPending(display)) + while num_events != 0: + dec(num_events) + discard XNextEvent(display, addr(xev)) + process_event() + +create_window() +while true: + eventloop() +close_window() diff --git a/todo.txt b/todo.txt index 149f9bc30f..2cd30ceeae 100644 --- a/todo.txt +++ b/todo.txt @@ -8,20 +8,15 @@ RST Bugs ---- -- BUG: sigmatch for ``len`` matches the open array too often... *sigh* -- BUG: - for j in 0 .. a.len + b.len - 1: nil - where a and b are open arrays does not compile -- BUG: ["sh", "-c", someProcWithOpenArray(openArr)] produces wrong C code -- BUG: bootstrapping does not work with Borland C -- BUG: addr/deref does not work when interpreting -- BUG: Check that pure procs only consist of asm statements (and comments) -- BUG: tlastmod returns wrong results on BSD (Linux, MacOS X: works) +- BUG: addr/deref may not work when interpreting - BUG: the parser allows empty statements/object case branches +- BUG: the parser allows to omit commas - BUG: when optmizing cgen.c with Visual C++, GCC, LLVM (O3), it breaks. - BUG: ``-cc:bcc`` command line option does not error - BUG: symbol files still do not work +- BUG: tlastmod returns wrong results on BSD (Linux, MacOS X: works) +- BUG: sigmatch for ``len`` matches the open array too often... (?) High priority @@ -30,7 +25,7 @@ High priority - documentation: var types, ``[]`` overloading, ``cast`` and type convertions, ``if`` expresssions, (anonymous) procs - implement two-phase lookup for generics (this is hard...): This is useful - for macros too! Alternative: Explicit early name binding. Both is hard to + for macros too! Alternative: Explicit early name binding. Both are hard to implement - implement closures for the C code generator - get rid of ``nkHiddenStdConv`` in several places: this mechanism caused more @@ -39,7 +34,7 @@ High priority Library ------- -- xml, html, url, cgi, fastcgi: implement from scratch +- xml, html, url, fastcgi: implement from scratch - unicode library - socket library (does SDL for us?) - osproc for Windows @@ -325,6 +320,28 @@ Changelog - fixed many bugs in ``os`` module for Windows - bug in ``semVar`` removed standard convertions - BUGFIX: ``setLen`` for sequences may lead to memory leaks +0.7.1 +- gtk2: cleaned up return types for ``Gtk_*_new`` constructors +- gtk2: added ``pure`` to ``final`` objects +- BUGFIX: ``genTypeSection`` uses ``isPureObject`` now +- BUGFIX: ``GetUniqueType`` was wrong +- BUGFIX: count references from untraced heap to traced heap! +- BUGFIX: fixed owner handling bug; only accessible in semantic checking phase +- BUGFIX: ``ParamTypesMatch`` generics resulting in openarray now generate the + nkHiddenStdConv tree +- BUGFIX: dynamic libraries are reused again -> much smaller C code is produced +- small corrections in the manual +- BUGFIX: the build script did not detect 64 bit Linux +- BUGFIX: the Pascal version did not compile for 64 bit (TUnsignedHash!) +- several bugfixes for 64bit version +- BUGFIX: no index checking was generated for some code that should be checked! +- BUGFIX: docgen did not escape tokens from highlite module +- BUGFIX: fixed seldom integer operations +- BUGFIX: illegal type recursion detection +- BUGFIX: ``for j in 0 .. a.len`` where a is an open array did not transform + correctly +0.7.2 +- small performance improvements for the RST parser For the next versions diff --git a/tools/inno.tmpl b/tools/inno.tmpl new file mode 100644 index 0000000000..e2d31eb80c --- /dev/null +++ b/tools/inno.tmpl @@ -0,0 +1,180 @@ +#proc GenerateInnoSetup(c: TConfigData): string = +# result = "" +; Default Template for NimInst +[Setup] +AppName=$c.name +AppVerName=$c.name $c.version +DefaultDirName={code:GiveMeAPath|nimrod} +DefaultGroupName=$c.name +AllowNoIcons=yes +LicenseFile=${expandFilename(c.license)} +OutputBaseFilename=${c.name}_${c.version} +Compression=lzma +SolidCompression=yes +PrivilegesRequired=none +ChangesEnvironment=yes + +[Languages] +Name: english; MessagesFile: compiler:Default.isl + +[Files] + #for f in items(c.commonFiles): +Source: ${expandFilename(f)}; DestDir: {app}\${extractDir(f)}; Flags: ignoreversion + #end for + #for f in items(c.windowsFiles): +Source: ${expandFilename(f)}; DestDir: {app}\${extractDir(f)}; Flags: ignoreversion + #end for + +[Icons] + #if c.app == appConsole: +Name: {group}\Console for $c.name; Filename: {cmd} + #else: +Name: {group}\$c.name; Filename: {app} + #end if +Name: {group}\Documentation; Filename: {app}\doc\overview.html +Name: {group}\{cm:UninstallProgram,$c.name}; Filename: {uninstallexe} + + #if c.binPaths.len > 0: +[Tasks] +Name: modifypath; Description: &Add $c.name to your system path (if not in path already); + #end if + +[Code] +function GiveMeAPath(const DefaultPathName: string): string; +begin + if IsAdminLoggedOn then Result := ExpandConstant('{pf}') + else Result := ExpandConstant('{userdocs}'); + Result := Result + '\' + DefaultPathName; +end; + + #if c.binPaths.len > 0: +// ---------------------------------------------------------------------------- +// +// Inno Setup Ver: 5.2.1 +// Script Version: 1.3.1 +// Author: Jared Breland +// Homepage: http://www.legroom.net/software +// +// Script Function: +// Enable modification of system path directly from Inno Setup installers + +function ModPathDir(): TArrayOfString; +begin + setArrayLength(result, $c.binPaths.len); + #var i = 0 + #for b in items(c.binPaths): + result[$i] := ExpandConstant('{app}') + '\$b'; + #inc(i) + #end for +end; + +procedure ModPath(); +var + oldpath, newpath, aExecFile: String; + pathArr, aExecArr, pathdir: TArrayOfString; + i, d: Integer; +begin + // Get array of new directories and act on each individually + pathdir := ModPathDir(); + for d := 0 to GetArrayLength(pathdir)-1 do begin + // Modify WinNT path + if UsingWinNT() then begin + // Get current path, split into an array + RegQueryStringValue(HKEY_LOCAL_MACHINE, + 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', + 'Path', oldpath); + oldpath := oldpath + ';'; + i := 0; + while (Pos(';', oldpath) > 0) do begin + SetArrayLength(pathArr, i+1); + pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1); + oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath)); + i := i + 1; + // Check if current directory matches app dir + if pathdir[d] = pathArr[i-1] then begin + // if uninstalling, remove dir from path + if IsUninstaller() then continue + // if installing, abort because dir was already in path + else abort; + end; + // Add current directory to new path + if i = 1 then newpath := pathArr[i-1] + else newpath := newpath + ';' + pathArr[i-1]; + end; + // Append app dir to path if not already included + if not IsUninstaller() then + newpath := newpath + ';' + pathdir[d]; + // Write new path + RegWriteStringValue(HKEY_LOCAL_MACHINE, + 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', + 'Path', newpath); + end + else begin + // Modify Win9x path + // Convert to shortened dirname + pathdir[d] := GetShortName(pathdir[d]); + // If autoexec.bat exists, check if app dir already exists in path + aExecFile := 'C:\AUTOEXEC.BAT'; + if FileExists(aExecFile) then begin + LoadStringsFromFile(aExecFile, aExecArr); + for i := 0 to GetArrayLength(aExecArr)-1 do begin + if not IsUninstaller() then begin + // If app dir already exists while installing, abort add + if (Pos(pathdir[d], aExecArr[i]) > 0) then + abort; + end + else begin + // If app dir exists and = what we originally set, + // then delete at uninstall + if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then + aExecArr[i] := ''; + end; + end; + end; + // If app dir not found, or autoexec.bat didn't exist, then + // (create and) append to current path + if not IsUninstaller() then begin + SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d], + True); + end + else begin + // If uninstalling, write the full autoexec out + SaveStringsToFile(aExecFile, aExecArr, False); + end; + end; + + // Write file to flag modifypath was selected + // Workaround since IsTaskSelected() cannot be called at uninstall and + // AppName and AppId cannot be "read" in Code section + if not IsUninstaller() then + SaveStringToFile(ExpandConstant('{app}') + '\uninsTasks.txt', + WizardSelectedTasks(False), False); + end; +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if CurStep = ssPostInstall then begin + if IsTaskSelected('modifypath') then + ModPath(); + end +end; + +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +var + appdir, selectedTasks: String; +begin + appdir := ExpandConstant('{app}'); + if CurUninstallStep = usUninstall then begin + if LoadStringFromFile(appdir + '\uninsTasks.txt', selectedTasks) then + if Pos('modifypath', selectedTasks) > 0 then + ModPath(); + DeleteFile(appdir + '\uninsTasks.txt') + end; +end; + +function NeedRestart(): Boolean; +begin + result := IsTaskSelected('modifypath') and not UsingWinNT() +end; + #end if diff --git a/tools/install.tmpl b/tools/install.tmpl new file mode 100644 index 0000000000..c98cbc8d5e --- /dev/null +++ b/tools/install.tmpl @@ -0,0 +1,97 @@ +#subsChar ? +#proc GenerateInstallScript(c: TConfigData): string = +# result = "#! /bin/sh\n# Generated by niminst\n" +CC="gcc" +LINKER="gcc" +COMP_FLAGS="-w" +LINK_FLAGS="" +# add(result, "# platform detection\n") +ucpu=`uname -m` +uos=`uname` + +# add(result, "# convert to lower case:\n") +upcu=`echo $ucpu | tr "[:upper:]" "[:lower:]"` +uos=`echo $uos | tr "[:upper:]" "[:lower:]"` + +case $uos in + *linux* ) + myos="linux" + LINK_FLAGS="$LINK_FLAGS -ldl -lm" + ;; + *freebsd* ) + myos="freebsd" + LINK_FLAGS="$LINK_FLAGS -lm" + ;; + *openbsd* ) + myos="openbsd" + LINK_FLAGS="$LINK_FLAGS -lm" + ;; + *netbsd* ) + myos="netbsd" + LINK_FLAGS="$LINK_FLAGS -lm" + ;; + *darwin* ) + myos="macosx" + LINK_FLAGS="$LINK_FLAGS -ldl -lm" + ;; + *aix* ) + myos="aix" + LINK_FLAGS="$LINK_FLAGS -ldl -lm" + ;; + *solaris* | *sun* ) + myos="solaris" + LINK_FLAGS="$LINK_FLAGS -ldl -lm" + ;; + *) + echo "Error: unknown operating system: $uos" + exit 1 + ;; +esac + +case $ucpu in + *i386* | *i486* | *i586* | *i686* ) + mycpu="i386" ;; + *amd*64* | *x86-64* | *x86_64* ) + mycpu="amd64" ;; + *sparc*|*sun* ) + mycpu="sparc" ;; + *power* ) + mycpu="powerpc" ;; + *mips* ) + mycpu="mips" ;; + *) + echo "Error: unknown processor: $ucpu" + exit 1 + ;; +esac + +# add(result, "# write ``build/platdef.c`` file\n") +cat >build/platdef.c <JfjWMqH=CI&kO5O0E#16T+`GB7x-WdZX+gad;G11Ez6gDQg(0~-Sa11kdq z16&=HFt7(gakFhK+?m>?#=Xc>qw1B`|m19lt8KBzQ` z%^oSi-Cbb4Z=hrJs21m zJfR{s3=9k)?>jRvFc>f}Fc>i~Ft{=>FmN+4FvNqxn1O*omVtpmkAZ<97ODrCN?>4M z2!aY&GcYiyGB7YCF)%O~GB7ZRFfcGkGcYiOGcYiK+~^Kf7YL6`I7(gK)2IYe&Z4kl0z+l3_z~Ifmz!1j3z@P;c zQ)Xabh=8)q85kIR7#JAz85kHepkne+8j@QW7^D~&7%ZV;pfJ{ivi+bmhytY`3kC)T zb`Xbwfx(x7fx(}Ffx(P{fx#9kMoo$z$uL-YK@x&9dEqPsLma_m5Jh5xn4mHPR31RH zDuX0Q5L%9a(iW79lj6ZC!@wZNz`(%Az`)=LRinhfz~IEdz@W>(z#z=Pz+eXz2T>{@ z0*cic7#MV*Yz24e;WhG3`|h~fkh3=9l{3=9mWP&SC-f|fE8APxfq11L{` z{0K_Rpl}2GiIKsHfl+`BBnC>qAT^q@Ju;S`x@D|*TQ|o~n+ysPs0o zAs)_zT|Fp`f$|=@Ia6?`&&FZ?YiJ%uH|HY`b8g@;Cmn}5vN+T$;}D;XLmZS=U}ZG2 zTR~+6Ht{Vu%<01+z7B``SKtT-Q2b*H|4TT`d4|K@GdR?rz+tZ?4)G2g=6mB1x5FX+ z3y1kyIMf&6aDM|1@e~~91mLju4G!^G9Oi(^VQleo3x_$PIK-KlvFE!G9R5+CA9RPr;%71rB>1 zaEM>WVa@~`{^G-7PBRYihd9Ki<1qgb4)Mh}+?k5Qe1072dvK_)#36nUhdFO?h!^1y zpNqr%AROw8aHv0wBYZeSrS+h`0ip_-Cj&8)QKx zHAp1{?|{1VfC8#GLr!K=N)DtS6Carw*aK2C^@5u0c^3-MKH zZenpZNH96EI29B|Anz6=mSix1!zQ1hC^a{~ER_Kijv(ixr-Chrk54YCEJ%${0y!6C z9mp}ol^|a;Y*224h=6*hFcvb6O$BIth#AQ=79=*Z zUId#JssiB#m>w97P>Y=fatCP4f)PA!0qWC(+WDnYnVg`}8DUVz3_Pa6%rF$~llY zs1E=WXIKC+2h^tr^%Y^_97y7z5Qm8iAc;f00+y0M5{Hc?fg}`=#6fn0#6VaBNgU({ zkQfLXAc=$A1QG*b3nXz^Sq&0*KoW=bk3r%dNaCRWF-Q!A1CYc)<2@iT5RO0+2ld%N zVj!G=B#u1Jkbxu)ier#k5H3Ix2ldlIVjx_BB#zvkX+RPO^~phMLAV1+95ikK5(D80 zNaCQeCXg5i&p;AK9`9IyB#u0Gv;s*Sd8}juk~nNU0c8FTByrey2}t|^k~nA#2_y!> zCy>NJeO-_k2wy-FM;>svfg}zZdjqKj;Ri_Kps^K@7zn>W5{Hdtfy6%`iG%VTNDPF3 zAc@1q+d$$B3lZrbG*$x^1C8AwiG#+{VB!Ku;>hDS5=i2p@j#e*1tf9gaY+p%anRTg zOuYe;IBcvABxivn4jY>Ti8~;P!^ZwV;vPuiuyI0=cmR?(Y`h619)Tnd8mj_{fp7wn zIA}Z+BnHA6NaCPzMUWT>7a)m)##TXMAY6eY4jLx~iGgqfk~nA_79Vb29h{vtOukPgcl%*gXRxFVj#Q%NgOn901^Y?4M^gkISh~(2=71=hs`U1#19~e z!{#bL;wO;ALGu_OF%Z6hBo3P60EvO{4J2{U90^DagdZS@BhSUWKoUouPw{Ae!|_6! zje+6CE)d~5hnc~n`3T41|E6BeDh&TseVSDm_~jiK{;Puc86YcOKKTFt|9@4dW)+4E zP!s6o1u)+V#0NEfULFARjX-=*ljr3IFkcJA2Q_tGE&%hDKzvXW=j8-2UkbzrHEmut zfcZioKB!6avH;BI0`WmjnU@J*J`;!!YQnq>0P}w}sW4=Knl3LL!2C}jKB&p^(g4hV z1>%F6DlZkl{6`=@sEP7Y0L;Gy;)9xoFB!o6OCUaIO6BE;e<1&!0`WmjmzNK~{6io< zsLAs30+_!G#0NE1ULFARH-Y$|rpU_;VE!r)AJhbSxd6;x1mc659xo?=`LjTLP?O_j z1DHPv#0NDsUKW7)T_8TFiSaT4%x?nmK~0O70bqU=h!1K~ymSEbi$Hu(Q{tron4bmW zgPIU86~O!?5FgZZcqstpM}hdDCc{exFh2;y2Q?L5e)tRWzZZxPY9hRR0OmV^_@Ji2 z%L`z>6^IXN61+SB<{N?dpr*jf4Pd?&h!1K4yj%e0D}nf+s{iE#FkcG92UYnm8^C-a z5Fb?4zbpXrxj=kS75_2;%x41eK~?+905JboqY6U?s7in70Oo%J@j+GjO9L?f6^IY2 z!e1(Y`Hw(+P}TiX0L;Gy;)AN}mkeP3B@iD}Rlof32ju@#AU>#ye)#~*KLp}~s^*s$ z!2DexKB!85c>v7c1mc6L;+Gr1{8b=6s0x0$0L)(m;)AN*mlMGJSs*^B%6-`Y=1&6g zK~?R`0x-V|#0OQeFB8E0CJ-M~wZ04h^Q%C7P?h@90n9G~@j+GTO9L=J3&aOip)VD{ z{3H+`RCT@-0P~|jd{CA7k^#&Q0`Wmr<;xGhLH_pw@j+GO%Lib-6NnG08ed)j^Q}O9 zP?h-d0GMwC;)ANZmm9!*Ef616)xBH*<|~2tpepX=1TbF;#0OPvFB`yoArK!_rM)Zw z^SMBLP*wIa0nBFt@j+GC%K$L{SAz;e2B_+K=>X<`0`Wmr)=L90{}qT2s;XWpfccL= zd{7njQUJ`q1>%FMrk4z0{v{9}R3*Lq@C)SsQy@O5Dth?<%s&L;gQ}pH7r^{oAU>$- zd3gZL-vr`=s+^Y_!2DGpKB%gBxd6;x1mc6Ln3og4{8=DAsA_rH0On5u@j+F}%K|XJ z3&aOiB`*`e{3Z||RE4|@0Q0Lrd{EW#(gDmb0`Wmr#!CY*KMTYMRTVE4!2Bc-A5=xW z6!`W3zu{ZY&Wmv#osT@4pL_@i@jQM&VTUt=$MJ&(VCr~rj|0Pt@ZbOcf0-}=RA+c} zvr5*gFnF{cC}H}40bFHFKn9^6olk>73L9)a8dMke!7x^Hef!QgS+^#Q0T@#wZ~=22zX2U7Dwxu1!_qw^R@jYsnV z0guk(FB%(}z-mFoj7PU^I9%=bK4i5LAhn@TwV)!%quW*+uJ$yFS_P0=O{iK>@#N8M z`=1-;hWRLJH9%_rHbC3}D!M$nZ7;*s7Ne*&0I9tQRSPQCJi2X{!_~T@sI>s8T?$nT zD)KzKZL8sGrBT#6fYeq()q;w{{Rumr8D7j;g9rfD4mMCc9)A(kz{CKNu0@uf0F^d| zngS|BAdNRRR!YYRJkyK$YF8g9HeuZU80TV+}Vz%`#9L2UQOcp_?!vPz?bQx&;#g zRT7~2M1~j5X`qONWC7L(Q1fd*=6ADdaj7zRbTfE#vMO+?GMqdN&XtXC1Q9v>Ss5L@lU|3h}=BDo_l%{(wq=8mk`NtzfIWcYxyH#cNqcP?_)oF5Cc4 z58VRj0t_CEhY(`m)XwzMqov*A3VAZJi2RtytuRu95g>Xx=TNR1q49~U}gAm*Bg+e08TETX17PT z=yf(w5`;RYK)|E7_Qnh5AaH28MkKd%(eY;>BaIl%&3Xs>WT^C>r@C6>-u3&j^fcr&*1AK)?x9b9UfSWYM-QZHAE-zC;uyGGcm1(10TR7GUa%kx1NHf!B?kYth8JuM3@r!vTbmd_i5zSe zs1pcP;L!~&@EAOLD|BACEdu+!VP6Bp+=drxKyHDRnXvra@M0<}sQ7^?Y6mNFZGd@I z9qK%f?$QR3qhF-4GBCXCN4Nmg&BW#cg%?K_f?UvA@&Et-eGGd+X?HJ({Xzw71vD!| z-2su|0y#wiN$F1(P$mEy0dvqaSVhpi6=WLNO_xB*Ai)pn)nao_{R>lwb3h{$`w}2_ zfY>jlf;6KA%U-ZdH47+xASum)C%y3ueINHG}wqGbU%{4zk{r?3wkejxUXC*UlN7JguvQ_Ktu`x20p?t~}>Nx~c) zwi0A2DD7^A2-p62F$ts$;$ToO9TcYfo-;5oywHRy-nRg3Xzh;|=?JBemL}942)`X= zf~QVM`w~fo#fwScqQ5ob|Ns9U-B60bqj$#~P?b4pKFDpYph2U33-*J33}V0d1TwOF zD@4;?u+V)b28MkB2N7z{fz^QZ!n~Tj0%RQ6s~|lfZ@pL!Qg*x*G!BJSih-Iz9w?$7 z|NsAoDgcd9L7AZT3#cFM(Jku6fLuOmc=YZCse6%s08~V_S|GH8^gv2UbWun_*$UDJ zN*LB)dH%jg^!jNk$TW{`xI%EDDH#STG^au|gLT4-&fk!P1M&j2^aS1o9AV!OMGa_#0_qD$=~@Vq z>jXz8)T5B@Bt6rLDhiJUUAsc)&WE-Jvf$x?LZD1F#d+*a7oDco<&r z_*Z&Q*{~1a}J-S05cyzmBkz#$31ddnN4{(bhec#T~1EBuzYEV16n|0*~xVK^Q z=sfk}*Bela-u1ysQ22I(8X6!K2SAAw)DU((;n6AJ(akChvIg8O;QXfo?G^-kG`@KO z($={b)b95<4o+yVKyK`2ee@UPY;a@W<2X1@IG%$>F2IQZoW*(}lAWyEK}wHp6X72)WUpW4^#R8rnDBJ6jV`zm4fQy7a}mF3YVa!1|gJ!MyLPeOz8ob zQqZ_AsMiUND_8>_6jz{eJdbX0FVLgg!2*bSZ%VCfcdn-g)fUYO@frdT6?eNS$;A#tEEVA}*pf(#=yUAg& zO8Y@Qw`#&tc8yB>gsA7oGr;$6_V zCL;VCK#uEl-QjT@)_4ae5OA0rcijML@L)XQ z(R_fzqr2o7hevPi1fR}BFM@Y~+6Jzm_1-YMAq@i*AxNtL)SqGSuy*a>?|TobOd(MR z?XN=nI}9G+IN=95wmWo!N4IMSybbVu1~}|zKqDA5xV`TIBsgch$ovHAm4KVo2*D7D zAfy!w>g#|S1&}5-bR=X3DD8nNfL4eiSX&|T#m%W;+Zy&YK&)tZVgC~pW2K<(QNs(P zpa1{wI{=eX0ZYMJ?+q_RK(Y)s!AYdy1shlvs`2L!WR0(XfXv(qvAnk7#chzR15D#t zuq>?S^5R7F49z)B&_nFTLi&jp9d0*`K3Q+vS+b&xWMBOq;++73vjTl)R~ ze~(Vr4)By7G}gjF6)C*vg!UdvSzpNdAmzdxpg!%3g6p83Fr+DjMaOGz3>|h59gsE} zv_u58;vEFQJ!z;>(5PPkk9u%Q?}jOaNVh@^fpA>GYQe3@9iaU9V$WnyFo4_o`x+pD z2x`f{kOBD^*{z`V$X>7%<9AS>@fIjaKm9tL9u&i%V?Qn+3DDTjazqjYEtdov25tdZ!wfqBGprJ% zr<+yl3#iZokN<*Mt}i?qkAT`^(ePF(?&fgkMGwt`9-SvV2(^h_AAs7)#;zYg6jF1U z^@Sfe^}^f4jc-8pq(|poaO@m+?T`kwBD-0eKZBZ=t_`4a9y%)oDd&4#8$3E$Q$W(N zI-(cc8QKM!g@H@~iQNaawp=HG!WTT`?9sawl-yplZUT)#u=aff84k%6$6Y6YX5&1L zyG{Tt(C~m5_TuDj28Ls<|3L$g6F?!$zpXX%|Ns9TuK(eEgyXIgKucFWx*;PBf#9s+ z`T;bL1*@4rOC>$JAp;_Y5cwA%n?OsI__w+K?*uoBo59^p#u8m9qh1KYVBl|g$-=+@ zUU&f!Vdn1-{{R2~OAb)dI_^3Fv?$7>8=PhNw>fZt29(;EKwWm|6dHW^)pbHDxcsU8 z@WKRKRv@?9Tqop%B;l<%*Ap=J7eK_}d{8HC7pPsb55(GU@Z6c3^JrU6x2}x58PTFDr0@2<_;>vK&`0I8~oc`m;`LBO9a7Pm~NPW zPN@titRUKJPe8Jf*C%i`I`MifNUj8IG^h^)o0vau#MMY3yP}%`04mYWHA;O{6_ch9n_SHwTsh=j}mN3!5g}3RRoOz`*eG61X|#Isu$cL9-s=S3p&# z>w$d_Aa)*j@re-}eueuO?txu#;Kc)oNc=tpn8-PZNcKJlm8H7 zHL3d&U}|PSM1uD*O>HhckJYXBW@iGkECnjodn^#)kRTev{d(D4>%1@Hj0912`ASi2r5l?3&T!6L_9 z!7|5O|1-V>wT?g%pp{Y{&9x^O_@}_io>Fdb_X8nNA_iA^-1PxS2gst=2_RAMnC)@b z2Vfd?xW@7j*oeOkwSO5(binTEX7ES`O?VyffDZsw2)t0g^Z$RR>yPHz9}rjk<=^J| z7gTd~v+BHog_F`76$Vfh1g-VqGr*v!UyshMkojKM6}gZ=`|=u8W4eO6T|1!FF=W1} z*L8tMC+k&^G_=bL@(WTO2wBSk>fwS$(z_vZ#k~~*FA8sh5)P=_@4A5zBnRrY@wY65 z)L$EzKthQ6YXdWg51OUxgy;i}I&5G82{zZ>U?}AUb)rGsm;Mj~pd%8l8$cs6;CiXI zLimMDH#miY2HQ5Ufu;mLfU{rig%_v({{P={035=Q8bfTKz@#-9?ECW|j8#uvot`|IdD+D}xw}MP~ zp;pAq(CPZ6x%LY~CD7`8_QH$gE^t7CS~DB!7#P4wsk8OZzyJT6_ku_U{ti1hhp|owBFeI^od`UV8xQp>!VK2O8FUp$4uRK_ftrq$vO%lX=_;vL95H zfJM6*AZvXNA{hW0%{;UNRCRl3UhwD@ISMKgJ-{7%Td;@?;|uV@x2cfIY6E1T7&L#r z7i8#*$AA9+e^~*Qh<^y74(Iz?MIU2N-lI*fCJ3bhGw>lt7DSXh1=V56Dn>K1do`G$Vz~ zgFWC>dClG%EbO;E}hm8L~#=*NmLqIS1`x2mScj)*JXpIZl z5#7)sARZe~jRxvfP6dmD2jXlFz4+J$O7YOYnReB85!=jaq>!8*qkzm9f3xxt(30rJj(|?7~HGX$C7uC!7E~ z9Nc4pYMgKqA_N+ug9(A=Euj+vFrm{RRiG&naFN#wQVnjNK&GuG`c~vEAR#pc!c!0E1VA< zO5NdM?RtQ}KM-R21h6VlcIb2ktxcS84s5#X2@l(V!wd{%tS`!}K(R6vG#Lf1c@I8d z22T!w8zuZx5Abihun(kZ{|iu`h}8_73nrXLH%1?qF%~ZxTfp%Ps@EoTfn%}u#*2k# zz~$lw4@iLz%9Wkaa*+?*ECiK{kfaPM7dN~(4K@W-E`mjo%SD&~C|eLJ7xf^`$_d>N zhdkH^4&Sp+;8pen=;#Ktp|}|$v*YDLNXb6o0?6l(B=utXWpF~8&;v3IRLhq-fRZYh z3rZHC$*Kyq7YU%%l%1|C_BlZ6-4!p6flP(0D_ZelCzw;a;)Rz9xQ9CdI_CBQ;xLwJTo8G=m}?v{G*YXo2R9FeZlA>>gOe6$wb+Xn>AIlg z&B_b%A}D>ZGCzU`TH~7qpj^_qHv=5EtuOxl|E~ZEvAYjJ&B9jD&J2&^;I#peaBBta z-2i9*UWjBT>n4!WOa=P_^@d z_b4P$Lw&Fa)R9+s0Lmw|KVHoJ1WMoht)M2=J_nd+J5=;6NNoa4v=AzK6(kDnD*t#9 z4HcdF@BjaO4KTH?P|;?P=mMCiK2$UpBzgcQDhU-02Z=s_i84b)9YLZD525aT`w`+^ zZIGw}O!PWf^raXiS%boSF(O1E%WoN9{s6cCz_GXlSr)Vsm+|E-gzQpeS29Qu%Ph2S7HUb4bBolBP0%w8;`x+o==D~}_?;(K!%AK$Qqz5m0p`xJJ*|z|u zwj3%7PWcC5qKQz^&!FIZ02B3wiVA|3)-XH*r`rcFOrfIsAW;RFs615E3nc0Q6Xk@8 z-eF{5cnLZm2AXq0{dDl?%!V3J`3PznfQwF6&|DL!(n$_rVt6SCuJFOhd?Pp^*S>gB zkEQ{3Q#lC1CqCnf!BC4yxa~NLxZHi zonW)Uxf&wN_;Myf7MyqvfQ*I~_38QGTn-u}zVPCxDig!YY=mmiNoM@p;8hB^NXJr; z@EU+qGpOzNBIFRrJb28of|lBY56n>+@#mOdpkkRnYO>c$Ji@D{X zKz2O=Yk!=0!F(H3t3%72+7mB6-vaSVPr$0o<~)#_KufG^54?D&!o={h9Wtc_DlGRC zmt!?C9U=m8$PSo8cD$$pTMTo^ju%;Ae(4UFLw@Cg9Rg}7ZFms@a>zf>oF*jV4ie{( z1$v+mffOBQ_kxqpihUnIF$!wyWxNI@pAs`@QaOZ@ntyEuD_;OjJmArx?$QM>+&}*R z|FQ((5>V%#h`130y96a}7|XzMGXoYRGhU>FM>1eRGUG)!m|r>r79`Jez(E39U_If5 zt1=VA%h!oh(;jf#biksrPbo?d}5t*Tl2<)l5Kz;_Vy?}-{WKD+F3s8`kzzSMO8xxYXUcA_| z0jvqKh69?|Dik~*t2$mVzx)6Hr2)cK=ZFiiOIjdTp#<38B5;6#)-^!05oGm%ENI{t zmi8b*To56UQdlydo(T>x&`dOR>FbO4@=Odbr+$V9*hNtMJAe`uG?0@adcd>e-QY>` z7rQ}v5)pbpXQHA9vH$}EQsX}1u`|O9X0Uf4kqR}O4Pv+hXfV4QJPG|G4rDkB!f=#6 z2Dr2JLg+cz8=#?(eUR03;5E80?wczn;pu`A?)b0(C9vehvIamh5UM2^MELNY(uwK8@WfkZ$R>u&~ zLRJMx9~RVk_2}FR?y+`Gy#Z9|59J6RuG z0*?oPMvWOfdiR0~MWpWRqnoDbr{ChEc2=q@C1 zz;1-}Y+qzO0R^h-jeQHiK~j6;#oTRR5l}Y~WYj&7p60zE4>8nnc|cg8b#F)1LF?Z3 zg1iWk0I@);-&TVpx@`k5sz7(lehdbMJSgJ8Ha8#e@aR0~(LEJpCS<%Ewh#_9yxa;h z#{;w`sQCrA2Y4LJhVg|QXf_=-u6-QroBJS_b=N+C^qfsNK$d{!K){lqQ4|mG2wzJ+ zXs8IH6Y={A% z%@hr_?-@!2peBL@UQR?P0FD0gZ-dwXZkB;|J|g;e;GTAw8WY351CS_P@Z#7iQ1JyC zz=lm6zJDnK%9IcrUqhVyzQgrhL+v|;5=Ru%Q5${WmYD>|^an80Ga#lPK+Hmdjp1+E z2ub}QPrd<#9VG2Q5(_BqL8+)t6-O#cRb>KA`hdd`>`PR4fP1kMK$^QDBS4@H=iT76 zd;ngo*%@+>!voap+L_P9;MsY=1Lh9WY=rC}CsQ+MBn{t4E8}sW&SNhQ zJ^laxr7C!+0Gu`6LZTZHvRDdpGZj#ASGoX})@_o(g#u`Y;f@!xB$*gqUV(IcL6Q3o z6uFQB>IH)r1H)@)XvzhRs)4sTfQJuxU);+E1*_|ZeGE^)&6*7_T+V|^vC;?NaZYnE zr*^{&OG%LJtoP5t3frq7R^t&+85`{w1D#Ta47RTD=qv>dvhG*_DPUKDlyOBIw-z|N9ld{xALT!eApf zTz`0Uvwl1S^X+pm3pS+$s$3*MxxaJo3rHk-{QLiZBgD6RKuSAXK}W-Q9B&0Jy@B|- z6?AwEv^oJxcCtjwE^tQrv>ZwU9)?b2PoZAhn==D5PfCfAEDf!;2StKoc}Cx?Nv@CunYX90!{Y zouj$Iz~34Hs#_6}25S0(YC4e1pwl!Ub3wTmJdH3F)Ru%yv_PUBVjy@92D*pk0mT(4o~(39wqw&RpBmAFi@cyT%loD4y=G03~%9ZsNC3UBX%6V47;Qrhw2={m5; z29IuNc6xLQT(N<)K_^q7YxdJlgQr;zykvyb0U#C7`4mt%z6jq1P5_{tK%j{T=xij| z>EA(Fy}K2h5TSb|I>D9j053l3pW8Hi-SZ?Fnz z80`S9D|<0D6BLWB;7Nz>+7+}ea10p2?T)w2tv2Qp)O z_=P>h)Cy2F+g&>WV(JW#3S?8k0R}cz2*p&;jtZ!r6p$X6sV_6YZUvoIwQmEsoPxRo z(mIa>5Aw8j{QLiZzXM3RcPq$SyI4S5h@7W`8XDkQ1{z$T(_cNhAtK;ffcwRbRIml0 zM)AG}AQQSFJur)tpkflbWFI1=3KoK}H%ov682j&2J`#NEFH%9YSX!{DWO zFsJ)v65fL~c$3W{vL2-iEsd58U#({SOdUS6E z^$=mJpP#P;%QzrPG&W4134)w}8fE{aK!rHCOHH=Vc7e^Hz-K0hJfPiUy`%6%&W`E+ zK#)bK?zaO8Q5ZA7z|Ad4|NM0dv^7hDcR(#?a61;XSO6Sf;HuDu3Do*@0S(YX%3Vk; z1Ri97B>B5Xz)2o7`0&yMlu3}))iyvB?EousZ2+Hl1x?uylWJ!`R7``YnDKHJWQ-Zq z#fRn{(6}^|3ChNxM^06}DjIjySjDfC-=!6W?KwP&OB+(2Wgk|9G zD@RmiP#vJzO^;6S{tM`VHc$tE=4+u$kXyJw@rzcifzN4xo{xj16lyZa0FO?{0yY%4 zfL4<+@b?`?RB=!pAPJ97@F2bi(%d*?DjmrJZjf7=!6O}z?inZuL519X(42QOczZ5H z0<@(ERMZ^ac~D1$&0)oFLv(*NxnFG8C))cJHyAp z9bu?K(CL;?CMY%Xf%QOZdg#vER*)KxSSNqKHimP+(w$&;K)nGzrwTHT;9(7pDgLPkI$Ym_Mr2AwJh~xjt-+}sA;aIY z929=XTS0rqk=zEFZT0Bh3i78%H+ZP*g(G+kSu5zUP>*iNIAQl*5buS`VsKP}jDR{u z2xMsYUXaL(ndd+&@!mGnzGW!k2en)N{r~@>1tQ45&Gjv8@J7s|dn+jBJ)rtx_JH(3 zM`XYaCrE^dLd*s!eW7*`Uh9Z~gt3(bSA}t8k3Ap>s$`EMh)H1YCdWbRA#fZ(+6>@8 zC#p>auZ_T&2B|jM25RX-0svBn>;)wONHyXQ8d2>8C$E;$+L1eMh<^&u0*pmYsY2dYjW z>h?j@fdpPwLu$GisJRAoI}s>p{Qdv`#cYTxK`K0sw}Q^1MM{^F;Fdt^BkHKP~^$9OdfexSo4KDP8kK($q z3pD!r!mA6c612Z+feP66(gz;BwJ%TtR)h%@u#m;H8Xm`87pQ_&*1iBO5qq(W8yO2!4oU?J$3Q-$PtNehq0HwB>LuygMWND>Bh=x#$oJsqUJvlY|>^f=xMifl;O zBT`W>M6#3B2Bh>jxHN+#FIYH()q-wC^yqE{+W-yHFSEb_1zOh+8lne{4}cPtCD@0x zFJ5FvfxHH;KM*>>0UrpF0nHBVR{)(6(z_K@KS9F(R0r5t&@c(eI4iJmP>UPD8=Ali zX-nmyc>$yV9Pgmfk{7Gyg5&f*1}RzC)O_iwB2E7B6_hLCG0BD+O|}1E}1E z4F1->cwsynoa{iSQe1c;0~)OZjiq&iHi_4+cp(aro#D|9I&%=bY64VOy>RRX#Xi_i zkSYwe1H6AbINUb8dku2#U>QiE6DV!KiUtPKZXX5Wq0#&h)003+1hDgK5@e&Y&J0LfJF8lL<9}zd<#k}XB zfCNv&9&`N%3L{Xb7U~kv>^hVQ(hIts*`ph*7PO}3#qUL6y&zRk2SWCqfwzz|@VCqd z6}k|oL3W^lM{ke}gzQ5DD}V71Vi>4@3^fe21I?ou+=XT+1x*lw+yD}MsShz2GysBR z8f0@C*bWcS{&k0ZRJF?f`8`gPmIj-p8>OWZ;WzYtYuU z51@6{l`#K;l)kiQ1Wj@O0mTj|3_$zHj=93Qp#5pxtvmky|BtqZ4YDVVAL@CKvSY4) zn4nzHE;STgu$^qb8ft$rl*k|{5238Cj`S9qT3QD;i&=c4owbl!Ub_Rx*%?R5dJI^2~?hYu$L6Rq=Z~>3KLOiO! z8Jx61Mr*jhid-9BK83V+L9JD2dISv}K$#$YZs43RsN9zcPe zA_CnG^_LA?ctbRUb;3K@_XEM11>^;2TteIoS>w`O`{G66RB%{>n(iLmknL36TfsbN zSWjt%7uJyNB;YNbknp?@Zk&Rxd}#|Aw*+-ppdJGqR}5u>LdzWzT7T9fhn9jzFZe{| z7peu|;cZag14$1ww9rJMp#?G@5?Ua6Y@r1bho3eH4XyLw7UfikW^mUA9$Fhg$7R7s zT@Y@DZ1n|&mh%*FXo0$%9^F$xeuec_p`n%5f*x8RH$Xyb;|6f*0|~%F3uK1}C|sc0 zIhq+5Ui(9%3bc3`G50L_BFPsVnV^9XXtNo-rsc&Ukh$O~GYEeZm=9rZ{KW`5K|UND z=%6D_eAmO<&&_WHJUVNCcyxmH!hvw@j~AJr85#CDfZC>@lZ&H2GeTDgdB7BR+j1*{ zBCzzwi|zma|A$XxgIf8}=CJFDf|sDlan^_HKy69Tv0JV;>On%V2~fyxp+g|)My^p|*Z^VXtx;jP0byFNQDIb&WQJ{^dD#xiYTcnfK&yE` z=UIUcw_-Wg(6A(hfzbm+yz`L9!AC3}pxt<#O&wrsLw|s|-8@GVK;GoOM`}!r;;D`h(G011x|pz!#> z%-YUkOUXtQw#c*y#j1-SO>8kR&IQ$8pv$H5CSfWncrogVY^|1?Wq#8V){>Zqa)n ziEh^WAPQo@8L%WMOj%78LAS{;FdSp$1F<~1S=WQq9e0pOSeC+YjP-;9=&Fe0tVb18 z7(g4iJ-S)@Knglp_bY(h&$>rJg`pP|e#coas;V$d0PFe$)%9LMg#na|J-S&pfc)3V z`Vyk+nSu(#REVy{swxZzz`EW*b%E4?I(r`7tW^+Qk0H7qD5x+jgyoy;f0SXaMU183ob> zQUkiuz@wXW5k%K%h%QhdpM>bztD?fN0jvvT6i63H4fqt?Zq^)#E>K)}9A`bGpu%tt zqN`s;h2g<+a56Zt926}KkaGiBcP$4c6%KBXZqfB1iEdU6uo>WVG#4z%3EIwGv;eHj z0h0Ps7Ql5yf+V_Gi$IzoiN_r*$;ot#H3k}Aksx1y%OqAUkn&E}V35dh)&K<+hRYBa zepOas5Lf|rp&iJqP|?kr53w^xL51NK#7;$J6@~?1T}4n`AT`iboB+|43DK3Npu%t;qKjDpR*2n^ zS788UvY+xQ3=XToZf{x!3MU5%2e7f-@{r8YA+N#!S+LHU2vX3=+9VHB$67D1!tfMg z>>ni+h6`X_qEN>ODX1_&me8|mLv-;#9K)%g!tfrV>ztAb1H(#?$N8bUKx)8yeY#me z@#oRW$_CK|a`#V&t_4ae3lbp3+(>$|)P1KTUm0kNzuN-7K!z`8(2fpme?fH$Lbv;Kzo z>kCBJM|l+nA&4$9B^8DPU|k@iK)OI`Aj^SSk3w|4gXnrKufiY&(e*-6h2aBO7sx1( zE|40?fDvmyMAr+5uBY-U42lq4yFg{`Do_}Li~{Kbsks43>XP8>!1@TH>%P1Sg9b!b zkD>}g09Y5uD3C6Y8qhvLk8ak-ki-K@ARfnAZ_2AMm_c-b>bnN8E|5_mT_81}{evFe ztZN~rK&{6ar-K-ZEgLR#P=sGU1!Vn431uBdLR)azVWE4mjNDXM+j7K-C_foK~ zBM@B&i-KfTi_73Fy$E3&C*BdM_cyg)o8+E@3?nQ_2KW8VXk`bpxU_45D-iOeqIU zDQN8*!~w3az+;RjL7@*?`N_I}2~um+p|kdmM`!5;k52GOXrQZ&+83!Xbi3XG4a>16 zF9Oxspp(p44M5D^+6OPLi83*~SUH)A;l-^7j0`V!A7f;A(Gb@7#LpIef|F*v?GlHbo~=RMnh2YSG9(?iubln%IEy};m^-PD81n8&>&?%wdX6$hXP;n0S2I$r=k8WE7kcpuB z^2H0#s@hJ_Zu}pR<7AG%03~6MZq_fLI01X_6_|zOJ(Lq)f*@Wz3Q`0f+jPB=0TM#( z8!Q7!!-9IKpZHSD4C>puVma|;KR8xE{j#kK;W+`C0Q*3p(#<*tqy(B4paBKxXF(ER zEl3(mS^(`(1Sdemi7!DQrQjIy0JD%{2!7^6N9Y>Ru{_Xpr~pz2jU;H|hYs0;kL6(m zNh2Z&miRA#?t0_jR=ehfENF-Zat;r;p8-0M0d(;j@-aK06DYw4G&H|p^ssjQz~9#i zYW5s=y#PLR64Xlo4TFQ1{|SEs^=4~7K>E|5^U)y3`D}n34gBRRvNY%hI`HNTX3!Zv zpd;NsAh@7|m4Cdr3%Y&ixa$S*v6kJnANGMdS}#CZ2Xxra%T!R0qnlL<)cyj8n*f-F z6mGcB0R=6rCUgWS?ql)2zk_@NKLWJ*4JZqp@PHoEHXo8Qn&yKl7SPB%)}kpHB#k9y zKu+9rJ;A@tK?1bJ!*x${?HuNwOeH4GwR;#!ok8UR=mbvCiPtaMBSC{6u0LMu zfP|AlvD009;6+XhR9F-w3^`}B_P~oJQ4nE|Zq|qMKxGanbzcXwkOHp2qq7#W?!7Z~ zhR1Q&9qS-|S_e`HUHcAAagYVjkhSmqAZchx0X;?S0OT-7*A;O8Olhv2!dPO|TswuS zB&fM|3PWiDXk9$$91V|d@KMVPUU)qO&$fN=01eB6M~eTy_5!Jb9OejBwY?0i>V-#h z?F+~OV*g*OfK-9ba)g_uRRLD@0Cb!-RFy|J>yx=K&)=F0s%KrHVbe zu?OPwEgT)eIh>vQydhfk!9kY6#Z@;F7T$d?CjQk8X$(Z~=Ph132(jcyxnr!Fb^Tx*!8I z3f0Xb;L&=3zXg1#&T-cR;6o;{nJ@vT2_^y_-JuJ>8;ZpLfF=~cv%@7)p!@Iu-HMco!Jj6f$}b-Mm|4L&pubnVsthF8uE zFQlO29^I_{Ghx1N1+$Qn9jJzY`}!xu*9jm+xP9#il7{*kTAE&foSOzd4Qa;sC$rN;R3ip&<$GaUc2K3_*i^!&FZ=VH2M!Zzv~5~hqCJja69|B>jlWsVBj%X zmzxoy&2OA*UpFr(b$mlF2?U$&6A`o(#7u;k>YW(qHA|%iKc)c8?2y!eJrUfNn z3u;%q$N(L=3T`E1SO$vk&f_m0ftTyMUg!m-AJFhJs2J}C-@XHOt0uutar8wE-_ zoyT8H1{v4QS}+}!JkqAao0E_z0c}m$Aq9yBPmnU)rI8j$8c`a-nso;tM{>ckss*I6 zbQe?}fV^tUJynI_#R&;$j{{Mr5*#g>I04jMvK*BAW#pk1DzG6Sp%boUS_860;#06F6;6qHO+i@V3K!7&ai?hv^S8s&8$({Sou z3f7Iq*dDM1C?LS4D8g7!j6+LjJTI& zDd^0CPS*!7*`cN06ma?gS>*saxbcQZH%Pzh3RvfB7U-~V&~=WWR(3aQ{!~~3NS%t7 z01$cdxa$cmNJ4M`DaTztD1xLBu>o(wPX{{+T1J3xuz*Cw1<)2MaEq!U43tkGvkKq< zL@f=yUxDJKcEt;O&~aLz)B|dw;|R>o<1e;=j`#qV!N*-MK+Y!vX(#{%Gt^{@7xTX% zDjh+P^$>-%J6?Q+g!KjRfn}g048cbM`>ycl4h0=%vg3s#D0?4wy#PM245XmDf&^E&{o*o7Ekp9CyOk07=9AfpGkVW#Ax(Rzxj75a~?~6d_>Q z_cc^ahmxa)=GkiE-Wz{kp!h=VkOgusQu$2s7>(+5Zk0JM7%(gKhG z9k>O}W8hoLKrN1v8gO(%Rt183I2Rx%r@3x{jOaOnj0Ooo$|6uAVSFJ6ItU0<=z?wy z1C92-fZTNj_S1_O;HC|%eI~=d4P+Km>w!{megd7L26iUrU+^#<(?nQK_%Q**f;YiB zYfm_IlpX;MXl;gs_jQm0XnPz>BH00wMuhVN@VW=^=ots-QUd;Mu17jtxIoGE0qEd0 z@VG`dgGX-wBZzs-ML+=5On$Hq6vSX{a5>Piyxpu3AoIbg!*2pCb$~V{gUhQ<@J>jN zPVlz9j;T42lDFe1#O1OetP&59x>jcoTU7*kc8+_b#0^~?8$ezt^3&{G+uJ@qT1JGk!CxeQ8&`n`I z5#Sv&t`oL_{SLau7pe`k+@Xy1#e*lH3=LWoJQcJ{6mpS-3V-WC@Jct=3DCp5Za|7V zRj?(XO;8}kpyn0$DvH@)Lu#Rl7*G`PZ*vh40F5KGru+vTZ4Dx;>YbbSf*6VXy`LEw z7$BUedT9v5k-zsYTvVmR{3U2%2}CNMzvU3UCYsON8A!OXz$ zaxQ4m#BtXNkn_T7AM69C=Ik#`|&C36SwI zn3r@R(x5_Y!d`GlLPHT6_`G0wXyA*1_CJ8`R-OynR#9RAS>g!Q1P%Js$Dp7GEqw%w zg9FN@7O~}`1bit5#5&lO#Y^6TV%hb=%PL4RoB)b^k8YUs><=JmQ1|@?#9t*~^~a!l z2t7J)y~u;4EASb;kki4of|E4(au3KEME5~U^gBT{2dEbb8W{s0fZc1u^x_}r2pmws z2wqQ8d*B5VNG+reIq>2uXw5!kPdPY@K|?bL$GrgEquA+s&>3AG-QZyHfFY~a5Fx2T|QD<4E0p2#>jg+xGx+py?KLs2C#1yTR!ak{&=SN?)Xa)gz~eIM6v~pw<4z zT_-?J4Z}ze=RxPmb%Gk1u=D`Fts0ab-f4hy6k<#MCs2I`>5FZ6@f6Gfok{_|q+r4^ zaD;;aw1zaQCV-Z4LoOHxM-RMEaeDyH9yg%r031d9`#>k}K6o($QcZyq8R)<- za7G4uuo*Ok1WIIgKne4>>jZGU3ckM_)%fT4aT{-mWIX5qE`;$aFym`M#&@&Ib%AO& z&@h7tnC1Gwqwxr++JKFAAzBG1GTwqaxvx9H4I*5f+%q8Q<%{r$IjtiGV=f-J5G0!xC|JXEu*Fa)dvP1L5aLY5gMvclKkJOaf`Cu=k-$RgGV zRuzVFkQa}$`m(DqG^_)!Rp0}e4qs=%05%!C&f;q;NEbZNpS6M<1h(@#n+n4Nu$>K1 zJ8M}%wH5dvWIa$^b+VR2>?~nbVW@}Ld6G?qL0~<|rBzT}AT^+gIgf7EA0StBvKB&g z<*}+TG(&W8gTf7Tau(|o7Dxy(vZ^oyfP%Z5H3;HFi4731M1#4o1xUVN2XhE}bc;HH zB)VCZK@=ne4ZxD1Cd=w?0J0?H+<_aM4%v#2oiKy>Y3h9!cD%n&cEV^(2EfOw%Dr0ckYgaX711z;{L z3naCG!W_KXFB~iZj|~s73^)sbJF&>?-MCQ}p&e@grBP6`60{Z$Ne*Sb8zhN?*Sm2; z8sR)gKY-ecxU&Pc^=<;71@EjN3qhH}0OZAHSIBxdCir@{4i;E=BtoOKjzxt5thk#s zzZn$h4iXF?z1^%0U@k05i<-gVA?VR9nhuiaX7vD3kSGlWOM((8w9(qlY6OZ%a4T7( z71Tdjl z*1v-Xm=Br;+JE4!GsBBl@HuLbApsym7C{Yx%mKNc@aQe@0AG@FUj&>D%|T8DdtJ8$ zUG&ZnSxc@OAZtPRL_-K+v2Ww<^35fr>g-I#1}by$1iMUMv9mWv>Hur0@%vDxAc zv1JuV8E#v;LDC3YU_%EFAQL^H`{F?3BDE)8WP?H%JaoVs4$=d**%!=$j~he%7YDJ~ z03?aqW2_3?Yb)xUVK*qH&Z}|Q00KsgT0yrX2EO*&AUY)&%3oithWKF0=0OLyWW5%V&pMt zS&%d=T_1P70GWybwVlDkD4@|N4v$_ICjM;<{M!yRzcA=@UDI5<#*DvxGpLJ_?7IeX zzfR{NkIRodIztzDfR~#vFw`-4D7!8IO}eyB1*a3&1*%|C(CPI5U?TrP`+z_bGvIsZ zkGo!gOw2$As6i7qpt(F8uKBSKw4CwIkw8e1&Z1@qJ*cK>_W7ZZ&um5yfiour|VKk8W1Y23X>i2eF!uM8H~m&9t4{ z3;|s{*$p2@!Dkz2s2MaO1ev4z;9+L4ECRR--ytv}=G^ zC{x9UkyOW`0!nfIl)CZoEJVoF2``a&g0kgFMNsh!jg$ZmkO!fYK}g1dM-`EbdkHG~j=NrfPJwIyhZi`yt1yj& z7NJPS?E($@BN;afY8+(p0u%%l9FSXuwK0tY_3$8ff5FmBHkxtXP~)Jf8sa)>kZ13J zj=}?5ya7CAfHGwPGfoE0xIdt#AYujrVjMfjxL!=-=3zv|Sx{daY$qf|uZ0>18kYo@ z`k<%)bsk>WVHyXSa{#3^nCt4$jEjRB2bn8?h8;J^b)eIkVQa8J^CQPyFF@`9K{iew z%{cH4YVd(_sBxSi;}*zcBoxTtII?lzdlis8djM2(9e2F|9vR18z<|dUAQru_!L$Q9 zN{*Czz?W?z*%1S^13EGdi679?wHI$eN78{+!lN5HMvY{gE@(6XtOyc6;PY*cyIufY zxPh9^m{C=NvI=MmIr4Nk`1T3NJmQWQil8BwfV>2bp{|?z+=ux#T0lz8D`5h(7@ku*9(x*V%HxYw*MIz80s}a8ew9{mfVmwuo#0h_TqTOlwR?C=%|P8N=s+^Kd-Z}(1w51V zseh_U=Kv z_NNT&HSlS*P_Kc8g&8~`EB5Y!q!Eh=z@0(pS`+xf0O+vc3UCPz9_9NBx{Ux-R~>gf z0J@Ftiay9CrLrENg`Hqi zmxD~jRKnk)3@P6ZK*kbb>p&|&%At+`9i|Ve4#D$Z!r=NEd?w2Q&`J3q7oCTc$uK8? zCPZ9kG}q4H;%@;t7R0LOZ?2uez~7#fngA46LpHTTJO*CXcMgXV&`qfaK&HX2TRs48n|He|00*@asL0g?9lr-InifE- zs{`Q6wBVsu2r?WrgDDDXCLMP@0J^LP9v1B2MgSx%ASc&@3`ev&)`E_$1Wj{+Ed{qa z9=uQl-G~Hjbv$?>45|x3((qQtgBKrPFfzPc0t)Bjt_L6k|Df0g_4E(iWME);?F$O1 z+h~Cf8a)PCU%~Mr40IwOs<%K#$|Hhx7IX! zAt41mF&(5Br0f|)6K@GmL+yXA61Ilg{|w-Z-4B4yP50=AdmNNuUV5u}&?{U`y-~-Mf%X2_m z7CyX$#W(11Z2oEwGi@cA(o4KuP8jGzLN0-lH4I5#6ju zieSb4t|GM3a|i5p*pHARW+q4}?uK?1NE%iHAZjp>ouKq`0dnFns09Jti*elb0^}56 zu$X`cB#&PJ6}zBn=_lAPu0K4OT|a=j_25(muJK>;P=*8YG@pt^u2Wi zan}owQ*`0x*d&zkgDPXFu{Kp@laRR%Wx~kZDE>C^86w>X{radXEcx5~KsgdgMLd6t zHL6g{0sao~ISMfM9Cy9&2kbxa#j`&=I>9O8!e6i$s452ST+}Fp#f@AcQrti~LC0NB zuzUem!;BzhxZ~wf0oD!>JYFEj*n;B#oZvuV4?d+9+=c@e_CG*k-~(QdyIuevhYHDZ zKS1%a?LepNmgd?m*8J_D%;1siy9ITuWd&rcg@b{C!$aA1g-7dwQV&o~qRIfO9YNzP z;I&^nK>Mpf6$Dffe+#%#f86x~2dLEtF99Nh7I}&Ju*d`T@KFZ8gdj0!4^oRe1{FZkh@5o+a+)6~m4Gvr zFxYZPvl`UIV0f__Gk=JH71i!|u^m)X9Cy6{IkpcJ?chcY+6Wq?UmL{VauT#cpmt4A zy&M~nNKpB8-5s(Jcip zPemw!IqNcb0RW1#Ku6YrI(^3&*g>w8V`O01uK;r8MbLRs;L&xsD?1-DGQ8x3x)O9b z0YoDUNF(G7I^-}&!?a8ZWV!>$^kPiYwLzw@26^ka>jlW6avkuIa{{?>i|NkZEWHgW&8X$|iA<{4A{`~*{ zCD?<XWk8Y53R0*I;Ue|dYB4R-0eLh5FA+;kmG)1TaDWO$tpG7FTpVe8OA3tSjp#DDq!|225+xe44_ zMvzidkckZ-_uk^hNSu>ECW7|uTrdOcf(B9rXdys1t7bN=1d#`^kjFov=NopGHh3I& zouLXTMSf<1y8shBj=Qdab^$;G51=jp=#0Z#AZf%IhoEW}RD3LeoR|kXm#`w?g(=vP zt_M82Ydc;ff{(9q1+4}6@L~=-xW94&EOYW1xC{o}Y4PGk6GR4d`(MM0FI*sBy588o z;2r2t$kGFl^W2LqK|_P!JsUwFcYymg9$*$y-v&~%A*~ZMhxkk$q!4%c$N-Xtm5<%E zE0Av8*%}I3BPS}C0SZdj6`*x!$6YUgTK%B3z`xDG!-k2!RSTN)K*#2R+DD)jcO8%# z8FV@nsIubU=D-2!O<=h}<^m{o{q}>0azTkV;Kh4RP#}QHA@~a6<#!?DcMjl)25*zX zW!?vndH?n?GC=0h7NHm>0h&jPf*J-nZOwHDbRKQTi|Nn-0?1)#t~)>;gu5Cvl@N~p@S+?n06rXO$BUofaXggNJ*#%mS1RB`@?}UftHBeFn&&#p% zw_7qZFmyu(%oD!A2FyWQ;=xs)0|&!Pap>4CX!ASB1b9qr1dRwBcfA1G{0>_@4(Tp# z`ThU@%lpvW91ac)$l7wqGQFuF=>t&dNU$_g=81wD8wHgBWgZ)*(o|5&kA{eCIOf0s zF4n;Vk=?EvP~saj2!KeW1)xM~z8fhg+yF;3DB?gBKRC5bxQUb#;t-aAb3#0nk75ay zM0E*t6CpUcAacSUCQuQCoD+;e)g4$BG$$y51)w=$2`Jlxa{}CLUqI72$6YTZK%9X{ zREChQ>V-t81UR7BO65QSl>`-oM-~gHEdb6Q$6YU^Kx9F|2=*a(Iu$(_vH0-APFOI) zd?@+i79-e)ANDPPEo1z_WBZn%gp8)j#S*Xp_?o93FVryIRtB1cJnniS6XFa+=x+w~ z>bqIFlR?=Gl%*Myk+L*=T7Ll~J3mPRHwwT*o;yH7u)GTy@;nNX#xmpyZkio;eE_Dr zYfrrJ=Ld&2Xlj2VNDsIIZwIsB6*$c3Lk5W1&8n6F>f^#zAW0;E zSKNRW;qihc;46^+#e-zPE0DnLA6$#@7Hq`72yX@0TErr}2Vb2T5DS=KyE!{MAnLF# z!UI_WT5sgA18ET+3w#mYibu)}pzW{6SQ{THgN9dG=RHzp04wfhHID~**Fj>!Ch%%F z2QU}3lm~RCni1HK9H2#b>L7`3))Sy$hO9Rd1xtdKkVQRGW?=R>&Kmwm8MadCK^!Qp zum(O-28FcWBV`5&P&6KA4SuA|zyNaRaaISYyF8Awrh-JltK96MPIP{*%vGbn5Z$L^zN$_x#gK?YPq4X8jE z&R7C1yTcQ?s#;w219h^Ky+n3QfAPE=wbso8tnZ0 z4JByC1>vTzkRSsEfX8uG>qp8A`ViA2o+&dt z02$EDx-b?JTL&Pq)dc3k(rQU8C`E!-%VmNk;Au4qECWuf;ISIy)pERu#CGrj%drMf zVuG!fLy|*TEeA=9;MH=xu+?%2_|q-6)p7-(>XQ{@At?1O00kFpwH!NqwcIOcqB_QU z7!=AL$5|gdQf2@v?q+R_frQ6|t>Dz#1?Iw1NlgqmJd{1USqs4u@bE|i%Yc^3v1UI} zX85obluV95qvRkoEqZjbDuJ|hvhIdN_zpxWwtb?^ps)?3Yadh>NDXK@)}xzM2Nd|7 ztXm#2vz4Azi%vIk|#?V#Ab0M!Lj69LinFA`j`9f#;T z@=%$<9->PSRH%Y=fs6u`SRgeC5M2_WSnFgx2+_6gp)!LjM3?qMWd_I!X%=W0C_YqX zC;$amH|r{pUB?|HHh{taRwZ_`MuQ9k*P4ORp!#|Od|fBJ%Dw?Iy_?k#q!K!<`T`^b zGXzp)3xT8&RrUiXuwy~9lNAClKnFB~rW&2$f({BE-Jl(lUVMeRUz@h1hn%Cc07bS znB#f_bOE40SdZ%s=z^@yL;FA?5OevU=7NtBY_7e*P!|Bw5(w4;+bPqznUTS>^9bCD zpz$)O!z&CR^9+8V9MfyU3|CVj;M4i&MZ5=i=6XU9*gU8nP((y%AXGw)0G%8STBZjY z`FjcnYLx>GA^FgLUlJErRNkbDr%QWD=aFFl-Z7Z4&J}m_#1BsWi zm5}&`oH^u*SWE}LHm4*6t{>qx&}b!Zi5dEXs89ig6{L^=?>T~n21ppR_VOj<5+BzI zkk!)A@N|&yfNlVSESiQ2S4coQr&1e1aSz}0*BJmh4r~HwJvH2K6%vqS_a1zUJm?;5 z$o{|zffsY!!6R}zJi0-%5D=pwTZ<<^ieHFOcZCG#WR(~HK)njkU8PgNF#u8miGeT6 zAu#|sfCs7xmUL@RKXOb zrRxjuBrxQ>6>gBK|40I?FaE9pcVb_7fHDSXqa5gBvtRZe-)li9#(<7Z_y9l08TZ*e zl&v_egt&nii>Po&5I4GQkg5*4ibxGo!8nD0>SoCKS)f86RDFSRs0XCFQwB*RsylGE z4Wy(99J8QW&B4IK+VuecTyRPT2}4q{)>3dveo&02uucY~9kOm6R(`gD=JP;jzLXsjOeE?l;e!>IkOg`}8K8R`V2apxv;3E@3)43KN-K-hGuyhp%X2Cnk zu+{g_fUtoCge6E3C~X{feSsw)q(IVG0s^`+`~>t&8`$b38(w}$-Ui7-LPTN-Bt)R= zzE5~`S7<;oW*aCYfU*(jT*m+nP$1NS0|9(B(TNwf(C`6CK$nBV?E3+#AV7sMSE(dO z8nUt*JgRi!1uINnH*0hdEHDDWEL?%%3keJzkRsfH!3&bc5*W>3SA$XoxQ2iS1{X9i zK=P2l;9d*~j25^KSYT9w2ZcdXTqis_A%Ou|Qw1=j9z9ose@mAuFY8 zcR(^sE~uf>dHjW|4JgP!X#qSK1WGWVQSS%f6%E}m)f3>WNkIxgRn!CMa%xbKVgWAg zj=Mg9uAT;ofhJ8svvUuofjkEqfC~q$TRQIg06c915|{!?hTW{p{;<&h>4y~hC?#zZ zB;;@S;Vo%*f}{~44=-uK%P_#_ITTocPa-@B9xHYQtqOSnIo-we2cne?5`hH&ius@l zk2MiwF1Wi94rU=`63~Pn=unU)pp}f%A+9t6DS{r01T6-US27BNq!B9_VXlPK%*S01 z%x7R=*x&HYnc+ny=;%GjBA^4HiBQnYl?UjqamYfW1JDK6h+~N$`-g0JODZ5r!9~ai zc==Y6h();NKnW-}9e^GKgKijjHE!*X7k-~WjXQ9V9e^y~hAlVY2Gud3H6?|RX66CN z!fn_}CK=EZ;4 zfSlCX_Ze)&507r}!1WKozNALHB=NyE!H$H(}*3G&Iqzvj}^^?Jp-~o_1SCkn9c7ld7 zST93{QJF5o2Wbz30;iMp&n566?axcf42(a(r-rB8^f(Sy1DZ_n=w_7# zTg3VeqU-Y|Wd;t2E{7}13piZa83o!~K^ z%N}4aLWj|gdVswM+U&XuB+UyI+z!@TXx>i7RExn}7paRhqbXl3f0IUmS6i63H4I~$^dO~z9g6NumNtrA33wH4qqwu`VJUYSSG6yt4^58L-NYKJqEf5!UiX3DGFaI{kauaYD8CpVa<7YoK5Shu;}63tmov zHsC^A<4vHT>SkRHQUJ~N(9lE9_B|kJL@0n91qz)9Vqh16n-1W{CwL?7an}cszaRZf%kX|8{;O7NNV+nrH)-P~tu2%$f$_fL7&B6qW z1{rYlfWw&^9L~pGAIQSQz+>u=#lf(s>1JK*3ace%f>}t>0LgU6U3V;jxVZwP0NQea zx*56U5($#Vo#76E2XYa9LeGE)pkul#K>IC0!&xuFA-yZmzyv&Zf)8axjK9K;ZoJ`P z?fRfT4V2-)DnLyDXnu78dmna6E%eYN1JLcNpcw-2LLBhXQjmNJJ}?oQFF_pw#F;G# zkOs$%*PsPx2VB9X)_!=Q0C6N};yA(u7L75|p|i1)xhTkGt-G z1|?|e4QMUf0*_8sK9Dr5I716E=(d&(J|Gtyhg~BJ-v9~=sSTh}W{+;y8SvobfO-J5 zi~(BcZ2$)rBF;8IPr|(50Xp@oAAAbXaaV|{Zt#ISpvc$&8LkHJ`<($=ngl+*>+TG2 za)02_9XbPi{ugAk!UoW&bVKd`_);#9slRl&OH}sB+NA z#RkxzGKde_iVHe-<;C;g;1lpbxg~mgc1RZrw2KNYVkE(RMb`^2-5~ve4WI#KaMS!6MCJqN zJ|{<5#IS%_@Q6X=g&TJv5%bsqZ$WwlBn{Km&AJuD1y?$&9l#9?(A*Go*Vzn@&Qeg` zUXk$A8MM%#6QmXz<{*rN>=27(vC3IY@x2*A2!XK4|||2@fPGFnF{cC;@GN++YHd z>aLyfq7ZbV6?mb~1lTHY%`J=!FF}23P$n@0^$;0;Iy1a*$5iTe?d@ zD{vpYfE>RF>-2%HodK(btcM2;oWGEU_z{-yUO?JaXCcj`7ccFg2@iTy>4akrlHjnn zf`=PF=uj_s2!n=HUL4;99!}X{4OjH)9>}Gj)o!3@&;YHiTm(|o%^CoXchJ%$H#<-w zgQhW*p5h!(g6d{f1u2EL!Zv_}U=2%1Pmv8I4NJYpT}kdKwt*7jaaTe;#rd|NgbH%- zR9m=%k&f5A1#($8YXwLdZpTJ~q>&s8E{wqAD%3e%^QR5WmG5ofuEf`dgEVqLi#%R{ z7le>@c!k~+Q1J*adC&*^I(Em;PD^O{t1g0-r&LpG`hM2 zvJCwJq~!%0>G6d&lwPJo^4|kU6AEG&ycIDWYy+r+0Cx|6D|iFuaaX7gn1O#F?U^4h z!TXnwyFPFShbEeVZeRl;f?y{fc)`rS?SKa}XmKk8xV}P?1g+o&ErIX+09)t^4h+cR z42U|oQ{VLC4h%bR34$CLo?yqp-0lE#yALQZx>;qdU};+z%tC59LW+&!t~dTelG-Or zM1_YXsa*z1V@Ybz=HLm?fIFBZAW?lYN~;*YXbKwz~wVE2{MAc3K}K{ zFSYmqPKJ=U2hFl5yzm1Th9LifMu0*4@E?F$dWe+i4{3FQDu)N4mLJH9V-6Ca#l{an zEk3N)cJ+Zm7|mK6&Jt0OZs@WPh+AwFO2OC0fEtJhOK(9MP+&_T?LUxTB^X{$1f_7u zdI4CZI)G0w0k>p@v07_YB8h3OEq^Pxayst%0J63K7QyjIRzubmK&%E?3|X{;#o}4L zB={H9SbhL83TEjmNDJ!6>xCd|KsOWZQ~)O$&{1Ropi@LavBd#8-Tj3+k^>=&8?ZQt z6Ptrt4uCFHcYOfSh42=*eG5MS6*LS09`tiFhb3zpbEG00o}{IIfm>SgAZ55qPX>@Q zmLv^okV2vazKin#s3D3qE!p*u8nzIlU}4(_Y0*N%7Sd=14}*YaLqYAk2aubLK&iDt z0n!d+hL-~HT#*be2Ed9mAd2pxWF7F_B;=qv$lXaT2TDK-&!Gp?)t-0(xi8%H0cZs2 zGQ#GrdO7H@+}IoBi2wMQ6AxSMN_=$1&m1npb|B^t=O2vDR-GQ6As zH65~+0TvRV6UkvE2xLtI7JJWkVX@anm%sH2s2O(L^+7H)AdWdmGJz}xt!Y5yTm{Ii z0XXM^);R2RK%`>@NSs$d(s4YJ$^x*NSX|?X)ipQ@5^%?PHdjWRd7Jt&JRFS`Usz^L9GIX31n&?i$#T4EyCv?h*2>A90Y9zf%^xvRseTF z@eiyPRrn0Y=w|(31S?gZ8No^w*w$n41tc1fV&w!#9dx`3T2msA zSFHp|Bf8SC9?t>j0szn*9~|((6L4h#J`W6Zeuw}h>sEm_ih%nGAVCh$x!7S>LA?Ud z0mrouUPK9iIWIiAS#3a;fjgc?V3z9(59AGxv_0@G8IoLJt6~sE>5T=DkeX+Rw@pzG zl0MFQMPG&C0ciaGIO|1y6$Xyo;Gz6O`kTg}#Wr2@rKy_a=a>0Ilvmuor1>0yBJX zLd|Yv=-uC;yCE|dMZ1+5z>2$BFYAH4>mb3f2kiSZU@ilw@9)vgx=#=6d(aZ#%^-a`m@1LnS4nPCIS zi^o}g_9!z<0PFIF>H?{O&VY4;;;56=1)|Gww=%;Ph%UK3$_xjLkX==!i*nc)Li7sx1(E|3~YZ~@DDUKf;HSS=vBOm{0Y9EIpQv|E`$ zVK2yEAfrIKKx#mvcplxXD?uUB$!Y}ArN3L5;S@yIl-YqY9R9}ti=#r zIuKo&yOkNvL3FY0Qf6QSFI>OB6B0{*b}BP8fTFaU)fD8y;|>xApjd*X_iom0Aj819 zaE%_Q%;C<@mdEi0e*ON zi(WDSm0F;t5xBJgi2!gzK;T8mZqUFBsEmbOnDPJ;)U`kMwf=Tycwt%#s##dSfxHEF z{~KM9`=KKXpn-buX(rHnH9J8r?q)p!QVm*1d))N~)Dw_##9mO3lXWFX8tO05pfc1S z$6Y~Za)L%gF33Yh{MK~3u4t}Z!BUSz{8*r4}dCJ z0gvMcL3i^(jwRro2uco+!;Wk~z5(4>!`}*C-*nvdfGtP}bmS9gfU$z@Mf(YGZhW!t z0jLP+u6^+WawZt~%EK2gAP2?OzIai=4Njp4>>&EVa~!=DtS{Ul`XB6L0Q9#jXY07@0m%4{>jG$uKs?kP`r$=mA~;r>YyU7* zDuDtKIiP_JChGx^QfTVp_ybx@ z0i7*^3^FbRNh76Y(1k$Yv)Z~DK(%S|2`~o|1t&Zp_d1;bje_*rFnM&IdZ8#m)N&Ln zkTu|xWq{Mc&{V|_QVMl2G*uywrhU*r%?{9Up97#1zrm}f-9e)(-K-}->cBSc(?AL$ zl(gLGI|a0)zz7s9-K^68q`}m0GhG_mk9enEJ$I(1-dV{oAt07ET8NIv#^bG=n{Z^AhWw! zH9<;nTgL^GMpy?+Y!ASrouEz@;>zv&sxUuZ1+%dE@jS%REg%KBEu9LIMp*jbJ;;y8 zT_1b^(I88~_h52>R(XJU;8VUId_=9@y#(oczRE8JV+ZY*MYk)H+ zXvzz=iWhVR=>t%O4_4^_QVCk!3cCLe<<3W$11Py|6@NaYA1RZkxfT{HWWbLp=H|tc8Ca|^LDp*?x(0cnb#0hC2<+wxB z9V88P0?7K8;DD+<@B%a`4GRPCs&a@7Xqc{|091^u@@UenS0K4b6GCUX{S8akD ze4tC`Ko`zI3(jlG;2;5C3Ii=Tkz0J*LDH~9ecbf|bTA5Zj0&P10TP7dpc5tF>i7a= zII4EV3(y&oNafuH$o3!5@P7s9R^Ao+N;n)DUL@@Tl?>oY`2uK=3Vc-~_s!kc+kNCpkf1LmL6$%Kkv2?8FOe*Z?+YjjAx%Zq{^=VsPxl zVzp8nVx2U>!2RRQMT z(_j|1lF$p{f>j^|xLwc0|*a0zhM5yUO_;K`XaFeLe6l1keE3u7?Og4UcYCZjk-p@MHwDkbD9PQ%LSV z?s_5x;+s42cys<SDhv-m;{(T86=hWz zIQFH0&Vf*qRbeoIFtue>7$P9dA2KQo4G^ZRtO~;l2=kMS3d02uvzzs|45$&x0O`iF zzLkLw{5%3lbh8?RVhu9za{(*~8u?;XT&v7rupcx)qO}Gx@T0y4KJfDZ6k?sMifh0F zKXPl78QMYKJI?xfjWR>Re(-ox4#@Q5u+g?Su*n>t(*%OS67bPB7qAT2PTMu0o;Cx+ zF;=lPpn;NZR&|J4i3t!hHNafhDH&2=og4xl-J<*;iEh>((x9{jp3wO#4e}=^^D)+0 zt0C^6z8Zc4#sjcA)`_dZ?(bWz%+LdIzxHZn(BYR1$5>fFERW-?imR0w6b^uWvjoRi0a|I^ z0Fvltod}{JKFGx517Ajcr_%29@;a`|qI*mxO=dT5v5$H8jIyfP`RW z1Ei_j2a-l)Ggxu);2@~pJMIdhyP^BV_&C5N#1D^d)-aGhaPId3vygH>N}<&Uva*|1 z9i#|4Km~OLa&rX|AJD!kbaVY#NH-K>W} zp$2x+PB06@NylAJOoKRQ21o&J=Tw5EVc~>u4!jKg3366%=ns!xaPhX|g@q8fW^@GU z1G~T+%);h^6%ZGQffV3&!FNeenS&7^a2J41%l7~U$PXQGfV}YN4gCN;uK&f0m4aaB zYyueqcFqbg3&}a4aYXP0${vVw+Cd7S-C=0_AWxuVfTR)K;R9vh76|BqN6@M@{#I~+ z9Ctm?#K^$#BAes?|853QFBh~&5!8=s1}R5`;{nKsr|l_m*x)JeOnA+z3bG1x1TnbB zaX<>RT1^sUqQ#3McJLN8(1OqpFOKd2YXPnI0i6~CT3!aKWd%T8vwg?^IWxR?ozBSc z666bz6IvlofV6dvyTY8{4tGKqXi+Pu$J#BrNCI5BKY%pEz)tW0t?NJTAaEKST(u7% zHgu*lGQ3U%8Q%^u9=5_0X8a2=m=Cof#^3Ph7IlUge*@L{70~gP8{j^6ckK;`6>90= z-obNmkdr`p{;oJE&qIfU;Z5Ehiqnj5%M1N$5 z1`D&5U>4c}FVMwvC%FHE3&{?U0^DxT1WCi(j!4HBc$gR%_JeBZ7caMfQzK{=8=gmb zL38S$lnfbA+u_k$A+QUq`Xmc9As=_Wzz0&*So;AaQRfcw2KY7;&{z;?c>D!;{XysP z7wrfeE(n11bccdA+W&y}r+O;{UKAi1EC^NvE}(wANCur_2`MJ$h{A$p5|{;#SlTVH zJDUSa#7N-}+BkYc5)$@2AXnf{vu{PfB_S+S;T4o7DC`gXb!K>>foPK+04WA1+HGJK zlHVLaoo8c+l`}z-xTCuYB#jx}FehAaVq#!;VFamoPz&C*pbD~^)e>X?*ctj@7P>P$ zAkGj1N#b_KXJN3=64RE+7UJsT6wP9v}$2lOe0^W!E;e`X(7}pP=VaAu>^Wu-YZis*gLQR?gGif2jqz4|| z(0K`Fu)5L-9^JJMUVH<222^i>0t{59f?OE|R)N(Qpu%TEG(;ZVCUb~QH=s7%crg=f zIM}8eFM7Zn*Bc-=zYYgk6N|+d=(_JWkcrX@P@^uq@B{0vy|7OoRM$iHXoC&D@B)0< zA7pm}s7`t)04ut#gIP!^5ce@7RM_9e3rR?@RTW6ztXc<-k5`vW;kVdv9 zNE%V^KA`q`>684haM{m~(K>*32Nr>x)y+B&q!hPH>p{{;E+ut_=>Ok;|3QNv;PFGy zxG^~C9{?p-M)=@XH>(858gNmVcR;+K>(rhwl){0P&GaVaSdvP(&k2 z;q^&iUn5FkFYx#(SP`rgRzxX~HrQCm z?kP}02G=b&6T!Yh?18h2tc$r}>1QUGg_eF$CjAdX(oq3OA?|KrAV?ZZ<|_r+e%$p3 zH2uKR6+EMrf#ks}OrZ6yIV1;wHj%+|95kk0z;;MOW9k6|Jf;pnmB51bKsnf4aF$yE zk172Ga7=+VhpYgvW{1WUvH&=y4pe}(L#kd-UaW-0)B$KrL33p%s6Eu_`T!PF2dY3C zn`?hCR3wA+RfD+QuoalmAl2QqE8sCD3p#BJw3e`T!HcLm@Wji38Wb(Lpm`3kiWM(> z!SQ;`1GFDZr;d@~wKd3!I(XyEcNM5L0g_+vf(L3^J;byXFAU(4GhVz0trh8Joy!SJ z1(P|E>Iz8Fd)#%$1xU=7ft2Bn`EZalmY8n_*^DRVTR`&2F>ebg;fRfS@RfhZT`^+5 z6>KhA%$vrc$GjdSqT9f#5fR-Eis%FnNRJAUa=yl*>xblVl#~P7>w2IQWB@2nqotI1 z$P(WNFKt12x|>yj0~YvVU=~sq1dW#9MZ7{Rb+nUO?+VNEU%KEzW_Y z5fwJ9{(I01_G0ac7c#Kk(Q(%YeIP+_It>GrpZy>%Je_U^t-kH9JpoUrrSQaa;KinD za5{YeUMJoSJripa=wGTrfFVl^~rK9~eC^~8(Kpab~8(g$7?LG@3Dr`xG;*&Q!J zK(gJeOd!92TLnMZkdh`SWWb&EkB|_#%?1t;@YE+XL?FdGWU<>GkTk6Qg$S7o(?IS5 z9lr$LRI&q9KC~Vv0ExVv-* zcq42uILuu^WgKWTEF;M2-~jl}3Q8zQJ!VJ^58bx<2NDpMK#FkJ@|!`@cxw6CV7J!J zfL_A@p2poU2P6opbSgn78A7<-wG& zizSP|0T1eufYjc2!3MUe6m+l4jTb+`#zMLz9^I_VSwP_l8b6y0W+7!fNXZ9nbn-H| zfHnkIfE3{_{USlqn57@Ao;$D*;=>g$=0oZ=aC>kONDv;f2f*C!+66DfAYKH8>h*VlM)iJlyZ$)%LLR!Pv{c!nyA|v@h(eHwFVesYzjV8P zK`1N%k8%74n+)+zH`sG8ghZf&EJQ1HMc`M0_Lg)B7nV}b>*3lrKh5|k{f1qoGokaFBvmH{LU&9dN7 zMU-E##?uBiaI3L&hDUGh2b3j}Cp;Ko>u|vb7(!GYcLmcR(_WqdMfh>o4eSsjCV2GL zzCbae6>J39@1jf-#KhRa@s$bybM*uVp_1(BaN@Phc=wV)A_2fIMWD!nlG1Se=vEeN{( z6f_>Tfe)ezG=6mhqDl~=>IBGv{9svE(D@c8N{gz{44$AVr{qPPa4y#VqAe~SbtDIIr(h#q&{AOSYE_Q8u8pujlpxSY_>t7mOf3g3e9=r5dndwh+VMsm%l=0}9+1t*Cfm+;xK) z$iU;S8_Yp;cP%KzK-1NIH*mVT0kYNtA`5EWfhv^;FU&l^lAuJl0d&caM`P^`kXAC#L7G0tU3WAJ+)3CkNp> z2!RZfA;y$o$2vhz837+YdE6DE3bYs*G<0#?^*|`tXz&6nME@)_0Ng(V9hZR8vqu&v zH34;(A=+U*@{=z?(TCI{?*^UU1)lq@eel8zRM8)IJpdhvgPtjJ>j`AC3pSAYZdTV{upqYng%rf_&Py*Oh~+@aa5t;|{{$@^fzSKHg7!ir$hPCI5E|6K z0L}ItdInCR-L8K;W1m$6YV9fa+n^>ED$Z7-6SATxdc!F9c#<5r%mdFP1^( z+d;jm=(+xSlt9Z>Xh0#?Fk3*6HBAc}y%!2okV2!Bb zt}ECX!9Bw`kOJHdD0`4Jq5%c7bVEBc1H+4A(6~0jMH@Q6Nd|Oo8)UHH(qwRZ1JpbL zO$@$xVFJ3G6f|-G+TQe{0o3+^l!>4YCB&~t!{41?<5+XPK$03{5(Ct-fwzO8lNfM5 zbP@y9M!vz{4?eURal#XP{JRTmE@=FlRRC%>csk>n7dSWn`3$lTyqSZ^qub;VXi5{Z zptRrtxZ8EYqq+7319;?Z1K6zNt`HhBS@PqxIj8{yEp9JBYL4vt;Ntee%UDQpyP+H8 zh~us>8Zxxp&3Yc{pib7KU=~u$!7DdWNX#t(DZpL1wSuH!Sq)LR!Ajr*eIN&b`qqyj z{dG_j9OwrLg8KCQ9njD_FaacV+!aEDM-*9aeFB9L=zx_X))xyveH4iJA!P9mu(;?t zu$b!ykLCm5(A@vvuQLNAI2G@MgA;sJEhLm&?}0+;m`As0If^!$LodW2<=>Cjpi3WN zN#(#KkmEqZub}E<^CNhR`M_k5M04!}hEmXpE)ecBG5p>68 zg}{rS55X?~0N!r^?%YA-kGq2DW3K-hUu%O3g;z@P~WjWByA!ulF0jS~x9eo8lPHiga;2yBgpkqbf zAA(ysFZO{84`(nBy8ZDEn8WG>G8$atfhOZ1(~_W_e%+-nUVvsTUY-Nh9mib{tOh#= ztF>|vYe7p8KtogyUNnHsu6+Qp_RIs2Bf!=^c##U0VmRP zT%NIk`hwk}I$$wa4rDn5?iQKf2RF6g-J%2Q;Z5vS*Faumbp-_`$bqcZAK(>M;~P-A z_UPOT>bZfYD$O9tM*^f6T6IA)03?q>I!8Z2PJmVv;0(~a*8z2L-16Jt;g|>Fplh2z zhw_4G=vWnGlnkWdg+n=PIPLodq;WE_?$(I^|NpBpd|+U(WoTf4jEVh&-n!t?%~}C+ z0N68m?@@9ChKF1r9&!h1!0jOokThNoUAqPGkOIgf$6X(QX-p60ml5G12TTtwe+S7$ zovd@;p?C=G0+T?9cPc>2aeF5cBn|ZrQbYKGGSu-ZAR4x4+Q1N8tAoa36+!yI!72`B zVJjkIAujm#7L-X`aZPeu2T4PVNaTi^CfH`sJ}vOV+$o^#@SxseX&w09Vc0sS<99$6 z2PoHrn|t6HZFXmH*|GzE5XvHiBIJ2`gn~v41$d`ZAQLBAU>DZzcrgWZ;#8;Whu4Zo zOAIdPf~0#xU%;1EM?ngWXK!E;cn8cv>e#?*muyJT?FK2pUAxQyNn;5*1CY(&HZI$!~?bY~pVf-W7Q2z$`EVJN^KbfArv7Ytb#7$CKA1n7t>jIc8S`2eyG9MnkI@j?z< z`m(Ni4GX&kU>3HptAm7HJxBrWuuA|*Bf<{WyoJ?o7wkbU0EJ<11@zz?yPMFe`nc-_ z2aqhNq5}^Rg1Hdyq+bLN5ngZvDFF4#UVu(II zfX^6P(p^~5WO|>w(YVb*qwGUooKnfVJzaqdoVa~V+%B!8Q6cP!M`v4hS zc?UXy6O>OtEx9f2pn4B zz$01p~I8{l{Iw^nM1=u91BoA@K&eEC$jsw`>7<1>|_> zBHh{7{{P>n0N(dd`{6||xCIDZPSVY44YCVd%Nv4ONCgzw#p@t076D1(cJbGzC?kPz z7Z*ca45A?}=D~0==Zp4cG#9_T`v3nv2bha*Uj?;U;V$k3*#&lSJ(z{$VtD1c58~=L zkOJJUwg*Wg!WmvMRDoRG&H4d!DY2#N4*ogtLWmFCF!_GLSV86l>brrp9Cy6{ zra^UzZNOphC}NxyC^L%g0ht972d$R`=(eNXKa?5v zfp&Agm@2HDOU_5_wJ zeZVZFWC`Bf@C>YpRUagYyCEq6lE%`ItcAGz0hsQ#-T6?N0n+2=gA|FN#^ja9Fc+Kx zvydVUQV&9VtY085Sqf5wyDn@4Nki*GaF^q_>wyN4D?q(fmNVcy0V?tqy!d_^%mIy3 zfm#_KURZU2$0Z(s?ui85Z3gL3n}Q4krz!2nXf19~0KrnmjRYp}xEdQsIqraZ4vOsK ztWzE;GdO@YlOAWC_)wW41H|lRZF&gGDzNR8B@dMujyZt0Q)YrBx>+xQG()yihJz(J zK_iSIAW8T}Qa7*!`1W#ZumpS~sSa2Mw2{;moC$HAX1Cw~{?qJMfE^2-!T_IU=K%6J zmecGY>ad<>2eJZmn%#nfSWmO#D}tS7_q-6a{r5O4OOY}ISaCON>H|<9IY=ac^dgen zgBb8YyWRt3@F6S@VnL0QZrkM#U~M0F(4yteWBVWIr!u^71<#zYMuI{J9Jl@tL4Dl` z;5k5qp*IRZe(Pp61gV2YY6D0JRx&`kxk4amn67SCW)K%_>dyyYQ=wOUPx0txQ3W3u*XjDh@PJ1*So8(>F86NGozdW}hZVveP>w)1tMpbT2FpV=ws0Yj z-n|9?|Nq~2fXRgcw4jjT#g22J-e+sZ|No$kl?)!etsn&+ovjJ~|Nn;^a04}u!D9yK zXrBixE({)>U=1*189Zimv$P&ybz$gimHGewfAd}t$ymY-VK9|Qy#`(P4Dv*G1 ze35V#tQovlu6Zv=6$9ujV=(K5Ge{CNtk?-&@B%g+wDJXPI&^~_Ggu0IKEKHsuvwsi z0*~gsAPQ_ZYt3dRkk`R>g9klf7V&x<2QQYn$mGHRHXJnQaRn6ZFcks_r-Ozkz=}W& zu%d3TS3SDHR(W4x1TCTjEB0u1y}$^SY&ig0Gvj)}qxl6RM6HlV zbM6I3{%xWU{XkWi>xB-1=GrH0{C&`S3=vBCTfv6}L6vWYD}PG}7Dcdf^y@{%bC9^t`MA&AdQN-_^j#z_9NS0|T_Uj64HM3U8Wg-!N40 zb;rKxoC~t_iC25A4nhQNPkA~jb!}W8Thv!Pz6=|tp~sx@<6&?x`Q1Kwxc%y zoC-SxUV^r3c7wylqwxqRbw@+91#H(VIQyj@cl`rO?638}jlXUV(A;|R1rP9)FOvu3 z1rNppAQIf-xh3w9une0knq?Jn^%S4-~EzpzaWKw(lkA zYS3=iHy${g)_MFz8Q3t;2p@QU7gQp3gT}Q=)zHj+0Gf#aopdAuaw61%*N%`v;SIQ8 zb^QUm$EMr$M>qH`(I1@w;L^(jbesny?fghP?w|lVcK~!M4(MJ^*BkI4M%+B!846iI zH|_Yp|KNQ0qBB4M7V6$ag}O(#FL-?xIB;IP;Q*JEJjY$HfVP{w{Kvq+fEFbyL0*2L z0=Kc-K|m7}GB3cM@O`k0g@FOmzTSU_$%Wws*GW*sl|BHSA;$0`ln?AFQ2g?52i+I? z-~|t+&`;386y2^bx+{3VH`B<&lz`65Dt+*RAIj(7?w|lO<|tGTL=1FS4mja>bo)X# znlyqFe(i%7D~^Je8CK0f%G;jq36=Q>10j&!`qDU#}xC7`sK(H>PROA6pMG%c?#~m~vERW+3 zaEGNGcd&qqf?WkNIPJKD2ShaOxPup*lAC(9mORc-L)OyM7mEHl!MED{QrNv6;!N(6Y3Tg28M3Xk_X=f9=){(ApJXVcy}HG zb!#mT6|20EKMIZSj(w~kGmKEpC;*w^x}(!|iU)Y=)O7>cji5a#4G%%hFwmh>4bMPr zuADZh;el}W@NX~O!@s?D z--}>&P(KrtaaVYB25^8C>B9}_3=jZ|$RdeA+{%q4A^}#jksaas01dFvJY*pYa44EV zd<9KbE8xir#DXNN6^LZD;xUS&e?x4ZH9aOr2m=^ro4}f>#f;b-h+Yj`z zFf||0vv!?QhMpRZeMLzPEZ{kGhYasl%f) z0CdJb=!AU*kJbaF{74yKGs1xu$Oc;QZ$}siD$ri+L5X<-ki{O|4hHB3CLs*;NCTZe zV~QkzVQ4yvp${1Pwq209$AYPXQ6?ufc4(fG+Eaczr z0QR~gjDu_-*y|@)krO?N*Le^we4Pa~0Oaoym}wpurd6SshU{lhTMSk-y_SKLY1|&& zp&P*ETBiWSE|8PD!9^ITeSqAvI(7i5T?6XtyzuB|J(#ErYIE?ng4!#`S(%Ly5`^pc`e6v+hY$2A{EZoON5GG6Og0$Z*yTiOLM1%UO=Iu7c}b0%y&G zvOIcgf4mSq1ln#=`{PB;L2xq)bT|s=JX{TrPS!?{JGw#Rw+;p#ovc-f$_)D-986(& z5wHiOmQ@lW{{m8kb-TWR*JmIW3lpf`0I}FO7(BW~UnhWjEuh12IY12-c)6K3sBp!GxUx} zr|*U4+B*y-pmP5JyxczkDff}vH{eU}wGaIJ4^j>qNpO7uZbUv&=9tVV;aIg)v4_?&mhPD)+?t!)(ERpRDhB>-4E)va7GiV@IEVQ&BvnAs@+N{UebBFynpJmAsk zdg3*Ex9bxS1AL0|njN4r3b|W&1JbAjcMBEYL8i_@(fJZISkfK(#G~8y1^5^=aBaM1 z7fAmhkdc;$ia{qc|9GLX^WXm$hj&3!$PGx_^4eR3QLo*=&awdMVs`xj8gBq~Awf$H z#6dSKLi+FQAm%X!1&?Oe4~$TypxZ*r?|@ySEIaGZ~s5AjfJH?}X$!k8S~wzC{qH}BpLXyC2c&fQ@WOL9JV7_V z5$LS_1Jc-y(4)Eg-~VpcKOh}YQ^a8+0x)w~VImTp$341BKfL&|3&~K_4tH7+~e#l{nA|fg#pwT2H9p~?fRu2)D8rnP6dfVAy9WF`8B9e z0-rPT+Pk~-3n8d7Se450BWPUtBluXRDTdvtqvbh~~*9rgf^#jr3!W^$mj3EfE3 zaU9^oXhEqLwCI)L75s2n$jA@cm@GSZ92PYC0y#MBEs4q z`#?f3PMd?yv3}C+`UDadoweXyR2AIatTX2@F<83(so{jKD}K!n8dri(7r27mQ)3hHhT@XC_X4=>ieL~}oAEcpdPsV!s-seTJmj^S^;1{s=p0b0Wd@d>!lcmtZo zfzHLe(>F@U;9 zprL6{dV0ASG-A|S`UW<|HBSnZBTA)V{PTVc49CGk*q~r|S;EJ_(CzxB^+0I_bVdqP zjkO*q@q=?6I6zlS+rjx3FAi)4w-&TtY~KQ@3&1mIpg7tm2Fjm@pM$!9a3=|XoYW0= z>x%$X>%a1Xtp}Ck$2|@{XL<2;BRC~)@Br;iLGjor@UR!urUHTP+BYxWKsJi)@Bp39 zP$~hwR;XpuzyHU<{sRZc6kgCBLg3|B;L+I~9-z_L7pMsYb#ylH?f?JHt}ht7UEf%` zzNk3`4LL|g0N0I6d_ZAZ5)TWK-T(ox$M-9+xiGv?_JsAlKvxh+fEOxsJ4k@ivLg8K z)!m@f3)*CJV6w|M{5K|41X@E}GE6@@UI>GfagAPbQ>nL(@Mt}yVoyapA#y?a3$ z3STS(WdKOd0*4^Pi>zROl<;^!Rn7eXUbX{C`cLpAeUIL)AY*rdE{%PWy#W+_ko<-x zzQNZ8g9bmez)JuKst2VH=2D;i=Af)H9b`u*c-B1acx%P~|NlX&WI*eXIY4OzCDf2I zDGMWLFbibD%PrvHC8({S%WgO@f*Vz1cZI?W1%$O8-QY?67qRR9{ZH!zI{}hm@jAeS z5guzq+3BF*(dhMMv<~M$lbY&>cpv zUi|+Lnn^qE3Na*!4b)$64FSz?Za>icfCDtB20Fx(ltAlt5P&RmAWf4Pn;tgCdkdf*!OLf@|#UpkdHX*A*VkwJR7(;RzM8%@=efC3sl_L>9Iv3SYhH0lK2TvlX=9;Welq zy21m(@#vijs^_374ZdOsyfWfN5i=;YRl;qb0xpCJW^NHsl>l1q1X)!?gnIt%tzrNF z|4-|5Vk07%iZFJAOSVoY5h7KC)^T+@LEE2rt22<P697G!G#SZ0rz?cfbN=t z7X6SO_U4zM!oHFdT8g}ebsKzo9Rz&3eGd@fI2Oik2a(QW@U&CG;nR80r}NZ{f1Kc; zhnp<}wHdqx5Y#9HH_4yy_w;=G{~t6OQ!4M#9SXYEZwE9kU$}6CjbMj559AtH4-Rzf zn!`Pa#u77_(Olq-LbV58oL&JcS!++ccm!iuE<U_U5KOo; zfa5s48}&K>GQeBD0c{7 z0o17h-AAw!v4?HowjpMt$wJK+WQQc!q-N5)ooKynJ`0PPu&Y|`@# zoK1L+yFzST#|UZ@x!wSc$wQ{&KzmfXeJ6PIf+ou#XR~>B9sq4&VrV^3X#vw%3bxO6 zf=93K2AF?5x@%W})UIU$Cw90c&=d;s8YlsP8-RGdrpty187{C@wG&<#fRh4f;tPCa z;{>oVFJ3JLCALb{7YCO>lD#W9koSQbkr%Fm8j%pcf>wM%@}=tx(3Cs>cF^h_*BNP@ z0c_o&dq7izplSDR*Aw6=&l#NophD^bj3WZ_9@t7qcgD;XyG)_R>Y{JC4@$}Z|Gxw;Lg|Ls(hcfl9P(g> zS^*IR&7=2j1zF?Ky%+56?pBa5c7h5M@abouD?wYqb~f(?Q4IY3p`Zpdlvkp6tFTOH^hLKf>`Jiy>}PEhnXASJOGsmoqHqpgSG^04FFS9 zJ-}42!+vmZTI|OboFGZi>K@R9YAc9?SV#upc7u`CrwKrd*%6%tR~;8=SBzE1(-vlrR(LFK#2 zerVDJbrLja0VM{g@QMRvA=g2ba69338@A+k5muu`|n{5R#l?$qI5nakGFy|18Dy%c!6Fciq)_4KtTpFs1q$I zz`_ZX`I*6Hg2vmRA=(+B0QF+27%Ui$&IQF1D6N2!Zu4Fci-Eu8%wL#SLAj;773693 zEG#u2o`sv=pv@G4?~AzsI>>w{DCohr^nhz)_Il97-wVjfVNh)iUg*cb@LCvrPKE1> zPJ!;wFCYoT;&{U4E!qk@k7jV$#=zeS+SPEpbsm4JJV&V%@#q(ha#tUIk7uZ|;Lq42Wc?RDW@7E+o44f=c~;;I(zvE`Wj#WF;u& zzg!N^Z(#MMN*>){g^;pB5R|4?ps0Rb)7=VE3UL9rvOsphj(MOa#v!Ph86K90N>pAr zqc{PaT7ppxRflWP1bZDGJpCX3!Q2XoW{|7VquF>aQZ$41@xhOmMh|t+MGfFVBJi=q z2VS^c0oTAh$6dF8g8~#8pt)#>_d)6HMHYB|4%D>+pPKyg9jHJ8HO%+U26+{{{ug$I z_yJHB2d#@f02&KA;L+=Q0W?hQ*?GaE^OHyCu@{TjLFF!}rv|YPz7L@Dphs`*gIz9c zE)3w(6x_vpacTyrRqA@fqqpD($RMz@UWm*Ew`!DLyq*n-TJRma0+3eCuXCVQ4cPS8 zZXVsfJHY0Gd;;0IDn9q$e~;!Lj3r7h)}U$!$IEUc?XZKQyIr@ShxozSNFfed1O=JL z>vsLn?O@UT<9|sQXu=$N(HBU}BN@6(slwpJRs+yLK4|6)bdMRRA@u`Xl(vG_$-BM* zM+A7k4a7KbBkM<6XMn=%YOtx@4jQ28ojf=PR1UWuD2W9NfTI`G5Ckm-1T8^^S_~Ri ztB`nMf!lJ<;}FYVOM?yS1{nZe)Cacwxa%8m3Uqw~ZDWB}R&N{ve!(L{KR`JOvHTu7Bn7%&t`xLa z20T{?n)Jgqa0MAZf?EKx88XO#%TQ1PU}<*!!r1Kk1G=W)#@h7BckQ1SrBgwftoFl; zIWwV*&mbSc3Z14`{br@{bppAisc?Gl37EK(hlpBYx`?!j5&|q6`$JwI5!{fr1Ep zz#_Bjhhq%-P>T*QdVu*1pfxGrrXR$?pfvyDIcS;`9?U|Z1JPb=oBHqnaaXV>UI#$7 ze}Q&$fv$Nv@fs91pySp~Kvosh-tg!SJpox&P$~{uRRAjHKD;QJ3hMIzV5kK3pkBO4 zu?Njp{pfT(((QT#9`2w3g)IyOuP(a709t||Rs&jsaHmG8+xHG=1smuL;a!LgkmZv> z!Fb^1Dp1qN^$zkTN6_koJBYoFu1A_{k1&>SG}j(sDiL@s(_MSx#Z74Vz7_-VUQdFg z{MVqx=b){d44D2s?s@{e=?@ek;AM*!z`F)PIxc`Ex_v>*XTV3u`*i!B@acBFunVyT z@WdprbGuy+!2ON9%!A{Ft^uiE{K3C z>2?V4NWK7SS2KVbnpn=2WMKmt+X*g%K+Bh$0-9eib~**T7Kd$Z@#tpgb_lR`{lnj% z^dFRV!F!WI7IZssfaY+Z%ud%IuPq>KiRK3^tp`AjWY-tn4ie1|7+VgM$bjTLx*>}@ zJh~k$Ky4HD5g}UJLh2KFC3?Ws&xLA+u*`&3Z$?CcUvK~y2^1-D+ts}1s4vWHI0zwd*fbE6Aavv z=l6qlpdl?pX!Ece(z!-%qqR&1C0mFpXrH-M<;A?o$hLypiR+Fb+xj}v1Jd|Jc&6I| z+QWJAU?Rv&&|m=Emk`%zL+t5<@R}jcFD~WyA-s1afU}XY}RqlWKblO zD7}~rN(i7`cr!p186*Z49R;O5(C7uj>v*tDkcP$#aEaery8zoXWAhnM^Afa^2BJ}o zf4l1m&{l*1IsWagH$W^FCPvpk9=){-UKoSwBiBEjt`oXlCqNS+`pPY+|KW?II*%ZQ z1E@f}(OG(>GxS1p?G?zHv>V`+2v_RSs%3C>bN&c;86^0Uv6o`t4K^3RQ=g?p;K~Wy zEV+Ujj*zl|v74d!2UCeUG0K?Hn*{uzG#-p>_bl){Jg6n@paI@oh~2&N$a>O1qdAbK z7sM5y_8mvJE1G*z;+=oH0~`PL1D&pCnrqK6fJ*i=93>pD#hQJ;u)MbGcD(>DH%d*K zeZR21)`RoW!VWy|Gx;!5*xiDR&)#@p1Dc-%)rZ}oFF-9QCs5<|20Tp?b{n{%(HQ_L ztBBLq?H~clj-b0S0zl0~Vs(kYb%BOH)5j0zi%cEu+(T*~SRFRbg%qv`7Ja z4l;WPU0?@VBMEK|f=f?GBa`tEcnagiix1Fq5kUpZOM9q|9^Dllpj@*LR8+puX9Tr1 zKn+ZWdTp>1dcn;$u$eEO9)Oy(4B4cw3=9nWK?7kgSWp}m0M-wx=~@qzVslu=L8x)z z$i^)L*E*n@)*-;-xC4Cmg9peY@D4xFBm`U@wyE!hM>lvOIw+JqAT3g`P`B$J$PQM} zg8YD;Ab0Kpjn;t<`T76iQ8%a+0X|n9yzw6F&+gD4kU^v4F#m1?UE&0dD{xZ{bX^Z< zdJNI{KpjNscD(_ugrQqAUz$R~`v$DqEd@>efsz+!4^s(f&FKU1G%0xh=1X>{YLD&$ z&{C5dptbWF^Wz@Ce8<&{!tqlDF4^ zpgqf#(l7FRP#guWFYEUI{|`F)0#uR(D1gdp=u+$((7bWOqdUL=A`ae{3lazMJ6*3J z?_~uA@{RrAB~3FrL74z_MrSRK&J`zUkPUjC&C5_|fImNw7 zuGi!!D2qT!&x(i_yuDznpv!ErrQ~`0z$y8|i%TF^!R&Sg8c~#31h$02|j?`oyC%^hT%emFC(f3>BcV9JFlL+Vx4DOf#r97i+A&!oa}D zP|pkE)@gY(*WO?N-5BJGwCEXJuYcbI${QEJEk#hMfz^Yz*nkFPz*Qt@;o*%JI`W`_ z7}%}@k>joqJ#C<(2|7sO0WP0Gg)iDFJWxb}Rw#p31s`sQbtiBs6ahu_4-d%PK6EGp zn}H&X-L6+UofM#H3q6z|qfDSyTNrgL>EZG14wTaJRyYCNi2V__TbW<*5W&6@ra6W{d zjsS8WQUrth@M1_BUzb6qSV3nI1aLsvHy}GeK*MVSpjI^`P$Bu|8a&^Cq$NPopo)6m z=NXO+FRJvxeuj?a2!nPhym$(74{S69)PVo8t{RE z(32uS)!T}fk3dldT}JfsDu~luyFk81qZ}xIf=>RtTbviVRz{w1>{~UDE00RSPaLn~a zCpb(%Q*5BQVbBH>h1LV0bB;g(Qo-@Us|D&g=#mR?e3^m-q5c7nOn@x{ZJUL6Dv(Q@ zW>9e>3`(BhuELW#P|m?ovdrB9Dp?@4t`#_vNZ|p5>WgRD6_z0 zs%jt~Lk3B)6-1zIHlS%CLaIDK+a(S+fujL$xdyIaI-LZLyMq0PsO~#!e?U$v0*?@Z z8pJ=k15~E+yQjZ6{u4F(G3|{?+j4E;*ZYKFR(pQpi=b(XkiH4 zr?AA^8TtU6c0tFpKnw3G%e?q6&LCE7dStlR-kw4hcsu9}L45xfc%wElNHXkH9- zQ$Rv@=@U>H2^szb1Z2-p(o>T^2WDe?{ zf&v@AI#9LEL!5!IjXrn{gl_`E7q&KxFZ@8Wwyt+TvD)o=2Og)ODWn(B!*QT3kJl2A z+gD#eRww=c`~N?u>mStliuyaCXn9cskwc!Y04EaYuJPvDI}8Zy=ytsWp2(_w@Zy6gC;`CQPJ+i>AsUQ4 zpw5RxX@$XyWp$uvgH=0D;F_u1^-iag1$0kTH`4Jzpl|>c2OgcFFTnc>K?U;HDC$_RIfLb#RSRe&YXs=sIlhw(6IlBm6-bz1zVCG+gTnnhpN}DNM2LS+rq%5e7PZ z30y-fcz^~+AUhym2KJj7(Xy+Jc7!H)+O1VMW zU(B!l_y0AI2e?@Xn#2R0qX-&Ua^3J!8Dt;$s4bWuKfE{zaX6@x@qnQeG?ew>MNBQ| z>`bV;Aj<%t-c(1iP#(0*^F_xdXlGd!SsSQMfjR<|)-<5(51@1hT8jdzyfJ2YJCDDZ zPzee#P}L6_CIeMokP)EP1E6hTwL5l!T0)TEi2~=L+7~aTgNi6*p7pkO^$ip-3Lxt{dP5HaJH>%U5twTA~d- z3z%AvNmO~HrEXvy%j9r6Q%Zb zfaaD}F|>jQks6V;f?6z~@Pb@E1{%1kz41b2-~a#M;pZEvCP>_W0d<>D!ePrAaN>RN;zc<)%|qM)+SSnQx&k~(USf%A9I_Fj zpay;+%!sAPMw|!dHP;6qcYqcadm&5#t%7yBOY>^unB!{X9;@x}d(penc$bi(Na zPM;MnwApvNscYwBL)lkaUb{0XQMIp;~YeTmgaignD$Bf{sg@08VkBViMAY z0%frmY3o5%!++3@d3Xp<18XH1)i#VCy`dApD}W(&9%y2z^#JH145TOo7elX>|NrmN zTRY*!m9@yB@LC@%xPL9Y8U!Uz@G66efB*jn9se2n1yaj&wt}434JP6BA83`~4$Res zJHWd=K%GbENopVg&}udQ7SOT<(B2+UyA@peHUALfZv_uNfet|g&s$eWKcP(9OI z2r6FqTS3EiFpc1Ka=it7;6;7lj%a!DzyHTvUogD5R}4Ds78J4`y`?9>3P4@K7ip!S zde`;B4p1uguynmp%Kc(fG3e;p)&t<%6Ocx15X>@ANeL=|!G3@if}l-e z6&xPDzBeEx$cqd2K*dJ|sQ9?yVeNVWeAd>EZU=?VL(Qi^rOpn}g8pt-(CO5W^UO)zdZo7>+A(+78fK4TJ8rLf&+~J zf*L~{9+rnnK`kSYO7QqODARyc8iUOA04+FfJx~H2_;CQuQG$okUO;D`Kw}^ZFTNLn zLcN6Nxa$K@fW35w6h1%rw>z-#L$?N(7=!v|C7>x1(2+8&2S8O4Xmn1b^#G{331Uis zmZrcAVS*R}ayp73PZ+?4yy$iifEx0m+W}?>Xz2>FA$uYD7S$zeAeWRzfjT89E@W%2 zeZo)*9s`1$V+*pw@(_3~{zrEJXjTqnmE|GuI>jI0O$gw{GM0xBeg_?_*zNko+Vx2( zXvqU8TtV|JAa7WJ!WDdU73`=lTaX)|hZUB9=5s*~MV$Lp02Ts|3_SrSY=kwS^BTb3 z06Q8i4ob!^L91LqF~`3h)UpAc-1h`)6yq>KQ$2Gn{0xyB1D0onrtQ6Jy~at!}= z2Op3#K^5i?$c)&FZifKNL#3%8W!(XwLi$CwLx|;}(qNDX|Mmb-`T?2f0n!NbANZ_6 zE0B>Mpi^O54}fD0B6@nRk) zXneZ%0;Dhjh2;xZWJ5qX26O}r@*sZW8&H4CqZ53Be&<&3j`Yr{;N79nL+wjJB|k`D z7igFSQtrO{3@TJX+vdTU1-yK$cPscxfo`x#FP5`|kL$LEYz2iZ#o{>*-m4CB*z0J} z<`mFI5~ThgilMJ9VOp754}kUnf{)GL1sX(#xFHKwITyrmP-W8%wgz5igVqV{=q%mh z(HXkJqtkc64lxEs29L(t1z?)r&vk)E=P{4(_rNQyLEX(4tMWk;!ylS!KY$jZ*5rXo z&E_A{;BLbTNS6TQi5Jg5fuji2N@I8lx(#?g$jBGBvq911dILNK1R86qU4axOn~*i# z250Wt9WT=JLBmD9J3u143^bYx35O(*d7x#9 zCOJqg$0kP5ZaK&;valOsKy&4wNyy$>NRt-QWje6n|Nob_K$#16roBgR!GF+kyWOE% zx_v=*-|*=U-2tl0p$ppo`E*`?;Rv!9bf-9Idn%?iYNuGvjykt*I^!zfsP;GGxkB=1fBN6cnCE4 zI|DJ1)_i~wGQS2IU*g{e>VZKFoR|SlxzGZs4K}?An%9GS15|In*bh3i^u;F><)FU! z3vjSNR_3J70|&_iP*!=l2^6rP0Zhm|7pT~UUEcs^gN`oa25A7R0iB8sD$Bqpd1ISK zK&+hk0a@Dl19rj{Vlw{+;$YGrkV5|lc*z0SP|zw1&~W*W;|?ky2Z9^{S+)NI+Hk=* zD+@mM0h$8_C(2Lh$ianvd|&!pu>T>e0VE+)w4h^zYJa@gnF-46uAoQ*O~b&J7B-Vr(K`XF7fL90dx6XpaA$Wx#TCWqjFaWed zkP%$wK@A0+efuH?*-%ii1$H$aW1y2U;I+KCM}@%)5gY_SG4(ndVkBgb2&mzJJU9%B z8mN1~o;))f;mOyAaGm%&)8Hv01(0Q+VhA1=8ldC%I!nKR#_l_PpMY94D8~YVmH>cq z7xIdKABg?nr3f#7fkua2pMV1yyypY2har1DN(&%mtr^j72OYBtJy{htBo19Vi58KJ zhzlUVK6U`z)$uw4VxK0&K2UQBO&cu!q2q_p7{IL%+@%2x;v(ijI%`42V<%`A$^&p{ zfUmrG0qRt^-T`NY7u^mjovwF4^C+%=xDrkTl8Y7@g)LHtWGxSZj z>l?5!rO@;a+M!em+Mxta8ldiv9%StZc%l{7L4yPm=)xLMQ3URvIY@wF{k1hjHK@4# zaGU|u^6`M4u=QF2A_ZD^|DzkSDhVFS1|ZESNd{bmf&-Ml1+*p+T;79kuYmX%w9h6j z1zbcxdN{2INK3CdZZ>H@MvvcwxYdh!|+Q_!h9w6PO#OxZBL z_zCKW!|(R60p0C!8sd@)j~CCA|NVyAh zLF*PHAWPA}E@1)hFo0AGu*Lt7mH+ka5Q{4!UPL5={9OCug?}q}>kC=~3Ego38WRPrcmws4K zNarDs%a1?<`=Ft5RnQr};4|peA@*))evkkPWzfdC4b2Z2!E&IrXs>62JPKYI3(AGs zpy?aXG&9Jh4jLZTt}n_!7wLf31D)V+%7hF}-hc;;5-9P2+IvW0W0;5~Y#cN|jUjFD zR4q7YKpH(jA+rcl;eovlN$X`0CxI6g-+(MCzI6o@HQ+_Ippy+jgZ{8&4<3n1n2Lz= z*TJB+F?f+6I1RjZhL{Hqc#t*FwY}i5?{@vs>BRAJ0=NwdF}6GO4`l5wHCl|<08 z54I}}RC0k@RC6c7_X&WCMUXHgqk)R?;|?64i~?bTw%38%L!gsJVZxwE1td23WNeUf z(7^_f=2_Zt2QApqpB~V?*2pJ6KY?sVz_(7rVG4X|@+CVn=*o}>u*pe2(86TUXe}tz zz-xp+u6g+obZmetq>A8gy$6XTXjzASQ4gq9!UP&71f?HPorGH%Gk+^|Kmo6bpaDO~ z3LApTK&x*&x=U{$PJaO{zG*$c-wE0l3QlbBS$*&(3BAdP5cvwpB%o>lG@b~a_6Bpn zL-J3su6%hn388;0vVKte2F>RvwLN6W=muz#2~wqKfXCkPY5^6C;6w~56v1vIs0+IK z50u+L4F%#ffsSH=6>Fdpi8x)*;lmqgkd?p0YJ!gXfp(DjgQEyk1Q7~9_)we!XaEls zDxm!F|Nm<-7@Ls++>W^c5(niV(DLag;1&Gf<jp77~(J>b*n3p$|o z2BaYn$YBp0@WG#mg3hT+av+Wa2Gs!3qbev zJb2O92X6L!@aXm6=ng&6U3vywqo4W(9za(`64E&Zng<3Y@eknrf}q{(pzB3IOB`xH zya)j~1axN}$Yf9j3@YIbAf{gct#t;CAHI+W2|#E6q5C>Phj@b)|#YEcq|GW@!;VQP*)dp)e3AWLF1bQ$Vo+@eT*KRTOr#Ar-IH8>g)w=c*K}wf$Svg zY<&Pemk7G65`08Z^Inh!R{r*GP{jbh0$(Fpd$CUE+KI>o`k19a+w3fx); z2T)t48+^u-hvgv;emCg(A)xgiU{Q?YM4(1lcyxo0O?t85%m4qKD83T#fY=YNd?C|_ zP)$(#72);=I6yq*F$25`8ltQdNwgCj1TR5nDnLyI`wFx&(4!f=^Hskb#Xj&6UB|&r z2Mq+lZ0ZGV+yW;T=*cB7QX@cJ1h7I6s4bvYB-B)P(86x8-5_7Q2AvNLNph{ABUe1S zAr$yN3y7n;K>-4idy#bvRFHu6f~MYH8^hetZSkTSy!&h~C{4cD5(Y~1V09orfiHiB z#kWT{SRAzK9{EzC!U&|^4C?q2cnuR5Y+=Id(EZ?9y@pV5VFVo}0xfJnTE+-k3-sb+ z7s$1)kWnYlp@X24-eV^6TABdDnb8Fqm*Z$NV!9M~2Q*Zz2M zC=|{4)Y+(^2k`=UbmTS2kI;=8;6ewqQ3EuB#P9+%6#yEW0M)JV_AjVf16P&cLAp-g z3qGCTqr-17l!CToJb;{3ffQ)q@t{4O;6MW}Nqz~M!rc!_YcGUCkV9Jq+zx;@)xe?M zjI0q9=Ah=W2Q<5b2F6P~!6StcptJ$%jDW`cKusRl%#9WnL-jz0f^Mu#0@;7u73?g~ znQX`r2xf!&YM_gCPk^pQ0v&SG>3RUX_8;840J{Zr>Lj>n2GUUbV&CIajtnol{(@>6 zSe*tcvVXkz8VpLlP|HA5MWFp2J3y1d(71Ui1FakkP=Hzk%H%H#;qnd&;Idc_ zCRP<07*9B5bK4^RWByB2yU=G|a$Z@Rhm4+GqdpxK@m zUxIOX^)0wc0CjDkZUF600S&V#Aa(jd!3gDdf_D!A zZ7+cYE7-q{AiJ9Pg1iMOsNn&g4w3=s0k_XkMpkr@eltRQoAzadNL!AE~W%7NM&F9be< zT3ewrK!t(_WPc7Q;Yfhv1~kL~3KvlLfchR1uN6`54{l&!DCPI)o(h@B1g#GXkbp)u zs62q2+yn7Eq&|Up{xxKXthYeJqkAtXUx1GldvPfcl%>F-4X!!dA!)2Jvb7C$ zLIAY97d&Xz8G6Q})AxV}sC5rIo)$JM2rdy@MuVo0 zRY8-B`}9H0`FsALf(5$R51Y&J7Jg~Z5*PJ{&VM3@!=Tnd7H=x>Rhev1W2GC5}40aa=k8ak# zpxgC2T@QF1cfGLyBm~{`2%2&A=w!VIl7f1gaxoYXiYYxO;SN1+BLO`Tr8cHLv28LHEjD@Hp=J0vaUX z`6rKF*9#t0W=;D*zdl#yn2Q0n-Bn~=22(DhhBl!o?3U)n4 z28IsT6(D7+k+q9>% z0cc|=+#ZSMA8ci;FI=~PR6*S&;W2}MTLS~T3qyzN4v>{=k*$;gn{>dVo3$4dHsDBU z2D3n`>>wo^_+YCJSa}B?g>apK;DV~n83-<@&|HAvf<|CgAh@6o;|2s5wCZOEf(sgj zK7imlKo9wc7htGOUszOw*8W<%zJMgJhT8uOC9v_{8%ScH>6jOw;sQAc+sOa}Y(@&wrrt;}%d$A9T_n zG|oX6tfMHq1Xc!0$``hxn5KZDY&BR}56HA_2xa`+95nd1{XkLK2v!No0~a8>6JWkD z*au3gFThu8bsk62;|ta^1!Ov?Q3`b{|278;(53Y=Ji2X;DzLjSpy-hV>jCAd3!qh? zP(7f_w^5XR`U?t%IUu7!&9vjL3qW;`M>p%)XwYq>3?7}Vhruk@29Hi=k8alvk4|S$ zyKsU>r!yp}b~;1SXs0tIadtXGQe~&Jfk)>JkH#aQgaBKv45>9CT?Kf81J40GKrEC1 z7qei&4<3dWJicFm7Pz3q2tLH*0Z7c)^#h24l*M2v))%``QXzU(@B@jweZaA-~Uhig03Gv@e8q8@xHd^-?NG5_gs029n0&81ORHXb_6NAF2dR!ex`2y?2cUUGP>~FxK>@??BHRny>;T2bp9q-O zKY>{=uY-yzP|e^0E~-E)?mUjW?offa={QJfrz@yxI03C9L54GU^n$iCu&w|}!y6KN zL02Ro)sj&lXLYkyhl7$^D@f9#xAp~+yDdQqj=LTJ54J#>#GqwX9>-k|90tW1=zc|3 zNZdZ~=-msN`v#q{_d*_Yu0?k%m=C`L2Q;hX0lBBfqq|iA)LepJ?E-4SdcZC(Y6X>$ z9-tz!8{8@K=ydJyfOi}xc)+`pGeCz2gUtb*tIxU{<0ok6wK0*_8-2S{lFiVJ9Ifjw%>AyK0P zas=+E;RQ+KjGFyU;0DZtP+UjBU@P!H6oISGrJUC!Xdg%UL_-~RvipnKFP zgu&9b7??%-sPSlgBLM1ocJ2l3F$Xm&-67F36&$3lxEhsZAZhHmSlbbF#OYp8uM{a0 ziGoCryFP&2?K2f@TQ?Kzo|bMW4v$XgwGvJO9-Xa_Yg?QoJUUy!S-IOu!2^~>oHXG1 z!^yw{mN}d(;5owywCJY6qnq_aFgRU+oB}FOz#~k@T_1qy-o2nhl40Fye$ZTLcPm(^ z6V!}r{Q;Ud25;1XW>8S(X@%rY*A?)r>AC^ho%HAgt@4Lu$^+ny5&{n3lm#lbTti?{ zYYk?>iY<8EcHH$u3?%5KKnieICBH$QLR2N7Q6+FU=Q8N1tps)#h8K}vz`LwJfI0-A z!XDHr0G*$J%m*LY0V>^@U3Y+YFz`=3(Bb;8q4pm`326KD3lE5d4Hra$f1B&S4%h$S z$^u267c38va01x`ZuuZg=HCZ8Hs`|&(;sk0UAPX)dhmm!G(fyg*B39r$LJn+y#N}z z^yp?40(lf%P;r1+utuo|zQ#u{3lpd{3th>Hz1;!2EW{Oy6zdD;RmiPhkH$CPq|yoA z9s}xx7D8gEA_$bOaCSl?LDGmA0+ocI7=p(Xc(}e7JksIO4ergo=m)JdhZo)rh{79G zq=VBhBvpcMgM_3?a2DwVr%G@Z0o|w64J|Q1+b?SyUI^HM(;p}yT(}DgWzgZjZIIDR zP@>!r2uqa9z$|Qu66)nvkOJI^G7Th+?&aRv4@kA7ur0WDzW_P;$`y3{4A^1d%{<3l zFMw&#h2pbpz^(=@N`CR;#vkyQ1jw~aAUnY6;YR?--Eh}7zF`2BVaHupR6^qC21p(h zG{;?cK&yN3T$)EOXtg@)PLMQo=@9(n0mvPSNF`P>$Qj37H;6GZFuV`}l@FlyEWG;u z@S+VQ2CpN)(a{YpAfSa7tojDG86cxh@S+P^Qa~zNSPc%TYYC?V)^~oO6bLCMkGpOV z2l>Cdw&BIZKj2*UfPWjaIfP?WkWW`a8Bv{c6=$(iVL3fBCX!z!V2jn0f z(CI(mW5+IlSfHHMTfy|g`z=`a3s4gVG%)lc6x6S40Jq6&U%YS!r!&Y2H!rMEq;w!s zpwr!7ypRWTKtsad7Okp3C`v*76lpLE9=V`qc4sZ*oTTHfH@YA({0;1XX!QgVf~7sk zn8$UHG^~0$?)m^SOyPRKqniP=dOI1khvNWvju|xU4>^I29y zhU*DPfPl0^&WJhzo?&J!09gZ0k!gO)utmd&)OZTyux?f_kSg4%Q5z&pFg0Ga1m~U& z(xBAX1}ZJkQsWPh*Z`%*1Rs>tC<9K7;GHaxwDnpHoMaw&bc5U05W#B@K~O3Lm0u9S zgAhT&sqpA4u#t#Vcpg-&f$9`cnnO*6TTrA>QsGRn6g(Bq2YCb>p;N&ucq;6yJ>k$% zdIZ!!x&w*T5|9E|HwPqyngT;X(nu)~G9U#?NucA#PVjGYJ<{RA1v;tf0c7L}B*owX zxp4Z#F&6;=P?hlja@aVE93<&|^@in_*WU1?2Xg|bTgnCQmYxGC!(D8z2T31i&GAxZ zP&kyr;BlOFrk65<2ZWjDrOZ$OVOD!7Gt7W6GrW`;4nUZpUdjwFAWSPSWd?!6U=z~4 zlo>1_%n&bSh6D&x&`X)21H$z4QfAlyVs^8B_f%%^fLzV)(arkOQ<>qI0|%!^H|ssH zgac^S7BuR69xTJj3@fc)LXJEM{o&Dh!2>q9&2p^a!Qm7JM$j}dLcH^k$H7M|;Bo!V zrWasqL34SaLWk$*0!|kOgi=t^0J__^vjd{e_Xny`AURf$6&{@|XB*C>FnE9u)@iQ& z!Oh>72kK!RXU)8?!~j|ic#PHQz7hkI$8py9`$`O8#oeqN5MN0s97_TD$`H&2)m zxD3Zwo599+v+jYYmAC*g^C+0h02=f5=w{sx*2%%+(Ji_LB+<<}6_nmPodi6(S!aPI z!Nw*(R$?$X0d`akNZoOmqw>INIQTufMUz1i-K;VQ0|LR4oXp2q!|p3FFnSzk4Zg1g z(`f=y-pT5FUkQ}WyzVP8@Pe}Fan}Ejlo%2qc5#5z!0r0w1`Ys_UGLpMxt(VqcJ+YN!0oC78wd7R zF-W4D)dgW!B3Ke+*S&iXf8D;P!~i*yUwsyoIy?+&C4+I>fffdQ03yIHq@bb(HXg+xs)n9Bfle!dIXF`zt` z0+xW6L7`w7aOQY+Uy0!X#4GJ!MGT-t03O|}m0&d-vL4;6d0+{+?s%{a$RBU+LQ>Gn zyO50Q(aq`vQrpS;_%1jFJ-7?c8LglceF_vm&!Dm21x6FuM-Xb>%KRwQAm1VkiLX0vQF;1yTbl$vwJR7eI7fgy=eVSBXIZ z64Jl#DKRVn>jD`C(gjij&4pPIU8frk?63V0U3>1r(_P^`B?beqE|5_mT_80w5W7x5 zbnS%b+IAP7f}HOuF(iO>fs6v_0;vI=`RmcmItij{Gep;hyGjf$kkI&hTZsWQqkD|? z+HFX>`+Qr8VZmu|suuz2I_@B`0hDrJ4V7+IU66OdEiPqeP&)=T_Y0b52TcX;xWNr> z$gqOcL5B%HfP`QzX2=NcGqCB9bz87T0%-gdvgywDyQ4A#WQ=+G5pcWlhXA^#FK9I}*Pa6ne*94}kY#fUh0}4G1xKSRN{4eQ|#}cnINvM|bE7 z{%tNy0xbthKwIJw0yezho$yEkTqQCf`yuARRe3eTrxP=X# zZ(rfjdFaK}twJ+o8HORer70joCWEbn88QiK2uNlMSO(3UI1F>RO05y9Vdi*2 z&3O%WDCFiW*7**gdKT0RoeE}w+W#P}&=Xcb6CW>LGXDGjAG$&TvK6hf^Z`6ML3R*R zWfE)~BqbqcSy0wP$nb#k#anw&#)k|=S%8G#W96VV%dF=>(ukycfeYm8=GqMmC00n; zjfULAgH0t06CEhw4Mxnbi#4h3%n4?9iTMOdY~i&9stK( zFYv+TEM9;YUx2!*$6YV*L&QIT^fbTV0I#(LZA$|6f-VRkOa5Rl7XytY3W5boKkWA~ zNo9C3djSKeQ*;4zqLxQ@C}?%v2Jq5M*5`Jxc)M!{Dn-E20~$3r?s_8*6e``UM?gxT z{WWMnA+M5H3X(>Y39vD{2YbLt473RHg#hGmX4Wc@Qc#{@EdaAXi3DsR?ZzcnPX%W% z97!P`;=@O_h@=25B0O+p!r{rG&CuImc|@&{Raw7aE}5M);B@r4I%_C+ye2z zhwLzTSi64U?*r$Ne!B#;Xsg8bWD1Oz%<|A9mt!@4RsNNAm+l@L?{;T`z#Nz_fxK`q~)8107EZ zS{x4<&+37U&VP6r1@30JUSNTgPhk3(>wiX%Zq`dSutagf25nIfymo1W1l@9wQrxvm z2S^&0u@FIY0JPTCqq`Jxn!$ch_4p!B160I<)~30>K%LeGuj^XDzs*6wMhR)m+#giF zKyGA))FPlUw&yp&rhra*c(4!DPWKyKdz=e!M| zk`-JdNA`oVBdBX1x&hh>DU}3eBd}_yE>J#s*$PTM$6YUgug-&QaOsBTY9X*OXlDQI z1DOpL+`+%iM*wtKK4>`r$RYs&i-RTLq8n@;)Lf8P!1e3}(2)p;Tzu>ocyRy2OA}Bo z?q*f6gr!k2OSBw|QulH2g6qDI7T{5RY!wDdw=a=rTu(3vlV_&{4Vsw8BCP5*Mi;<+w{wH;^=<1cg9qdag$|YpxkAn3BOP zq{aZ~^H>kl)W$@^&V0@u{861rJ?_o5GZ-rEL0r&EYFLK_WYfV* zV4E&@bk|KS5722bIdO z(BA|~XvbYIfDQ%#`FJyk4_aZ)-vRCb9(UaURs!0`2s-`axa$VUjxzB6*B9{OKdKXy zkYhn{@Bq>e%mEcSoyQ>&;s@G#2Wri~=m?PjwZ1nPgCnsPs<;NM*cH^P*{~Jl1W*8j zQp5|E&)_6;;bj`6#LhE@1!@YI<@y5oP*doZcF>8(@ZJV=HJU~@$c3RVK*QGuVXMj@ z1M^6$%AmIe!>d84=GR@MEoI9AsRu1d05xa`EM-HfXaXV0p~DDoMUx4VMwC9V!tH_? zC{T~PLTFI$>Hs7)eDLT6Z!Ord3mm2nAZ4K3(9J3jG6~$05CyYfY1E_n4XDtCEQSXi z#0FX|0&&|LL%eP~3zEik8@$zT39=kf5ng~?P~y7619WJXwd;qvGEn-o2C0HH4pw+r z9x7se@uLkCf36=qKpT!hhXR8t%-S6yOvwAQ>C5 zv9%u{bALM^N1}arSp!O2$6YVjfus>MXtg(JvHmXuSep9)X2Ajpw9E`tMtXFD54-c| z+zOtP@0xqtoXUZXkF?co}oEdweD=AoeKuV9hHh@Lp0SQ*< z0=ji?0hbHIi{}@>z6NC&(Bc&akKb><4tKCL zC^tiw5I`GZovq;DzTwdgK3x#pq_a`sZ)HSi^#E(Fy#c8uvp<3|D(Gra(Bvw-U~mMR z15@ONq6pk=1NF&TUHBPD091ay$N-%#*XerWCAhN)Z+w8m z*$<==RmdMC)C~(7ZK!6b$&kyHFyrN8Gbmo*;@}{((dTc2j60%JtEY6m5@;~t&&UbMak#WJ*1&v*;sfYwBSy%+>GALgHE zuu9h(FU`Q23#=j-qT&K1#b|=HgHjAQzkqYO5ZEoXP!;ST72y01S$G1vA_vrxc<>_r z3dl*Wp#CaU?d>=J|3k_Ks9K1^u8;r!zx)GQi~^dYMg#`r3O<-)*S!P#;|>x^+He+5t75fArlU^ z5vGhEM}sI zf}TL`B7QYEEH-#_i_X^t71f|M)}USKppAhb6`+HRKnLZNfNQYY4g0!yT^L?O zSHVlcD3C4Pu;5<+4u01gFOPsi5_(4$)bbdJN@$^122r^JDj5rw3WvTC6fe}SfW-H-*Wi4y;-wlm6T2=zO0sca&%#v3yacI)Bw27HBO0s~ImvE41CA!p z9wpQyJL5$sXk{C?`3p|6@nEA}7r>M3yN23#7)f>kILU&gP?9V}ckKd*7cRd7ISjRw zSyKm!515LLAQf1X>`zE010`9gX|3pLAxT!{EmD$A0J;9SE9hiUSiKBQvNzRXNp{T& za9B+6=oWpW1x~UPK+9|(1vNCuPC!bs6Cg=;ML9glCW36~c3lD5O8Zh8)I)@5P6CM^ zcLnX8L9;y?Zo3}D_70D3(L9Ll9T>KEAlcplv0ba2f#Kx_P*g#zN~zDN|c?ciGr z3SM|c15VnIRk;sd%!ecbSOuC2HUd@*tAi7f>y4M*AWOPg8`VKU1DYKv2eVuscr+dX zwYZ?`{GqMX6&{_Xpv`_eW`OfIs~1Qy?x6u~kTkq1#^|-eI#mZU!EOVMky=2KQpGb+ zQUdoC9J__uuk z?Kb7#_T$CMr(o}Z=kRhtW`Z_{mVh=49{_Q|<7cpu2xxiN2HCKCA6 zAzlei!Jr#9Au$7=!GTx?8YDwVg1QahshkhcsT|0RHpFCDd2;;;IECMMJqeWIO2D>) zjtKx~;RB@*J~;DPyWRlTCXj6fpmUkQR>8AZRRu+k11ATF+2Gk8bF=-60)Sv z^#Ek=HcXoF5ol`=`1~;N+VFwRygO;1T_;(sC1KR)a;>D3eAP#8m z{ewsI0qER2cq+7$(A@jqhyVY-bOOzIb+i6egr(KbU=~JNJ?^^WCM2C+0x7_qPB(+3 zG1Dn5DIVy9qz)J#mJ|>4gT%qf2wDz*cmR%8Q0Mo+1h6DpDSD<16kDJqGyVmrSp{w<+3CZAx1J*QobtC!0w+JTwFE*CmxGEfP$pm!fVvz>0OE2a0f@_y1RyR)5`efI zNr0!6^SJ90P&@54`*By$ZLFX<()IsKg$Gv3bktZ9#W3wKewV?gaE1*vNEe9U(0=F=rPDCC;zXOuS9Gl%R8yrBO ziHcAeeUO(=-0ou&C-~lSQ z`ddIr2{x7v8L9SjGB3yb5rLEIj^yLgOE#3Qzolq|xGk0W>CU5}@&4 z1&RNKP;q$tpSXh*|BIor(D(x}@>>ezC8RP8?gu%DA8vsZ;P%6AkTk*% zu+jPh>)@lgl91$qbuMx})Tf}Mwm=2;i%&PfA&y*@;GK@-?}yGkLsTIq(hh6@8x5Y4 z1UG`fQ<4+%!N~(OzYeN_1O#jx%A&xF@w-96?IIvx6IJdBYEOY~^MXl$f*7nl5M4Vw zH+tRv{~yu|{PAMuK5$I@c%6V@fB@J4P&ERps^h^+#|~`9=GsSjXs(6XU=Fnbm!Im5QQGZsokyzJgi+$)R!PR6?Ccv zXqgPu%uvuqs}6W-QO*TNA6O7lj%t1aug9?TZ)xu7R9@><{P=;@2A>3D*O! zn>@N%gT!Gm=>cLjAE|(j6M!aaKm#K1*o5A8*x3sjA@n%zI>Q4Jw*nx2ppCD`T~}a< z+mB+PZ6T1WWs&wa!>aTJ2f*P5Iu!wQJ`yN~V72^$gAgguEsCHK8>CQQa2PBFo)q$c z)PxI;fQ7&X(~TF5AkSO7Uf}Nm-=7H|$99FBC~@3%!7;FMSX1rdRY;hC7E7ST7ijDR z9K+zG1zKxo?RtQ}AGH1!Db7GUWkIpM;5gV^&^S26Pv9J$pACvLaKxN=Q3_5Qp!NaS zXJ7?>URV1AF_z3n_$RXnJvYZ3$8h zP02eTN&GV?bUIykywrs>Oc$I08FJheLPHuuFJ4E!*pUTxHfSvG!i#-iO<-q(9RkZg z%;4ci@LHVO3omAXRk>bxSqLgAj=L^61vMH6EE{4lJ%Jn#bKfo{-lb7-&c z*ClYW#;o_cU1xx=>^Sav0Gg~Hcv!o>s4oQ-Sl}`hsm^-|HWpmxAqLOpWPs8JxXu9$ z{4fbvxvl|EB_9AQKkf>lK|9wvU4Ohb0T~QUh0sbR_X^l?4_-HdfEGrO_J1#UrF9BO8ah7=?HXMG zA1!&@^@0Ht0|WoQ+AW~Fwn4`;F}!dGC1G&O2Kn?Ok8W03kTIY-iB(t#xg`ugCjxpL z9@J6q1i`f*t|f5iLDFcB`Tz+Hu%kc@^60MJ0CCiPNJ0a(HIR;E^5|ym02u>zRGlD- zqZ;27KyuOwP~Pd>x&TZ~odKebyYA?Kgq$ZxJMJW?1(GI|1bg>_M!J!5){#Gd|AQj; z8@$<;1Uj$?luwSk9{3LOWbamx9*^$5AZNYU4sp~0@O`w1jCZ;(pR3B#2!AQynSpvo7zSly$0FG%N$O`!AUK&x~>Ed=oL zh#xP^wnJK4pc@T5K!?;;f>LTXtC|2TEy{pdptJ}w8*;}1tmCB2cD+T5=I|93ChjAZ_U%FGN6=9CtnN7v%8nR&ew{)h>mr-3k$|{qf@IW$<~v z2S7*8dvv#gLJv{~zjz^X5uC9;ygY^21Od-19iiX@mY}g7%#Sx|nt-ICNfTav9(TRK z3=T!m8c2&5o7O@@3lUuxSU~bfd{z)2RCR(!H9zq8ftpRA`kW0c0g6bFVbI>TV+y=z z*#RC`vU1&0s*k1|u^>e06=*jr4<9ULFo9X1lmXgp;27!{0vaBP z@aU|C4D5G?f`&IJ~n#2Q(sR$6O`A9^xV~k@gd^sDWp9-BDTMvmPJ&;P=MI%2* z8WBsdzACJCJ|F{je(i!69iW42Kv^EK+!NLeJ|GKK1c^4M(;!cRhuq^CSKp z4?vp)VaZ@8SY_>teGpMpEzJ-3L8o(uuz?OH{Lv9&0gg#|u#L4JAlJZyPI&+y^mE+x z0Cb5Wv@ewiz6Zkf#!D+u9Cx#x=7L4bK`;xJfoOP)(4Rz5IKYM|P;=>V*B$#Hac=~2 z4(_-Y21z609@Y|rN2?Y%JU}fn^xn+@ZIIM)*Bju5&T-cRIv_q|CJmgJ!TkcWc(5Zu zV~n7Y1ttL-?NabIL|w3ISocKYv_wB&CGt-u2rV+1k=k@OE3 zgZNOz(B2B`3s-E$g3rZ*s)QR0I&=_ZtO+(_{>6fPjpRDekP3L6^Yi1NtOZ(h@dC0^ zYZ54xcY;@Hflr%*wjWHv#=-*l;7O1!aE3f!29|-C4R?1h*h0|aD)t>zE4$C?1U>11rFap|%$D4gRp?89Sb0}nb7t48Dpo;^+^Dx+s0NnwOEm$6cbZ{W^ z0GA=z=QA6)g2Ocra0Mg{YL!6>Fj$cZ%SIaPcwq}^5rdNM z24|22Xh5?0$AA7-=w`SL&}-;mMd=3U(vmt>*wT_f&_Y>oD^PSI2Piy2GoGLVZ3A>& z33$}Mw?gp6r^TQO#r48I1%8{e?f6<9fjZa$FJU1a<-Nk~Hw@ zDcMj4hL@oIu%NyNXv(`p6tqAAbe>x&3y1~Ua0i=EiU+MN2j9_-7`=eGyoCei^68+p zqM-X9x<&aR@ee-s=(sD)T4 zg8U8|*0Tn)kRldRFCKT@@dIoWs}x89?sD-r3wYEA()U8_k$^?;0bfu&AsUDW{6Kuj zg6kD8azIPSAob({e~<*I6A6w`(E1=yHV6QTBGSbHXoRk1h6PJQ3pkoycyx;%0HrZd zlIR3^`2aLR!37y8LKPQ*RX%`4=z|yCC%_GO$S%G*Fvs-)G(tgF41gl^1!Q%PPcW#M zVdVw+7Ton>2D4zb7ibKP1Js=F+zUPx^mr@iQUO7J@F@NbW>D6EoG^AAe5(Yc1qeRu zA3O%t3z6((1^LV4cq{0LIgkWoM5@#E0gQ3O<2YDX2q;*_KB@U=C!246Gs) zT?J^I5!4t5jc`Glp3uuUphiY8F)+Xk0WClRo%|mOG6Zz#2K2NvSbL!}0u&mc1H7h! zybEr++h~I(e8F}@w80iV=7a7I0^Q}2BF8-D>kbRJt zi32g=?kYYEs!c%a>pyITgH>M-oLB-01hA(2xKt`f?CC_`ycE z94OU6HV_gFAhXl>!w;nKhoAh!A9oOR`1FI9TD+j8I^ZOo2(lbLaRC;B7DY<`m7pta zzt)2b7|=>vQzlUP3R`Il%1V&Z2z=EA$g#Z@{4XZV1*>1NF9A}+ta$MY6usSBLD2@9 ztb6ea%y(Vk0jXp*KrR7+Ez#ZK2X|f)$az?D*MksHaG)i4PjFgz(@^_{0ega9g-ur` zLKlBaJ;**t&?SSI@C4s<06D}#J_WaKBfuuY5@;-nB5<_WKvK}_hT7M#6a;FNzA!>j z3OA1f#XMdVMG*5KDF|#He~TfgXofg91?F6E0=>K+t8-U^OZ(ab`@o9Up(uhF?*9m=G%-6pZFu8Dc^t#p0v_HE;#NAnZ<)> zgraOc6eegXU!T8?50n%T>cPQdW69tC4cssV zXY5Rnk59;c>}dB8*CjcuNdwH#U|)P5wP2Gz>;up!QJvb z0OVb?8abZ7^&x0v8xm^}tuS+M?tz&5dLz`@JRBy^#b&Y|e=BHW4qP#NfTsk(uFD6R z0TzTdOC~@K2OmxcFC=22c0(m0*G^&jNf~T2TpS#PpuQ()KPOT>4H38GZ->m}gB?-~ za!9l94koA-B_KW`HsHZ_z#l0JJ8qyxA^5a+geI^(@F?uui4=t(mB>+8$^-xjZO0L-W4Q4_My+4_f>QKI~r9{x>-9Lzl~gRAb5e zvp@#|b-Fgd@_xe$7Elt0=lzBkUqH#D+qD5&>vcf$K6IV^A$NG*uLU^|5kc@+edUWK zpi)af7ixemZUI%VkS41ue=7%QLoFnO)PaqI1>TOGkidgR3b@9@VpknDyAVy`1{5<> zpk}_t+7vd%W)z|++ypWTmbpMpVOVFN86*KuObk#vpzdw~OTse|JdBR{fWina4o=)Q z`ehPWGFBUCJ_>4FE66y=9!*dO1u6cm%>D_N^BvVlit1@VyogcSE$o%ssyiZ0Uj5 z8^MVSb|f}LDd-kj*fk}fjwX29uE%lkc3fxz0BxRvGC__8&nX`V?|A{W;Gii4GWQG? z1+Rihg^Gh!LpR{UcL0No>4g+ky`W1lK&9yGOYl+@<_3^5$V4-EhcRS8oe}ICutl%? zpqBJ8F)%<{_5!Xq()jfb@=rg|{DHCM0KCTvQUPiTJ@~{Q2{s;FHolgH8qg1M47l7x zNJAwdw<=;rM2aV7M6?{>Z$ZjUV6Df&TQZSC5Sp7#euCwuIiU5Yuv-{JZ+->mCdh7T zJh{nmA~-jJc9X$!6Nvp{DkvSna}!vo2`mKJwg_%;ft>^?clUxUg5)N5CwOj}j0llP zS5SioG$6|Q?i0vqpkbvaU>4{UB=FS@pZEp9v`6C+&@c&f&=NEhkFtnN6*6G59HbfC zs=&I?r~@Po?~B0~k-^3c7t93ZjN`5kKnLA|Mz$+eTL>x9axL`Jj-(1_kz(4;0 z|F#SJKzzs^jWlPFM_m`p0jU5T@9&)Pzus;@itf(K-Tyu(BB z0_4=T8}R8J*qIW)HvRt(8Uk>Iohh+kKG?+C8=xG+@S+p4TMIP5v|s^P#`OVYZ5epz zdjWJ32fC1K&IYij4!m>&jdORivVDZb^PdkO7I-Kcv7QWVX`l%tRxg5-;*Ql#AZa|Y zx(wt>#8D{lSX>Sfhx1o}_(-t|;zMF}f+HkWSAtZ4V)Y^D=p@K207k5?f+~W<>g@I4 z03bG2!RLfyiPhC$L(yW@22@887pp28(PMQD*hJWb>SpL(8PGzowO|?72cQGFJF!LT z@pWK79eC*uiB!Y)pr{08UUe`FB~qay{wP!1&X9Qh`A!Km<%Mf%`xZzVF>wYT7~TnX zU+sbymY`FuI$b}2hRTuF4IY4=fCrl*H~>8X4?La=x=F7OwA39mMhrax545WdED0WQ zcm~SCkhu=fd>ZHkJn#aQ-Jr!k+g$&Hwn({7X|A23&fjtxbZA2D6!m)f=GrL?{2idP zy_##M$k*vL*G^I5ZvoxT^70o%QA|l$bM2HE{+?G1po>JOG(%5DxDCn32lhg|^@L+;02!Gj5qjdDLA;|j$O!4UwO#d`o*(edHM5^xg;wAc!~(C@>G=Nte3 ze>oj$_uEkny7rFLrJG|NnI^C`=BZsPu!WTmVx!0i@Cyr1Bt&N)?#O z12C0oAeErQ$_^X?1s!B{_=gu?z_p7jXuI42=wW~_AbF)8lCEC7^auA#Tn`)u+W=bY z584m>;l+W;;KKBS2V^eg!wY6mnc2;{;SDSSE(5b*lM+aS>yT@Jwt_DPIu7nR2SXBJ z2}nmLK}wH!96&7&usFh11QAc zVbTE609uc8;zb*>hD^8ykPWCSePfXoI=~fzOoqh8VQ^f4eNkc$^*Q*sUig71Twq7l{5C|> z1qQe#un3YQXfYiq;VK|B-GgYl!N}hVJ#h!t5Q6kCAiD2^RKX9jvWB=AboDD__ZUPG zq<7#7YB+6xx*F1vaNXcx?Ye`%{~)+v1bYywb_1l51r~Y$wga3WK#>5CwNtjBXa={~ zL17LT-vkkdrF>XE0Zk);)Is9rV5u(DDPZFv4h1vezR6t<4*v%)xgf)+p!5rBc7fJ* zLdwW!Nc3%Z3E40RcI`uuYazygnXvdc$_Z+=fR#K3DS@W}F^D0s%<}{y3C%n|At4Hy z^#fhE13K*h39(Qek_9Q`OKodZNhqY@*J?J15kRVtcXvhfMz63iGVpr${5AZT+(1ODv))yD7 zK`{@yQOl9&3d==kj6x%+0TM~uAkoGLvgHlf`H(d}tp`e3Uo?V^ z10Mr><3;&Wkl&&H$pUjg%h4c1*C<0KpnVlc!TAWdk;ra&WkO8Q73H2bTD+*;)uu5b9K z9^l{h0d^2kcjy9-<^xO~-8P3_$b!{_R}w&d^8@Uly&%^@((W%%ctP)Qg!t#1?$0d6C1LdV3`?grbj0{KmP-3Mhce4;4}gD$?G_%)eMjkU{Kg0 zs zy!UItP3Png7(}5@f2|$(bf|WqbMN3M^QYcA@53C0>DeX1|`3syVJTQ{? zMsT3R0uEFz@q>+lh@e@GEQMmV09X&E)egv3<4VPXV9iLWSQg?YP>Ox|3v^`~B+`Y! z>L7{J+I0ngKX{@HA}0ct1IGy@NKeiK#WBPekkv{^2|^UC8WGcLz^Ml#K{T0w0uG_9 z6-62L1d#|<1702ljY=`FWsqS;aDuRdC_##Caj+7ICbS?&mO=?~39uf_AU|siax^ry zaRoV~App5E5A3E@^TELd8jXHA5ptdsC@n~WEeV~0(#XgL+W_kC!pdxxL*PAF-K=Lp zx3qwIi>!yiEby64NF$=~qg9W)-pGXXY-fQK;@; zqnp(gBnrPA$s8=fA?VR9ssobfhTNY8(Io|z1nXi4Ny2sgybZVO-EC0AlC>OkM-oKW z9k3)P6Wrt7tSdpf!C^H2juOMk!>~JOAm`#AcfFw@0A5zt2vP?P7z>aPtRoLO93u%N zjaYaHTde;8avhNE>$|Ygb-NhwaKsOfZqZ{Phk=e{2CpD|APDMRAg-kR0T~cy`9KS1X}1UH(DMVZ%PxBhK+6$N{J-eY z&DsXi19m~pZBP(_cA&s*Kkj;?5MpyYNEvRM9YE4ho1uem4~#*!_kvFVIPtluqz-JO7ET+NKy2g$DaCE$tDB&V201t_?YQed zQ0L9{fjz{|e;(bnCtkdS*m(e?5^U$Tn@SA)+g<-*hU+$nol`+daobr2l7{;7xa%KC zN$&c<8Di-lu%*(%;K=j_DFs{VcvFd?+w~8oohKl6DuPtvwv!1Y4Yd<#$Jhh#jkCSr zL%&bF@P$}?Ey(cZ3Pb}bh`cl9bn^) z?A1DmtqCBtV6TSV0DHC5b$%yRt!x|19<$+!c>e#j}($6Ze_34)8YRUp-niJ}|OECd;Lgluf> z21&z8I>dVG3n3sUfKIjM0Z+Z7965ghbSJO}cvqeW=*Y_-kh^w6H+Xc{?)ZNZye;6k z>xD3|5w0IRtX(&hfJS_wBH+`pf4n#gS>6b``$xd!qjT6}_raZU(9ymK3* z0JnGcfTR)Lfz1wFhz4DszJT9_;e{0FR7c1V`UTLKI>a9ipu%v+{|nGH^rc0hMfISa zfU#gt)b4ok;uq-96VUN~7vdNg7#eE-@s@&4Lb?zSQvtf~0(vh_0s{lXYrTfre_W-Y zBmOQVg7{$7NerOP!lj^$`{BiZ(4nZH-GJqw0o!iYe^)`i2c_#TV3sTFN+9TEN6LcW zD7_An#GR~mfTW?x3RVthgB*F>^#OQ?4yX$1cCdid1SdSY9UMF?5An}C06DFv5~Lj* z8TnVy3QI`(?kojwNH&Hz#tWnzw_~(H(on~MGFBeQA#evkcbkLn@3eM3P%G_$E(JRH zAC%Bvb9jJGyyyh&_5_^?9J<4!Gr+;4oAuNcSePBSf>d|W^zN=-+Mu$}6)ko=1;Mdn z333qb0FeSoBLW28jsTtL2MQoC4G9GYaCy+p`usA?i+8~+wCr)h0~8~jp`dJXBOc<2 zEg*%s9WfOojl~hrQ~OSMbQd@vMa7Hdpn+d&*B!NT5K&awPLOP;>jrQf?eG9??&t=s zRR$Lt55ULoHP`-Nr~@5U@&Iz&9w-VO93ZpJpcH5UAIzu)U9r>+x||oR#sab&2h4Wx z=rv*T=&n5gy2N|ZLGTXo2j%btRpH>#UHan%=t3o!!H^`f{1Pnu=7L#B;fFh!fG$J_ z6%&v-KkWOPz+1VnNU^@Sp^1`0AlC(E+T4wQ0k}x`4+scu5UGn zdEE6uHHd~J7z>YX3(%(j7vTM4ouJLECp@|w;9DRd+OWpM zS2d6id_mW+K_UpekOLMEHcTGfrQmqrIsl1>TDUX7@v!5?EO4rT*$K+3@*vNEOBT_K zNLdx$=xc)n$&U+o8+|uH(ulPC05rY}+S14H!X9+47Sz|x2P`}~kG~KGyNY!wNDtWN z*%y#(29;;<`f?h?_9~E4Xa%zYBm|plhSZnQAZbJeb74qdxu;Lhg$5L4$qb~wWCW5%L=(K6gG{2KT)D>%QVNcpzvn>KBIQqb z+ISAJ^bSY?)KX|`2HDcRAZaX?g3s*hwiP?4#IO%k*}Rwu+Uo#nZFP&@JPWZCyu#e| z0r^hDRlmMyh0tr5dfvZ#i34*RH-4z)N7t{a=g6=Eb z#S{-0H1OzVJqq>%sNt|1%)%Ce{~;kb3#0&d2v&on5h3^hay=&~+gDh;$lLoDbVWxv zNDVl?e9yuY2duMt-1P>(5V#^V04c+5lORYMY7?xPG6fW{$6X(QX>j3GVew*_F!;b= z(7o|zKv4zq=9M#OO%q5$0ab*@U2n)k9Izgw9Jd1|fTW=g00k^~(2~&t|jv!^wf&-c~ksI1dAZbLw0m}~;z?Y96cZJa4Hg$!? zi)@h1;Mxarp^8U0>!Z^!zuy3}kfIpm5|p~d8{(q%Acc7R50XasALgP5(EI1XH3#G( z&e8)fHiLR0;0(hW0n!H!4?i#q$t9r8o{$0+dW}sS#3iaAg}B3p4J3^Sn+tP5$p9J_ zpfh4Ux=S~_SSkV=S8@H}VePu2LDt%YE>+Acn+#IO%k7`(6pEtmy|lxW&X zkj)^^tmgdnKc=mWbCl%HC_ETotOrKugTGm@Yo6c18_ zI~E;4(ui1u^}S#Vt}cL9vGH#U1)r1T(Odh%IFS;%z*k9 z4xqzFz#Uo8aeoZ|FM!+N&9y%mA?ZyY)RANmaAA0{6@2Fc$Z@drRxS=sZx$fK!TCe) z1X6kfho}eifG4Okc|l5XJM-OfaO)3J!yR`e%b9!_&b$CBT)J5&f(!>cv;8;$XQqLa z;&!GxNSeaXOb6Zd050)hp{WUR=Bs0{h<|X5fHU`ll;U>g0+2KzXM$G3AtId#J<<R(`VB2)nnb~o?hG;<9GaGdoGAfPirbk#j}j5-EDQ`tX_E!rnUWaJybUTnyIJRe z3ru`kP?Ffh}q2=eF&6W7%adAIIHg=@Z1oON4KaGNTQo{GALjn zb3+DTNls>uty20S_lHUJd19^I^04uTC3@#tnf36^jG&F?UHbhGXP%WyIu zW4)fB#K7orob^hA66h#MkmOvD+D_JU2_UmrPbVlbtN?}San=P%N(>Jm7A1nzz-O_7 z!NzfbEb;(Lz%8-_%YZDJ2eoK+f)WGB86MrNG9a~`tWzNtO-fK=SO>AlK1qo|;6e(> zF##YoaEqM4#(^y|2TQ;$(g4eVEJ}r1l$4;v0NG;4$_-N6$r=N(C^A8bVGG2fdx=U6 z4iJm39{_n576vB|z=LidSORX*daw-0A|0qjnh8n_pi|>Lx>+ZI)ONBeLo8BAP+~X$ zv8XmtiJ<^ukse45+(!yvs1wDEF3Xjp;uRXoVi ztk2_>7|uW}l1WrzSOBr;DM$_6qU-zNJ~{)IfLpW|ECaG=7u2Hd@k$J!V}d-oSr>rR zcCv1SShOx)iQy{5qV6~)1~vu;hGVQLaY_tK9>-Z5i`c zSOV^qU;99wJRmbPrMQ=Ki%C24l_51SDfRO816&7vIFGZizy7pSUsV-Kx#nk zUyp9q=b%{WWOab(vW-__cmmON3*>EZ0Bi=aJdU$oh*M&i0C8|2$gblK5*Hv*kpSbz6uFQoK#y+L8z5P5 zt#fWKyf}w-zo9+g1+w5S_*#%sXpz1FBm}EsAY(LrAZbKJ0Pg{Uw^t)3gC0P3RJ;E0 zV0Jygzm1{gK#2#a!(0Sj4h0wH-v>GY@dW5rZ8gxbe&GE=&_jhDfOk-L*ZzR47U==C z?LeoyuJq_;J+H24iI&_qNX{i0e zP$IBTK^T;(YJa?#@c;k+*L?dNVEl&v{}Dk8HXgL$@dIdf64Yw?vF{$p0`SV0Q^>IZ zRtmC!e_!nvutQPo2Sw5g@cqJ_p`fj0umlS0T0&^hAy3w>H)?e}KrGP7?98CugBCCJ zqe0OKx*i&w0$#kh3F=QayMADNeF_@Ljc>r$k9Y2U0g^&w1xTm0o3&>*r~qsQFSqQ4 zP@SyhAVDavw?g8@^ktB=0of7K4WU{O@VA0`=N{c#!Db^myr2!63@<>Z3qWTZOA0}` z2|UZ*UHjt2OVE9&peO~|}`*E<(Ans%>+68M=W`J2pSr43Up+kDmD5`z&B5^q+lpy&Oydd$#iyBbS zHP?Rl58k2hAGDtd8Z(dr4V**Esq734 zuT?!jc9w#s&Te>gTkHe{;4V-<6Jq1cB_JEWpm-e|f}N#LIzk_Se9gbj^#Q7HyKA4k zPymG;xR8AT@)+o(vTg>CR>&3_)S$$kk-)bJ`n~`qDoC+h2R0FuVUP+G&^Q?)6L$Ju z@By6~2Q8I6K*eU~F%M?Y_A=1Uh}st~IzW@z-~lj7OmQOJ6j=5J#|Su?UGM$Ayd zu83uBwprU@33M-L5h%EP5Ov)F%A}w%WKaVA07{^LAPMxtK2bRrh8IUz7#QFg4&-7) zG22~xmR_u2C}viWGy%sdUV@<-UhSQ4Pq_mjss!tyTj$z4XV6t>00qv~JeMtxBNWRq763 zoz!jX3-`STXzeQ40iqi~3Zbk1K-6&u0dt7&f9&%I1-d^oD9}B+S@l3Fdn+U$x$nSY zxNAV;=#ag!@Sp%+J__0%2?_b*82i*AqlBPqB_V|#cs!NQqp|h{=t>jF@(!?=w?{W9 z(}OZd0Eb8C36FyhSUfr>Fqoz?Ajt?IWH>-F@Ou@(wJfN)=KA6F1n_-~B|_i}7m+2N zgAX4CZL4j84(2a_->D-2u601|9nh&x`wTz@IC$5C#S0EljSVTRA9!>g_t3olVlL<) zTS%pL1H7vhv|q;J#c6P*1TzG(UKTX>edEOukns@n_KAQt%`QMux-S9Az8N63unAt+ zX_=sc6m(BBq?m(jHUmuyfktmYB{_cwXoW4f1_3p#K_wt41iN>DLhywa=I$K1_JKwwUfcoK`7rP9TY%(;DBh3DR)$et2{W?0Wz)?+2*;D;&wd@Y)8Z8nk@l#aqyUhTy6VtXe@7 zRCs{uC5snNK?Zf(UfuxBr>FiPxdBp)be3Lt;VA$bmIbwiLN9o925@+EvmSsr4AdBB z-2!4aAK(BbvhLCwFV3rgl(WtS3Bxm_{sQoH=K_#m>jD0j8qkJ_ZrcePl^7sZHy0=* zI$7&CDlzQOFiK^3@exw$-0}1si2_%4hZL7FZiQ&b2P=J6ND-{ASj)RYT0p(v1Ht^`S{kuVl;l&P!-jCprv3&)m zNkAnmjKy29!GNBV}i|u-lI1@-=Dn#KtkiZ3q z!bu>731Ee_7hc#voC5CbfK$6|5lCJaqAv~X2HSWrRr=zECRm%TKgc++`K%Cib|8Td z5c7>d`We6qS=B%qK|Q_jU;qEV<^*qN@%i=t{|nGj952rDfr?R3`3)(}4Q9j3Pf$7l zw^=$u?=;ljVc>6-VPs%2s>HbA8y%yaE~5ZEFBB4qSg7 zgQ$}S2|#kFtuRRcL9jy6__d%s!pZ>B55APtN#Ml{(2nqKRu_;|=ka~1p!#S(aux#3 zHG=zDkPhc-&>>PF7xvcvcp(HjFd3AqL2+{U2U5mU=&XGM?MZjLzUg%R^Wp>#D6DOh z*TFK&U67+XS%cQWGRu+Q|Nl4F{$VQB^XRs<2C0(=rMZuw!woxGwLk(5kU*1Lr^N8$ zO$YOley z5Iw~pJ&qtfpv4=_wSQPjwLQ9RV?auzK~5Ed=3Oa4uLc!z`Hj9?fq+ITWd_Y0C|YOVHT!i+@_+?&c4VZc)9} zpacw=KL<5OKSHt#w6p>FMfk-m53uqN`xL+)uKn=hFentd!DoDbcmWEMeGV|G6<{gQ zxCrQAFOb0?y7tGuGEhF){u3!h!}Ebhw{6=#SR*$P;kZsvXo4~WXoLv77D%88*36p* zGA;wzI7o{g-fOab4T>YMfB6tbvaLe$FXR@{-U^`?+d=2_fSbTjPdyA|VAz)c^VDVV z(Ue#`wFKmfN66U}6zbq|(E~D|0_~l?MS(jorJ$Y!)D5-^SHS}L4`>M}*uSDW zkP!I*>EMDpFql>ut!1NXGAXv>>fyO#@h8k zDcdpE|BRrz5xhwKL5VcDISUqMcr65J&pHTz*0aC94N{8IM@LQ|x~pMscYwGZlzMlp zM2^iLpw8D*h}(bc`vG#hJ8BmLkvQVuLGe)?oVr2A9fSl0s6hk{#^VkGO!A;SUi)L8 zkh}}Siyz;Rk}s%F3mH6t8Vlat0P+fq0lIw|G*ooKgMU3}KiLn^38JnyKm&I#KullI zIj*iRV28MZ#aw@Yq#@&aY5aPwFF@Ck&pxDh0et)!e+y{k26)gfjbG!$C;k}U7m!ns z^-h$jqKbpgU|YWx<$%o41Fw}a6-`1{1Uq@{1?c3pG9HkQ7a&)icr67wJ@p01{9W{sB!f&2NxXFf>_$??8FrLD_2HQ=oN&-AE&3 zWX6u~4N$~@&PRhBtV@G9k={Z?oc!C2rihq0xd_#SKThUDn;7soF#sL8CJRpJtoN3H zMq^ze+rdCWsM8tyLDH}eGc?(QhVa0f(2l!;H>16ns>KL8UJA7Bq#vXn)RSdx1+!3w ztB$*#hyz*C&6)v{>;xT@=z7BfBn0a)LRJKOf}~*%LD+i11k|`Z?h2+~=s;}!@Inm2 z0A)T4Tg3nU5ZcOG|r0d)I*qQ>8#BHl9NE%`51JI!>9^I__KwfG+ zPzqY9_h2Jv<Dg!PMif54J#r z^FhL$$00+jT%SOVZPwF^Kw$-1!gg>G(&Q0jvDIT)@7fCt06S$#qJz@g_1X2Cw7Yi43lqoyETpys`4QB{ zalLRHBo7(}tP=yR)dO=u_3yzK%%DI4Uk`Etbh;Fx6~L+nvI}Gcs|=Wh^yL56xm z43z;%<2Ll~JkZQJbf){b>jTIsc&tGSK%+tqpv5h>K`OxJUz`VXILQ1Ai1~X!(zwl^ z3z9~1^gRX!hU2WC=PNP%`~Uy{an`r}K$2e((ddhpG7#3s?lQ zf1DYtvGf2qp$kKz`}AB`fpBmxJUn290d%n`bTPmJkW$Slaz5^Q;R~{S=LOKYki8-Tpljg{zOeUTyx?&W>;=#=ZqWD}QqA}kuG4|T zqt^y>Au_{@^Bmxe3n^|u0}jVsFMtox2bDG83=HPJhzDKOdEE8Fceo)89-uj2@Mz%< zk8aTVfZ87~io3xz$^}qi3fbaWA@HJ!pAocI0IfxHRo z5`t)mxs0Ge*9{(>pd$q?{DUiE@aPR-1RD(M{;|5ufklJW9HeM~ly1;98B-vsMG~YG zcWU`H8#N2Cfg|1Zga@dk1#j1Rzz!Ay&9;H=rgZ`@8HW!^!@_e8>@K8k*n)GAzgTC3 zj0Y#{iL)^rdffHK0*E6^K+14CG880@l%zqoAnXUN=z5`wX)So6I_L~c@ZQ1W4jlhM zr(7I&eINk#2a4AO;X?2QN-t-@g7*F_Bp1VL_{|U(9|9@Eow^r;q!Fnblq|qWK?Gvq z4)BOAG}(!Q#6Zce#17tdJnniy3?vMy>OjEpz*SkR# zq$EUS2dMi88e;^BNx{UrD93INx{hXlbrwiZ(6QEq(9RNB3 z{{uMpf%-?_$>)*^kOvjvdNI|2jI(y#06O;0^#WMoaVU+$P*AVl3S_Dh+|&XNkM7zJ zFTkrlLHnn3Ky8)dt{0R+DiAazmb+P(&42~k954%Br-Pbl(A;?o5@^*R1-KJ_3`iQ0 z@F5l)cYW{(Trh;502hA`m_WrJsH#^6Wl+%2E~_#~BPijpN`hH%CqT+-NRMK*Z&}CEKX4eg#jceL3^e_n>RVYCp&}NZx6tiHGxtwsL*5v*Fqkx2TIgIHIODq z>v7iyS|A!U<<$)i=pQf6gT{J5@o*HROdBM9-1UJDh=v)}dB}qqbOfU74p3Ry&1wX4 z9@xVg(~%M?WM=cY>kdXmaC?s%qzp7ub=>s?v^xWtaf4iB`(_%rG=yxVLR29Kz()~v zgYJ!mw#ART9x#A7XN3nSg@Hn!@qkBfz<&>rGDr;sOWOy)7x;k0VM<}8X4+TqigZxd z3^a5FO7M{0)p1woX|ApZz~|o~@u4RO-te$?{ZXF}Is+H10yJ9#S|)Pb^?)(lW#H@p zIT;&~WpqG#OmM0Z@aP6lYOi>48q#yqnma9R9H5cIu#>II!nQKEs8^;r39oDceI3pq+#7)L>h!mO&_p?y9iu% zEC8>^IqrJE3M7swa}HR8_~3W|2h0oPvIH7-HXtR2ek8Y1?W%%NMnTYf`{cn{yCsi4L~z+rM0g^K?c}DG(G^Q5^L85rLu6*j66u4YmuM9bUXR@Eej!UV;uj1E()gI)XF^z(+>IZ^&%^!HhJ7DhRU5 z5o}uRiWjdyLmkIm4>*AZKxrA)s8|6S?mX^#z!@%s8jRqJQNa$v47Sz-CGsF^5Ne=~ z=7u`@H7E}sfE}gk4!U3+bUWgUY*2?9Hqj31>K=DJ-~o34sPO%RZuX9+wJ;6^}jp=g9oI~3o`FQ2vox3;0reJauJT5-~6~(YMTCaIPW`;2`Fo2!g&H8sDEId9>MBCts5*{{?@Hhuj zj=P3m50Zw42fR0a-1P$FvR!bE{sXyz69w_Z59F}80ZBDrKZ5f^x9bmN&w~uO5QEUj z1`b45kQtzG_~3yEhaafn(0S2=^Pop}=m(EpHztoxoI;K zQlJvxbO7Bw4oMPtg5vuHkIsu8is+&7z8@AEPy3NV1JbED?s_8x5)vms%5XPXR)VAv zW%Pqn5Enw)1>Ft`pxQqgRIOhCOR!D^r5aF)+R54mVjg#Wa1kt1d*X#NsF?$5C4(CW z4jdjJ{oS=c{)2{OA6x<}V+{c5f{Zq}f|%W`Y9J?o+X6BOkAT`<$6aq^K|H|>Qi9tP zPx`>^09bUv+g+f^3~;vsJiiTYY3&3l1zWZr%!0SHpcYm`ESvi6Crl!ft293gC8V~WXCO#9miQ+CW1ygAYHxN5Ftw> zp*s*EJtU#K5FuqGp?eS^2_&KW5FuV9p@)nN4Eq>Z7#Q|@n4~hiaQpcGKPV+Uf(u^& z3F||JAA{{o(bY$*d;gV1?w{{hgF z85K~H>K2_03X5)55zz2dC+MiaPd%{2|Dp#ecu|Ui`H)~f4pNG{C|CiKMid1EkL<99 zY()hX4;Oe~TO2@RGN9!`paLB{1$W%_0xv{z2WVe%>w%ICK-=an}pr zHQJzc>L3GOaDWDRKs@jO&jkU9rVk(kn}4vEgGX2e!Gfh9AW>BM792%bj_f$t4GXaC z-M9j5D%)s2CIj$u!q)U?>3}ZUyFo4h{Q( zw6XIA=0&V$ysfi!`w-PVcLcz^^Bw5R(H;)IDH<+zJy zpqF5u)*g7F_aAf++J8`+8honT1Bi_436I{20`R#RUf=(NjtMaUnE-Z=S|_%MVp0P4 z069U*aJ%DG2O=myWz&0*JC3_P_yD3|5eCahun7BzEct`I96SW|2`pH80+Nw*Uj6_7 zS_3?k8uJg~BXF#KfvE(?>JCunx0^K)8ypHJRkt^jul85?z|-pl1Ah$ zSVeY08kEiv!3}Sp%7Vl}nFiV(m4om%fXAyqu5n%A(OkQNsl*gSv6O^@D8|xaQ09_H zsD&0ZFF+I7{M#7#w;cd21$Yf^(<{L^1i1eK3P=SH%R|MWCeQ^9u!QRdkM01_!GKU$+->Ob47yTiMdzs(?V#iWx@8G8R^9CSfbsQG z&@>Zt1owa$*lDE;z}IS9fre#3J?G=D2h2ed&9yfez-1$t%fBsj4ru=$Sgk(D+-_Ep z7FaxUwZIFL#y6mjI9fCZLZbO`GdL@NZ^eRkeUZn>j)0`GM6(shIiQgONa{Uc4dOS~ zu3!MqsDQaIXMsw)iJt4Kvs0SPEZx#Z~%#v%6RMmZI=eE8uU!gvjEsBpk~4c5B~KRz-zKVnI4?3bwJUKl6tAFK#8_5{9lZbJZw4;m2UZvpuODOW}(JP^kO9b!7}dLSN&od9vbye1_E4_nYSp*qkx zy$2GR7#LmzgN|Z3?s^~zqMi|yenGe0^KYyD{{ni?B&?Zo0DKKRXwwa7Ww_!!@VE)& zB05m49(O&E0k#Renr?+hCuGPl7c2%U(?MNOP}CfN+!|i`0@6m)2i<6Q-1PwX9`J6_ z_n_1ZN+FyVJUUq)f_TSW4?uRI*S>hM>^<1p4<6mDTkBvUx*E(v8dr3HEpzCDglHE? z0VIK7TThh@l13!i2a#Ymv*v)Jto1-CxVabwP93FZAf146(BAfLRwIx`Py>xsqYf!j zQCi|lAx>ZiDaGxC7quuYU|1FY0CMR!=x9DjA;`bp^#EiiZ0(5`J0Nuus1y639PDQB zH1Gk?xa)D(2cVm~Js>l~2f)$M&DsdE2JGN+FbmQ2IMU$JS=-^!S=!)n+;zrgh@*o* zion++xvqegG?1&GdO=qpu^NMq09^qN>d7#?$bl4*uq3pg2JFh(ju*Rc zf#dN7=+;T_mE6Z&7l7~5Ml|&nK(5aQ-RWH+@M7a_um;d#)*Il95fC|G0rhm&pODLB$xTK?2cQw>%bY@^+>1df#%u+j3r6UwFj6= zO2C@|Tl*mGg|ErK7Z3e0DY@Gm+Sn==we@LcoUGVQesA6F7=!HmjvPOWE9&g>fHgpFIGqZ1QnyoqM`tTYtw*<0 zg$MM)sqQAw8NVLT>sY#*K&Pt0uS;@;HWa{SWrA9d-Oy{BK+OfPXckBm(qaI&R^fBE zVA*VtEUHirNT|8?20wp4w8;W(T7Wg=f@DFnyP)$Kz|$Mx`&d9j;Ls)pSXn+u89b|l zg$h7I&9xU8_*+2dK6)Gnixz@JyIn6dKVSrn#V10Aiy*>~iOPcyctNdOkgc7EJPtl$ z1CIoOnwy}k&3OVc!3s7Gbh(oU=#UGjIiP(!pbQ8SXLxY{G{FtAw*+JXs4)UnSPJ5U zHj;wx^1JXd2)w8QY-Slq3N+#T@+l;NfKo*{ND!3Y!A0eRmopJk2SACSyA=|r0U6*q zLCZrP{5}^vprV}t86LfR6;M;fxun1UJ$mhe5FDn^bO)^=!9vhH z06voyk?xQ$T?9o7G~GceV~9hb>23uBf6F0|uOXt)bhiSM?)Y246);2!n)X1eqBuO@ zX>S9l)`O(I1s*7A?*L?w66}fNkoF?X)h9p}LLa!q?aL)j*GywYna_4L53~07|QSty3M!y?s ze=~rGnEy1?{$VH)hgk&~?49w#7px2{$=@P~C^Bw>{e>{j6x@~v+XT5Dwsr>O*aN+f z|NpCj>cJS)@by5nUP zSjrU?jtm~Xdk>%%2+?uyis%m5#mEH$NG-HLI014Xyg;}B;Xx}Rh~wcmlY#;pS|EVc zb%L%T1v?E|AapSBw}5ZyJMIdq*kCyYS|A_`K?{Tie*S*Y*%uxt*M5TRftCpk9^IiG zkg0Z1T?Dza?Kt@APNZ}LDH+g3A%(+U&;SYpe~TR`5FnuoDIdUQ!HS4Ch^zuFB09k9 zXy8Re1H6a;TZ39kfbKm7Ir=Wh4$w`hketjv?Ldd?uZG%R3?+())CDRjCcJom7nBHp zHq`!vBtoz<{ub~oJH(aX>w%$}0V7{RZv~zJNohyG`%b_y0l8oolEiruXeAU}3O8j9Vl z%kyAu;kkM6wlHkQ;kfIGSCA%f14tR9mxXPgS0YFn(FKK#tz7sFc3tg`7tCkCJqOTo z5m=}80^|}|@Zc4wKYIakO)RTwp%R0Kvg->E&_{$($Bw)1_yO_MYLF7#(*r#qX+(D!(jDrpeXt93 z-YBH0ZW#$GAzcsr2l=zt^#N$1J!?v%5<}-j&4ZmMIu9NEC2x2^^8$Dp2(+!v0%Rtr z>S5Ibvk(IbZy-Zj$6a@DDud_#ctHwqyY5{Mc;o}z_y)HyP+c}Z0^+g)P+O_j6?Ep= z3jWClI$R+w3qg-=);*wc8cWv|;4K%Dh+p#fyxan~0hm7wXTMrHH%m-sQCwbSp-OM6-cl-_XBvObTxYIZ! zgNI%~Yl{FBm$mQWqk}vc-^c=GGU>-D-#~dNJX3nB(&#(l;KXrbs%X(2*5)1!e)?th(7&= zEg(Ku63Gp|)NeT-53)?_Sj=Nsi4yAX1XwX2> z*?XW$4Y9!B0z}4j2XukKix*F?gX#v?3p>GDz!IS5!iyINu7b3Jvp;|9NpNNEdI3D# z4@%RZ{0<9Y@Y!U?T`xe#{&#qw>}CL6GX>fLKYj%4;@TH43_!z7$6YTRg$h7Q1EpsW zj~#=GzPNCUf#KyuP;2wJ>xI)GQBcqRWj#owoAq2eEY^>tBgHznly&GRT>_dWj)KJe zVvthY`K$#bji?6>TmV@Gnl}W+FnDHwe?F{WE!95e`j-*ZcPf#35q1b#>2%$vx4Hi9aD^4Qpw%L!ETA$R#Nuz62X08Z9=OB|>a8t-PDg@xFK&ZYoE~>Q zaG9Bb;e{4xw-=~v0=p$30(=GqY$O46Bw7GC>s^64x3@y!h308+ARf317OY+ILK(Ct z>A35GYhVHJa^wW)s%_BJKV(<}Y*+#)A76(nb8vv}@>&7DZ0@-0fg51C+7&NmLyE!! zw?M88JO~bi2Oiz5t3d&2?fL+`>KoiE0(tun1E}-F-vXOrybUuZ^$o8s z1wd|f@IZ2e2grfgNH4c;Sm0}tRP1q66> zvvPriQ9=;3j^V&Vm?}^R&O8NPz>}W}OJ1p|NXZMl!Z90?tb9O9aF4|5f}{}z2c&s% z-1Wf|ux+e$Y2eu`@L20pkkE0~^faV}gP;lp)VPLBtjIwsvj@*XDnUhSC#x;UfNs`f zDKLlbNr5{QI-3sZGBrY+I~Sy|6WoyXIPTg38RCR?!g?XXovalgMaQ8XMnoOc@Cp>{ z9}j~gtl>3?6AOt0$cnWupcBVBT_3z~-VckJ+8ZzKK}0WjblVoBD>1w{2jQRa=(cSD z@%KUa2RyoMBS8Fh5dIF2ZrcD5e;$Ot!K2%j0mScv@K<{|dkhQ@~*bl?-{9MIYiFYLJ)81_AYNf|<}seq&uBth-J+7By zIX}GM1W6^pq<(XO4Fqj>{qW))7X!n-1u&@x5UCwt122Q59>AoILZm>8em=a|0g_UX zg4(qTBDDgnYc5DC0VdTCkpivf`0%0$B((r0RRWQk0oIic=78Jtpj6xN6_gBIKxJSz zt3whj6`FxrNbO$8s@3DJCuTy@p(scJv>x675`q=Ikc|xA62Yw==*YG!EZe~AWALSz zpc)3$q=elI(_H(3y&kkZ19DBwan}!^Gsr*{66nqv@DOZof#7}yP#bd=XfOs+tb(>V zfxL17w6+mCCHMh4C71_t2dLI$O#!ozd<2=tJnnkq7RdSCtj-_>(1HN!BZ%`M$5N<( zq_GqPW}rG6blcixP>lvzr1HQVEC`;jJOP@k>Slckx*Y)QklSDuhC`rB8{a@2vkjyO zw_~P*q_H>#e35f^?SU6=NRF{VI0iO(Y6})}JpfuHpA232Q32Yeb>hVzKX7yYfgM;0 zct6~aV=e*$psnkmyA43OsFPI;u z(1q8KJE6hK8Q^hn0y6dO`U8BzS&1*W^RX6m577LiXT$yurPrZ zn}R$7xm6lke0H<)#llKV7BCAQJ75$-&m1d>K1a#+Yd$N|}W+!aDY@+4%} zE%clU@JcvPZtiB42N?m*jiO){l7qknAndxiFo=UbMB$CQMe|u3I`>xWKh>C0q)&y%QQk$6YUguk!^pWxL^Wpb437)-RE; zxO)X=!Gj9AjUW{gL}x*gxZ`XcNE%C=fsUF5uOX=im&;)8an}b>`UmLn#@AsUjkPC0 zQ~&j#^@$Hahxmd@YA_9oX2t`crNgiFL4tB1FCKS&0H#5Q>OgkjVjc$qUIZ=yauqlk z@PS!yzd>^S3J>U#w_=DNUq*nF0eIyrG{++s&Zj`qn1%BJaBM;gU1rw>@IDl%Lu+}c zUIz)PPoLgAOi$l@kZ%gM0*%0VRxPNSz59zyUXn5yrjn0QIDN55dYe$Xpy~ zoDZB0OW!Ir{-a{B@BI8!$)w>yE3CT0bB0vsg2!$A>`6eK8FwH*>9*FcJJNBee= zG$Ps`fF_ZlGpC@E2wb8-SBimlZGgA-g8K%&HcX&G#oP^Cs61E+34{}negvY=0N!QM z%^Co*2JC3JaCol^Hs%D~xH}u-U{#P(-0c}QkThmihQ-DO(9vO#>2}awBM*L0NMQ@g z!Jsq5AO*7n2War21{ARuAm@mIhFx5Lyat!m;DQ{okABCCK2T2*T0Cq6dlD8Kpdq;n z+aW@r3=Ykz-K@!Bpm+hTr-=l!kYWg2cEK)oTo3WE2}luc4~v4NF+F?%bVL={H&Dkx zPN@Rr8kDlj59IT6U{`|VDmY#|09RO`#mMlo3w%xwxNLFY@ZewXx&hKas{Qdo4K(%y zs*gYwI@G4?aMRFAqO4Gu#}mLTgvY_l0%v%1mQL{K4DA3dLf!}Qyg5iAbP+N%$3j*) zKo%iOfTR(NkYP2+hQ|;m%m9@upw+S9$vBt?tX(^5Q$V6mA*vun_Dj&n4#X!N9+seX z#UT%VUr03wKK1*!>xO4=4Ulk{01pQ_&@duWFX$!YU>#79f?5Y1{C(g9h!F7vYqD*4 z1veAcqPqc#63|!$$c@nUS_gFDF>HbH1rKZ28}+eBDlR~mD{cU7r2tnhHXFf}3+QH& z6OhHz;7eX6fDh?}tS9zhuKfYI58~K)@L&XNS@8wN*E2zezejQ%xIXLf&;%uo37}oZ z{OeDECyPPzub_iJ5oUUHo`Q@*y4!>E|AvoXbHG`n1JVzR4TdF#U@!}w7@&hKpk<=R zU1wZ^qyv4B8t4*HXgUBDkf65O1dmQu0gyC&O$_|duLYoe0Q*5p#a>K+EDJ{-#$N!9 z67)v)0_b^ApfCrut`~rk6{wL2jgtkCGoO4PK*od8)6&w8x7Pgs|357)EzP4FJbmf$ z{iVmjUrgYO4}RE#0!#BChyz&!zTg))IKWpY-0;Xg@C_Wa4|-Xc;8S4D2MoZ1A38!f zKz09u-ykjEn-h+^F8BlDfLCyVR;IZw0G~JoUY6Dx3>oT&2pxA_06u4`xweC$QVFy^ z6SM#ie5gRT>jzM8QWqo$-ctcH8*-)?ctPri7saq#fv6Ut3)5T|FoOnOK{qUPUhqJi z(}iW}DL4%ya_Iu-K=}a=Yu6LtUdaNmif-@;H=wm|3qX5$Ji0@{JrQuP1U%K|djTr; z0@Md-*~3Ze%h?*Y23=L6`VU1jsZ**4qKF6nGKL zf_GXWDex1&AUG;hJi1v_H9!I0>H5PE)LZCy3Q3f+K-xN8K|P!q&_oGc8sggE(aBm3 zl0NPVNvFqMK~*P%M{n(hU7&FQNcPaM0cVd1pd+_F@e6?M11Z_}OT~o&JW22()efSB z6BOFVT_=F)-r5Z>ctA(QcY=m>Sp`8hfvZn;FbgCY`Xj}|SOo0w64n>__V5F09p_MDn1c2j0?aAbs_k$ zPV55kLdb4cc>aPcVS=BEvp@*s)ox1i7vxBGlJXb$^e$K)03X|hl)uD4E<(*;V4>r# z3&7`gA@UdG)Gly;8j-)i2Y12DhMd?1&0oTx{jHE-gY-S&t2|v7Ku+umeF2^vdI38J zk1F{~7UUmDUim%U^|H7Ce77zX@>YsNDlvye_N?9ux`yDZt&vF$75?>P}F3 z3|i9;IX~>UE0}Jm-NR5Kupe}<+>1ug&UVo8;(Yr-_sYE}gz~{-2%uIieKSxK<^c3euN%<)1S>qcLAUD6 zcmZxEw;rejEk-$@3l0z08{mVNI$dA9?gRCvz&k;q`R`>Vq(*}s$^~-H0>oiVCDI-s zM}X$WnL*_q#17D+IoNgsP{$N396bvO2M@A`c+|Ia~p(^0?~*5Dl{EHE4SFfhHt4AT-FzZcs}C+&i^A1U3S^t`~I84`^=` zg9mts9;v@uA@HKq0u)BzTmB$AAhXq=Qwyp*U}06@fwD5F8MD7r3JEWFkQQivX97qF zR_Q|eI~pKqL`w=*)@%S>*#X`s2`b#6;R$NKgO*--fSTu!DrSQq$iv;P9k8w0EzPwp z;H}v$jG(RAEugL0^TFFPTbN2xn`>K``CCA3&6i!EY;)XogAiz+b}f_xx)RF+RF8Li zfWi&3eiPDa1+UfwpIL+?3frs=8W`{a?bZe#REJp*Z4ie#6KS_Ls38vTGl83n@O>8W zU6-I^^B(Z`gHGZFc^<3^Qiy%yi*(LggDTI%LI?^+8HlmLE|%s-IX^O zUoQt41-haIq7||~uJa(22i=nc9S=W-DvIo1JyUQq4pzx;01uFLmv(q`*G_oh0-5Fo zHGMaLN5w!JJHWfXAzW}xT?%pGZqR^3H>;c*ENzLnDZ%dDYkUJLSUfuSdVq?|&aDn$ zYAR&?S!)DnhlDD)zJ1^dYVJWcw;Ttr6on+VR?roB;BHPYM6#20D@ZBw`d?RQsspQq zlwYk7`@p9{f?NPvh72+ZTwHa-R)u}=I1bhWE@~i5Rd7VNf*i=d4YZ5yK=TWh&Q{QQ z;mvzNq&$Cn8VdtMH&_UCN9P4q7l!|!!~m_$z$StV2&g@vniRAT6uy}Uu60-xdv-bVx~kRWFtf}Ly$4-=?F0LM!U&?;1jJ)j;L z+=-xNW{|7{iI5i_zyAM!$puyo@6F9XatLIG7V1F;k50&%VN@S?PlYTbJ_v5jBOfaO zYS=-#jS#nh1023)1nhcfeqL8UZQ zIZ_0|)F78(Ge9GQ5R0J^GlB7C3aE@Z4&Si=iYF(q6F|2cfL1wnKph4?@D0>aD$#|C zxPaBwcD%R#6I=24*|8gow1!R~7DZC*wxsaUD3F$LKT;&c@4jq7j9&-$l z@L*tIc^%5 zU?nhQ%o^ng-V18rA~zSL9NH3s6t>V33bLxf4jUWA>jCIU<^#xNYv>LS z$gSNcUND13Xu4VXK>9(&0xJu$YfyU-oxY$B{*D(A7u~i8RRXTy*$}9UkY_{ofTR(< z2$+iwghGOE1=K~*^4|487({#lbOHlfK0`fu-1R^>M1BUz^VT(>9sxL4AS&|%5fIZR zctF}76JTX4xcTt{BZ0eOSAd+lcY%)TM4Yp6gYjh*C~0@IZnlF(^h!IVh(-kMan~Je z>flK304arb%&-J$CP*4fkj6qh0}IjvaS%TI1f4m}wR6DDv^n5r+8j_b4b*mOuAReF z;?rC^hnc_SKBy)FAG8fRm;uBA52GA+JpjI_7}Tu;A879iIs*sVY=L?I1!z3-CHUZJ zL=uEW-~s4_HAtTVH1a_0DcEohc)@m_#= zJ`(ucoEOs|Eiu?if(MMRS0n0a*8`Awap9GShF0K5a4`hLI5|*>w`eCfu4)Y;TFOVb^;%O!oS}21-Re^El&Wg`8fU} z929rR+4J=hk8W0RYgknBS|g(J4Wui2-1UZm1~^}SumTr#pa%8}50DTnxk3uxiy&!4 z%6|Z9M%12op`i&b>NkSq!G-H`D}Kr(DFZi?TyH>afwcD_OYyQn z(lCn=Ykw|4)`~&8+>o8siCW;hvOxnz7r;#u&>>;`t)Nx{sLu{wG=^~Qg$fqX>PA~_ z8`!CsY`ehu;e$uFs2VtcK+{>ES%eFfV5Ok-=%6bP1zs$N&Rgw!09m8>;>86}UEEy? zS`Yc+#bGeV^#ydz$On&3&&;H{4(rhV92)Z)||r z{K^863J!pTV37f_`7}rxi_PH9^>Nn+U>dZ*aO(?j@PaldO$X@#+ujRiA=?hVNe)zI zy#U$O&6*8T0rfZ*>wQ4dSgZ&4;XzkiFfcHH@1A=R{v2+h?}mPgM$P-g#mRFD3yWc)j(4iJ3!L-r!Z2L!5!NPkih`R;aR=48}{*Nx-fuy zB`+4MLR5%?V(_@@1TYPn!SI44z7-zbto|U2!2WOrvp^$xs52OA)!;K2$ipYcU03jH zg7Y{JNF#LU1nQLy3?M5ZLnm*|zzbm^Eu7=7kkNqV+6j=u;5SHuRDw^MvH-Ph8D4C? z3kqaVUk0?Xd7pqZ$P&<&XNwnWL5C6@cijLQ6?h3f*kc3eMpkfVz7|wa!KQ*ii*YI# zUpRnvAc87B*j=Jo_x}IiX8<;{_QQ)9kb$5XbnyM!Ge9?4o1s__9@_yApMH3ufA9Z) z&=3}A01WKEdi0QvD^EvVlE%DB)K@Vym`FY+#dl85V!eH*|g)ZTb89pt3$Qqaou z8!x)R9MGNN22kr?q@dUg6$KsU_aYW_91Cc6b^~afmVaL<=%NX5D$u+MvIQ1CAa{Xx zcYqENd?^D;XUAPPfQM6{DHpV@=*4gFp+_)H&{PHq)XyL{bhAD*hLzaYjgjgzNNIiC z^@buON9_VB1Nr;7>kDX(LN2LigQT$(SfJ4u$c@iGFN2&99u@+Ryn1w(p6~$O{%i_b zm)p%62{Hkk>;1tjc@{c-;sIzB2QpLS4iyLO_cVe9(k3tq$#L-MD+h?QA|Gxy4 zl%S>sWM~Jbcq2?PB!AWZc(Dnj7&aRLx(pNI(jPB6LA@umQqK#trUbOH1DZ!ZyeI~x zXIL4S2IfHf;k7?rI74lN-cj=7h3n1#{~=4ROc)p#`1h6W0k3Njxdu;F7eIGVf&?ME z@)@Bf>;nZVNcaU4*bdeY2C%q%24*40CGuoW03<#Sf)wG7&qW| z4_{jzDmDUzEOZ14bgHWaw9m5xJTnFw{OV@#0NvkYc>&_H*FGQ}kal71ju%fsg$YX7 z3cPrC7OeDx2P`xtZv6khk3j}hOVxgO!37ElP>ljB0+r zSThlNCSNC{{dU}SMu8S6C9!S?X@ai1f~Eq{p&?4T z1(00^pmXmmAUQSs3M@`KJURvT8GzF*SpJ1S$hnB3d;w&{3o^_Hsw*IS>zel#{Qv)- zsl?p_%BtsqvKUJwUe`j|EG14*7Dq|o>vYgsC+Jp$2FMf`Xt3(#Zb&O*0dyBa13&z@ z>X!?kQqau^4c!c#prN=AFWaFK&}|3}przoTi+<2{FE4jf4_dtiTB3H)Cpr)A0JSE-*UWqX zoixjlP_-$8}Pan}Vg$ObZa zH2>h>?*|QPf!3Hn8_AH;3l>a>NmNK+HrF1o=kEs%8iOp@4QfwA)}x&O@u359$bq8l ziW(~MAQvD)1}$WLdNMpyWF5n#8^0$olD__*X{)V*NkGo!g?l0K^PZX!mfuaGFD0YC#;sYX} zk{>igWbxuKs0D{8$6;Z20lEa@Mk10R6{a}`JnG}pgie7yy9&MC-S-~bX;kz8)GFCG0g{1M zfO_oHLBWU!s{@VT7zOpaAS0-tCJrLPVL^2OT&jY*Z=jh&(9v1&Bgij!fX^SV{Q(VP z5=Px26S$b8?%<|7=f(UfEekw4Ss#F;5mms3PLQJz zgF#&&E;vr0gF!1!!?Fl?)Bt%fXaUIi$6YscgQi^8Ls|tJdcX$MPIyrOI+OuC@B`}S zfW}-IUl@b-c!N>{WDm)Y7qMsl|A!`}+8;0cK?Z{NDuCLZkYNB6>k&f-KVB$-6eBX) zhF-A6poSDI(IF=qSgT_LPfYK}SI#hF+j)3+%yYkOz;uZUBuvLe|iL)7AsfW|J2l;H3ee^fkew z+qVI{PN#+yoW2m-6<)@GChLy7ZUCozsI}lM`vzRgfU+z&?x5)lZ0!?}i@I4aDZ$d$ z2_>}jg;9=thorChAT79iM-3opL;xND_YAs0y(7?lDV?sM5jMsW^XA$f@Pu9uLy6o= zQziz6=Gq=6{uWRxq`9_-nZIQPX!J}5vhv^nXlUvsKa?{I645ij{YFN3igNvd)baUr z0+wn)nHgG+d32Zlc<~w(CdXY5%!Zf(&Wy~UINFb*W#0v)%(xw@2f7;$+PeXlZycbT z`j|l-9ccCk9Xaw6aO$@cU(a$xNHfaJ5gAWt86Jpk(2Kr$D2ff&+BLjsV34dlbx6)*09 z7pNc?Zn2QW2g_g3eRA5M6SOe& z0GJCdUqf$rbVHpI2y#j{tAGM51+yt2Qt%s4YXPwqq0<*s?cLzf2G#GZcjdt)BzQ^; zT0%lX95NZQ4SJ$%sO3$#ko;zchgsE@nCHvK^lMDpDL zI1R2x zPeGnP0re?zoqq)+jmWF8HqHU?y#(F03tp7ffP4zs*AA*gJV1ieLB}hB`dQ$hs4DwGm_#l%PFUr6i(BWU8f*q9SUIZKk=>P>HY7Twz!V{$U zxa$GXenrr<0%%a|g-$oL=V}VSUUkME7t>V#~#=M3005<`&dDl`W1MA z8O)Y_24L4g#s(gN9B|zA0Ax=iC^Li7B`6m|6PPgAFxK_5umrYL79Q;I1MWa83q3lw zg3lD|oC;YC*y{k!6X3;#x{!#-0vXZ?UeV+MS=0lG4seei+)L|)NOrQ?gOno9GzInb zcY<94SxgAJE3)+f=-MQ(UeFdck8bb+M^O3%mtI+ds2` z7A}G~pwTY}ZOG^s*aFb*ACGQGNOeQPt$Qyh6knvh`~UytPc~5P2383=M8KmP5|~&u zuzdah|K$mU22j$*s{ypX^W}7~2H1cN*rr1e|9~SAl)*s#GOz@AwE)Zsp+7uO9X#>( z|Nk#Nz{Y`9gU&O9h7f2B+5>uoI`~HSQdd+NkdNUJ20r=*CBh)hEO>;O9sd9SgK=(5wIPZd7w+f*Le2^Q=NjUV(1%+rCLeDAWfU$TH4l0P?O*#Wax_i+C zKD+A>Or%o)#sUvqet1!O=>PwhvIv7uBMj!>#^Axf@5hT@plpvk@Cf(4Dqh21ypRAH zegHJR4@sVo{lDNs+ zObj->o53Ub#|tNj(U2p=P>jySYxIp52_U065Jp4xB7=VGc4Ia`7xU`(Hsd zd*6>2aS*c?K(6ybHv7e1kgd34bis?;`~Lrb*$nQyfz1X@ra@yA+@6LMCiVCK|9=^a zP<0LA0#H(|hO9!H;n59h_(8PzfV6=3Q9%OaIz$U7m?5(R(2^ac4w(Pr|Nobut;^8T z5`4i3B>q9e%&iCDMFW&9_|NkZAN;|M;Z$aDyDflg3 z>;R+af#!l18)$AtRT)wGF#KQ?sC|o8d)119(l#0q{Wsy|oQ5GC+I$j=LTJ zoiwl?G%WPu&lXUc1J$DNF3wFsi~4rzWLcRc_(W&j*F(2*aam)Y_6 zgAbBNtha<8^aPqQ_5kg7r~}>Sa{$ckhE4RIfGimMu@BNIul@1jv_Isqw4 z=luHv8uGmWTJYl0TRY*!RM1_^$6YUgdIXRGYt7B@D7^qV(ZIC<*7iHt{LtQG2SWt| z1NbJw%RibQFt#2jkq3=jegcI-FQ`==+Ta1&^aBdAonQX{e{G6%_}7ImAZ4IA14z2K z04@Sx+ImYrfR|1*eE~PWRuyAGH331sz$mnhDj~5)EkUs8u0eqMN$U7k*?{u?1 z6@-QBZ7>TFu5ZAnakfChb00_&RPP>leX#+QNn!KdknZ7pkTjxu2no;Qt`7=9t($Jv z1)$(=Jy5CuTBHOPgUUg|@gd}7iXX2*N%27uNY8Os2;I$^0@4dQTBo~0;DtI=rAIfb z4#-MS!<1DC%tCUwfJbNT50B1L&}=y9Y`PyWtU~|)M}&n==>PvG4~KemKJ{pR15w;< zd#6c}0X!J8{Xbk5I)04UeE~}A0`}lSV~qf)(17I1t`;}V#eC#1w+0AbD+QeudJFfCM+7#bkVzd}k3DS7NY$FlB_47!n}No61TI9T4U_K_!L_5awonC59Ui<^z5u28OF(6KsW) z7&IVECP5{J00>iFNQt2W!rUUD#IOLu)D%==I00dX2`MprfG}qZDltf00~@9xsKnp^ zVSW`-V#t6nxdfFMCP0|i1(X_c%Zh#Hj2})!TW}1K!Lji=DEuh3O1H$|v zpu}(h!Za07Vt4^z&f-^M5V#38L0wRZ!2-gJQBq<^fG|7xl^8l8%rF5Zh7Ay=wSW@C z4G2>~Nr{2s7TAPTJ|zYX2-64@z7VFpk`hA&g!u*(z7Xb0ekFzz5au^tC58_W=4}Bb z28r8X!vX}97#tu>SAHdi3<#5nUx{G?g!!CbiD3tXDZ{VC@BqT(hu%>VpK3_l>uC;Unb3U|SVW%4UActDtZyh;oO z5GE*{&44gJ@F+1HfG|sWl^9-tnBA;lAZ^D%2bO^5;yn137>+q`FnV;e+JYq<1i<46 z-K=_G8BS){N$)S)!R2M>577QA#seOV7d#F=U^&*Ha4&^{5p>QPLL7YFAPe{s*3Kr4 zdnpWH>2A=_D$h{{P+~{lh&taNV6|}hgAZ6dSV2~Jbh4bipq$F! z0iLXFuKmHt-531WF1XWh0_kpZl@n>C#eRBt&*G=QDKDgfp} zYM5?TCO)w5c|5vVzw?6C!F>OM7bFAnJ?q4spgo!l498frz{Yp8o`$HE*Z?u}4w%aT z*&WMz4y==d$D>>HFi4`CbqxD5MvWT+Tei@%msI?2S}ouH4&s761HYwNwBdX!yv}K*sjRHxZAjZy-Mvk&RX?P$sgCx3HV?dsR z7+VOI1RD!73}S3C)YuS^^5YH?3J<|4;VlQUvG+OP#$EwQbhEM|j6DRF1RD!73}UPg z)YzpU<;NW)0wBhku_GI+!45Z879`QldQS?TZn?pdU}HgsL5x*}8vBk7WR8PG1H@Q< zaG1an7$Z3Nz+w9hWPLX)I6XoF;R(XEAj2TW{@Vsg3CBUok2^?gfEe2Vat%DnilpGK zO$SMIv(5lH8e(iHSQ6}7kYNyGuS1Qs04YE2An^cVtS8tOm}{-U4g$N@03^}Px)MY| zjFkgRf{g_k1~GO6)L2H4y5kNK0*}B^c8C=eCNN{Su)h8U#`fF?Kpw5^OBU zFo?08P-Ck=%8xrpI6#bD4Cca&oeI_oc5N3(qMP+MA`mLTl3-&&hCz%?f*KnQQVuF_ zA;xY2X@iIDGH_&rjhzjW=w`J6#W2LRonT3@u^_`B##%#-%>gL~mA4RMbwS$T#>%t7 z13?5N(aq`$QVube2`mXV7GxO2SP`hPPob{805SF-NH^Tr4`7{O*FFVFbhCZ~Q4nJ< zgC)Vnf((Ng`*tfNfo%h+1C_Ur!BOT8wgncpmf+w68>Cw#^4wisd@g86qkeQG%kC!vStuD|hrU5dD z78Y{L3tbN0`ugAjYkfhLfR;0N^BjF(=fZ$63Umr7sFek8fq@n^en7~Bu5$SaCONJ~TWIK*D1N*xRsH zC@9??a{z}&Jy-%B9-weL<^T>4&_D_UEIdFP>f})z32%wIqRGL-;{_r-AWA^T9(D5^ zJ%B$vUVu;gLv4{>KnafpknniH2pS$jgvXC9uqM<+5X<8@>$@$A3}D6Gtka?45%2_@ z>~1iFk_#+6PBDWs2`GK+2TQ=iV*^+Q93J4&E?9VgmZ&P>2oE$lcz8TOga0Gwa=!4mNBU;xX2!vi#_0?#iO zJbD9sP#lTKFKBY`@VI~o4~P=*3=+@L1J-!M19HYBYJPFxV_-n^;~XI2aRC$_7ZB-V z#x7X;D1?Sb-!4T4u;Ol3bx6ERD7*!ShXn&Dco;zA$sXOTS`6Uyq3qGkDi4-`hlc=I z1{5BwKi?@bG`t1%gNk-RdQbVgAUzO|Zq^f^;O=D2+y(AErR`E=P>1$|-YGI{fY>?b zKS&bZ-}N!h!bh9>tCE#|JfMr14G)t&OX1n0sv~ZBxPF4emMY_8b8FU~PWxZ2m zcmT2JH%JYpg z7f9#s<4#2eV~AaB?-UsX-hqPRJ5(1)4YUL63eoirqU$xHBYESkB7*~17sx13_Yp%*Kj2_zU|<0aSj_(e*2V47Ejk4x(aoxg(A5N%1nc4lk0Zh&i%|faKtOhV z0}XR@vxb8-L+k>LsetO3W2~Og&~V$S$N*Zc?9t779HhJx+~J1yx2+-mlG>rj0NN0F zjP*0P1$>-U0MwxcCGBq3nSViUc8~~wMCd9o7nXbH`~`afRJuwEf=ja# zpxk=`QQPeT^$5YW|6~x$<2dVv9f}NK#oeqcL7@$5WW5I`gjc^o!2=88JHNr<0m{7> z!4mNBI0Tjfg$L{JSBeY???Fj+$__~God^nUaO;Sb31oaHYxfS2v8)|C6d4>Kk#zQz zBEtl*u0E(PkQ(s(LO1IlkY$~$tq@&JJK%YK{wqa>0}z+)0GSMLx2*!FFAhGBZc$J= z^yp^205${MtM3I%f*m^#>a=65Yyi{Ze0P6~c>H?{O z=J3zIK;;Lk4@8&e4n>9lh^~Dv6&V^nfTQR?co+hfe?EdoEI33xx>=urCE!tX9V`PX zfMlQ+N$yZ&fEEh7Kx#W#g&`J!@<%AdqP^Q-nP(cfb$^_7^EO3>1E7@E&3fi1C>k9k z3?Nb93JT)m44~@Wqnp(noFq6viA4u20e6WkSOy&a_qIa{_G7Hu!FjWrl>wqwVgtl? zieN6xOkuE2u$dfS3AmX*e}R%F*vwsUGbcmMyaNhGP#+RvW-Hj)Ff+@4f^>q-%mGWl z&5Q-hfX$o+H!~ku!6%FtP@=AYk(!-W=eu(KxVpvmM_7p{R1Ao z0cj|?8By({$-xVb1BikHq6D;!r<>=f1O9^JfJb-e0Tin|SQUhktNjL0^nwnL1|2ZT z0&fOw+^)y~T4i^PwF?{w$61$eS7ZPy?q+rP0Zj{^z~ONc%!Q@O-9Nx#Ea=fKx&b87 z%?ciWf|Tm>z>=Jx(WKkoL59F|o&65ibqFNU&AJ+-8KP?gSQ4yD6eM|^0o2U)=w@XH zOMv6^&o_{9@UVaT4P+iClgDw^Z%-8&CO}-84>A*8*Cm1-1FplvKoZ@o+d+mv>~sN3 zg0j%dZIGhv*)~Y}_2_0*2PyAleXtE=C+pp9iVX3PEHvq25+1E1`kKDE`iv!aGN4S3dAnGr-}?8K7q=h zq=5860mnzk;040IJkHx>-+u1%(&~s182> zlIUi21e*aaM%RHQL7|ZiwJT$rBCJ0?5v0766*T7Hahx@Nn<7I##I8A8VQt4!Xy0?v zRz-#cP>Snj^#M_E^d%SH){<@IV8A#LL381ME5|V$6~u^unZ_GvMztD$j|@@fC->M4!E67;NcT+awrE$bh9>q41w603YG)~ zz^Sc}zbnV!x z$WRUmHqpn53=hD%Kt_R@bRad*h+XpqTup3+=-RYZk)Z*i>-i%^27xaiyFf;Pbb-`B zD;GA1UF#vb)@)T|Xocw7`ACt$0jvvT6i63H4Ya0kfY`MXqHEb!c=K`d7Fg-f1MM`f z+@i>!0Et*HkS@?r=4Ws!tNsKE6<9vc{RB>BpomQZNp!QW{tWUEIF$u}CBgYz7UW=f z)bN9&51brWKoZ@orXbCbsQL5-WF%PEfABa3%&w2%VH>cnXCR4g*6#?ru7D-Mx*EX_ zhUqE>8wb{v0g~uuo%j*%!Z5HTSeG!!EVv6mkCfYaoek)_jCrN5GO`U6vq8xGrt51lWZN zAc=0)i69DM7av#>tcw|B7QAuw73>Ib?e+@f!sGBPbsH=L%2KZ2194!@V$e-on-Uup(GHkPEB^touL64~VG! z@E+tzux`nFiVPpVf=U&q&5&}>9_llXZdL`5d7Z45n?WJOYPMOCp$}53yuPc*pzsZ( z%Lb|oqy}2#lL^Tr}jo=Ec4Bu4xuWLLqfsEfm;t=Ac<~PX%GcTz!qRh@CbnK8<3GO7uvr8B{Z-L zO+XUeth@+aN?=Kl3&l4$-sWHhDeq+E+XOO>m3xyS!&-<7J2t@D9Elqs!Bw|G zk>LO&xWwOrlsiZq0HpkStvbvKn4m=f4GqCuk5O1uOy2D4}2(P)2bDZT4Y! z3Atkpbm!Fs@HSE8p+Q7}y}_dwO&VTiZ$OmUa8=-y)jUTZnBgt9H+Xc1Za^!xK_`_V z#v&KUfJZYnfQs!6HT->$+kaSfPAD?ef(upF6Oe#WI-$q_R@}{63=J3uesInR0drxU zG&gWs0#{?!U>$A)1`e3huRvT_!0demPcfUo67Yao43+^03~2E&JjE>V=$!yQrUrY!U`oRSW&t8# z;Hto9aq=8((8U`t3p~0*7oY`3b7m1s0S6F)4(!dGsEF#8bHmggs7DWfS9@I z8L~TWCHq2oG1?9)5iVWf&$6Xudg1L{Mf{Z@y+AxoWf#JoDaPT_e2FQu@tX$6#27)#; zy@6QyE?~L8U>HJ09J(6Q3zEK-SZ9 z_kj#yZ2*UgYXfA*i|xecF!|S@Q!zSO8$b>??%Dv}-Fuw1^%=-h4h*0$0A)RoMNw1T%9A7|Zp4HQN!pjCC-z)S^(U zovcA1s$0|>OtHFvDA2ZU#S0#-2TG+px`=*W z*C%jCdU$m11)X#6(FxrP0lMxDvc2Xwcz+ov73=_=Th;u7qe$7~IQXb~F7QY>cw3N1 zcQ0fI5LoqRkJTQqvydD#KylZy0ldk`^#{mD2sr_d<^vw!{qCTp5a3;ckQ0JnsrUix z+Q|pt-6ha{Caz#!^8o?S!A`9QN;Dt|jsbG6!lC9z>^s2Cc+CqQogkh^=Ty*Y_Sf9d zojf4lcyvPyV}`7M2W0_QP&x-E*yaa+z}HiPCRiCk`{g1_}0=!7UxdIDY42U^722|67E5^miM0if)!4LWQZbS^qfGy)_FzFH3^ z0#*0HqZ4#64rnKg>j8v&K-m&>&1Qo~cP}JiFhWkTfF=`n4iC^J4c${AlAs|R&{k`x zT1N@UhBcUC1;|MaFvXzg+5k7$5wv%FhetO|u?1v%AxyD@2Y8+gX0nGzH+V-iJn2GC z1VEfp1KQgHDn7xhQy_YwNf3Gk*9mwL3EDP#!lSzZ8aO{7sv#i=+OPt)7_@ub^#ka7 z#^x8Gr266|sE~q0D(Fmc(4IxKa6x38Au=!asla7Eocn{=umXuQ&>`C0 ztj{kfGJw6`8({9y&3XgG{eHtk5p?@2C`NvGSi2tJZwmvJAKj%t96_7r860=~|NsC0 zPSBCIyFi0EpgrXbFW#I373HoUK&zns^S6Mms{`MUhbSnNV0;|WvH=_|;9e4Vt0=fc z0$+Xj1Cjz1z<1Ju3M*!C76WY$2A}KRdAm?B6F7`JLAMiw&nLbC zTBCp5frA@dZn{43XgnDgl0m zXlLjOa8Q6+4WJSZ(z00LaqtDRNAnN)a$eA}Y@l@fvL75pt}DRavUdGZt_$wdfJ>-@ z9-0?DI!}St^`BE@@L)UuDjGrM=mw8Y*99*_AX+zo3i;*-{~$F2_)>r$pfGDb01EdP zpn4Fb8+0okB(8 zWCYc7u0K39L3JL~6P->P;MIAc6b2pua=ifwJCMg7K*J7{X&yks4sz_L=*KglQU;Wz z0t^riKJE&-s*T|_s15}kn&jZod8pg<595K(10JArB|)uNa6t`DDj%RB`@y3dbm0*w zLIVVvUH>pP*Zz?&+XFSW@r?s0v32hK0jfqjw|)RqQ(u6o-UlG6yA>>mC^j@a5JK1k zY3c#cVW^;%1+lm;O36C>x@!Ws9U=Qx_$qEj~l)G;QIwd(B5^B|2hR;YJ%;Ac)$4o zwiIpcx`2Pm0sd_VKy6J~sDaQly}-lr5dSo&WC_pl)+_)1{|A+Cuel&>a1u!d3xnI; z;LX#}2*hRG44l@@K)3D&l64?9)H)E;qxC?EEO@X6bQ%=6kPDpw4wz0SftN-_$PEbSRfaj;FdJBK@F;Utz9RS zx_dwy^&p3LG9k&f9w;q?I;lGVw3`rY9OO`4)Knh8^4bTg5}Iy1P+YDB=}S0(GXI29 zJ`d1UJYegb6kZD>@ibnuzEFqwseysNcFXg!E;b!F^SR5?2(*LFACrk%C7z$PkD`r;~z5_tXe*YZ#oY3|_Oon7ALBh(M)e zC%Dt=(YzOQ-~>a77pmzXL1br^z)S~AfGfs4hyw7n1I!q3l>w6gx05Un@lS@8 zZ6YYjz&5^SeIdCI6z8A7Xr->I67V5bo;)!oC*;ZU|;|Xvvj(GhJhGCk}qJA4p2!ZOv!^U z__bZ%G#}uDNcD;^bi2N2KEMvXs`Y@!ce{Q;w2oR0K;G&G z-s9cx|u@Y() zlSenIK!AY<#5pjBfU63KYH+TGFgpVTUV?@SJ-VS@039X^I>orT_KSRp7|1V&F233U zx`aUULTBq8P&!*8$znE>ivgZs~*o@EQQhhRR0J01tG7 z+G!jfkS+q~Ovn@9x!2ZyTS!LA2D1BcMDM9|<3n2+8dhYloyx(48Z zL=Xd#(t1Hmk4|66niNo($_VNuf%>ALeif*e+fWAT>^|`51ZS()+~5{!C$z2H3u+pA zboxTto}Hj^JJ$suCqY`7paRTw0jR$Oy0!q+8tQcIfOd^Mx*<{B8?eKp8xmmMkN{!- z1e)gnm5HEw0o1x*0BU}FboosJwH-Axq`rhrFxQv-x4 z0oMUZ&7Ba9Fk>K2=!BR75$tXS#aAc90EiIy9MVpR>7XNFK!YEU5zG!yhZ!^|0_v=J zfT}@|oVDwPV$k#i=%Rs+*Jr>(h}NzT_*=kx-@yGHNXrg1aSGo|Ya1w2LWW+U1Ne~a3~ByALj%;XhFq%wJ)sh!26VCvthorPYG;5F56l!u z6A2zBpbFOklo6Zvf+(a47knseBUlu*!UY{i4LvVw04iKaT%*>x;DE(e=R&4Jz^yt^ zJq50F!A(3woeSo6gX>%{6H@1bOhlDFkZKpX zEdXk`f`$;SA94N8#=w{Uh zZ8Eb4x6{h?Jh~yqbb}3j!3n9DA(K}nkckOMD7{?F0qT{an8?z4fWLJLsJD9D^#<4# z(3k;L`K<>^KvQO5pMm(D$2_2xe0uU7#uO10L`pI!4zM9y|VleE9!=y@#di z3I2BI!N@0Gm_S?vY0H4xsIB0$4M7bH@MtHfQg?mv5^@~_IQSqZFG5_~i5P3|-mb{t z0crt3d{6`8g4_aXouFA?ZU#Qbdgn%PV1TT?0BJ^D0JoMwhFH4ZCVf^X-A45@<;Lr3!()!p9?i8I{+EE-3_Cm+T~E9QP5hq#O$KxxfAL@g_$)j~ zngTf#I@yX8ps(ej&232X?mX0diUlgtIRTX5A@fSD&~OL48{`@Av?{AS$erN18PM&Y zf*>Bu)u2(s1s;(6QRW6Z=^WoImf99@6wL5wuAT9}1mp+Mgas(TK^Kv~IPUrfG~New z3#btC=w@96TBeVZS|@-+U=Emo5^NLr+rd|K9Cz&ir9aS86ENLfJK@F7^-b+102&zkU*ZWKys>s|D7J?TlYqur5KS*=D*zfg9v;@q9WJa{{=53|9v_umIdphKO{#{(-e{MFqBiCNLnDbOucAn0B1f>oe5%tG6igm5j@}W z0o*A7wei61Pk7-1HXm|QD71k5`Skz)mp))CAZ~;%umCrFUkkxTFd>~s@K9v)UJ%7l z0?HI17PvG3D+jv?kb17`R7m*-A z;ot$Sr2m0#;q?6jaWz7T_Xl`u0Nn6_ly3ZOkOB!MthLd`e?a5b&=?m$batR3pdop1 zdj&pf1m;2dTVOSv;6^i;2~HKTp-FHT1>SE1w_hRg4)!Eif*E!KGDHGwGI$;w+_-uz z_TtoQ08arxDqn~rL9;m^BO$XnD?rAf&E|k) zJE5~VAU34O;)*&837XAW0FCw);Mp8dT+Z<5gwE!`c%a#w$YtOesu_sc93*2=W*gzN zIj}iI&}ri0~>J99A8!4iqi?j=m!ymF9rc!3H5_stZ9$|6a0G+`Amw?bYF3=1H zc<}^m1_LAs8&LU!Jc9v}=yd(j?fOF(c?RQ4x9^wBsSshL84S>r2BYhjZr=|uNu(JJ zbV=|G#uxAm21p7#gYf}2gRuc=2ICJbTR;*wsCfWi-vOPZ3|#?gZh?kUTvs6OE(8?} zp!&ddg$HB=1r$}_5fs?$J9q>o4r)G%40r?uq`nh8f&v*00~rJw6+rMnV<+G>P%EJ8 zOIAR00mw>$m!MO?VWVE)kqA(&0$OnbnxpvBi9AQ40v#^_(U8K}bp!vlUJw^DSOTuJ zpq+kD1p#XKS-WoFZ-I0TA%i)PkrJ>{)R7Vg(0JO#rC=H8x$@wA4xXa`OTyg;o}&PH z9pV+pY#DN@wnNOStpJxBpb&uA51yR>aX~=^DrdoQ09v9336Ql63=A&{7lCpVL<6`K zhqeeHNg7;uLnM(cEriAr)KTCn9$7vR(F%jc1=LhN;NsQ>@}KYzP6 z6KEs@Tz5j2J4=BCnq4<|fL7H(8c41i_}dl)Eb~`$v|CRR`9i_pf-l<14Ii!6Kp(G1l)>%-kt|p z3u^89g1?CstOhi3QoG}Y=7s9#lxT>fCnDk1)zn#55QMxgx&x( z?ie5|={|r0ZiYwmkN>6e;FUw5v~}ErxfXPj*NYc{OF$(Ye=GEwIPj&IFTtY#$Rh(U z%7i??#xXE3G56~Wmk`RdFA?;&r@VZLqGBr@t zAeG0UwWz2o^FXb;Lmm)4J3PSMh}s=5`oZ^<*Y0?64s?M4qbtOoQXX(ZIPL&yjDpr^ z{9xdp3YzMMrmn^}0iby4+zVbw)4BBmXdT*d$nI*7?p81t0K8LKrs(-I%3=$RMLa}h*{EuQV^(hR=a|MzXf!U3-(fU3v{Lz zL_|cx4522|Q?`2|R|x z0B?T6+KDqfKt(NRqN(`+i$^!hArH`?4``(gco?a}1Jq^(<&+K&&>UTJ?Fxoc&^Xit zkh<5L9v4$*yetG2&mbB8)+|t5H`nf9;BSow-6juTDh8?{;T*;T-*15HC{TEHJFqBT z=yZM4T>FNBzXg=hyItRWzo87;Nb;oH^-1#!#!lA<-L4M~zTjzoAkgW0r`z>Tr|XSw z-#eFcA>ypyl?fnmMig2{XjX_X}@*0%8 zL9(F!BS^rbyA@19;%Nm#X}bqFz*`)^>i{9H1ebP@L;P(PRz*BU{t|`%kFH3@`22WMM=I%hPI&jwqG}86r(JXK^w*$K74O|(*+8LlZ zo&<2(1nt05qTg7KC@5KFtJmGaw^a{4JkB*$rw0q}T!Z5Y*j4 zT1E_M10mW?pf0Q*ycGluVbFjItR)4iH=&DwKuI3biP`}&6|EBmk_C05K#fok8```9 z_Y#o3VF@220xyi)Q7YmA8_a=P@1*cr5SA#DagtfasYv#bpppg&hXhqF{ zrb9?a3sf0;H17pb3?%`mu?!MKc5(@l9bh>~Ukl7cvV-fzx9NZWzxX&ElmKcs$d^ZX zbWa6WpP+TXphW<%_N(td}us3C)OP#vJ90auV0ZGjdwfuavt0$#H~*9<^RgS2U&c?DEVp)bip zC3XKy^^7iZ|Mo<;?}^K) z5MiYL?U8QRBaE&mx_ytpB$4{J=#t?6?Fn%I79<6#y)&30#tgh(1l`ra>;Y=b zc0!iaK-S1~yIz2-&;t+BAyx~3xscTYU?!xm3yxCII=la3YY=G+`uq0@;0Ca^O#5_<<0-E`6uDt+Wp?3kL_j?4| zZUfPfb{n|&3*v$sZQzwr9^I`V6Chdb!5>f?jUTp704xFN{el-vftqB9Q3CK9tcy#* zGTo3p7vSmz-1`Mff?6P8)4{!8P!K^&Vz4Z7aRyo^02YM#A2cEW_A}IZ;G%LWR0K?c z6FAl&0(F{RBu)lp60q&y-e4zW_XaGZfddunKV)Zs)(Idv6TDLdSst`b04xY|CODcP zA_x<~U1FG9!II!!F-!z(E0XIGedD#0KyG#gH5xz-6wt1d*8(r5gG7(Ff_RWv1T*2? z7|>~l9-ZKI*0B3?A&Z2-^&_|u)9t|W{RXHp3mRMkw_Cq-yMBSSTR{Uw;PtZ~F6TnT zA?;R>IC$wSTpZGFMHh#*Td@fo-ObPwc?fM4PZUyy9z%3?7^Pt=H4{Ey=G&TSo zegpNn;r$74tE1EP!fQi#HxkmUg-Sp+kAZrhpdKt}!W=aEk8F|xXxjv+H4EzAg6dsR z!wB4(1qpy!vmgQZ3TDuH$=U}Dr4!&66@nt#6||igzAc2mO~H8mN0<3c(FjP~8unjsQ)1-2iujK#M3rlM|q&i6Ay;3?5XEfddQNws2j6QcHuz z;6aKvKnBY|l^%GUNB}YhA2|V>rfxtQqR^F&pp5AX>3M<2;6bvW4S%44;{}irdWbA^ z3?4Kejv@!DBEYRn@TQy@AT6y2z+>^T@)Z=z*)le z2FM7sCL>4|)MNzhq5!cW1r=&wq`+%iK`T7LW9^|G z;O(Q(_8-U@;F&N7P}dr?u%LmV#1YjvluaEaFyk6Lzzsgoz6?;)$qBSig1hg}{}*f^ zGeK1jxTy!uc;M~%puPXleQh_OO}!f)-QY!e;E^E43m%ZB9)>7dQ?C~i@nDnTO+BcQ zu25S*+uII6YzYNr@dF-^M&1Q*%!7+PaGeI-($oyT&69z@MHpf>B#s?G`5)Rw0(XAF zYezxLAi(mlcHj%Nb|AR%4w+*2fK38}Z3H#z>(y;Z=%?J3w zyCxs~fZiqxo+k!H0BE)r))j?}z(W1O*m|H;8+_bIH)!!+^9RNj@M$QZ6kqzoqr0}_ z#a{58-mVW`&H*QE*AE`nt{3>5j(}#=yFuz8M=3yNzCj1ifYt?`kmqm90jmeAfNod? z&4+{PKn{>UxIqa4)N=!MnVK z2EcMEsCqu&0Wko=W`rzvLpA`sK*06JOVAlZ;6+TJzAI=by%jWc4HXdp58s3Q+6Fyc ztpnW7gKR4YZ43aF3OgVhZ$XEkfw<5#1*$G#A?$(T(H}@9$`7bJ;Tlmris*8Js#{Pm z6kPCv=1D+1vSEcVs2Kta_6H25?5{On9P0pA4L2A{I6b;+Z@j4D2hU}Ib}oRLeV~l; z60$M{oP=IDg9f!gn-oA(((OtXX#lbF6;Zoc1;tuHI3h;?w&@Fl3k`BH32`)WR z?@ETu7ITzKcyxoug5;f2r zj9?$Jcw9^c%?$kTfGlb*dJhf&=(ynV0}Y^oHK;GG!2^Khavt!~KMu4hHmnO)EWPxD zI0KXkAvqPq@<7R{py&XHBZvWUVK0d3(dqjE-k){_FD`060BWth@aV36@uCm3Py@6F z9ejjL%TrK60V}~^_d+z2j^KxsDMr+ zVul=i0WInwiw_|NLe3%wZ@Yu76a<|eA&zh{`2I>r?FHH$11jjj6$@-&sWTMRoY?`{ z{|#oJKrE&O4f28v2WN=~e>}87c>vtFJOL?zK_wUH5P=gONF|ppc={dG_yny71LeXE zkmEZRfD1 z&OnPPK7iZA)~+-7o7aFn2Cm>{K+2{G9^GK>36Sd{i)3IHcyNOz=+IpaT9^uRHH3}f zYEV%KEyX7wg0=$`v>x5y266|~+n~mB2gqjBaO;3>hPnVcwF6d8T>_mW09woqF1Iec zI0WK@QUSQY26ueG83ojC16P!gacOu_0c|hL@aQa^;L#b{(dpabgW5bR(f4Ssoxo6v zn2Z3M`qBcFO<@~bTn~V5ga%pgIuoK?3^ETX4N?UyU)VtGp&;abi1}dR^R(V>K_IVkYS)B+`ucE zP)ZC?>i}#HhygVR#DpBO;yS?tHpl$B9O>$A$ni(&6DO!y0xLp5JM*AJ(V*i`Tu*pF105dZ;I((4)(~{1AE*g5 z0bCg^8=GqSo;Fa&7^Sm~^_JeDNMa>T}&~am+11ladd%y&d;|o;Hfs+Y{ z0Zk?#CZxo5-Qc0=3My@&?F^8sp-17kZt!4qz2E_g(wC623RqJMNfGEK3TW30oQL4K z5W4>aJOB*YW(``4z~8|ziD>S7Sn1Jb%Y0Xm|n)Adg` z>y|b}hHl?KmtR2UzndR0w;tecc?DY7>I%8k9&!K%qwAkt2`Z@!-55vAfI|NOxIqVw zR?t8RsD}hjs|P@Xl%+D=qP`GopdGI77ZfjavRbw&GQ76%=oa;81Fa8tMd@mT`?esX zL49^mBNnv4@&IVy;CJK$Vqu$wqM zz%5r$j|nzz=X&AgBGBb{-K<+%!Dk4b;BQ_6+PzczgMq(AftdjmG~KR0I*(m`hB&hX zG?a}x5q&}N17!FNH0k^SG(zY420VBN+S3jjyaUZdgQlTS3Hetq2S5)E97u~K8K!bN*ppo_kwOu zHNXV84pfrcb_*_~9ks0E5B=Y>vIwPrG`))x{rppF1+1Od{{2ahsxdm9Ctkd+E(-03bv{ZRCqN%0QJ63bhD~JjFd$f`Qk#E5@ z6DtGAMb@q-_?t8!0`D6Y86Zgu+CFCe3KD^za005@<;&_Ii38GL09C83=RvBvSxl&lIVwhgjAb!0|fAqnp(oWM(I1 zHvc%QX(Q;&RtC_StxhmzH$)PasNvc@x?!7FK`kFh%Me8by@3hQ38`5xyxamw&*vMU zrCr-Zh`>IO060&wZU!;CS=WH5PUyrx>oy1vGHDH7ehX%T18){cuA6l-i0XuFV}o>y zz|A#K8v`N;p6Epm60i|qQOLwN)RCYaH?X8sd<+`z-L4nl)nWrEvOD+A04)P+22%|D zEmuL;zIC@k1i|f<8y?-F@9M$H7i|h)30N(7;1+spDSQNqzoi{X5_}K_c$fz~o&r9j z5K@7H#`{6dc2HMB16+lGj03HD2h~{zAPrDIkLJ_^|DXdf;7%NP;fO1!C3OI@_YS%! z@WKn58pxtRUaCO=?nPc=-)7@Br2YIu#L8)gA!1ES=VKWkm3^yCgljMFT)C0<}|-C+>KT zx3(Z1qy=JwIuIVoU}4Y@U^NcYS3p`Spp(Hsrhlph2L|dC4A1e_4kXh-Y^doVCdhQq zBn`;_pwS`FfjJ=mgWDi49Y7-zTgpIXtSe}rC#>EC9n%G>VL){#Xm)5p38+f|;(@{v zRHK5}ps<|a(JdMcaTaR539=NV5VRu$WGSSt2RfDuG-vq29%3n|=!HxTfGQzS=iGGy zq+4YMK1&Rey5L(Xp!F+5N&Rav*vKYqeIHaa=)er{Dk8aTkHQ*3Nos$4f5;b_hR~xmIf_nfn82DQlKm#k?t_whOI*@50)&jLu z2F!EDtX&tB+9QTPAXPK8UIjZXt6P)-VmH_@qzR%6ovhEQ6&YT8cyx9E`^yn6i0h<7+c#)GmXsZNh;u5R@JUKKK%ml>{WPZpBjR0gPb#1B1^70Tt(<@l;Sj1+5!FSpy^lEin;OJui*8 zL4&8@sn!#qSvAC3Kw+>9)NJ_J{9o9hMK@?<33R$Ne`^S6tgf3?4dfV5&EE>{;dQhA ztpuNx3v%cu5VM>0HHd=N{GgJpll3D=1Tx_cubN=4WjzCu1kFo|c^qfmT?wy|XTX@< ztUJL7Z+0c{EEWDNu{yIH+J z6s(m2vY#~oBmxGdh`GJ_Rqwga#RCULD$;fHoXJy-p|-UdV@n z(=b>IXz&^`fC=VGc)(8lf;2n8b8A1K2a0%DgRAFK`EJqn3Q(C3JJAeM<`-8eGQ6x} zVPJrk%BY8w=c8i4gjql1v?LVzyi2E3_G?7ECDK-TS4`~ zk^*R!fj501tM0&yTEYEt*cn|85+0C^pe1?mbGtzOFX+M;NFxcftPHkZP1FG50q`0c z4=e~@E(SV;2;9AguXYi52|C2?1uNKj5VIi#J!Cl&bYT^!@CEB@-V34_N`qid z1J@-`RZt3DF@Fnai}GvG5?9bVG7s2lEp+8jS3;}@tArlR1gS|tOI$&ggGXLFAq&}1 z6wLSN7F8_+$0gYD$Uy;G-U=3kS2)7?ph6qG1C@clRR59u2f&B<_9s_^NUvL{ z^S6NJVm-QHOAf)Nf!An(Z3S0_kdwDOn!)G(GL*P`bc=2&0ecU;WDMEipp~XzE1(Cc zL8>aSGH5(QYO9`HP`-d!0a~jAUNqLc7eq0X_;_@S212X=2_QQdyqFbg1y~NewqYum ziDU)W3(ed=|6izp?IEWA@#toKUJUN{+<;eV`-&AAUe1CvhrzWTxcmj3dPPdj23|4& zFJ{5VeSlV3fJ;#v12C{9Zjd!+;G>4SMKy{+#p@TeQ34?pQP3y>Losxe0IVB6O27#6 z9r`E%LJ8QC*Q_r-WrJb{a;P)7VgwHnfDb!{a6t{w8y>Lpk3q7aIve6*&^pvC(11Ny zDRkwz>jmg0OVGkMkLJA~3cLsvG+YTkCK4nHTZH-nc@Zi|0y1W%i@XT+MYr#Z%c*a= zUEk<}?udsS6A2mUdI1_PgGwSTLPeJZFG76*UW5vg0*&0cK7lPly@0gI60{@^JX{ZJ zl7bg6cTWW^G3<8z09kkn;vlwHLOl=KVF_V&1}JokW)yD<$YN9Q<`C!+-QdY4@M6;o{4Jo#8`#<1kj188rKpQd zH-P%(7ng!%x?90Ka6u1VYzpIcf)4-(EjAVPDgcE9L?LoX16pVbQ4aMbD0sk80CgI; z5F;{pwt+TY{>T8Oe6Y=s@#@wUAh&jl9?u6m0Tg5?B~hhEx9Dn!99Si?^FRws!Gh3r zs*tFGh=A4|Lac!-Fon7rED2fD0~G<=2+;`^fh{oQdf}7t=l=`$4ESkO&2J1mV8_%S zcLirGkLKDJ450O9t}j6IRG^iUAK=qPoEOq|Fo5c-641=o2j~=a=?f2Q*9RpWpvf%I z0Gvm6?S~hApmSJ2t9!tk{y?{6{O|xxO@o`=pxI&2)G1U5w0HqBnF^W-t^EO+=J8Jl z1+422=nxIETS0Ct<@e~WeegmJV$Y4&vY;gbprJyDYfC}X@IPJzLdN(&)3>k-l|XkK zb=Lmy=medu0kW|42c)^Jb^kx&#tcNjz|QXnc?MKK^@8>+mcH=pJg^gd69&l67m|;W z^eTA3%cU9h<#5Vq3L*_v=-Mmrg0F5?Q#dEsqxlVoN9XT-AkTYr-hZJw9WIq;#K;pf z;SL8SG*HBqT<(F8?-pW740qsh}%4x-w1Tp{^>0J(OvqZyY|nEgHu7yobdT@8VKm| z%eR0+hQXsVN9Bf3XN}4ak6zu)PZbz^dTrN$sLm9X2R@xSDldFGOH@91bjGM$@MwNx z;iLK2vGbp2=U0z|f0;cyue=aW`SahS^=*la;cb3-2L_+cM?RhJTspry{ujCL(R`TE z!}4{}E069N6%LQ?92Ehd?i3XXpY9wL1)uH`6%C*68WjVN<|7uMd&eeBm@vVk^OHyC zzx|*UX)hhpK)Y@~!MKU(fBu8-CWAyxH!H_e1<)k*{}RdFKjx+|@XNa}FnBb-=JD1qWqLv zm_qlW{8Fe}phlrkp!>~00x+7(F()U#+%MlVIX|!1wlcMt%O^8AHLp0;Ei)(87Nimt zgKkd*iNI(s|I(6z(h{dch>kpPAb=D=F(@H`m@qmX#KD8-LFHgHmveq@K~ZXPab|v= zZBA8gB3E#JPG$3IHpGwq`K3k4saEi476eH$FfhPqQ2Ht^amg&Q zQm9TWD5#Br%HyKMp%O6KTEQ(RF}>JIAu~NMzbLgVwFneaSR4k`$B9OBMT27=?iDGh zJdB0}PIWpcRn^8g=jRpY=RmRmR3REA1m(kMYXwkHfs%!lLUnR(N-b`ufpzkMNd^WO zjcPvw1I%0)jbc710123%1T`NQ(0*dm}ixP8npcX(-iXZOB6EmApFFfqSVBcN=<7nhUZZC!)UH(=lqn^Sgy3vykwA73P?qh z2B=Iaffb;j!U_`F#U(|VdFh%~3J``hS5j(vW*(PVmXdbxke>h18tlRD9}6i&KkI@{@~e z)itfT6p&Ox&DK^>k5O09Mt7_=S8860HBwB>gcf8lT3=s5mx_Q(U!O}~U%@jkFJA#% zwJ3z87Fj7MnCcnn8G>Yj!Ep)_1?6)q1qDMrV~C7nX-P&tNUZ`CcqJC4rYJZSrRF5& zr6|~BB|%sYIjQMI`T4ned8s9KAR|5Ub5jcv(^IWL`Z7vN3as??%gf94kksiH=ckpF zCl;kb-3N7r8#L0bK*lJz<|QWOq$+^ZU}iEn3n}EMp(L!7%%arflAKC~w4(f6WM4w_ zOlnav7a}S7=BI!XjZ0>chNhK5h+|PvVx@mtFgW!f5>0Vx30TG_H7~s+L!$_sR&>CL zoq>S?)cyq}Sr`pU!yrB`j9xw}C_oI1hH8KekTWpA=vW18sS;EWscR~L5*1V*jDooX zMyp$+=5lF%h)Ng@Nqz-I`N^p%rA4U<&@j=^wB{;HEaFm7$j?auI%QOj8Ig&df^(3u|aX3K4`puuhOil1qzh z=am%Y=LDygfGSWBGbR|)qEYZo%u7s9Es8;Epr|9614{ntI0dMD zAIuXtb#3=1NNS- zVJv3y0R@x3KF9`mg`Js~uA@+tnwwvi3Njc{z=0Aj+zM#*25%pv7Qs?xa(-S(W?pG3 zl2VB2&{7d>c4AU~QHerQYI0&}F~o}U#9{?#%?zulkxT$rh+s{KumKk)AjgBSzP22o0b~&<#6j&6gs+oxN>fr(pcX@0EuO`gVGLEF0P-2wBr97u z6WLXe1ORiBzP>_uQD#XhNGaISP-B8p)4}2cRUSaY6PgoJ^B@5L4t2Cr&KKMu1eK4L z705o&*H>`P&nrtUDglLUaYlYoNornd3MlD<+Uih$ftPb~=sDFij*G!Rly zSAcV#XPQD{X-R%+MQXBMQeufhYDH#oNwJPXGAu{JA`}*b5Cv$-7hFYwDlm|(>dsa% zj-es`t`V-zdQOfZh(az6+_i88TcH8hgQc`rQ1Ho5Oo2pJv0G7oF34GZIS_ z%2O5ci!#$Q^FTGfLUC#dqD})Dpsx=pM^aLAQcF@55=#`| zijG2l5o%gb$xO*phbDO)WS8jcD`+GarGkcz67y0tLBR$p+e-2kU}Z1J2T*6@DZ|jx zPHp75Qzdyf`Eh&JO;tFRXMoW zEXhb!NGr|Bfd`aAerXBRqY4TL4-{ki0G7pc6x^6{R0YpsP)|A-s!T&uAvrM* z6x&Iu3dxB%IjJcq$rRMog;@?A`vVCnI2IImrXXom0(G2~K;;{#o2*cr3hpF>b>fL> zusm`ALBj{5_lwle0Ea)w3&naR6(vZGNO+7w7~z>!iA5YbP7XM4ASGsS zuOH+Pn4>h*!F@<@-R)lgjfC`2O+r?Mchgu1ceXpP9+u; zq+}N9D8SMS$X&&VjufnVg(w5nPdMTPlt>{#fMSn=twJfHd4eS*5H%H|q5?Y!l$m4D zBN^41C_$B(25E#N1tprVz?A~n3DD400ClH8T@Fb2Dk!*s%V$X8g3}S;(HGDl2_(6| z2ZH=kQ&WOci%SxVNB-4TTt1$D-mXDVjLXAR6k%CgRRcS#%YLQi}5{L~p*D6*C z>O83G{9*!%xj-&aP$|tXRsatVYUO0+l~!meXexjcY;I+Kv8@tVObH?aiX&Jws315B zx;ZI13c5MDN??7~puDM-R+O5WRGfll8dMab5MhF?5~^`1Cgm5T=0QvX8xL_7RFI&< zP)y28Ex|AdB1V#fQWA^GGxN}VmYbNIUtB@R9L#V^%mjrvlFt$|i8TdO;ea(lLcBOX zC$T8ASWBTsL94hF-F;A5(j5p*4d6tj5B%F*n7`1g5dLAh9S}s|GEMz~+OcVCo7$xfLmv!79Ll z1<5cqxtRsU=t@9hFnOpmum&EuRxK_Dg(o;`;|?}RkpL!Pnt z45pyNw+t{EnxsI^0VOF0*t{u>21fv-oCBvJup+QY5P}Ip!DqDIz1Cqb(R1{kfNn~y9FpZA7N zqcG${?SoOUbOWOyiHodJ&-c=`~#Ndg7`W()Y;iJI2fgY#17KLz`y{b zlZ*39i;`2JqL}kHRhb2FIS>Pu&R}$AULJaq0x5%I(5_4n2S!6%feN~yB^^ciDGJa| z3S{~U+F;Btf=#$780eXDDJWM$i2GxItseF`QYUtR-kDg1qIMZ z5V$CXh=N8NQbi$Ie@y1HeFMOL78tZf-+f(2w@acT)zIYb~oO(9XCEU_pPG|kAR zprD%pvLGWh2gy6d8TsYK3MCnt#R?z^kg76}D(Jchkf9)FKvktGK*d4f3|i&^3wV(G z%QJIw6p~UE3KEM!p;(d+c8VW(wGAjbLF$W83lA*wjhT6wpyUR}uyhKeL9T>LVp$)Q zfh>uXPhj~4>H)YaSh)eC%iuB)1{;K8fYFecfC^%9e_3J?LK2I-fu1RfJgi=W(V2N= zi8+}mpa26UWQCl}JVfTk;$J-!(-`3O9;|-TLsx*NUJc5J(b3_FMR}Qd>9Goa`QUV| z03Nv=ECUm%)FHRazqHi!W~AJ=4DnOOvg+Q z=2ghDh0qSb$m|!pw!yIgr(SFzaD7Y?}< zhn^*&HbN*^y97oTSLT%@Rw$%``h_4BFn7b~+~RbQFdU=jALuABs5=kNy0CbG(Yc8Q z1(|v2pfOjl8L)f-qm$7*1WVU28YB(Y2qn<%cZQ5Y!|jKK6O0De$56c>DjY;GFfhPq z$m&o~@e8W26m-)Rbajg>bCdFOKsFa!<)?u}pqVs3FQ-yLS2sO1FCOYI1r@YNSEkTcnVdn3aBuZgRT*32W;IY zjE0u4@hXP#Dn@#l#mH$Fss)9Djl02Uoc5#WLU7Q_SBSlcRxzyJhtaSG3bdUIYG;-> z=jWwmrn@ATBr=rb=jRmb!z4kG2V+BBG4GL!U+D~pRuiuABs1YR}?Sy~3S3@iq* z59YFh#G>L<=iC$@P*Z}CeI-SuC7C(JU>l(hPA!BuwwM8CVtHatwo7JFP-=2%QE_Hj zYEC8GbH(X-L8)ne`OcNe;8Ku)ed)=_HkB3^h2%S@=H$R_N=!)s4W}0q3a5OCi(w7~ z6?x!wzHo!Uf#8{!2{H|oI+g@DfGCC!P`W4x!k-xfq0d5Tn2DfyDQA#oXoA&AfT**9 z(ud+9{B=3jXc8SKw*P@3f>gwGG96AKDJt3yFmR$@Vcd#EQ^ zHG*(}s`G}@x%nxjIjNv>1(cJa$qwpLsO`lJkVXz9w4eSmE3DSH6H#A_adE{CjR)c5efl6$K{L+$?%pwMm zMsT(SB?|_S+Y@tgpm_)0ri1d!5{rr%Kn(>*W#Cwp4vlm~un^6H?Hhp6pqY!r66i`^ zD~0UTO7LtAxRDJl(y^HRpZVYa|Ly<&|7Qp7#zMx$B}FBPNyU0OsgOn`f&2zj4k}RK z?9_5d1`h#s6mjHa0_Nh%$1po`D>D*{GZ+wD=iCAWue7)%C>2FPUTQ^2NKqwRNl;?B zduj=s8yyR0W+WDSr=lqI%qvbULa24k%SkLsPlaoUjmOylxR594MtWDdjfI&*`ZpSWI-zNGyUoN0p(pI2CDWBbb|8P*MqEfPBfo zaQ+P>|K5Yr&!Kc~eoCryVsUD4YF=?>NoH9p155-I9LQq9C6zg;$bu;8jpHrEd?_fc z2c>f%`5x*ShUEOxypq%+22gjPEHQ^61ynhLY(y~(&cU62;Yx5YVD&PLhSkq7}+Tqt#>8aT^YG3o->8cZboi@sX1J?9@Cf1qN`vo}8Ah2Ws&%5X_fw z<)8u(&PmS6FHS`mm7ZGSoS##gn};FG%=V~-z zm(*mCa50LZuEoiT1*s_@35c(^ZG*HM(s$seiB(6)oG;rU_E3u^WFId1s;v-roP^SL zTOfRxdTprq9W-&6JTAHyP5r^msOF;UL$@~_Ej}dB_?gh~LpKM;mm(k!Q#aK85A7?U zc5VpgN2LA@JiB;+bCGk9j~hx>fwWOjg}@zigivvIW&wg%1a32g`85o{?fz;0>+0a%BLrJ!4ei}nbb}%F`O0r!GOA~X78A`I9^K2rLCZJ za#}jbdC6(%!H~r|!645tB&VfAg1s~q9Pr6$>5!=qkPNtDggR#d)STr|dOMUp4y7+b zX=wWd7TgTknRzJ;u*wNki9#w$P<5D-S&~|mn8Q$#pUqGV4pmS`0bG(pEk&kOkU6BY zVeJMOjoyBNwM$@h98^J0Y6WOEN)J*s5v%0bl{jO~`0ljBsHmX=z?024|B2_+V% z`lMDMiNZ1*Tp2{b#|-RMN)GZK$9tu^aqM@ z{{qkwerS|}dLOC9dLRls&_kfV15%d?8FPR#lk@YEJwSaNC_gPTFS9rUSp+1(03x9F zc!GBzgPY@+!l1T1s0m-1ld1sG19d2g6eAO24?Q-mPSD~El9wMKvLkc9L`HmEdi~v^iOk! zOe}-a2}5#jifdj9h;l4S2k&SGv3>IM(jha;ARe;Wh>&#q1t}MOp>!maPKVODkbV=) zdXPa3p!AxV2R08pI3wR2ZD=|k)<)#k3fqT zhN{d0P#!4OtI8}uE^i6M52#GiugWX{VTgWEM7w(WBMbx=3Jiyt9l;K~0;L65AbglO zjE1`dQqUo|;0*wv0W-J|bSw~ikDP$JkmT0-dr zC|wPupF(MKE{Hm4D$UExb$2e!D@sj+m_n$2$2ndC-c_!blA0Wpng;V}a$;UmDtJIO zC_ldhCK`}mT%4JdlZq?`b_U21P-kW4fz5$?Ijz_k+|@x62ue*%0hf4ivAopssLTRT z?5B~T$~vWDpal~kz=biVvy=M(cxC(dieb=A`MTR-_`z zE?E7E-oJ;<3&Cg)e_vOqkzfj@4@RS}4?>?G(AP@_kM_gV>Cfs%uR(#ITjS;IF?o*@t|rz5ejbP3?c~KfD0Ay%7+Zn!crWhaStwv38inO{02>m5Y5mwaDK5~K_X}?G1R7D&{krY z|B6!+i;^>3D@p?Li$UH1OCq~IFTW@k8m5r_3Lr_SfFpRE4oRRmF&BI`3&ymZPh)`RR-f=Yt6@|BjP24|$^C9Zj8VTnb>&hXGgpDF>TR|4q_SGkd2te2LVmjbZ^VIhc>3f}PNnpXzm6qJJ8 z0b)V+0m3{8Q3Ulva&7@AF2I2gO~z0eC=a9ymXuP#CrluVfa^Ngd=n&HdF1D&LX7~m z2*EiF$}dPPO3Vdy$zUTpnRzLx74Sh=PcRRXUJ`SiLBoz9*MsUFztr;7B8CF+)_sP8 zWS`8uY{r03R@MIU*J{S=S&Gg`&se)<>1E}^^Ee1h`0B=?{h5&D77KQ+CMkWTod}z4< z((7BAQ1st!Q1pfzq#GhlPX!Kta)PzynI1e6Kh#|vdU2RTDo3=E(wm6!=yIfU#U@K!Q# z&7J~sesO7X2H1KAPhHz??QAO~!kUME`6UX8$X;ato&HdimzV=}OjKrp0xU!`^FYf& zGK)( z!}`kT^2mIUS`a_PKPbr6FC@w{Ai&i{Hv$S6bQy}07!37{^o;e48B`4{av~U1i}fI~ z3`N>W42Cly?K@v6y&FoOfYPe7Ao6ig8e|s(s%2oIc}F4YijF~Oi{lX514_?>(jTF; z&1r}{;~5CO2TFg0((lef#I?^sXf_5$CT12`>mO_-3IPiTSeU`q@xa#GcPS4CX|_*3gU+3hxkH; zbfGl3VVYP};+vUMoSIyW5Cs{5;Q8byC+46Ex%(pVK}@I(pavDxCD4Jpkj$JMKOd-J zDo{E-wZtW{1hlUhUaf;0AkcOWDdQRt+d$Q0PJVJWs76F-If0v9DZcr63@IU{sSGLM zsVNL8AsM9%DQ-oX3@O2hB@8LSrI1NrqyL=Ho)V`(}=Zg6S=L#}^v2}7=5ei=iqOKLKb z?F!9N?uXL3kop-Mc%bpV{Ja!~+|0bv zl2nF_{L&(Z-2A+fjFiMm2!o+AHL-}HJT)~NBn0As=*;4jV#JC~6z4NA*dh8LXfjA# z^5-`RnGZSz6J!yLHZU|YHZe6bx3F|{a&~cb1IgjTuyt238qvxEpH&2EZQ#?6vHu08 zKP@Le5i}41D_3B24BCNwFmV_iqmF7FOdLkXKsTbo2f)Fn41oq|ii1-N3Fjx2adSv# zIuTn#n?Sn_S34W-ti+rgP>wA2%nOFBOMon!DlE+}N%c$%E=WvHg|x6KE*CIM0k|W; zn}v(RGfTiLD9)%ZMgaP?QQ9Ye+3F4lYeX zs08^nxHKuaqzKfDhPwhGj8K}H7w-?=Fqsct!U1t#QEEX>Vlt#gfQ131MF%d@VL~PO z9;p=wqlyyC13=64JoCT{S0F~gML=gLrsd?9Gr0Pfr51r%aEE~vIc27&r-BX)K-cXC z%BBcwz>$p1b;`^`a8tpP(MbH1%o5Pbv&6h)@N$yUoK#R`gB^#Oi$Byu_$rXeF$jk! zQVgmJMnl&RgO-)1f{)sP3_(FvVN$SjJz+FdKWMogkzhyf6)ST8TN95h-=sJPg%1T@MG^ILIoa4KkwB@=WGC6X$4tfHVkAb6Y*p&i^8 zL=yvbC{y8O9%ji)ez^5ud>CC)REpS~z<{~`BMo$V3`8rKgw@M1x(IdR5q<*M3&XH;kzq7${SY0nc!tpmu!BS)(ir>O;0G~7<9e5cC%rXWB2K4SW7G$QT5H*f6q56Eav+O>aGQd@KOUk#H?cyYB%>&`I3qtN z1+Ncah&_@M+;@G2B%Rw12Pj~s`vb}fuX z=!eDuPMr`_VEuj=ot$5q0~xB$$xp=Mbyz(Lqw_LzAO=B6SUm%yVf6x38l!xL^~Z6_ zqxJV;7Z5m zuy!7dE=o;9F#tB+3!@cub?uN9!0d(5dIUC*!`5ZPX!PKRjb5Zc=Q9Yj|Dno31H!5~ zDGaLVp#3|b@)%NBGPwGemiVXnf=f;YXkQO>>H%mzP@y0nwDloBj{(#~he{TumK0^C zmZgF#d4!6*d_=8R8cs564Vbp&|65>{;_ zflf#)hL43nW-nnIO58G2a}c8^`AMLS;?U#7K!?-Ab@_v3Am`13B|!auUC;rVrFkjP z{y$B*q0S(0H~cjx$&%wkaKj3kl@K5`#PpcuTOC9xzm z9lnLp-8mkj%r~(p+c7UCxI8tr07(nfRBW<|DJfCTAuzR>d71FVIv_sqtzHA~go1FP1_dRSgSPO1wmG4Q!#6vjhz69x9fC4u1yPilmki&Wnp%Ni zg9gYFi&9-u!PBZRUnQsJph78k(;z(JUpob8lfQj(tw69sw79oJe1XgrqY6_*yJ zIzk2s5E{WtmY_4T7HpZPEK%6 zen~NS#1EnpBI=xxnUhkKnuk*YW=LLYxqng?jF${LzS$Yxx`7FU1}{T&qGWAuly>8YfA>DJQxq$hzQQCf@c=bV*k8gPzMpFA~&%p8!X_MmlBkk z4w{56f*V#^kdj!Eij-!djz$uJHqsEu+TA%GbVe;yCCnOk=Xl5@TuEkeNoF$KhN8rB zKiHTJsD2|*?qIGP$_0fQ_zDY{RVDd;ncx*8uwW`KDGC9J6_>yhC1_a>bPf)x3bcq8 zRRpRAw3Z5HG*k%2O-zC8%z+wFlnQF+!6YF(R3lLqIYD(5gI3;yuG#<(&OuUFW?pg; zc#s>yMJPcek37(gS+GHRh_bxQT=1YDWaM5|IUVK{h*~ofhy>K$yv$tCa3s1IXv`8t zEGaWD5qwocFnHY+%*^E60*K$>QJD(g2M)CXv|GI>Gug2i)Y$@M5yI<(6Txc1%V4k> z!obk{&Iy!E7?M7aM#J=lLiNLFT;@2Tna}eEzkRdc z<^+mDXay*J6e_+CYR>|wIE;qrw-bZt`wUeFqha!?Q1Nak4HGYd>N^dkHN+w2v_k0z zP}))gB0d>Pe}>X9b71a83TTYt795Uw@Qwp$=?-MC6TA!QTb$02SDX!9+!Av@T$jo`pUfl>D*&_<7Q_Jceh{40+ya;&hz1?kQ37IwB^H6GfTH|l5bX)t z)mD-Z7K8L1K^ye*inDzalZ)~}DquHqg4mG0XkKwPD3`-IZuvz}Q+>hfYCtM|5|dKF z4h=3TMVowKU|?9J1DSu>0Hyas>61|U5|q9VrJqCT_fYx=l>QH;*>xf22}5ZGD6I*l zO`)_Ml=g=BD}i3K1v1(h(qscM-SUgd z6N^$nOi)FWS5gU{i-ypKW>9fsBPhen1jK+;EqNuCU;ZQmWN*6-uMkw70rKdpYxlnpJl->ZPw?pXzQ2IEOJ_n_*Lg|N4 z`X!Y90;L)CA@1ge(qd3r5lU-7X#*&238kH&v^SIvfzt6%ItxnYN4czWrMOghz2D{pUe^v(=)FG!LmRw4b2d2V5blF7nIFfr`51mw>iPfdpYY8}jn9VM5UC z0^_io*V?P#rtKMguGl$Vzcif1Gq zc$OQ9pHmFZ9bmJAOL8G$Uz`hLLXsTFHJ)iOvG5E~hX?4^Js95!vP>Cbo=awNGU%EdXh?w6fO0*^d{5B6lM;{!hzGi*1;&QRID(_u zGY@<<9Zbp*JlhT9fr^{dJh&MkVUX#ttOs@pj02Md1p>%Iuq2EVmJ1RB@%-VL7*a!r zfXfhY9Svayr6z;y0I3g3O$NmalnIJP2r~_$GN7ag!U#)*GC+wDA_Qt0AXwn?1sXGu zkPZPIV*{;9u~IV(AobJ&D7_L&Z-UZ0q4Ys0eFjQjgVGP7^jj$X6H2ohLd+F}((+JR z7fPE$X(uQh1f}DkbOw|zhSGIVx(!NCh0<%G^lm7921?(A(vP6@8z}u9O8>_!lG z3PEW_D6J2rEugeBln#f|DNs5ON>@SYHYhy-O3#JTYoYWWD18!2--6Pwq4ZxU&1wvB z7cZ0+h0@AU+6YQJLTNuJ9RsDap>ze5?uOFyp!7y4y%S2Gh0^z+^gAg18%nd9K-?n$ zr4^vG4wSZr(q2$H3`(a!=@KYi1Eo8m^b{yP4@$3q(p#YPekgqgO5cFe&!F@-D9vOF zai1WRmVwfmP}&4a+e2v|C>;f*)1h=Zlx~62lcDr{D7_X+?}XAvq4X6f{Rm2bgwl*= z5O?uGX*npZ4W$jCv^|vehSFhBIuT0eK2}Wa9Bgk7XP+A#En?vcmk~F{kAaKL1B+U`D_8}9z(IW#YUj(IL&E9O#gbG7m zHlz&A2A7{uFQ8Bpp!%jm>3L9kDU^nG-=MuWXy*;qcSG&El~np=<}j30LYoi>7P#LA z7Y8>b7@)njl1f;o4QducNhPF0U?`~s*9HurzE}wZtiJ~7u9Z}RdTWr*8b}^GDpOJk zD)|`@JvHQx8oZxYQVDG)F_cuodTHR^83UNKfKY~J5Zc%XLYtX@l!KRZBf4i$7D5ix zIV-6QC@o5b`r-jJ9G^q!cToB(l>Q5)xosfnKoCkxLupMYZ2_h2p|mHI4usNCP&x@p zXF%x!C|w4nYoK%!luC=FU*02(h0E(N!M z7%o7?Z$N3t`dq{+-VadmZ%{fHJZ=NMzKH?6NgH(L5%`3W{Is;N$m^%97M#1zQDGLxY@BF6dY%R1|b^1zaXGPXTlX zG(-_)xXAomxcoy*Izk(P8 zgMZ+k{|;gd4DvyL{wIhrFvtY|`QISM!0;#d&;JEt3=CNzfBqj3V_^6d^5_2pF$RX} zus{D9#2FY0!~gtO5NBZc8UE+LgE#|2PvoEf3E~V4z0rUEH;6MZe2Dq;e}Omy!`0Y7 z{||^WFto+}`Tszif#F~LpZ^RJ3=B&W{`^;vU|@Ka_UFHY1OvmF>_7h#Bp4Wu=KT5J zAi=<(o%`qi0tp6&mAQZZACO>Rkjne>|A7Pp!<4)~{~0717;Y5&`L7_!z~EN+=f8s_ z1H<~lKmQXX85qtN{rTS@$-v-Q@#p^nNd|^r6@UI8kYr%ERQc!s14#x3i@HDmK?_~4 z)c^UfAjQBivGLD;2Pp=I8?Ar-CrB|ctZV!8zd?$DL9Xl1{{>PE3?F;{{68SYz>wef z=l=sK28Jb5|NI9naMhXi=f8q91B3JIKmQ%185nlV{_{UUnt?%a&Y%Ac(hLm!bN>8a zAkDxqWA2~-2c#Jomd^Y0|A90EL)H90{~2T$7^)Zi`L7_u!0>b7pZ^Xr3=H!Z{rR6D z!@$tAC5 zH~;)!pv1t?ee=)%14;}GzPJATf1t#`kaGLae+Fd+hO@W-{8vzBU~ste=f8t81H zWcvHxL7jo&KGWa-3F-_CQY?S}H>fi(gt7kpzd)UVL51z_{{!j_48mN0|36S?U^vS4 z_dkOM14B9Y-~S343=FGy{{DB+U|`VU{rf*bgMr~R@8ACo8Vn3e`2YT2puxcKhyU;Y z0~!nrK|+83KhR)cC=~kppFxv>VW!aE{|cH63nM3<=7A{~yp|VBk>s`~QI!14Dqy-~SBS3=F4K z{{C0cW?(q1`uD$sHUq6y~s{Q@npv}Obr~dc<0&NC{73zQgAJArCu+;eb z|A96GLx{%T{|q_|3|ln*{#VdpV0fwV_rHS<1A~a>-~S0Z3=E}OfB!e=Ffg3d`ul%@ z4g7B zLhRrF3k(<-zQq0gf53o&!8QKx{|5#P41ePP{%0^`U?@-c`(MG3fnjpu-~SGV3=Ew~ zfBz>KGB7Mn`TM`Ykb&V(%HRJB3>g>>W&Hhr03@FM_x}S!28ItgfB!QWF)%#M|NCFT zh=HM^;O~D2BL;@Z!oU9$j2IXm7XSUi+(JV9dafSoilo=z`oMb$|aWm@qI%H~szZV8XzV-}Lu?f(Zk|hnBzp z8%!7&7(4#{Utq$((Ae?!{{a&Qh65dc|35HcU~udF`=7y-fnjmi-~S4x3=GzNfB!p} zGB9NH{r#U{%D`}?|L^|>QwD~}34i}DFlAu4H{tL91EvfNe5OO{|77>7~XIC`~QIj1B2d{zyBF585nG~{{63D z$-wY->)-zlmJAG&xBdN}V9CJnVEfr1#3|K^7p?3h=2L-{{#^K^56drApX_A z{})&@F#Nvy_x}NF28Jis|Nehq&A_n!=HLGeHVh1UcmDoYuwh_ey!-dRgAD_N-@U*8 z6Koh59^d=>zrluqq2m7E{|jsw7^)xs{eQrQf#J)ezyBZDFfc5B^7lW3Edzt;v%mip zY#A8lJ^TCL!Ipuc1Aj{|jsx7(T!G`~QF~1B2$jzyBZD zGBEuA|Mx%WoPjHh|Nbl3F)#$M{QK`<$G~7M{O^B)9Rov%$iM#$b_@(ZME?C>V8_5v zCi?IH0XqhU7oz|EKd=Lpr~m#l*fTJk5&QRF!JdJ^LHyr;2YUvFE#m+FC)hJEXi5D0 z-(b(cuw3Hb{{{984C<2q{vWVsVE85Z@BagP1_mbSfBzXA7#P~6|NU2RU|=wk`S%~x z!e1cs??33e3`yC4{~H__7$W8V{a@g~z;HUFK}dFn4{}tRA7}Bi&{daI$@!&3Ku{}VhI7)(9>{crGKV3^|Z@Bac128PET|NbBFU|=xv{P+KX z2LnU8*T4S^o(v2Zy#D=H@MK{4?fvh+gC_$+q0hhn37!lL|9$@bZ}4PbDE0mKe}N|h zgQ4HQ{|7u77&iO;`~Sd`fkDOp-+u-#28LVy|Nbj@F)*|R{QK|V#lY}3;NSlQF9wE; zz<>W6ycie`2LAiMz>9%FG3ej_16~XaT|xi;Kk#B;Fbw|ppTV1fVMoZn{|ep=42hxt z{yTUxFbIeJ`=8*=z@QlZ?|*|g14C5AzyAxo85r(H{QG~vn}Oj}$-~R_b3=CW;|Nb-hGB8-D{`;@s%fO(V_V2%gF9XBTw158-d>I%V(*ON$@MT~) zlm74j0$&D(*%|--AMj;hc%1p~{{vqJ2A1r9{~7!k7+&Q3`>)`~z#y9c@4tf|1H;#X zfBzHw7#O^Z{{3(8V_-N{^zZ)yKL&>S;(z}S_%Sg2F8%lafgb~dXZgSX4E_uZp-un( zEBG@o=r#ZQ@8HkCaH9F&{{(*qhMbmv{~P=n7%sK``@g`Sfx)8v-~R(3b)EnIKk#Q@ z=7{yPLPFih(I_dg+kfkAr0zyA#Z3=9t@{QJKkfPtZ4 z;=lg~0vH&AC;j{XAb^44)8v2u83Gv?0;c}^uMo(<@NnwC{|=D+_30vQCS`=1cRz|gw*-~Wan1_q@i|NbusVqjRaSfx&arzyAw@85pFt{QG|( zn1SKx)_?yW1T!#rZ~OP3A%uY;cl*Ep3Ly*(uebmE?-0Vkkh$aE|AY_*hL=13{ci|i zU^u$--~R<63=GnH|NTD@!oaY6@4x>KLKqla_Wk?M5X!(HaNys61rUAk-+u=XefZ!1 zgirA{`=1m#=vmu^uPZK zVGImf=l=b72xDM)bK&3rgfIq%YZw3hZwO;x@V)%+|AH_Eh6lI*{XY=Kz;O8PzyA-y z7#O7Q|N9TRAnnTifBzN285kHJ{QK_^4(jjx`=1cbz`(-u|9?X`14BN~|NjfZ85r*H z{QrL-oPl8;@BjY~!WkHx`TqZBh+ts&C-DEjLIeZDCZYfT9U?&W&j0@j5ey6(V*md) zL@+Si6#M^wK?DPXf%yOb2O=04PAmQY{~&^a!B*@4e}+f~h63aN{}mz`7&5H?|96OF zU^r&`|9?Ux14FOZ|Njk<3=Hgn|Nk$DWMJS4{r~?!Bm;wa=6|Ar_Ah9{-}|1XGQU{EOg|NlS~14BsJ z|Njr77#Qly{{Lr)W?(o}_WwUEzQeTg=peX8mX z41c+>%Y&@oH*#Re1P!8L(O<*Bz))f2z_1aA{2T@b22EoJhOeN*QepZ%nnA7syKN5x z1B0Bc0|WT*DVRLSECz`C?=Ubh^w>Hu#DE-)Mg9*11H%hv2L>I`ra3I~GK>riBCZY$ zZXg@6$lEY7FhqGcFc{*{AH&GN(Cz8KPzZ7p7X3Ah3=Drf9T@)MFn!-V9@t>U^oam#1@PBcNiHMKEygOl!G?i!Q{P~S$dcu;q!-)fgwHFf#C%X_sK9Z zF!-l9FuVk9a)jwe3V$0W1_p~#2Zmf6?u%h!U|3q_z~BJ7L=dJQWEV7kYM2-po;Esw zx|mqg*BmAW2B9Vg&=3+<`8`Yw3U2Y39) zFf%aZ_Bt@!$D!YbnSsHl4^R9vGceTl<2JvBnStS5zXO8>j_{kq%)p>F5qJLC!_2_Y zKhc5V0uJ}xVP;^6pX9*s7l-^GW(J0s$qoz;kmX$w`Add{fx%`9?)+uL!oaX7I*pvmAg^v92me? z|6(z}hK+&Y$~p%I7tp3>m^@PYo5RMyAh8j5`rE_Cz|gi4cmBA;#=!7?qXUBia`+>e z|A&o%fq%0DLltuQ2=Xg5{mQU2Fm&#~9ltj03=CE~9T;wa^uXK?Vng-Eurn|S?Q&p9 z!x29<>3cf#Jzj-1&PB2LnUSH3tT9WSU$pCe%#??V7ULtf#ER@{eL(a7!EzboxWwb7#ND5IxuWT z&YvK^K-0Gk7XyRF3kL=#9OlPxF)(DkbYNHm(t{;_YPc8}#9rZ!pE+C%4E3*Y$Il)v z28Oq<92hp>F#ir01H;_c4h-Hn-1mozf#Jm)2ZoI}(R-iDij!RUhn zsEdTPeGL4EH9QOq<^LTR_;Hjkb9fjSI+z?8_92@OVnglU!^6Pf#_Y)8j3a*T@GvlRvN$qi zf%L%K2Vz6@|KVX^_{`$SuoWbRMP7!Nfnf!!Bg0A@=G*WxFa)wY;_Sb~@G>wkaX2y* z;V{33mw};#!;yg#NBGa-Wnie~a%2GC0*l3cdw3ZbK5#kW>|fmBWnf6;c4Rn@!~Q?K z3=9T5jttv-d{z(i!1B1DcBZC%>^j*Wxz>p&9h_in(ho6Drm8c`bWE}3>!_UA_ zE9S`1ghT!gKLf*mF-L}e9P)qo85sJ+9T|?}h(8$t28K{cM}{&S`fUUl7*0z%G91Do zA0xoP&@1K0AdbWQ8UY4|CDM*K#|P#JFfj1S;7&h#1Q-|^WE>gVaoB%HfPsNs))9C6 zM}UFhuB; z46HchZG;#Y?6n;kqHxH^2r)3s)Ny3^g(H4ygcukm>pC*Tv1l4*%^DW?&Gtbi_ISbVrzh!OaSH{qRSa zfnmFqBf~Bn=F5mMFcjK2GIZmRw-I4r_+yK^evT1gVAy5n$Y6^j{%S-R7`{6=GF-$F zese?^7*06imfs`7z%bJZclmiogn>cc*^$8-hx`ACFfc^9I5L37@v!y3WJDPlrnx#Y zoWtQh8&L*^6gNkP_c+S;7*Pg>U@u38O*r(|h%zv+dgGR#Bg(+A-P@7D7>E1!h%zv| z^1)O7i!w0e_&PGo$6@~;Q3eKXKSzceILwz3V_R6Fl-ER1TE3QDnCbzf#GJ5BWMW_R{1?*3=9mxj-Vlatnzon7#Jdg z9YITIu*&}tV_;|wb_6Za!748!&cLuX*pcBavj33AUu?t~7-oez;vC|DNH8!gNOojc0TRQ~evFY|VDLzB1WmzWb$^Wn z1H*(A+~GGzf`Nf6)e-0T)gB232Ie$J)bUFO2msAb+>u~lc%0@4T7rVr{y!2743g=% z)3=Ny14CXqZui+pGBCVI$6dd~NHQ=~W;lYDaALK;Mv{SHN`@mt0?5f&!f%cw1H+dL zN6-=+torvzGB9Xn;!fXpBpDb&G94Kbaip(5k_-%6vm8NFgjmg&kz!!r%ywjWhCIK3 zoc^U47~WSpGEB#jK4PR87}{za8T@hBUn9l9aJANv;V_Q!bB+`P!;D5phBzGIvqy@7 z;aj64LnjXN??^E))Hgda6ycEn16p(2f;)Z5NHZ|JYIS6IgTsCsX$FRCZMfS{G13eS zAKG!3Up3MU4B{P*41qY@H%FR*A*0ig;Rg=;_ee7^By{0UUw5P#7^=G*8T@dV|3{jE z;bgZXLoW__85stKuwLBe+sH656!tnY+{NL(7#RizzdqdQvqpx2p|a1BAqB_y!W-aOM~;Ev@G2k!N5~-GHb6FVDcRV}m2ZLtODM&%iKqqa#BH4)g!WGcYJ_ zab!4-L%)my1H+3gxXVWy1qOzPTOAp|N33E=pD_vy46fVolz$2g3_06ymk)Ck7#OB+ z!(D&vQD9*BvE7lu2S@t6qrkx6veOZ?1PyEa{!w6H=-TPXun?F3L2LbYIWl#u-q468{N^Y!FtF@*WC+J${vJgJ zhUi1M>+d^?3=HcJIWjcjiho5027{xH41ze!mr-J1a6I7%*#w2feKtxA3{5#4F3|sKX|50XO@VxGbbN)<5g@Iw;b=>i1 zqr$-8a>J2fHgfnPxj#mQf#Lp5-10Rl3=CDbagR^UQDI>CeFsnfSA~H=?;h^)!#gSr z4Abx7F2DY$FfdHG@5rzYNBGI8GBDUZz&*ZXqsqV_{RsE?UW_UO!F8UsV{}?p}2K~>D4EDJEug1WT_r;Nc4~P65H3o*7 zueif^j~WAm?l;`wcSntZ;qo^}245WJ|50OLQ261<(1Sx>MxB9S%}+-LbsX|G>I@8* ze>pO&!XXd3bFTIe+W06^`=Lgif#LdJN6->`tmWq%bp{5Jf4KAK9(4wW&VP;!GeB{U zC4JmcXJAnL@5rEv!+n3$85rCcoERE8k=E}aM28QFDPPpekH5eEYxSbfxahM;Y z!N4$`$BAJLj`Ufh!NB0m@5Eq&Lw*iu@0Oqw&iSD|8ld?XCx$p=`;o%;4oJT+ZvB5i z`bBW-m(gTkC>M2NID#X5Z8RAeti_xdULxBMQVY%BF`5hvDiTf%r;+86+*hN?!0=wu ziJ>0Z|489KN0WgePsWMiGRRCU@w-Qpfx%JM31|AgqshR~C+CE-e)yxwz@RLTTV6(s zfnkTd69Y4{`#^4i`p-s-fnm3z6VCCg7%c_{6J;lc^~nDBY-a6Y>176u&(vr!Fg#Xq zVwi+1k7WKFEe3{CH7A_&LwmFs81AV#FPNj1B{XMW_?*^sgYdvq8W8t};9(P3ct67Ga^{_>9w14CAX69f1z4J_u%=rS-ok8r}>{?%n*NRPyw zKVx(m7_6e47&vf*e~m5!gHyB<&iSV~x(p1*qn#L5gW?2>`}XKEFcih$PTzNQ85kbK zI5AY>(Emr5fgv*1iNOJf`(*SO7-q)d&VM#~3=B;1P7KmG^vCEiFvuo2;T#{Y(PLnk zp5TOY{%VdM1H*|#C!FgW_JH?DFt`> zw9#i^xRT<8bNxY#J_AEsDsK52eFlaXsZKc8N6pb^V3?BT#2|+weD~-xFlUlzsG=q;T<0NI|d94Q*)gd&f}W@FkoOvDR#oSep<$mfx)E231|P-#*l%bxWozP z{8o%11H+^e+~sSHAp?V1sT0oe{W*pV4B4el49Ym-Z;v4ZLtm*AXp1`5_TwEx28QjW zPPpek3>g^SmO9~_ACoa+V2~)o?LQkM1_tvoC*0#dMhpzI%bXa3airfGBL;?d&l}7&9<5*Wiv{850JEMKw-1*EiXK_KMdyF%;m4pBNJc27_8B zhAlYSFEu6%3{UEv7+P@XpJT$nkkR18@C!%!*<-@MkksVF0BZhV8{fTS!oX0_nHo=J@9f$rq<_rwF6LFUhf6N&eR!nrlxxPTgf`Nf? z67KYEW5K|XI0<+B#aJ*foSKBY{;siLU?`mI#L$i-f6cLAVE8e`iD4xU|Lw70U|2ZS z3FrEnI~EKK!PA^@jxYTIxqrG7&h>XPmJAHDW;o%TU$e1fV33{Z#PAk}`(i8^7`SFR zG2q&tRAb4&Fn6{S!!#V_;~Yx{2IF~73<5a9XOATVgY$eR2GBl6Z0YlkB?E)~0zCe= zWMJ@J=)`amhx=u$7#PGB;ZDCcptCC$;i>->zOTlLfx&ADp7y^L14H#v zC!G5e_gFD7Brn4~zH`Tlfq`{7p7d|Uz|gSV3FrD|8EXaxo)u0w*H7D6Gcep<;e>O3 zD8`zBL3x!EgCdUjtFdNaa9Qod@C1ka9BT#!jkQh;x;WCu9%}}M(DhCX4{+$eW6i)| zy3vUt42S$5YX*kyO->B;xZ>Z2fq`qY6VCPVHZ}|l`#0krpNO$xV6fiigme8tjST}s z=XNIs9&V)ZN03{f;}3Ie7#OA=a$>j%62sDd*<-`NkayULVHOVgJ2ngq97k}szyH`U zFswP^#E^y~d}M4H7=(`DmbbBGV5m6m#PAJ={uo;ZhP;zb4DmSPuf~>v;p}PL<=Y%v z28OaTP7GZ*^zX4{U|=}!#Bd3h|7{rx6TC`W|}*hSUd64EJ!@f5)DI z!TBL>{eSEk7>+)6Vwj6Vzl;L|L(&u6;}ca3=GZBoN%xIcVJ+c z_1p>P{`)x&3=GF!I59-v2%kL;3=DFwofw*M^zZLDFfc6mfT#WEz`&sQ(TO1%hx=t5 z85lZ0;c5RnGB8AaK^xx(g(Woo#yB!CsD5+8xxco?k%6K6n-hZ)4*TagGBB+Dj(hxd zk0S$v_7B|hcN`fQR{p>}e)-3dfkE>p?))L+#K6G%%ZVWj$NamE69Yr^U)=R)j1vRH z^S`*$SB(<`L(4xWhBLVQ@5I0m06G8(hx{IpJfkxM`0{8h`R@)$p4pi}4afSjKTZq` zW$exjQ$TTsMZb(Q0|OU_GtT~ljWYwo3=U_U@f+jJ!0?a58F&5f%)lVe<;?IJhyUh) z?B{W2NWhi;of#Oi_?#II;gG-M%)p={=*;j6hyVUKGcbq=IWv^wuwTZ7fuUE}nPD=H z`Df74#tJgdIQN&vxG*p<%Q-Vd;4r@ibk>x-Gs8|C?wjMnz#yXFjC23h9v21%M+Ik` z;}dsWK>K%`86Ih4uYdlyFfh3II5TA9uwTZNfnmLmGea&8c^g*-1{q&x-20zg85r*Q zIx{TAp})qJfuY&YnPE4M_?zR(z+e~X%&-MV`0a6JVE7c|%&-WD{2f=&{Ejou^?QF@ z85lCcoN?A~GHwhElHtxc*T>noF)$Q_J2TA2(SD0@V_@J;c4jETwg20VfuT0bnZX!& z{uvZj(DHMR8w10JVrPaQIP~vvV_;ZO?aUB|BmC~TF)*;zIWrvR!4dy%3=C(xoEfT+ z&sRXQU&ft*!F{4L11pa5!^WL~!Dp&7gEkKN7m;eUKmn0|QJP-1cT*U;q_SAgK;eqnm*NlBO9L7$kN= z?u!H!F(CO0Cdd)>U;q8j2k|GcLin)w7vP8RK}8x!{sdH>3&deyU@!)iMGOoKpduS2 zBmp8A7(mCoLs<|Cs*K^qeDLaCa1#q8a{<&AfTkx9A5?UKXmJq1z`(FW7-Bz6ya39F zYJ=2FY) zO%7^5lvab%W>DGsLrQ4wNG$_3cN^gVG$Ds5zDE$mde}mF&@=*Jsv>KE) zgVJtLIt)suLFqCm-3FznLFr{sdK;8J2Boh->1R;-8n24)u4%)Al?CJt86NewI< z>`aVopo@7}H9-w2Nsu5TC$j_82W;UW(?Ms-Fo6zFX5e5{2MI7RFz6?hX6B?o$Q1qb zoXn(TT_ZhZ?6a5FU2qqlz6~< z{~6JhK_U`Dk`~bn4A7Vcx6e75UTTA!4w$ zIls zO;G^lD~J$?g_flu0SF-p1tXT!4!0yZBe94fCqFM8Y#o>ZmjhXg6sgdh3c5Q0(zAjI zz#`%@v>b$m|3qjx1`B%`Xej{G2csdT{fGC{V8ONksvj0;YB=;W=oMGymLw)I=oOa~ zLFfz^D>JVowWxqWFE76&RnO7MQ@12Bok1@>uT(E1u{eW4FQqcCxH1<)mlQ!{%2JDp zGxPIMIPpacdPS)@i69M7RzXe)gB~b+81%sRpXsG#=4CSI73HTSmLxLhrDnvZ6(#1T z#%H7yA$SaW$tC$k#SD5W5GpIV2yA&`Ze}urUV45Bn9u{84KXLFxR^mNIX^cSbWylo zN@`MRdVFG0VqSVG$P_TQpfm||)f$|inU|K&08^Tj1iG&c$^&1`24xq6{0lJ;Y8)&= zD5Rx9#RIqmfEZ)}?H5}>>L2j=&=4623C=ALCYS^jGN3*xR5?QkRDTFmKmn`@LBRUo zFcDJ*1_n^^1y#-f>z7wR1tg#yXpkC^9!RarzyLGHkb!~W+yDRhP~{A;e*6Te1{07b zs2w0COh1SX!q(6}JWM~VpML_X-vin(0F48H{0`F(>u-Zb6+lje>4%LQ2tWsiVB-WJ zyFeIZ28f1XZw7E4g}WctFLx1ws5l0pz+nVp!t8<35ey6rpgup059{{}fNBW_2FRK^ z1_lO@`$1}8?gyC#!k{%zps)nVf%vd-h61R550D_1@PqjubS5{le%QFh4ybeA zura+xX!?iQKLJ`UPEdkq>Hr_w4q<~xm_862gh5R;Wcy*|r^HTBs$hVusRSv6Vwn9< zE<-QWepvX!T3-%O{r|v+Zo^bFfUaRfa2OcCdy+u*!}WtMCShP;aBzUw1iBj$Sp!5A zA+i|F{u4ov`!G)gK~%DMA=H9cu=oS9L3k}xKg72T3_s>Vny^3SLiD4D7rOo}X!<#z z<3t?uh||9tO}_+GzXVi2x_#(;&;^yCxQDqPHcq7g)qemKxX}Cq@-Iw3%wM3^CP)cP z{{!ea--G!O_ruhK^nx&q52Hb6Vj=5?jT63r>4zB%(hTp#z?>jSD`r1YHbd+M5*+{h%Hmh!4Z)YE^L9AH5QyAAF__Ofweu8$k6NAgKW{ z*Q|o*2k%({2|zK-ei#ip(+$RkDgjdot0DRcg+FM^9$FNG^?!is_e3)sjSC*Xhm~Dm zjZmUt8^rzt;6teyz;kQ=7!m0nR)2u1XKeO6=s*hoDA3w2sF@%N-F}c5F3ilp$N*~( zA**3#V1l=EP{o;PVTp;@k|d`WIE4hXGcvqKfk}!0Jm>aX$Eb3#vFj1FU{S6&GM|fYw{6;(`pY z`Uq8A2wu;iiVHKq>JLyTOESR9 zQ&e#&WG@JX2?noWFat{8M4C)%tj`dF-h1mzzVhL7<6A4~#NhhP&2H3OL#c;O>gF!i8*12*+~;4%&~enEHSFfw4qFQ|FK z$bcEYpusDUy$_)6IhehmH7JY>k_;BmdJg0tkR0d^9gw&KR2<|VkT~c}WRN)l%8>DY zkQfN#a{n}_`x&6^5Rh6BhP1N;8BTx}6i61_nK-`U6mLm^(pdD1g*IfQrM+2kp%Ti7V`Zm;)0B)lVSt1gJR7oFJ(A z4N!5I`$20QLFx}c#bM^8K-Dwsg_sXB2Xvy+$BdGcY zs5q=23R>d_QvU!d4hzpOQ1uFzAm+fr?Jrb30Zp8Z3Dg$lXIKCgmw+@k82F*$2d+WP zfw>2Cwh+i(hU*Y<(6~9s%ZgC-4N!5Id$ge92cY7xa5ILAKY)tE)PwGT0+}yx17bcb z++3mR4ba5>pyCNoahUnxQ1J$+IL!T^wT~e44?x9X=4V3HKR^>Nf{HWTgt!N0PBm2A z0V)o&w*@Mm02POs-wPFQfQrMy4YXGW?xCt@Vuqwo1vGJPsJH`~xCm4{0Zm*MD&Bx5t_BrffF`aF6+ZwK zhlQI3RQv-}92RblP;r6#sP6ZIiaS8XVd*CrD&7DUhnW)t6<>fRo(dH|02PP1Cl4zA z0V)nNryMG-0J^vpslVC)6?Z@r?}Umcpovd{iZ?*TVdl?fcDh@MeI#k>NDxLwVq!<_&7C^-} zK*eF|LBkASd!gbm^EW}&GdzXZ3(LQ|q2dluahUoeQ1Jw)I86OnsQ3b?I4u8OgNi?Z zio@dTK2%)c8N^2gq;+28JB4 zI6s5JOVscI-Mt3tzbLGMm;(#94ygJBsCt$n;0|UcpusbCg5}^M502RLp6JHAnw+qn0sOMmDeufWkQ2qNA zEH24lumPeT77om8ka!P(io?QF5GtMk6^E&p2aEGF1iVExUl%Mc$RR6=!&dYHuP`Tmely3o7n_CSD8`Pe2m~-9-p;PXn5GD^&dg zs5q<~=!1%1fQrMyXF62;1Df~(sJOs;RQIohiaS8XVd-!aRJ;Hx4l{o@RD1zc9H#yV zRQv%{9F~t*q3H^Ak0L1Pz|tWs-Gc5<1c}4aEi8S4?mYyF!_wzju=$b<3!w1}ONX~% z;u|69>H=i=lHny(ykI*-9OnM-U~zti4__eR02{AhWrw804ybyVxG+?F0#qE9J{7^@ z{0s?SA?CpPmHJ?DNrnYb^)PW;sQ3e@ILsVxs5rw8h&y5783`8WXLtZL9~STFU~x$X z2dH|Ocqu#fbY2fu&(F~C4dPB%ICMb87odqxgo+v!*kiZ9p&2{(u> z3=F4ngu@l6dqDRAg6sv~2?&}4hSqnWdjLV=F!#g!3%dUgBo6cMW2iZxd;dV zFVOvbAaQhmf$qfviNpLQ1-4g`;Q=%}Vd1X<6?fPT4QFUMZw3`_*b5PdrCS%UI6p(f zFNl9({t5z%OEMgQs)vaufR=4x85hk4tLJBU05u1eZcCuz48I}f!^CT$;tFWuuy6z2 zlLzuIEZo{SAn6lyza2;%e8(LF0|Tsm0=m}@Bo3=*CqmVO?z01lgYUFsU|^UF6$jm8 z2NDO(%Y*2RP;t=xbs#?Y4m$=0hQm;C(7kjZahSblpyHtW=s@DI>BAdfe@QYtfQB2a zUGxkp&afX6{@^=i85kJ8K*bdfK*V9?3==2z@`0Tbk`5RAMGa2@sQ3Y>I4r&-q2dpq z;;`^nf{HWzLp4VmDz1PgZUPl|fQrM+hoxK4y=^el(CcEMLIdSD<^VK;r1_E6{yaAaPi{+k)LG$>0DDPguV2hKetMio@!oNU%6R zg98&}JpjyK>0oh5h6M*9@d6Vs#St%cIK;cb=14FwK-c6Ox`m_sM|V9||HE z7#J2p#XmtO12PAEH#2Aqo(tlB(0wN$aqyid z3=9l{Q1Oo~5ck0BRfmd$?mq#k2j3ybz`$S+6$jmW0uqO#{uYpW@EtA;3=D-(anQXmAaU^BFboU~bx?88eKR0& z@SQUZ3=BO`anL<8AaU?rGYkw2pu1&3_JZyY0f~d}5Mf|oSOrxNy0-%)4y*6BK*d4# zEr7(qcP=n6FdT)7gYIbniGvm~gXrr}anSt|AUb?E~Y6#0%&i3XnMXE(!()25G1`=>7?iIQR|<1_lN#sJOveNO*$pmSA9D zu!4$%?t1{K2jBU?z`)=J6$jk|01^k^1;D_-;13lCoxcwf2cN;uz`zj6jlCR8DdpyCZ^;>A$&Z7xIH30eaUvIkc0gU-DN@nPi*tUUuduO1{0YtO*SE6_Rc zAaPiE1uK_8=d**v(aR;!x$7WtSh-XScBdqR!XZfcumjp(?uLp#I1CZr09rK2z`!sQ zD!$+}L>xBGzZ@#ga0Vg{YZq+=i}N!ma6-ZdmLCs;#U&XWpz2}b7s2BE3=5#@!FNP4 zFfiN)i%T*zK-I&<-{OduA7J(T3=6m*_QK+Ykp~iA51`_(b}ScET!9;+9wsgf6;FVQ z!^%(49l_v!6I2{#zA9Ax0yJ?wsQ3XiaacTp&XWhl3oIUC=>c?(JxCmu9$@td==^$+ zIC?z-I=3Dq4y#9C^%3a2c#t?O-eKtkbk00T9F|VZc_8@?bUr&s9JU+-mJUJZvV+87 z>Cg_U9&}zcNF3&Vcc?h%9BPm_%>4o2aFAqp0F6i3JX#zN_WYFrR?p9{fFBYsuy8Jf ziXVWA!{Vz7D$XDPQ4bS`g(v9TU}X2e!XI?rFGw8beponz&glh-qlYu-d|r?^ES#Ic z_DV7&oQ0%+4rm2A5h~tr9wIIP6`v0kpKuW>4l)c>KSIS9K*eG0+ub z#J{lcISUn6Koh?P6?Z@rzYi5pKofrf6>mTj{|FUdfF}M6Dt-V>oS7Gz@6g0~pyCE1 zsO}eqiYGwDVeu#j6<+`qhvi3gsQ3Y>I4m3tpyCgp;;`_vgo-POLhOZ=KTc5b1gJPn zy*E^R0h)LSRQv)|9AQ{M;`KL8bn zxxWi4&LECz{$!}Q1DZJKu5EBRh94pos@S#V4SNM?%Fnpou3z#V??VXG6sqK!@WnFhK4uWnf?^fr=YI#bNHR zg^CBDiMK(;3(&;-q2d$J#AiUoH=v0xgoxp z&QAr2!|In8Q1zg5LqX!;vqKpe7(PP9LFaXX#KCvsfyS4h;-GUZLE;^^ZKpmQcc;^^ZKpz|d`;;``tUVeywLFX=l#KC7T zGB7YGLB&Dm)q%vpXV!ss146|?=cs|i!FQ=6&HI4PPXmd==6$UALHSgY;Q_4P1Z`db zwez9k3ilxO>;cfiGzJESAh0+;LxV0PJ%Dy>g3L<*i%T**kV*w{8DQdhU~zti27QQn z*mwx&E_={CPJ=W=Jxsg{s{Vl)MEwisqSqN+G7$AJ@nul)2?`K#SU%bU6+ZwK zho!eeQ1J&)ahUoGU~zti4^|L+VdD3|;*tyuim2wlfr=|Y#bM>uFQ|9|R2*h6hX5#? z`57FnA?Cx>i-E-@85*GKVd5%K@dHqCSUG6~7UySZfSLmvFLD5jOEP?bs)vdDLB$!A zAnu2m69X3KXE*>g2jB@i!WEGxPl5K+&ZB7!V78+ z=-e=n5#Y1K7#J8LpyHtO!a(BSGs74d7_y+^pmV}N;^4Ew7#J8DpyHtO!9e2RGr|}c z7`mb2Q$ir)gy6e985kI*L&ZVofq~S+%I5`8anLznAaU3@#ww^d==?8`IQR@O(D^S= zanQM6AaU^7UknTkN1)=M^S(gh;4{A%7#Pk$#X;wMfyBXQeK9aFJcEjZ&i4X|gU|S4 zU|@I;6$hQ`1ri6J?Zv>r@E0l$I?oFv4nEThv`0<|5|5yByg=gMv%Em-HlgC6^SeOe zp!FFbS`R8-J`)l?;Iq3J7#K{27#J9tFxOFggZ8^I2{C+u?jHh~0m3mj#Ph-CV6NY; z5Mp2uV&Daz_XyHo2O=047}}xYpmU-@LZJ0$AbPqGXip2~`t3zR3=Dz{k_-pbA?XS> z9=IB84oD{|-iJf{B3PUkeE%&-2W&gnL#X(>V~~-J0%*GZ3KbV>f{4q3G=Z=%#61rT zP~9UY4Dm1M{8W%K@ENKM3=GOp@h1x)=78pjLGt=g@$Y7k@gmUrW{@~&S2-xCL2P6k z3sn!g9|R;0+fR}K6$hQ$3layP-OIqhPyrPOohJ?w-vlBU7#KRi;!q9}H32Nn3%=hQ zBn;Y*3ZfT4#XzusDbSt(6vmgn#*eNI3ID zbFD!_;Ipkk=WRj7LnR^pEdxn1FfeF~g2Gvn;RBlaCQ$XD`*lG|K}TSM zXh*0x=-vK<6Q35h}C9dw@r$ebn+!N9$|3?+Hk~Db$@NQ1R-eP9R~(od%%wbx?88Ikq4PSiR{376*x-;zX#u51{q?59oTl zOt5-h@O@(-9kBYb3Mvk|CkiAEIx+`Dw?fU~Ky!Z|RQ;bGNI1j#%QK+jpz|_8`eEU` z7%Fbg3rRoPQ2%a(nxB9cp1YvxGddyaVf#ByL&cvqLhOa5=bKP*&^;a?d%<_bGB7Z_ zfttSnEgyY_st28$4pQF)tpFG$An{v(=3g!eNc^TJL+pJ4(!{{PASnTAUqLxYlm-rQ z8>l&;^W;IwLHmV3v?o{`#6rb!Q1>XHxj!AOo|gf1?=naStld=#76*x-;tsGlF9R>= zuyO_l2H1LrrBHFpBuIJ#-;oEJUxwP7ffg@Epz2?lK;mT;)SBy1anL!@AR+Ks(F_a> zPod(V`-ef|;5&#J7#Mzn#X%ydm|GGO&LHV3pBp;q2i$X8$n88 z^_@Lb9CR)>NE}wbghItZ=S73WVd*DH5)|+J3=dc!{Xx*ad60ZQSX`1p04+UKfX!iG z*Z@605u_G`CqUH~poQCXuzFqw%NY>&gYSA_U|?7d73boC^dms~SU~3Nf{KIgwFL3O zcUv+rFr0#l2QWj_gU>8yU|_fn6$jm81X2(4?`x=dxgaEdVdGRk!Qvp5sF+U*6#kg| zTSdU)yx@B{Ksvy8aWF72s6)j;_e+7qVe_-bP;t<`gCKG6-ISoC072qRybKqh?Jnpx zDF%O#I0G;Eo(qtA@LfI(3=Bz7@jsrBa09K&2gw&g#XgYF>&@nP-!xl*8bmt?3wi?3x+@d;@8Zaq}I0jmB4$S?*5hW$`+4o_S2i;c$5`vZU^PVf8A!Z0pt-XfD&B!6J_RZsfR^6oLd^%=e+RM`)=u6G6$jnh0urAHB0%*H zSRBehqRxTEc^N`7A^u8)`s*%K9DM%+NIg{i8B`o}t~W>+eD*hJ{0Axyx^EpM4(p$C z%Ywq6mth4f#Qc>|b0lHn=OE%)P;o7&IOyJUkU2A<;&!r-aFal*FWjNx6VSpf0BR2C zd~}dGu=AYKq2i!>MM2{BAcBE`p#Ullx-SXq3!oa|A5h@P4=Mf|h zYwtaTnzI1SoUc&zpnIV}>cMwIF)%Q2$%DclB!Y_N!Q#B&d!9ft;Jcnc^OjKY^U(6` z6iAYRfx%K96fcqtE70t9fU5UTfrRHv=)k%kR2+29J;(@He=q_p4iZ7dIZ*RApqXC` zQqRQ8Z~)qVfEv$G1rlfAWvJK(v3CwM{d7UaLHGB9Y=Fh@WT^N|CrCWP!gCQ+9CThk zNIh&mZaY*QbWbQq9M=Cm26g8SGfb`uPrnCI4_iO^ zQ=WlA35$RKLDeh#fT-_*`j=M$6u-O-5BVYDu>PH#0wlgppxLVm6^}qGxAmar{03bP z1Ue5MYQ8g69CTj~$Um@i>3yK$XC6W9h4t&>z~Ug4s5l2K&dXpp4WeERYJMYB{ODsy zdlhDWA5?tJ7fAe;L(8jqQ1?GTbN>dY_ysio?u44dnGLb`8Fbv^FjO3Lk2}bvuzlQD zq2}B`Gv^*u`~jNybEr8?91!zi?W?a~_5ASjVW7h#3@nO}_yXNe53(25&KH4-gYLBh ziQfbf3=9kkQ1KggA>qIa4L5zTI8+f5WeyhSW!Sy|;vN~OdKaj;A?WfbP`d%DClV|U z3Yrjm zVe6tpq2i$XAVKQEcS15SFr-7pk4HoD1*|_+4HgHfM8*AJab5-yCy4qQXnvUk6$jmC z3(^5=C#;2vv&%x<1FP>2Ld8M%cZ1YJRs}FHoPmm;hK@7C<}qI>F)#=)V9qyvhlX1P zTDu5zsS0R5t2r2AuNKG>1_lOxWl;F@GNeaB+z*RiS+F=%5fY^g7UyMXfR1l~&MgE< zTSLV`_pgKapmU-@w3{*{9vjfy;}2F3Qh|z-q3RRR(q|4>JukzoFo-*0`Mnydp1~Nk zf7Ak154x`!WCQrlY6b>|$xw0Mg%EQ<=k9^zmxIMYEL6M)hxkRXI4}6VM39a+XnMX2 zbx#MHf1iQXgH)p8k5Kg-Xzu?B6&FAgXH+CQ$L|JP>o%K-04`R6Io#l73+IxIb7NWCAMA0E_c7#4A9? zPr!G6fyTq2;tVHI&1r#(gYIVonFPy^Q=sAjj1Y5R7oRMJiZjJS+$jwW|LtILkO`>x zG+3OM;psg{xq1~UeG3|%3TWZ^2&$fSEku19RQ)@sxI`JmURXN+2^9z3uL)8LzGD-# zk3$s_FQ9wbK;n;~?i7NGe|La{18n?F87dwD&8M*OZDXi7=>Bt%Ip90cLDy(O#eZyv znBxOAKMX7mQi+PQ!Q#9O^Qs{34}(fqgT<-E1~v}w0X2UITDS#*)q_-`;#9CWFGB|tB;58vrAwgV$0k7H5p@18NU9ks zzHvGv-FAQk85kHQK*giwA^8Y=#~)~16e`{)2Qgkiw>o4>IB{_9Se0@Mm59(0y z2()-K0E_c896;;m+Ca?*-G2%47WfWKPxPQImxQ>#9-7`dpyJcFLEH};x10ub&kwZnVLnv-#e)!g z-Ju=D^-yuS*AVl;cNsG(8T|O#F-=*en8J-289I(b7?{1Q3_iA!}6CnR2+1VJxCq+E_=|r z6sUNi4J3TJq48@06@TIn5r>s;&QNiKT8O{4K;0h=6?Z%VQ4j0C=Yz#THlpGtusARH zUSyCAZ2qVVEDjPu#S63;7zCMw83fSIy<7_t2c5TxmhZNK&EaL3vJFzN!P-mvq2iYp zLfi>USEr!j2GDUW@ZF6J3=FrR;=Arc;|m%-Z=m9peGqd}pb`HEDlT#XA`TmO;?Rb~ zi$NtM++h2o#h~Klq7d;TP;aY4#Wjr~_I?E&M9jdz;0zU?a35m+I;eVosCac3MBESR z&M2sO+$o4Tm!b7hDpdU2Pl$LJ)cpn8kbFG@ExlDj)vuZYQ4c$}xg9EgcM`LHDnMg3=R2fcE)9#j9>Z%xQ$WlSc;*9)}t-vCt) zx)&9sA2v?g4;6pE5fYEE_2f&S;-Gu#LF&PG)iW?KY=WA<0WI8iL)91WhPX!Kr`ny*c_0JsQ5itoR^^*I`0EpC-5I?&H*%YICMebz|W8X zJ&y%8Pa&=gi7!`Z`48LYt_c=LwG+g%1B>%A%zX_BAK3nGPpEiO3M5`&;|#H2dnFl8 zpt&ansy==a#GJn%!$I>$P;p0Dh&ix$Y=nw0$cBi+=Er-W;+KCx!g&=m-e*I_J6Ry& zSy1zrL&c|rK+J*F<6FSuP(?`8aj5$@pw-J4!0LG!{)<7(?}zGn4i<-Ukf^_4bNCq! zK(0r{A6;FBsaX)PQ+(r)+zmg0)(A?xA6@)jyCkJexK2^NPs0*MmW2gMgJL-A8cy4?)*moiu!NglTcP4^Q1Puo&>As zWv~f=m=gvKx4TgF25A0$230@J6`~$=PY1}B-(YbN3l;MjK;p#-I{pl6SI9ucndKnu zoCs)oP=ShDltSVWbWSwLL=&iZ=z2)FJ%FnBfQm0IgQ$0aUOXHI6?bERsBeU}Lz2Ma zAQMq>odG0%9nk8dcCdP0hM8#Xq8U(e1L%GPXK4R@2~>RjIf#3VpbOJCLd7LTAnt*U zukMH1`v5IoPC&(Hptz3-k4VuzG%m2DEVl zAwx(wSfItbv>_xOXTF2@3$|{-0IL24n)}V6;tgo-ae$h$TM^>^N@zR=LdCP8wZ)Why$iGiAb04@EbLe;;5j<>_kv1x#cH$dCNuzF+ySRB<)Al_1_ z`3xqhATIRwQU->#VD-EVS2`f^3u`~`hKj3xgNVb%QO`idU->}X4_gm^7ivBSn)%P5 z>SsdFlL4K34syUxsCbGS#GLogc;PXIgg*ybIExxX;*s?i#64k9^=eS@7h53az~=Gw zq2m6D5b;20_&b8dK`ubW{$O!lh96TP=EK%QMnc8^&Vj_EIJ8_!f{M36=PzQR>8%1P z?*0^F?+NI_#3ryfs+}O-G_W`?!=f69y|8uWE1}{F7a`)X{?|6JI7lZdK7&L20a%=u zf#V3o99aACJyblm7m{D@LycoGfrPWxa)|f?Xg^T^Dn1FCe_`_-iYAbHHo_H>uAs&+ zs6o|pZHCwjYbWSJ#gDy!h{Mh~cY%tVK-c*MLJbN9i$gg`RHg|eod}?%w*nmMTX2Za z0E_c7q?$nD3s%prfQolO$9q$t>1Q)ke03(o{jlyps_1@lbPa zLEV1>EuBAxiWi`Xzk!;g{2dZ6m!amcm_p)9V=csdU8uM;SR5(9piD!sI4{Fr=(s4X z9&v<SQl zsQ4#6h9BFsi%{{W?GX3F^2<%AI15^QJ%NhXLi;WStWFy6#MX!K zpIn8Q1Dh}NGl#^Z2AY4vpz80bLCn7fO}80fagfVUaSha*3bcIP3Kcg%Grt!qegRGW zG^n@*n)>-*dwCgNq(jmVY<=%4usEt)K)n56bNCq+K+kiAjh~zYtLJ5~(t?=73M~ij zK*a^RA^wHUV?G9(Bgt?At=;klsy=}mq8@aQ4#-|c3rKi6K-~{JUy;iK5|0O<^M}4OD!) zHza(Fq2cozEDkjki4w4c#N&SGI6S1)#K0g071!PcF$Xper2-S*4p9kPH*RhTNhb+t z>B<4B{t|Rt1vYN)4Hido2$Y!w7UyN~hpr2S<%>e7cnNgfASX2abU?*jc0$|<8)u#i z6`!dC5eMB939@1%R9x>PB%DF_If2AaK*d?1;Rf5cej6&j<|o7)b!d3Lfr?vAg_J+A z`tc`J+*%A`{!6HOPAf<_-+u&A4_i+nX9Wp20krg>4pnanRS!F7&kC%bpMe2-{ur!0 z^a6`ZG6o5#9w02_|> z21A)_Hjr?$Kr^4;1{5z)MM#t~Se%#PT{$FuxZIvlFr0nI%bQ1w5d^YyM!duyTU4ba+46T#}Cijb(~IK+415I+MJ=Vd5{?jwe+ z-@6DF$GoreI#`^S;o5D8zj&eL3c|U5NQ+pbKC@=Wap8J)r9)VCT5%LdDw`LDa+A$u>~&#j_yh_d)ZKmn|ec1faPm z7^+@m2_#>Cht|IgnR%HdddXlaEi*4uFPR}ZF()TJJvTouzPKc@sDvT8sHC{0G%Zap znIS&jImACG-p4aIBtD)YKHdd|=jDtfm69Kyo|B)Hm=m8;l3!FDpIBPKker`ekds=H znxbcBX<^O)l8DbtsQ~dT8PbXpb5r9}N^^57VfMKCxqz*43v%>zjfe3-*1*^ZTaw|n zSa>{sFzI*pk6kGnQRI(*$if~8O&re zn8{`^lg(fzo54&rgPCjwGug}l8klAVP&b0Do#yKONYA4!T=H{Miz#UByVJ4WC%_yAO=LUg^?k|Oba6; zh*cIwMi3WR7(o)ak%h4l#Dx~dM&OVDiGbr4!~loBk%h52)MR6GsL94q*P4MtzyeZo z8JU4YzygxAj4VJwYGMINaUh<#o{0q{A%b{jARg380~1pa59$&F6Jrn$oKHY1jX*r8 z2MkOM^-L_Fwp$pO7=UIvKN&#^A`s6=&%_8)J{g%C7@C84W(*mL#TlufRN|bUmki>> zgS>Ca;Fg(}S)2hAFf@TgTz&zxhBPuYf|M~vrpC}nF*P=axX9GVz*x`3$QTl7rbeLT zWMmBSoT-tKAxIA5Ia4D;OArqdKc+^879gGpLse!$T4oN|Ss6w{8)3lM1p$Uiw zNhwA~hQ@kkCWaOaIhjdSnFV^uP)2-WPL5tOLq$nZqMnI?ks(8TRc1kac~NFbstFR? z2*OS=DvdA6%uR*xic%9(ic5+RoU{TEHz%>UBtADkMbE_8%!HvNzo;lRuLPtEBw!3t zU22qqWKeQOVqSV`3PdV7C9^2LIJG1`IX^cyHLnCJT9letk{Vx}ii1LQOYP+-GS zmYETxondHZWMIjVoRORz1PW|WiEU_NU;s*%hTxJ0!~-QuLr7{e17|oBLvRUcXl7sn zO3skR2Z#q!32BpncqV!#CXg}##4`f%z?l)mGX(KWKov=8NoEerS+LAtXkr0r0vMWD z8iUI}LsLUYA#7-B2x;wt7!YTe8d?}JG3hzGII*vJ?x2hK%?#s+34dM4&3mJG#} z#U-h^kV4eZ$O!6ABO?olHX|cQ;};|a@syDfq+SGxK!V1|2vQe-M8Kt*p^*`!AqirD zOFcs)V@N|1#DJP?3@HRaB9Le^GKNO5kujtp36g?ZVGNBFBV$PU4U&SH42?@8V`vl` z8AD^<$QYU+jEoJTjyE<0m&t}k#)dGHA(g425iB^3pjD@#kujtl3SvN#l9917%&E{Q zHZq1(J0LYM1C7DO9Y_Qk8pe>K-_Xd|1m<@Wn1PTME=UUILP!f2Bmy%K(!vFazzl@6 za1D)&AuU`G17jNfVr^&NF_8F&5bNUJV@d;GB+~UvowchY9n(aGY}6JDW(=69@GY7 zQ&SKRYJ;&U$Ub-?1e*!1pp1--!1|z}Y-9;G6KbE4rJfLi_&?2(t*B z+91}Hj0zW2!Y(x+{B#B^gM=4h(x@*kH3?nPrSdITd-?L ze2Alyk1J?62sD-ypIB6sSQ($1m%K)F3F zF*7GMCEnP?(2}7zwZtbiFTErqxTJ`|!!^RlG#=DpGGTD7NKGy+NiEJu&B+0^jS}-x z;tef~EG!v7mgVK6x+N$zF(uy6*vP<$!5LDjR3(?hTY|cwppvIJwFDeMCZKVIDpzoe z2;_Wl!zDgBCpEE%!7sHOWO8vyQEFmtyrHqNks+u}4GNnQaPTrXgIi^w2AiRUv4I&w za51O_0}en#V9_vf!NokPJh5YDrLPT5^7A zUI~LUxIqZAJhh?(>`7CGko^4Ql6X+-z=R<@H8ndWv9dVc&rSYI4NrrGxOE})h%+#F0JvlWm zF)1fC-q6C(kfAuQpeQr1Bn{O#zYtGDBU3YT22k)PXCxNI8yXu}8h{d#p{bFXC4)y| zUP?}Ca#2oNJgBp3$`D+Vn4AqR7nVNj9>XNi#fq|7`}qBAjN0J|AAy!=8uL1PHHskzA+ zMW|B2*_j0(6D^G)ZUv6FgIavL(Z1Q29^jb zETLAI8Zh{z=79!}Nq#)2&j-#XIeGEM z2Bzl5uo5*T6;{NUfvhnyF*G#=6~3N%B_a92B}E`XP@CF}!KpMeCj}HG#)bwKmJIPo zQvjerc(1bfpw#rt;*!)N=NwR>Sbt03(m22igqE4KhO0zjc@X<%*+$|dk5ZOo8X zoSK@As?t5RB(b0%Co?$_l)ym#1?4VK&NBeD*~%fw1C%Df#h{THG(Up!b5LS=GQ1Ep zG6eP2gHj8MK*I=z-~qzmf}G5foXot`;^Nf8ctaCIBXfq-icGYU$raq01cd;oAcYkZ z8L1WEGQ`Nj(9jTEq-25;LA;@{p_wVTJO!m9P(Cg#N{u%(G_o{;L@hWbEX*OD%G9DF za2$bR&&Hr0CS3= z8OSNdpmu6OQE_TXVrd1)6{bd@Fi$H=P0dZs1$o(kAtXO1A6&?q7#Nv?s<^VGQnaEI zQr<%AD)7KdalAQbqyye(H3P>6D1P8^0qPpW$EOvSB$hC^C#RKyYDRDq8dOLdgIeBT z<)8}J)C3YXpc2{K95gbOk_ReUax$w@Q{oLxjLjfH4DynR5jbrcnOcCO+Q`(%z?8wg z2$}|q<1I`K%|R-Rjf@Q$Qc}T%BtvRNGNg1b0_P8CLjcq>2Zg+m5ookHKO?mQ6e5=3 zj0YMCf>aer`T02@iw#U6aRwR$hzErr$QDCG17kCWbl1Ex29Lzz3~=>oWM*J!!2m7y zO5zQ{V{%TVY4OIOKB#+gF}PGqEJ;nT1SMop>j6^yS}?d3g9}EmF^0yVO0T%2C=Vkw zfZApG$*4IcEx#Z&4^;?SVS<}j@wtha=+dA@MM@@U2nZCxiJ;I1`3W?x2g;!ah6bP( zVo7Q)sPmd7*kU7%E}Up;*AU~42&28 zOY=)oGt-I-5|dLQV>F=9F*5<@m*o7sw9Is{*NqJf%nZR!F@TiIM#iR)+RFmuC|G0% zXQt;R=D;ErG^_+Fxr%aAGSLeBc#uy)!#tJHA)|sK*SykPXla_C9G{z55ucWyUjlA7 zK$qPHZw2*CnQ5d zBMS?Ll$^}G6mUa5H4i*|25B)n=N80+$|8o~Vo*_$3ThRanS!!tesXeYL1t8{ zT}|S{RubFob7hmZXAX6BJg4pu#3G1!|YM zfgwW?sFC2Amy%imX~jYsFsP}?w-V+jV-p6jvf>g@gWSLzTHmLZ#3vRdXJnS8f`$V@ z-7rx2fLsD@ni+u-UvW|qTE*cP;%Q=HY{md8g@aQ|AWm`1OwCCF+ra>y!70foN-YNU z>Eca5bBONA>7cBcSdv*>l9^l#Zgzrl04QamI=Up^FEbaE*pLGgRHK5z&&b%6A-E_x zC9}9B-q;W{vJLG?7LLvssI zLIcG%$XQ0_=7_XgS`2Raf&v5HHFE^_Ucin4$4YK~St=;RKwdI1U~osurv^sgo`4Cc zSqU1k0~ObV)pn3;fzZ%as%&BzGa)6nR)S`ZZg<_%)Am~Ban7e0|xix+{B{ncneU!4N~YN7sVTy8yK6z zJOn8nic$-55|dNm{(`06w4B6rhSI$B)DpC!+dZ|UEHS4v71Vw@gc6V$o`6@JDRpuyoB^qS1II61K(71Y=_ zGXtfklKhgy97xeLqgprwi=NJ1K&7NB9( z_;_%Y1Fj@N83xqqg%1e_GW;b#n*mP#&4HU`^@)HH?J3~lAb8=09w5}dJ- zkvT&e*eJ}fv;ejFK>g9oyb=pgGBbkoxQsw^xZu*$71p@|cS{nBQd1zKF!83K_6?}c z$E@w*D?lX)s%_BP(I>GOJahu`r75g=1nNVAVix2W2o1?lmd2pS08b5ovMNI`N}tvk z)L-z)PfYR2Oe#t&s)STX(3Z5hIk;4D12u4rOc~@N6lx>jJ7eKs{L>TEd~bQMzgVjfq^B13%Cym z@+GLigmqKEjc3p_hbcpFae8V=0aETX0XM=7jY0j4{G_bZEJ2~ z)DD1lh(Yz5J7`=cu_QG!FE771wWPEl9<*)@oUcJa2xb_9XOcmlEsi%dF*P#of3eiT4Kw)nLj!q+R6B{L{Ky5W}H3cr#Obozd3!o)_ z`N<66u{g9bOOVCJ2IdB!(iGCB2MuN!f(G9}QWl10kPHFt9f77=!F6_WE~w#~3L1Mb zGyn}+!sh)U=H-BXsFw{+YYEDbG;86d61BuLK`Qsf(f#;oJx zQ;PHBGe9Ak%HR%36!9jeW`+!I`9+C2ImJ2oCB+~&nwptffI=@duME_(G%|*+TmUC| z$I=RL@eFRtKu7sN0Rzqo(2@AkJn)PfLs~&;Nik|jfyyP&LKkQxpf&HIYfK^QJwXZG z(!ju!Atk2_(ys#9QIrY}GiWCmG-?cPpo0egN=wo#lJavwjW1lEyMS&~{DZ)9c(=~IDy3rbC(xi(PC4ODOD z$PWag%Vv_cF4g@GBUuqi4|P0CD9Pc1IV%mXKVLjwlTz-mDyYMd36mZavDp^Am% zmlhO&#_&xHKm%B*iI5V($jsaXG{9a|g6L^LN1Ca>KPfD zgPI?1Ir)i51C~ah1xlc}PXnbI2IQ#-$cQayodu+xMs*}e4=A;OnkR`RsgR&CHa7$n zS)kAc4dR0m7)TvBHlnXXrN-u1T?;j+QKz909R6=K`Y7I)mqk49$%gJo8FQ@*%~vk%2L+;Q}tQ{Zh+QGxI^iW`>5K=6WJ#*V53~ z$kG_O|6Wp5nwJe~!;8vaS8X=$mT&Y2O!72qrccM3yZ zYB^|*3*-<`CmuAD=K@OX<|YjB@u@{cdHIlpkeQD*WCmTK2X=5_aefinP%&c8&B(;S z6k2*i#+^WYDR8nfgSNqpKx_FxeHh3Ts$)tDXcExG%)}5BEGeaEy}S7Mq~c=eyb+`+ z3M+KY7;>{gD_+nvfC@!pXtfFPIjly4IRiBCSdf?po<#sBenSf*LsJHDLkKlJ2Nx%n zq=Ke2jg5?r!0j8yyh>1aptJxw%3*A22CW>DGct2hic<69O^pmq7@{&^DnP66KmlzE z8u9}zW&?R9IXgZ%BRd{6$BM8KTnrdl8XB2`%1~oxPc1$Fa}srhRqC3K*b6uRht=@ z8iB`oA2B4`XIHMIbgQ$giJP7Y{oXijPcI9(fn2mc{Ogav4vx}XR$!EOj@kAP#? z$jBTzVhxFY@SG{A00Xr{!4(^5NYe;Br~q1SV+Iv7H!uWG5rXmzq;>&?5PDG$@~NeP z5u}}FVPFWUMnP?S2GFELQEGC2Q3|MyU}y+x&4TO&txZVDgiS3On}A~1$PJVxT;T+` z!)Rg*skC63*uat@CqFM8>ogK5@WGuU|FYDgw4D5MP{|RRmxI(V4FIjm08d_n3J|!5 zK}$0c)m<*AwlslOcCcnEXayCxxCXVl%)lNiE-8Ze$_Uot1vPfTB__0M0dDlby4Iky zX%r70-;OsiGckh?+d-;!r2cMveo=e@WO*P+6R2XrNS5HPBB(A%0hP|i29`z)$;Bl_ zA)wJn&{Q92XAP*JLF6S+H!HU^4`Z;%vp7Ew+%N-WQ*bp09l-!G zt^s=xl8zt?5Wp)r@>0u#Qwt%jpv>e%@Z2>xbPOykAq6kIp`DnM!vJXkp*jwfjtq?% zQgT2^2UV&l6|-gy0*gT^9%BPzNWdDI8W};_Ip84_a|ZXK{PO&ytavjM12fnXi{z4c zQ_#Q=$U+lP+X}?6FfcHI4iFS)vzrB|>jj?qMC)-uM(P8lzIubNf2deWxgH51NGBiSN6F`@8 zm>Dx<<|P+_;?y-IvjkMOCxT}dO+noSm{wD8pAxik0X!C$3LcvS5Bq}}X0T36Zfb5y zX#sp?26~ZZ&H$Mi1QiUBbd{b8T{n#2x`T$}!7E&hObjjHjUod}m@UkPlv!#Q;v&sYPgWN8yP%*(sStMXAZ9Ma7wAsX3LP8B0S$ zhR^~~D+E+&n}XKyf)fD5>7cPTSToHWG^q-zJ3y=HgA&WZl@_EGZDD52kOodIsP2R& zOh~0-XaF7&1dY3c>qXEyPe|5E0jDs~(&8MHK{Zg853bCGwUj~A?0)%0xu7UEGB7na zg)UeC*Ad1BX6B%Y1xS4c>3$oU7+Qc<)MS7LLrfToQo+S5eAoq~&j^%lz#fJ+Js_nS zsKx*{_43owK%=H0kC=m+J6`#jc?HlFGsXt6H3*ZF14 znxTOucvcotE`e5P8Cf!fq~;cYHv|@gCR5G8ElgM$T9gWHw?h{JfVxMZBnzGcfDGbW zK*G`pv}FRc6g1w@!rY7jTt9$wss(6$Y#O%lx0IX$Xx9?#ZBQW#FUpZ-4nYxZVrXv0 zkP9jr!An;d;MpEEmVFUZGDenW48D~Re}H=1Nr}nX@kS6i%Rle9#OSXwZkj zu>iE<4;0#>aMsXrGu=?$j{FP^|ZkjW#s3A@;RtIWN66X2Awbk zWejjJ1X2%fTY*RaO7ct5R+AxGC7|JC3rKAaPH2Xpd3JEs3hgGF8=63t?--dFm|HNo zLAu_M4h5(M2r9E6u@w*LXn^trXjPUWLuqbeG1^cCXtW11}FZ3M_PFGF!jN`5I?*9tT@S5S&RbCwG#no*qvs$fw? zKr0^@pkwr@umzl{g`mDYq;M&LHF_XP+sFvqTnA0=fYXO1XwN5jI1^lyfO3r?v||Mt iW-tP+nE@{qbOL(}QWk=Cnt-ZbaMCa`28TJg)Bpems(IJ| literal 0 HcmV?d00001 diff --git a/tools/niminst.nim b/tools/niminst.nim new file mode 100644 index 0000000000..2418ea6c92 --- /dev/null +++ b/tools/niminst.nim @@ -0,0 +1,346 @@ +# +# +# The Nimrod Installation Generator +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +const + haveZipLib = defined(unix) + +when haveZipLib: + import zipfiles + +import + os, strutils, parseopt, parsecfg, strtabs, streams + +const + maxOS = 20 # max number of OSes + maxCPU = 10 # max number of CPUs + buildShFile = "build.sh" + +type + TAppType = enum appConsole, appGUI + TAction = enum + actionNone, # action not yet known + actionCSource # action: create C sources + actionInno, # action: create Inno Setup installer + actionZip # action: create zip file + TConfigData = object of TObject + actions: set[TAction] + commonFiles, windowsFiles, unixFiles, binPaths, authors, + oses, cpus: seq[string] + cfiles: array[1..maxOS, array[1..maxCPU, seq[string]]] + ccompiler, innosetup: tuple[path, flags: string] + name, version, description, license, infile, outdir: string + innoSetupFlag, installScript, uninstallScript: bool + vars: PStringTable + app: TAppType + nimrodArgs: string + +proc initConfigData(c: var TConfigData) = + c.actions = {} + c.commonFiles = @[] + c.windowsFiles = @[] + c.unixFiles = @[] + c.binPaths = @[] + c.authors = @[] + c.oses = @[] + c.cpus = @[] + c.ccompiler = ("", "") + c.innosetup = ("", "") + c.name = "" + c.version = "" + c.description = "" + c.license = "" + c.infile = "" + c.outdir = "" + c.nimrodArgs = "" + c.innoSetupFlag = false + c.installScript = false + c.uninstallScript = false + c.vars = newStringTable(modeStyleInsensitive) + +include "inno.tmpl" +include "install.tmpl" + +# ------------------------- configuration file ------------------------------- + +const + Version = "0.5" + Usage = "niminst - Nimrod Installation Generator Version " & version & """ + + (c) 2008 Andreas Rumpf +Usage: + niminst [options] command[;command2...] ini-file[.ini] [compile_options] +Command: + csource build C source code for source based installations + zip build the ZIP file + inno build the Inno Setup installer +Options: + -o, --output:dir set the output directory + --var:name=value set the value of a variable + -h, --help shows this help + -v, --version shows the version +Compile_options: + will be passed to the Nimrod compiler +""" + +proc parseCmdLine(c: var TConfigData) = + var p = init() + while true: + next(p) + var kind = p.kind + var key = p.key + var val = p.val + case kind + of cmdArgument: + if c.actions == {}: + for a in split(normalize(key), {';', ','}): + case a + of "csource": incl(c.actions, actionCSource) + of "zip": incl(c.actions, actionZip) + of "inno": incl(c.actions, actionInno) + else: quit(Usage) + else: + c.infile = appendFileExt(key, "ini") + c.nimrodArgs = getRestOfCommandLine(p) + break + of cmdLongOption, cmdShortOption: + case normalize(key) + of "help", "h": write(stdout, Usage) + of "version", "v": writeln(stdout, Version) + of "o", "output": c.outdir = val + of "var": + var idx = findSubStr('=', val) + if idx < 0: quit("invalid command line") + c.vars[copy(val, 0, idx-1)] = copy(val, idx+1) + else: quit(Usage) + of cmdEnd: break + if c.infile.len == 0: quit(Usage) + +proc walkDirRecursively(s: var seq[string], root: string) = + for k, f in walkDir(root): + case k + of pcFile, pcLinkToFile: add(s, UnixToNativePath(f)) + of pcDirectory: walkDirRecursively(s, f) + of pcLinkToDirectory: nil + +proc addFiles(s: var seq[string], patterns: seq[string]) = + for p in items(patterns): + if existsDir(p): + walkDirRecursively(s, p) + else: + var i = 0 + for f in walkFiles(p): + add(s, UnixToNativePath(f)) + inc(i) + if i == 0: echo("[Warning] No file found that matches: " & p) + +proc pathFlags(p: var TCfgParser, k, v: string, + t: var tuple[path, flags: string]) = + case normalize(k) + of "path": t.path = v + of "flags": t.flags = v + else: quit(errorStr(p, "unknown variable: " & k)) + +proc parseIniFile(c: var TConfigData) = + var + p: TCfgParser + section: string # current section + var input = newFileStream(c.infile, fmRead) + if input != nil: + open(p, input, c.infile) + while true: + var k = next(p) + case k.kind + of cfgEof: break + of cfgSectionStart: + section = normalize(k.section) + case section + of "innosetup": c.innoSetupFlag = true + of "installscript": c.installScript = true + of "uninstallscript": c.uninstallScript = true + of "var", "project", "common", "ccompiler", "windows", "unix", "7z": nil + else: nil # quit(errorStr(p, "invalid section: " & section)) + + of cfgKeyValuePair: + var v = k.value % c.vars + c.vars[k.key] = v + + case section + of "project": + case normalize(k.key) + of "name": c.name = v + of "version": c.version = v + of "os": c.oses = splitSeq(v, {';'}) + of "cpu": c.cpus = splitSeq(v, {';'}) + of "authors": c.authors = splitSeq(v, {';'}) + of "description": c.description = v + of "app": + case normalize(v) + of "console": c.app = appConsole + of "gui": c.app = appGUI + else: quit(errorStr(p, "expected: console or gui")) + of "license": c.license = UnixToNativePath(k.value) + else: quit(errorStr(p, "unknown variable: " & k.key)) + of "var": nil + of "installscript", "uninstallscript": + quit(errorStr(p, "unknown variable: " & k.key)) + of "common": + case normalize(k.key) + of "files": addFiles(c.commonFiles, splitSeq(v, {';'})) + else: quit(errorStr(p, "unknown variable: " & k.key)) + of "innosetup": pathFlags(p, k.key, v, c.innoSetup) + of "ccompiler": pathFlags(p, k.key, v, c.ccompiler) + of "windows": + case normalize(k.key) + of "files": addFiles(c.windowsFiles, splitSeq(v, {';'})) + of "binpath": c.binPaths = splitSeq(v, {';'}) + else: quit(errorStr(p, "unknown variable: " & k.key)) + of "unix": + case normalize(k.key) + of "files": addFiles(c.unixFiles, splitSeq(v, {';'})) + else: quit(errorStr(p, "unknown variable: " & k.key)) + else: nil + + of cfgOption: quit(errorStr(p, "syntax error")) + of cfgError: quit(errorStr(p, k.msg)) + close(p) + if c.name.len == 0: c.name = changeFileExt(extractFilename(c.infile), "") + else: + quit("cannot open: " & c.infile) + +# ------------------------- generate source based installation --------------- + +proc readCFiles(c: var TConfigData, osA, cpuA: int) = + var cfg: TCfgParser + var cfilesSection = false + var f = extractDir(c.infile) / "mapping.txt" + c.cfiles[osA][cpuA] = @[] + var input = newFileStream(f, fmRead) + if input != nil: + open(cfg, input, f) + while true: + var k = next(cfg) + case k.kind + of cfgEof: break + of cfgSectionStart: + if cfilesSection: break + cfilesSection = cmpIgnoreStyle(k.section, "cfiles") == 0 + of cfgKeyValuePair: nil + of cfgOption: + if cfilesSection and cmpIgnoreStyle(k.key, "file") == 0: + add(c.cfiles[osA][cpuA], k.value) + of cfgError: quit(errorStr(cfg, k.msg)) + close(cfg) + else: + quit("Cannot open: " & f) + +proc buildDir(os, cpu: int): string = + return "build" / ($os & "_" & $cpu) + +proc srcdist(c: var TConfigData) = + for x in walkFiles("lib/*.h"): CopyFile("build" / extractFilename(x), x) + for osA in 1..c.oses.len: + for cpuA in 1..c.cpus.len: + var dir = buildDir(osA, cpuA) + createDir(dir) + var cmd = ("nimrod compile -f --symbolfiles:off --compileonly " & + "--gen_mapping $1 " & + " --os:$2 --cpu:$3 $4") % + [c.nimrodArgs, c.oses[osA-1], c.cpus[cpuA-1], + changeFileExt(c.infile, "nim")] + echo("Executing: " & cmd) + if executeShellCommand(cmd) != 0: + quit("Error: call to nimrod compiler failed") + readCFiles(c, osA, cpuA) + for i in 0 .. c.cfiles[osA][cpuA].len-1: + var dest = dir / extractFilename(c.cfiles[osA][cpuA][i]) + CopyFile(dest, c.cfiles[osA][cpuA][i]) + c.cfiles[osA][cpuA][i] = dest + # second pass: remove duplicate files + for osA in countdown(c.oses.len, 1): + for cpuA in countdown(c.cpus.len, 1): + for i in 0..c.cfiles[osA][cpuA].len-1: + var dup = c.cfiles[osA][cpuA][i] + var f = extractFilename(dup) + for osB in 1..c.oses.len: + for cpuB in 1..c.cpus.len: + if osB != osA or cpuB != cpuA: + var orig = buildDir(osB, cpuB) / f + if ExistsFile(orig) and ExistsFile(dup) and + sameFileContent(orig, dup): + # file is identical, so delete duplicate: + RemoveFile(dup) + c.cfiles[osA][cpuA][i] = orig + var scrpt = GenerateInstallScript(c) + var f: TFile + if openFile(f, buildShFile, fmWrite): + writeln(f, scrpt) + closeFile(f) + else: + quit("Cannot open for writing: " & buildShFile) + +# --------------------- generate inno setup ----------------------------------- +proc setupDist(c: var TConfigData) = + var scrpt = GenerateInnoSetup(c) + var f: TFile + var n = "build" / "install_$1_$2.iss" % [toLower(c.name), c.version] + if openFile(f, n, fmWrite): + writeln(f, scrpt) + closeFile(f) + when defined(windows): + if c.innoSetup.path.len == 0: + c.innoSetup.path = "iscc.exe" + var outcmd = if c.outdir.len == 0: "build" else: c.outdir + var cmd = "$1 $2 /O$3 $4" % [c.innoSetup.path, c.innoSetup.flags, + outcmd, n] + Echo("Executing: " & cmd) + if executeShellCommand(cmd) == 0: + removeFile(n) + else: + quit("External program failed") + else: + quit("Cannot open for writing: " & n) + +# ------------------ generate ZIP file --------------------------------------- +when haveZipLib: + proc zipDist(c: var TConfigData) = + var proj = toLower(c.name) + var n = "$1_$2.zip" % [proj, c.version] + if c.outdir.len == 0: n = "build" / n + else: n = c.outdir / n + var z: TZipArchive + if open(z, n, fmWrite): + addFile(z, proj / buildShFile, buildShFile) + for f in walkFiles("lib/*.h"): + addFile(z, proj / "build" / extractFilename(f), f) + for osA in 1..c.oses.len: + for cpuA in 1..c.cpus.len: + var dir = buildDir(osA, cpuA) + for k, f in walkDir(dir): + if k == pcFile: addFile(z, proj / dir / extractFilename(f), f) + for f in items(c.commonFiles): addFile(z, proj / f, f) + for f in items(c.unixFiles): addFile(z, proj / f, f) + close(z) + else: + quit("Cannot open for writing: " & n) + +# ------------------- main ---------------------------------------------------- + +var c: TConfigData +initConfigData(c) +parseCmdLine(c) +parseIniFile(c) +if actionInno in c.actions: + setupDist(c) +if actionCSource in c.actions: + srcdist(c) +if actionZip in c.actions: + when haveZipLib: + zipdist(c) + else: + quit("libzip is not installed") diff --git a/tools/nimweb.nim b/tools/nimweb.nim new file mode 100644 index 0000000000..4835c5f4f6 --- /dev/null +++ b/tools/nimweb.nim @@ -0,0 +1,203 @@ +# +# +# The Nimrod Website Generator +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +import + os, strutils, times, parseopt, parsecfg, streams, strtabs + +type + TKeyValPair = tuple[key, val: string] + TConfigData = object of TObject + tabs, links: seq[TKeyValPair] + doc, srcdoc, webdoc: seq[string] + authors, projectName, projectTitle, infile, outdir, ticker: string + vars: PStringTable + nimrodArgs: string + +proc initConfigData(c: var TConfigData) = + c.tabs = @[] + c.links = @[] + c.doc = @[] + c.srcdoc = @[] + c.webdoc = @[] + c.infile = "" + c.outdir = "" + c.nimrodArgs = "" + c.authors = "" + c.ticker = "" + c.vars = newStringTable(modeStyleInsensitive) + +include "sunset.tmpl" + +# ------------------------- configuration file ------------------------------- + +const + Version = "0.5" + Usage = "nimweb - Nimrod Installation Generator Version " & version & """ + + (c) 2008 Andreas Rumpf +Usage: + nimweb [options] ini-file[.ini] [compile_options] +Options: + -o, --output:dir set the output directory (default: same as ini-file) + --var:name=value set the value of a variable + -h, --help shows this help + -v, --version shows the version +Compile_options: + will be passed to the Nimrod compiler +""" + +proc parseCmdLine(c: var TConfigData) = + var p = init() + while true: + next(p) + var kind = p.kind + var key = p.key + var val = p.val + case kind + of cmdArgument: + c.infile = appendFileExt(key, "ini") + c.nimrodArgs = getRestOfCommandLine(p) + break + of cmdLongOption, cmdShortOption: + case normalize(key) + of "help", "h": write(stdout, Usage) + of "version", "v": writeln(stdout, Version) + of "o", "output": c.outdir = val + of "var": + var idx = findSubStr('=', val) + if idx < 0: quit("invalid command line") + c.vars[copy(val, 0, idx-1)] = copy(val, idx+1) + else: quit(Usage) + of cmdEnd: break + if c.infile.len == 0: quit(Usage) + +proc walkDirRecursively(s: var seq[string], root, ext: string) = + for k, f in walkDir(root): + case k + of pcFile, pcLinkToFile: + if cmpIgnoreCase(ext, extractFileExt(f)) == 0: + add(s, f) + of pcDirectory: walkDirRecursively(s, f, ext) + of pcLinkToDirectory: nil + +proc addFiles(s: var seq[string], dir, ext: string, patterns: seq[string]) = + for p in items(patterns): + if existsDir(dir / p): + walkDirRecursively(s, dir / p, ext) + else: + add(s, dir / appendFileExt(p, ext)) + +proc parseIniFile(c: var TConfigData) = + var + p: TCfgParser + section: string # current section + var input = newFileStream(c.infile, fmRead) + if input != nil: + open(p, input, c.infile) + while true: + var k = next(p) + case k.kind + of cfgEof: break + of cfgSectionStart: + section = normalize(k.section) + case section + of "project", "links", "tabs", "ticker", "documentation", "var": nil + else: echo("[Warning] Skipping unknown section: " & section) + + of cfgKeyValuePair: + var v = k.value % c.vars + c.vars[k.key] = v + + case section + of "project": + case normalize(k.key) + of "name": c.projectName = v + of "title": c.projectTitle = v + of "authors": c.authors = v + else: quit(errorStr(p, "unknown variable: " & k.key)) + of "var": nil + of "links": add(c.links, (key: k.key, val: v)) + of "tabs": add(c.tabs, (key: k.key, val: v)) + of "ticker": c.ticker = v + of "documentation": + case normalize(k.key) + of "doc": addFiles(c.doc, "doc", "txt" splitSeq(v, {';'})) + of "srcdoc": addFiles(c.srcdoc, "lib", "nim", splitSeq(v, {';'})) + of "webdoc": addFiles(c.webdoc, "lib", "nim", splitSeq(v, {';'})) + else: quit(errorStr(p, "unknown variable: " & k.key)) + else: nil + + of cfgOption: quit(errorStr(p, "syntax error")) + of cfgError: quit(errorStr(p, k.msg)) + close(p) + if c.projectName.len == 0: + c.projectName = changeFileExt(extractFilename(c.infile), "") + if c.outdir.len == 0: + c.outdir = extractDir(c.infile) + else: + quit("cannot open: " & c.infile) + +# ------------------- main ---------------------------------------------------- + +proc Exec(cmd: string) = + echo(cmd) + if os.executeShellCommand(cmd) != 0: quit("external program failed") + +proc buildDoc(c: var TConfigData, destPath: string) = + # call nim for the documentation: + for d in items(c.doc): + Exec("nimrod rst2html $1 -o:$2 --index=$3/theindex $4" % + [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), + destpath, d]) + for d in items(c.srcdoc): + Exec("nimrod doc $1 -o:$2 --index=$3/theindex $4" % + [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), + destpath, d]) + Exec("nimrod rst2html $1 -o:$2/theindex.html $2/theindex" % + [c.nimrodArgs, destPath]) + +proc buildAddDoc(c: var TConfigData, destPath: string) = + # build additional documentation (without the index): + for d in items(c.webdoc): + Exec("nimrod doc $1 -o:$2 $3" % + [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), d]) + +proc main(c: var TConfigData) = + const + cmd = "nimrod rst2html --compileonly $1 -o:web/$2.temp web/$2.txt" + if c.ticker.len > 0: + Exec(cmd % [c.nimrodArgs, c.ticker]) + var temp = "web" / changeFileExt(c.ticker, "temp") + c.ticker = readFile(temp) + if isNil(c.ticker): quit("[Error] cannot open:" & temp) + RemoveFile(temp) + for i in 0..c.tabs.len-1: + var file = c.tabs[i].val + Exec(cmd % [c.nimrodArgs, file]) + var temp = "web" / changeFileExt(file, "temp") + var content = readFile(temp) + if isNil(content): quit("[Error] cannot open: " & temp) + var f: TFile + var outfile = "web/upload/$1.html" % file + if openFile(f, outfile, fmWrite): + writeln(f, generateHTMLPage(c, file, content)) + closeFile(f) + else: + quit("[Error] cannot write file: " & outfile) + removeFile(temp) + + buildAddDoc(c, "web/upload") + buildDoc(c, "web/upload") + buildDoc(c, "doc") + +var c: TConfigData +initConfigData(c) +parseCmdLine(c) +parseIniFile(c) +main(c) diff --git a/tools/sunset.tmpl b/tools/sunset.tmpl new file mode 100644 index 0000000000..02e49218c1 --- /dev/null +++ b/tools/sunset.tmpl @@ -0,0 +1,72 @@ +#proc generateHTMLPage(c: var TConfigData, currentTab, content: string): string = +# result = "" + + + + + $c.projectTitle + + + + + +
    + + +
    + +
    +# if len(c.ticker) > 0: +
    +
    +

    latest news

    +
    +
    + $c.ticker +
    +
    +# end if +# if len(c.links) > 0: +
    +
    +

    additional links

    +
    + +
    +# end if +
    +
    + $content +
    +
    + +
    + +