diff options
author | Andrew Gerrand <adg@golang.org> | 2012-03-28 23:41:38 +1100 |
---|---|---|
committer | Andrew Gerrand <adg@golang.org> | 2012-03-28 23:41:38 +1100 |
commit | 4081aa12778bae22450c1b068a88a9117e4b303b (patch) | |
tree | 0d2456199c4b87f21f630144187920a931160f8b | |
parent | 3895b5051df256b442d0b0af50debfffd8d75164 (diff) | |
download | go-4081aa12778bae22450c1b068a88a9117e4b303b.tar.gz go-4081aa12778bae22450c1b068a88a9117e4b303b.zip |
remove non-go1 commands and packages
136 files changed, 0 insertions, 48601 deletions
diff --git a/src/cmd/cov/Makefile b/src/cmd/cov/Makefile deleted file mode 100644 index 3f528d7517..0000000000 --- a/src/cmd/cov/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright 2012 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -include ../../Make.dist diff --git a/src/cmd/cov/doc.go b/src/cmd/cov/doc.go deleted file mode 100644 index a5fc0036d2..0000000000 --- a/src/cmd/cov/doc.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* - -Cov is a rudimentary code coverage tool. - -Usage: - go tool cov [-lsv] [-g substring] [-m minlines] [6.out args] - -Given a command to run, it runs the command while tracking which -sections of code have been executed. When the command finishes, -cov prints the line numbers of sections of code in the binary that -were not executed. With no arguments it assumes the command "6.out". - - -The options are: - - -l - print full path names instead of paths relative to the current directory - -s - show the source code that didn't execute, in addition to the line numbers. - -v - print debugging information during the run. - -g substring - restrict the coverage analysis to functions or files whose names contain substring - -m minlines - only report uncovered sections of code larger than minlines lines - -The program is the same for all architectures: 386, amd64, and arm. - -*/ -package documentation diff --git a/src/cmd/cov/main.c b/src/cmd/cov/main.c deleted file mode 100644 index 9496632c53..0000000000 --- a/src/cmd/cov/main.c +++ /dev/null @@ -1,480 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* - * code coverage - */ - -#include <u.h> -#include <libc.h> -#include <bio.h> -#include "tree.h" - -#include <ureg_amd64.h> -#include <mach.h> -typedef struct Ureg Ureg; - -void -usage(void) -{ - fprint(2, "usage: cov [-lsv] [-g substring] [-m minlines] [6.out args...]\n"); - fprint(2, "-g specifies pattern of interesting functions or files\n"); - exits("usage"); -} - -typedef struct Range Range; -struct Range -{ - uvlong pc; - uvlong epc; -}; - -int chatty; -int fd; -int longnames; -int pid; -int doshowsrc; -Map *mem; -Map *text; -Fhdr fhdr; -char *substring; -char cwd[1000]; -int ncwd; -int minlines = -1000; - -Tree breakpoints; // code ranges not run - -/* - * comparison for Range structures - * they are "equal" if they overlap, so - * that a search for [pc, pc+1) finds the - * Range containing pc. - */ -int -rangecmp(void *va, void *vb) -{ - Range *a = va, *b = vb; - if(a->epc <= b->pc) - return 1; - if(b->epc <= a->pc) - return -1; - return 0; -} - -/* - * remember that we ran the section of code [pc, epc). - */ -void -ran(uvlong pc, uvlong epc) -{ - Range key; - Range *r; - uvlong oldepc; - - if(chatty) - print("run %#llux-%#llux\n", pc, epc); - - key.pc = pc; - key.epc = pc+1; - r = treeget(&breakpoints, &key); - if(r == nil) - sysfatal("unchecked breakpoint at %#llux+%d", pc, (int)(epc-pc)); - - // Might be that the tail of the sequence - // was run already, so r->epc is before the end. - // Adjust len. - if(epc > r->epc) - epc = r->epc; - - if(r->pc == pc) { - r->pc = epc; - } else { - // Chop r to before pc; - // add new entry for after if needed. - // Changing r->epc does not affect r's position in the tree. - oldepc = r->epc; - r->epc = pc; - if(epc < oldepc) { - Range *n; - n = malloc(sizeof *n); - n->pc = epc; - n->epc = oldepc; - treeput(&breakpoints, n, n); - } - } -} - -void -showsrc(char *file, int line1, int line2) -{ - Biobuf *b; - char *p; - int n, stop; - - if((b = Bopen(file, OREAD)) == nil) { - print("\topen %s: %r\n", file); - return; - } - - for(n=1; n<line1 && (p = Brdstr(b, '\n', 1)) != nil; n++) - free(p); - - // print up to five lines (this one and 4 more). - // if there are more than five lines, print 4 and "..." - stop = n+4; - if(stop > line2) - stop = line2; - if(stop < line2) - stop--; - for(; n<=stop && (p = Brdstr(b, '\n', 1)) != nil; n++) { - print(" %d %s\n", n, p); - free(p); - } - if(n < line2) - print(" ...\n"); - Bterm(b); -} - -/* - * if s is in the current directory or below, - * return the relative path. - */ -char* -shortname(char *s) -{ - if(!longnames && strlen(s) > ncwd && memcmp(s, cwd, ncwd) == 0 && s[ncwd] == '/') - return s+ncwd+1; - return s; -} - -/* - * we've decided that [pc, epc) did not run. - * do something about it. - */ -void -missing(uvlong pc, uvlong epc) -{ - char file[1000]; - int line1, line2; - char buf[100]; - Symbol s; - char *p; - uvlong uv; - - if(!findsym(pc, CTEXT, &s) || !fileline(file, sizeof file, pc)) { - notfound: - print("%#llux-%#llux\n", pc, epc); - return; - } - p = strrchr(file, ':'); - *p++ = 0; - line1 = atoi(p); - for(uv=pc; uv<epc; ) { - if(!fileline(file, sizeof file, epc-2)) - goto notfound; - uv += machdata->instsize(text, uv); - } - p = strrchr(file, ':'); - *p++ = 0; - line2 = atoi(p); - - if(line2+1-line2 < minlines) - return; - - if(pc == s.value) { - // never entered function - print("%s:%d %s never called (%#llux-%#llux)\n", shortname(file), line1, s.name, pc, epc); - return; - } - if(pc <= s.value+13) { - // probably stub for stack growth. - // check whether last instruction is call to morestack. - // the -5 below is the length of - // CALL sys.morestack. - buf[0] = 0; - machdata->das(text, epc-5, 0, buf, sizeof buf); - if(strstr(buf, "morestack")) - return; - } - - if(epc - pc == 5) { - // check for CALL sys.panicindex - buf[0] = 0; - machdata->das(text, pc, 0, buf, sizeof buf); - if(strstr(buf, "panicindex")) - return; - } - - if(epc - pc == 2 || epc -pc == 3) { - // check for XORL inside shift. - // (on x86 have to implement large left or unsigned right shift with explicit zeroing). - // f+90 0x00002c9f CMPL CX,$20 - // f+93 0x00002ca2 JCS f+97(SB) - // f+95 0x00002ca4 XORL AX,AX <<< - // f+97 0x00002ca6 SHLL CL,AX - // f+99 0x00002ca8 MOVL $1,CX - // - // f+c8 0x00002cd7 CMPL CX,$40 - // f+cb 0x00002cda JCS f+d0(SB) - // f+cd 0x00002cdc XORQ AX,AX <<< - // f+d0 0x00002cdf SHLQ CL,AX - // f+d3 0x00002ce2 MOVQ $1,CX - buf[0] = 0; - machdata->das(text, pc, 0, buf, sizeof buf); - if(strncmp(buf, "XOR", 3) == 0) { - machdata->das(text, epc, 0, buf, sizeof buf); - if(strncmp(buf, "SHL", 3) == 0 || strncmp(buf, "SHR", 3) == 0) - return; - } - } - - if(epc - pc == 3) { - // check for SAR inside shift. - // (on x86 have to implement large signed right shift as >>31). - // f+36 0x00016216 CMPL CX,$20 - // f+39 0x00016219 JCS f+3e(SB) - // f+3b 0x0001621b SARL $1f,AX <<< - // f+3e 0x0001621e SARL CL,AX - // f+40 0x00016220 XORL CX,CX - // f+42 0x00016222 CMPL CX,AX - buf[0] = 0; - machdata->das(text, pc, 0, buf, sizeof buf); - if(strncmp(buf, "SAR", 3) == 0) { - machdata->das(text, epc, 0, buf, sizeof buf); - if(strncmp(buf, "SAR", 3) == 0) - return; - } - } - - // show first instruction to make clear where we were. - machdata->das(text, pc, 0, buf, sizeof buf); - - if(line1 != line2) - print("%s:%d,%d %#llux-%#llux %s\n", - shortname(file), line1, line2, pc, epc, buf); - else - print("%s:%d %#llux-%#llux %s\n", - shortname(file), line1, pc, epc, buf); - if(doshowsrc) - showsrc(file, line1, line2); -} - -/* - * walk the tree, calling missing for each non-empty - * section of missing code. - */ -void -walktree(TreeNode *t) -{ - Range *n; - - if(t == nil) - return; - walktree(t->left); - n = t->key; - if(n->pc < n->epc) - missing(n->pc, n->epc); - walktree(t->right); -} - -/* - * set a breakpoint all over [pc, epc) - * and remember that we did. - */ -void -breakpoint(uvlong pc, uvlong epc) -{ - Range *r; - - r = malloc(sizeof *r); - r->pc = pc; - r->epc = epc; - treeput(&breakpoints, r, r); - - for(; pc < epc; pc+=machdata->bpsize) - put1(mem, pc, machdata->bpinst, machdata->bpsize); -} - -/* - * install breakpoints over all text symbols - * that match the pattern. - */ -void -cover(void) -{ - Symbol s; - char *lastfn; - uvlong lastpc; - int i; - char buf[200]; - - lastfn = nil; - lastpc = 0; - for(i=0; textsym(&s, i); i++) { - switch(s.type) { - case 'T': - case 't': - if(lastpc != 0) { - breakpoint(lastpc, s.value); - lastpc = 0; - } - // Ignore second entry for a given name; - // that's the debugging blob. - if(lastfn && strcmp(s.name, lastfn) == 0) - break; - lastfn = s.name; - buf[0] = 0; - fileline(buf, sizeof buf, s.value); - if(substring == nil || strstr(buf, substring) || strstr(s.name, substring)) - lastpc = s.value; - } - } -} - -uvlong -rgetzero(Map *map, char *reg) -{ - USED(map); - USED(reg); - - return 0; -} - -/* - * remove the breakpoints at pc and successive instructions, - * up to and including the first jump or other control flow transfer. - */ -void -uncover(uvlong pc) -{ - uchar buf[1000]; - int n, n1, n2; - uvlong foll[2]; - - // Double-check that we stopped at a breakpoint. - if(get1(mem, pc, buf, machdata->bpsize) < 0) - sysfatal("read mem inst at %#llux: %r", pc); - if(memcmp(buf, machdata->bpinst, machdata->bpsize) != 0) - sysfatal("stopped at %#llux; not at breakpoint %d", pc, machdata->bpsize); - - // Figure out how many bytes of straight-line code - // there are in the text starting at pc. - n = 0; - while(n < sizeof buf) { - n1 = machdata->instsize(text, pc+n); - if(n+n1 > sizeof buf) - break; - n2 = machdata->foll(text, pc+n, rgetzero, foll); - n += n1; - if(n2 != 1 || foll[0] != pc+n) - break; - } - - // Record that this section of code ran. - ran(pc, pc+n); - - // Put original instructions back. - if(get1(text, pc, buf, n) < 0) - sysfatal("get1: %r"); - if(put1(mem, pc, buf, n) < 0) - sysfatal("put1: %r"); -} - -int -startprocess(char **argv) -{ - int pid; - - if((pid = fork()) < 0) - sysfatal("fork: %r"); - if(pid == 0) { - pid = getpid(); - if(ctlproc(pid, "hang") < 0) - sysfatal("ctlproc hang: %r"); - exec(argv[0], argv); - sysfatal("exec %s: %r", argv[0]); - } - if(ctlproc(pid, "attached") < 0 || ctlproc(pid, "waitstop") < 0) - sysfatal("attach %d %s: %r", pid, argv[0]); - return pid; -} - -int -go(void) -{ - uvlong pc; - char buf[100]; - int n; - - for(n = 0;; n++) { - ctlproc(pid, "startstop"); - if(get8(mem, offsetof(Ureg, ip), &pc) < 0) { - rerrstr(buf, sizeof buf); - if(strstr(buf, "exited") || strstr(buf, "No such process")) - return n; - sysfatal("cannot read pc: %r"); - } - pc--; - if(put8(mem, offsetof(Ureg, ip), pc) < 0) - sysfatal("cannot write pc: %r"); - uncover(pc); - } -} - -void -main(int argc, char **argv) -{ - int n; - - ARGBEGIN{ - case 'g': - substring = EARGF(usage()); - break; - case 'l': - longnames++; - break; - case 'n': - minlines = atoi(EARGF(usage())); - break; - case 's': - doshowsrc = 1; - break; - case 'v': - chatty++; - break; - default: - usage(); - }ARGEND - - getwd(cwd, sizeof cwd); - ncwd = strlen(cwd); - - if(argc == 0) { - *--argv = "6.out"; - } - fd = open(argv[0], OREAD); - if(fd < 0) - sysfatal("open %s: %r", argv[0]); - if(crackhdr(fd, &fhdr) <= 0) - sysfatal("crackhdr: %r"); - machbytype(fhdr.type); - if(syminit(fd, &fhdr) <= 0) - sysfatal("syminit: %r"); - text = loadmap(nil, fd, &fhdr); - if(text == nil) - sysfatal("loadmap: %r"); - pid = startprocess(argv); - mem = attachproc(pid, &fhdr); - if(mem == nil) - sysfatal("attachproc: %r"); - breakpoints.cmp = rangecmp; - cover(); - n = go(); - walktree(breakpoints.root); - if(chatty) - print("%d breakpoints\n", n); - detachproc(mem); - exits(0); -} - diff --git a/src/cmd/cov/tree.c b/src/cmd/cov/tree.c deleted file mode 100644 index 905bb7d978..0000000000 --- a/src/cmd/cov/tree.c +++ /dev/null @@ -1,243 +0,0 @@ -// Renamed from Map to Tree to avoid conflict with libmach. - -/* -Copyright (c) 2003-2007 Russ Cox, Tom Bergan, Austin Clements, - Massachusetts Institute of Technology -Portions Copyright (c) 2009 The Go Authors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL 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. -*/ - -// Mutable map structure, but still based on -// Okasaki, Red Black Trees in a Functional Setting, JFP 1999, -// which is a lot easier than the traditional red-black -// and plenty fast enough for me. (Also I could copy -// and edit fmap.c.) - -#include <u.h> -#include <libc.h> -#include "tree.h" - -enum -{ - Red = 0, - Black = 1 -}; - - -// Red-black trees are binary trees with this property: -// 1. No red node has a red parent. -// 2. Every path from the root to a leaf contains the -// same number of black nodes. - -static TreeNode* -rwTreeNode(TreeNode *p, int color, TreeNode *left, void *key, void *value, TreeNode *right) -{ - if(p == nil) - p = malloc(sizeof *p); - p->color = color; - p->left = left; - p->key = key; - p->value = value; - p->right = right; - return p; -} - -static TreeNode* -balance(TreeNode *m0) -{ - void *xk, *xv, *yk, *yv, *zk, *zv; - TreeNode *a, *b, *c, *d; - TreeNode *m1, *m2; - int color; - TreeNode *left, *right; - void *key, *value; - - color = m0->color; - left = m0->left; - key = m0->key; - value = m0->value; - right = m0->right; - - // Okasaki notation: (T is mkTreeNode, B is Black, R is Red, x, y, z are key-value. - // - // balance B (T R (T R a x b) y c) z d - // balance B (T R a x (T R b y c)) z d - // balance B a x (T R (T R b y c) z d) - // balance B a x (T R b y (T R c z d)) - // - // = T R (T B a x b) y (T B c z d) - - if(color == Black){ - if(left && left->color == Red){ - if(left->left && left->left->color == Red){ - a = left->left->left; - xk = left->left->key; - xv = left->left->value; - b = left->left->right; - yk = left->key; - yv = left->value; - c = left->right; - zk = key; - zv = value; - d = right; - m1 = left; - m2 = left->left; - goto hard; - }else if(left->right && left->right->color == Red){ - a = left->left; - xk = left->key; - xv = left->value; - b = left->right->left; - yk = left->right->key; - yv = left->right->value; - c = left->right->right; - zk = key; - zv = value; - d = right; - m1 = left; - m2 = left->right; - goto hard; - } - }else if(right && right->color == Red){ - if(right->left && right->left->color == Red){ - a = left; - xk = key; - xv = value; - b = right->left->left; - yk = right->left->key; - yv = right->left->value; - c = right->left->right; - zk = right->key; - zv = right->value; - d = right->right; - m1 = right; - m2 = right->left; - goto hard; - }else if(right->right && right->right->color == Red){ - a = left; - xk = key; - xv = value; - b = right->left; - yk = right->key; - yv = right->value; - c = right->right->left; - zk = right->right->key; - zv = right->right->value; - d = right->right->right; - m1 = right; - m2 = right->right; - goto hard; - } - } - } - return rwTreeNode(m0, color, left, key, value, right); - -hard: - return rwTreeNode(m0, Red, rwTreeNode(m1, Black, a, xk, xv, b), - yk, yv, rwTreeNode(m2, Black, c, zk, zv, d)); -} - -static TreeNode* -ins0(TreeNode *p, void *k, void *v, TreeNode *rw) -{ - if(p == nil) - return rwTreeNode(rw, Red, nil, k, v, nil); - if(p->key == k){ - if(rw) - return rwTreeNode(rw, p->color, p->left, k, v, p->right); - p->value = v; - return p; - } - if(p->key < k) - p->left = ins0(p->left, k, v, rw); - else - p->right = ins0(p->right, k, v, rw); - return balance(p); -} - -static TreeNode* -ins1(Tree *m, TreeNode *p, void *k, void *v, TreeNode *rw) -{ - int i; - - if(p == nil) - return rwTreeNode(rw, Red, nil, k, v, nil); - i = m->cmp(p->key, k); - if(i == 0){ - if(rw) - return rwTreeNode(rw, p->color, p->left, k, v, p->right); - p->value = v; - return p; - } - if(i < 0) - p->left = ins1(m, p->left, k, v, rw); - else - p->right = ins1(m, p->right, k, v, rw); - return balance(p); -} - -void -treeputelem(Tree *m, void *key, void *val, TreeNode *rw) -{ - if(m->cmp) - m->root = ins1(m, m->root, key, val, rw); - else - m->root = ins0(m->root, key, val, rw); -} - -void -treeput(Tree *m, void *key, void *val) -{ - treeputelem(m, key, val, nil); -} - -void* -treeget(Tree *m, void *key) -{ - int i; - TreeNode *p; - - p = m->root; - if(m->cmp){ - for(;;){ - if(p == nil) - return nil; - i = m->cmp(p->key, key); - if(i < 0) - p = p->left; - else if(i > 0) - p = p->right; - else - return p->value; - } - }else{ - for(;;){ - if(p == nil) - return nil; - if(p->key == key) - return p->value; - if(p->key < key) - p = p->left; - else - p = p->right; - } - } -} diff --git a/src/cmd/cov/tree.h b/src/cmd/cov/tree.h deleted file mode 100644 index a716d83ada..0000000000 --- a/src/cmd/cov/tree.h +++ /dev/null @@ -1,47 +0,0 @@ -// Renamed from Map to Tree to avoid conflict with libmach. - -/* -Copyright (c) 2003-2007 Russ Cox, Tom Bergan, Austin Clements, - Massachusetts Institute of Technology -Portions Copyright (c) 2009 The Go Authors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL 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. -*/ - -typedef struct Tree Tree; -typedef struct TreeNode TreeNode; -struct Tree -{ - int (*cmp)(void*, void*); - TreeNode *root; -}; - -struct TreeNode -{ - int color; - TreeNode *left; - void *key; - void *value; - TreeNode *right; -}; - -void *treeget(Tree*, void*); -void treeput(Tree*, void*, void*); -void treeputelem(Tree*, void*, void*, TreeNode*); diff --git a/src/cmd/prof/Makefile b/src/cmd/prof/Makefile deleted file mode 100644 index 3f528d7517..0000000000 --- a/src/cmd/prof/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright 2012 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -include ../../Make.dist diff --git a/src/cmd/prof/doc.go b/src/cmd/prof/doc.go deleted file mode 100644 index 0072f9ad5d..0000000000 --- a/src/cmd/prof/doc.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* - -Prof is a rudimentary real-time profiler. - -Given a command to run or the process id (pid) of a command already -running, it samples the program's state at regular intervals and reports -on its behavior. With no options, it prints a histogram of the locations -in the code that were sampled during execution. - -Since it is a real-time profiler, unlike a traditional profiler it samples -the program's state even when it is not running, such as when it is -asleep or waiting for I/O. Each thread contributes equally to the -statistics. - -Usage: - go tool prof -p pid [-t total_secs] [-d delta_msec] [6.out args ...] - -The output modes (default -h) are: - - -P file.prof: - Write the profile information to file.prof, in the format used by pprof. - At the moment, this only works on Linux amd64 binaries and requires that the - binary be written using 6l -e to produce ELF debug info. - See http://code.google.com/p/google-perftools for details. - -h: histograms - How many times a sample occurred at each location. - -f: dynamic functions - At each sample period, print the name of the executing function. - -l: dynamic file and line numbers - At each sample period, print the file and line number of the executing instruction. - -r: dynamic registers - At each sample period, print the register contents. - -s: dynamic function stack traces - At each sample period, print the symbolic stack trace. - -Flag -t sets the maximum real time to sample, in seconds, and -d -sets the sampling interval in milliseconds. The default is to sample -every 100ms until the program completes. - -It is installed as go tool prof and is architecture-independent. - -*/ -package documentation diff --git a/src/cmd/prof/main.c b/src/cmd/prof/main.c deleted file mode 100644 index f0acaf1c07..0000000000 --- a/src/cmd/prof/main.c +++ /dev/null @@ -1,899 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -#include <u.h> -#include <time.h> -#include <libc.h> -#include <bio.h> -#include <ctype.h> - -#define Ureg Ureg_amd64 - #include <ureg_amd64.h> -#undef Ureg -#define Ureg Ureg_x86 - #include <ureg_x86.h> -#undef Ureg -#include <mach.h> - -char* file = "6.out"; -static Fhdr fhdr; -int have_syms; -int fd; -struct Ureg_amd64 ureg_amd64; -struct Ureg_x86 ureg_x86; -int total_sec = 0; -int delta_msec = 100; -int nsample; -int nsamplethread; - -// pprof data, stored as sequences of N followed by N PC values. -// See http://code.google.com/p/google-perftools . -uvlong *ppdata; // traces -Biobuf* pproffd; // file descriptor to write trace info -long ppstart; // start position of current trace -long nppdata; // length of data -long ppalloc; // size of allocated data -char ppmapdata[10*1024]; // the map information for the output file - -// output formats -int pprof; // print pprof output to named file -int functions; // print functions -int histograms; // print histograms -int linenums; // print file and line numbers rather than function names -int registers; // print registers -int stacks; // print stack traces - -int pid; // main process pid - -int nthread; // number of threads -int thread[32]; // thread pids -Map *map[32]; // thread maps - -void -Usage(void) -{ - fprint(2, "Usage: prof -p pid [-t total_secs] [-d delta_msec]\n"); - fprint(2, " prof [-t total_secs] [-d delta_msec] 6.out args ...\n"); - fprint(2, "\tformats (default -h):\n"); - fprint(2, "\t\t-P file.prof: write [c]pprof output to file.prof\n"); - fprint(2, "\t\t-h: histograms\n"); - fprint(2, "\t\t-f: dynamic functions\n"); - fprint(2, "\t\t-l: dynamic file and line numbers\n"); - fprint(2, "\t\t-r: dynamic registers\n"); - fprint(2, "\t\t-s: dynamic function stack traces\n"); - fprint(2, "\t\t-hs: include stack info in histograms\n"); - exit(2); -} - -typedef struct PC PC; -struct PC { - uvlong pc; - uvlong callerpc; - unsigned int count; - PC* next; -}; - -enum { - Ncounters = 256 -}; - -PC *counters[Ncounters]; - -// Set up by setarch() to make most of the code architecture-independent. -typedef struct Arch Arch; -struct Arch { - char* name; - void (*regprint)(void); - int (*getregs)(Map*); - int (*getPC)(Map*); - int (*getSP)(Map*); - uvlong (*uregPC)(void); - uvlong (*uregSP)(void); - void (*ppword)(uvlong w); -}; - -void -amd64_regprint(void) -{ - fprint(2, "ax\t0x%llux\n", ureg_amd64.ax); - fprint(2, "bx\t0x%llux\n", ureg_amd64.bx); - fprint(2, "cx\t0x%llux\n", ureg_amd64.cx); - fprint(2, "dx\t0x%llux\n", ureg_amd64.dx); - fprint(2, "si\t0x%llux\n", ureg_amd64.si); - fprint(2, "di\t0x%llux\n", ureg_amd64.di); - fprint(2, "bp\t0x%llux\n", ureg_amd64.bp); - fprint(2, "r8\t0x%llux\n", ureg_amd64.r8); - fprint(2, "r9\t0x%llux\n", ureg_amd64.r9); - fprint(2, "r10\t0x%llux\n", ureg_amd64.r10); - fprint(2, "r11\t0x%llux\n", ureg_amd64.r11); - fprint(2, "r12\t0x%llux\n", ureg_amd64.r12); - fprint(2, "r13\t0x%llux\n", ureg_amd64.r13); - fprint(2, "r14\t0x%llux\n", ureg_amd64.r14); - fprint(2, "r15\t0x%llux\n", ureg_amd64.r15); - fprint(2, "ds\t0x%llux\n", ureg_amd64.ds); - fprint(2, "es\t0x%llux\n", ureg_amd64.es); - fprint(2, "fs\t0x%llux\n", ureg_amd64.fs); - fprint(2, "gs\t0x%llux\n", ureg_amd64.gs); - fprint(2, "type\t0x%llux\n", ureg_amd64.type); - fprint(2, "error\t0x%llux\n", ureg_amd64.error); - fprint(2, "pc\t0x%llux\n", ureg_amd64.ip); - fprint(2, "cs\t0x%llux\n", ureg_amd64.cs); - fprint(2, "flags\t0x%llux\n", ureg_amd64.flags); - fprint(2, "sp\t0x%llux\n", ureg_amd64.sp); - fprint(2, "ss\t0x%llux\n", ureg_amd64.ss); -} - -int -amd64_getregs(Map *map) -{ - int i; - union { - uvlong regs[1]; - struct Ureg_amd64 ureg; - } u; - - for(i = 0; i < sizeof ureg_amd64; i+=8) { - if(get8(map, (uvlong)i, &u.regs[i/8]) < 0) - return -1; - } - ureg_amd64 = u.ureg; - return 0; -} - -int -amd64_getPC(Map *map) -{ - uvlong x; - int r; - - r = get8(map, offsetof(struct Ureg_amd64, ip), &x); - ureg_amd64.ip = x; - return r; -} - -int -amd64_getSP(Map *map) -{ - uvlong x; - int r; - - r = get8(map, offsetof(struct Ureg_amd64, sp), &x); - ureg_amd64.sp = x; - return r; -} - -uvlong -amd64_uregPC(void) -{ - return ureg_amd64.ip; -} - -uvlong -amd64_uregSP(void) { - return ureg_amd64.sp; -} - -void -amd64_ppword(uvlong w) -{ - uchar buf[8]; - - buf[0] = w; - buf[1] = w >> 8; - buf[2] = w >> 16; - buf[3] = w >> 24; - buf[4] = w >> 32; - buf[5] = w >> 40; - buf[6] = w >> 48; - buf[7] = w >> 56; - Bwrite(pproffd, buf, 8); -} - -void -x86_regprint(void) -{ - fprint(2, "ax\t0x%ux\n", ureg_x86.ax); - fprint(2, "bx\t0x%ux\n", ureg_x86.bx); - fprint(2, "cx\t0x%ux\n", ureg_x86.cx); - fprint(2, "dx\t0x%ux\n", ureg_x86.dx); - fprint(2, "si\t0x%ux\n", ureg_x86.si); - fprint(2, "di\t0x%ux\n", ureg_x86.di); - fprint(2, "bp\t0x%ux\n", ureg_x86.bp); - fprint(2, "ds\t0x%ux\n", ureg_x86.ds); - fprint(2, "es\t0x%ux\n", ureg_x86.es); - fprint(2, "fs\t0x%ux\n", ureg_x86.fs); - fprint(2, "gs\t0x%ux\n", ureg_x86.gs); - fprint(2, "cs\t0x%ux\n", ureg_x86.cs); - fprint(2, "flags\t0x%ux\n", ureg_x86.flags); - fprint(2, "pc\t0x%ux\n", ureg_x86.pc); - fprint(2, "sp\t0x%ux\n", ureg_x86.sp); - fprint(2, "ss\t0x%ux\n", ureg_x86.ss); -} - -int -x86_getregs(Map *map) -{ - int i; - - for(i = 0; i < sizeof ureg_x86; i+=4) { - if(get4(map, (uvlong)i, &((uint32*)&ureg_x86)[i/4]) < 0) - return -1; - } - return 0; -} - -int -x86_getPC(Map* map) -{ - return get4(map, offsetof(struct Ureg_x86, pc), &ureg_x86.pc); -} - -int -x86_getSP(Map* map) -{ - return get4(map, offsetof(struct Ureg_x86, sp), &ureg_x86.sp); -} - -uvlong -x86_uregPC(void) -{ - return (uvlong)ureg_x86.pc; -} - -uvlong -x86_uregSP(void) -{ - return (uvlong)ureg_x86.sp; -} - -void -x86_ppword(uvlong w) -{ - uchar buf[4]; - - buf[0] = w; - buf[1] = w >> 8; - buf[2] = w >> 16; - buf[3] = w >> 24; - Bwrite(pproffd, buf, 4); -} - -Arch archtab[] = { - { - "amd64", - amd64_regprint, - amd64_getregs, - amd64_getPC, - amd64_getSP, - amd64_uregPC, - amd64_uregSP, - amd64_ppword, - }, - { - "386", - x86_regprint, - x86_getregs, - x86_getPC, - x86_getSP, - x86_uregPC, - x86_uregSP, - x86_ppword, - }, - { - nil - } -}; - -Arch *arch; - -int -setarch(void) -{ - int i; - - if(mach != nil) { - for(i = 0; archtab[i].name != nil; i++) { - if (strcmp(mach->name, archtab[i].name) == 0) { - arch = &archtab[i]; - return 0; - } - } - } - return -1; -} - -int -getthreads(void) -{ - int i, j, curn, found; - Map *curmap[nelem(map)]; - int curthread[nelem(map)]; - static int complained = 0; - - curn = procthreadpids(pid, curthread, nelem(curthread)); - if(curn <= 0) - return curn; - - if(curn > nelem(map)) { - if(complained == 0) { - fprint(2, "prof: too many threads; limiting to %d\n", nthread, nelem(map)); - complained = 1; - } - curn = nelem(map); - } - if(curn == nthread && memcmp(thread, curthread, curn*sizeof(*thread)) == 0) - return curn; // no changes - - // Number of threads has changed (might be the init case). - // A bit expensive but rare enough not to bother being clever. - for(i = 0; i < curn; i++) { - found = 0; - for(j = 0; j < nthread; j++) { - if(curthread[i] == thread[j]) { - found = 1; - curmap[i] = map[j]; - map[j] = nil; - break; - } - } - if(found) - continue; - - // map new thread - curmap[i] = attachproc(curthread[i], &fhdr); - if(curmap[i] == nil) { - fprint(2, "prof: can't attach to %d: %r\n", curthread[i]); - return -1; - } - } - - for(j = 0; j < nthread; j++) - if(map[j] != nil) - detachproc(map[j]); - - nthread = curn; - memmove(thread, curthread, nthread*sizeof thread[0]); - memmove(map, curmap, sizeof map); - return nthread; -} - -int -sample(Map *map) -{ - static int n; - - n++; - if(registers) { - if(arch->getregs(map) < 0) - goto bad; - } else { - // we need only two registers - if(arch->getPC(map) < 0) - goto bad; - if(arch->getSP(map) < 0) - goto bad; - } - return 1; -bad: - if(n == 1) - fprint(2, "prof: can't read registers: %r\n"); - return 0; -} - -void -addtohistogram(uvlong pc, uvlong callerpc, uvlong sp) -{ - int h; - PC *x; - - USED(sp); - - h = (pc + callerpc*101) % Ncounters; - for(x = counters[h]; x != NULL; x = x->next) { - if(x->pc == pc && x->callerpc == callerpc) { - x->count++; - return; - } - } - x = malloc(sizeof(PC)); - x->pc = pc; - x->callerpc = callerpc; - x->count = 1; - x->next = counters[h]; - counters[h] = x; -} - -void -addppword(uvlong pc) -{ - if(pc == 0) { - return; - } - if(nppdata == ppalloc) { - ppalloc = (1000+nppdata)*2; - ppdata = realloc(ppdata, ppalloc * sizeof ppdata[0]); - if(ppdata == nil) { - fprint(2, "prof: realloc failed: %r\n"); - exit(2); - } - } - ppdata[nppdata++] = pc; -} - -void -startpptrace() -{ - ppstart = nppdata; - addppword(~0); -} - -void -endpptrace() -{ - ppdata[ppstart] = nppdata-ppstart-1; -} - -uvlong nextpc; - -void -xptrace(Map *map, uvlong pc, uvlong sp, Symbol *sym) -{ - USED(map); - - char buf[1024]; - if(sym == nil){ - fprint(2, "syms\n"); - return; - } - if(histograms) - addtohistogram(nextpc, pc, sp); - if(!histograms || stacks > 1 || pprof) { - if(nextpc == 0) - nextpc = sym->value; - if(stacks){ - fprint(2, "%s(", sym->name); - fprint(2, ")"); - if(nextpc != sym->value) - fprint(2, "+%#llux ", nextpc - sym->value); - if(have_syms && linenums && fileline(buf, sizeof buf, pc)) { - fprint(2, " %s", buf); - } - fprint(2, "\n"); - } - if (pprof) { - addppword(nextpc); - } - } - nextpc = pc; -} - -void -stacktracepcsp(Map *map, uvlong pc, uvlong sp) -{ - nextpc = pc; - if(pprof){ - startpptrace(); - } - if(machdata->ctrace==nil) - fprint(2, "no machdata->ctrace\n"); - else if(machdata->ctrace(map, pc, sp, 0, xptrace) <= 0) - fprint(2, "no stack frame: pc=%#p sp=%#p\n", pc, sp); - else { - addtohistogram(nextpc, 0, sp); - if(stacks) - fprint(2, "\n"); - } - if(pprof){ - endpptrace(); - } -} - -void -printpc(Map *map, uvlong pc, uvlong sp) -{ - char buf[1024]; - if(registers) - arch->regprint(); - if(have_syms > 0 && linenums && fileline(buf, sizeof buf, pc)) - fprint(2, "%s\n", buf); - if(have_syms > 0 && functions) { - symoff(buf, sizeof(buf), pc, CANY); - fprint(2, "%s\n", buf); - } - if(stacks || pprof){ - stacktracepcsp(map, pc, sp); - } - else if(histograms){ - addtohistogram(pc, 0, sp); - } -} - -void -ppmaps(void) -{ - int fd, n; - char tmp[100]; - Seg *seg; - - // If it's Linux, the info is in /proc/$pid/maps - snprint(tmp, sizeof tmp, "/proc/%d/maps", pid); - fd = open(tmp, 0); - if(fd >= 0) { - n = read(fd, ppmapdata, sizeof ppmapdata - 1); - close(fd); - if(n < 0) { - fprint(2, "prof: can't read %s: %r\n", tmp); - exit(2); - } - ppmapdata[n] = 0; - return; - } - - // It's probably a mac. Synthesize an entry for the text file. - // The register segment may come first but it has a zero offset, so grab the first non-zero offset segment. - for(n = 0; n < 3; n++){ - seg = &map[0]->seg[n]; - if(seg->b == 0) { - continue; - } - snprint(ppmapdata, sizeof ppmapdata, - "%.16x-%.16x r-xp %d 00:00 34968549 %s\n", - seg->b, seg->e, seg->f, "/home/r/6.out" - ); - return; - } - fprint(2, "prof: no text segment in maps for %s\n", file); - exit(2); -} - -void -samples(void) -{ - int i, pid, msec; - struct timespec req; - int getmaps; - - req.tv_sec = delta_msec/1000; - req.tv_nsec = 1000000*(delta_msec % 1000); - getmaps = 0; - if(pprof) - getmaps= 1; - for(msec = 0; total_sec <= 0 || msec < 1000*total_sec; msec += delta_msec) { - nsample++; - nsamplethread += nthread; - for(i = 0; i < nthread; i++) { - pid = thread[i]; - if(ctlproc(pid, "stop") < 0) - return; - if(!sample(map[i])) { - ctlproc(pid, "start"); - return; - } - printpc(map[i], arch->uregPC(), arch->uregSP()); - ctlproc(pid, "start"); - } - nanosleep(&req, NULL); - getthreads(); - if(nthread == 0) - break; - if(getmaps) { - getmaps = 0; - ppmaps(); - } - } -} - -typedef struct Func Func; -struct Func -{ - Func *next; - Symbol s; - uint onstack; - uint leaf; -}; - -Func *func[257]; -int nfunc; - -Func* -findfunc(uvlong pc) -{ - Func *f; - uint h; - Symbol s; - - if(pc == 0) - return nil; - - if(!findsym(pc, CTEXT, &s)) - return nil; - - h = s.value % nelem(func); - for(f = func[h]; f != NULL; f = f->next) - if(f->s.value == s.value) - return f; - - f = malloc(sizeof *f); - memset(f, 0, sizeof *f); - f->s = s; - f->next = func[h]; - func[h] = f; - nfunc++; - return f; -} - -int -compareleaf(const void *va, const void *vb) -{ - Func *a, *b; - - a = *(Func**)va; - b = *(Func**)vb; - if(a->leaf != b->leaf) - return b->leaf - a->leaf; - if(a->onstack != b->onstack) - return b->onstack - a->onstack; - return strcmp(a->s.name, b->s.name); -} - -void -dumphistogram() -{ - int i, h, n; - PC *x; - Func *f, **ff; - - if(!histograms) - return; - - // assign counts to functions. - for(h = 0; h < Ncounters; h++) { - for(x = counters[h]; x != NULL; x = x->next) { - f = findfunc(x->pc); - if(f) { - f->onstack += x->count; - f->leaf += x->count; - } - f = findfunc(x->callerpc); - if(f) - f->leaf -= x->count; - } - } - - // build array - ff = malloc(nfunc*sizeof ff[0]); - n = 0; - for(h = 0; h < nelem(func); h++) - for(f = func[h]; f != NULL; f = f->next) - ff[n++] = f; - - // sort by leaf counts - qsort(ff, nfunc, sizeof ff[0], compareleaf); - - // print. - fprint(2, "%d samples (avg %.1g threads)\n", nsample, (double)nsamplethread/nsample); - for(i = 0; i < nfunc; i++) { - f = ff[i]; - fprint(2, "%6.2f%%\t", 100.0*(double)f->leaf/nsample); - if(stacks) - fprint(2, "%6.2f%%\t", 100.0*(double)f->onstack/nsample); - fprint(2, "%s\n", f->s.name); - } -} - -typedef struct Trace Trace; -struct Trace { - int count; - int npc; - uvlong *pc; - Trace *next; -}; - -void -dumppprof() -{ - uvlong i, n, *p, *e; - int ntrace; - Trace *trace, *tp, *up, *prev; - - if(!pprof) - return; - e = ppdata + nppdata; - // Create list of traces. First, count the traces - ntrace = 0; - for(p = ppdata; p < e;) { - n = *p++; - p += n; - if(n == 0) - continue; - ntrace++; - } - if(ntrace <= 0) - return; - // Allocate and link the traces together. - trace = malloc(ntrace * sizeof(Trace)); - tp = trace; - for(p = ppdata; p < e;) { - n = *p++; - if(n == 0) - continue; - tp->count = 1; - tp->npc = n; - tp->pc = p; - tp->next = tp+1; - tp++; - p += n; - } - trace[ntrace-1].next = nil; - // Eliminate duplicates. Lousy algorithm, although not as bad as it looks because - // the list collapses fast. - for(tp = trace; tp != nil; tp = tp->next) { - prev = tp; - for(up = tp->next; up != nil; up = up->next) { - if(up->npc == tp->npc && memcmp(up->pc, tp->pc, up->npc*sizeof up->pc[0]) == 0) { - tp->count++; - prev->next = up->next; - } else { - prev = up; - } - } - } - // Write file. - // See http://code.google.com/p/google-perftools/source/browse/trunk/doc/cpuprofile-fileformat.html - // 1) Header - arch->ppword(0); // must be zero - arch->ppword(3); // 3 words follow in header - arch->ppword(0); // must be zero - arch->ppword(delta_msec * 1000); // sampling period in microseconds - arch->ppword(0); // must be zero (padding) - // 2) One record for each trace. - for(tp = trace; tp != nil; tp = tp->next) { - arch->ppword(tp->count); - arch->ppword(tp->npc); - for(i = 0; i < tp->npc; i++) { - arch->ppword(tp->pc[i]); - } - } - // 3) Binary trailer - arch->ppword(0); // must be zero - arch->ppword(1); // must be one - arch->ppword(0); // must be zero - // 4) Mapped objects. - Bwrite(pproffd, ppmapdata, strlen(ppmapdata)); - // 5) That's it. - Bterm(pproffd); -} - -int -startprocess(char **argv) -{ - int pid; - - if((pid = fork()) == 0) { - pid = getpid(); - if(ctlproc(pid, "hang") < 0){ - fprint(2, "prof: child process could not hang\n"); - exits(0); - } - execv(argv[0], argv); - fprint(2, "prof: could not exec %s: %r\n", argv[0]); - exits(0); - } - - if(pid == -1) { - fprint(2, "prof: could not fork\n"); - exit(1); - } - if(ctlproc(pid, "attached") < 0 || ctlproc(pid, "waitstop") < 0) { - fprint(2, "prof: could not attach to child process: %r\n"); - exit(1); - } - return pid; -} - -void -detach(void) -{ - int i; - - for(i = 0; i < nthread; i++) - detachproc(map[i]); -} - -int -main(int argc, char *argv[]) -{ - int i; - char *ppfile; - - ARGBEGIN{ - case 'P': - pprof =1; - ppfile = EARGF(Usage()); - pproffd = Bopen(ppfile, OWRITE); - if(pproffd == nil) { - fprint(2, "prof: cannot open %s: %r\n", ppfile); - exit(2); - } - break; - case 'd': - delta_msec = atoi(EARGF(Usage())); - break; - case 't': - total_sec = atoi(EARGF(Usage())); - break; - case 'p': - pid = atoi(EARGF(Usage())); - break; - case 'f': - functions = 1; - break; - case 'h': - histograms = 1; - break; - case 'l': - linenums = 1; - break; - case 'r': - registers = 1; - break; - case 's': - stacks++; - break; - default: - Usage(); - }ARGEND - if(pid <= 0 && argc == 0) - Usage(); - if(functions+linenums+registers+stacks+pprof == 0) - histograms = 1; - if(!machbyname("amd64")) { - fprint(2, "prof: no amd64 support\n", pid); - exit(1); - } - if(argc > 0) - file = argv[0]; - else if(pid) { - file = proctextfile(pid); - if (file == NULL) { - fprint(2, "prof: can't find file for pid %d: %r\n", pid); - fprint(2, "prof: on Darwin, need to provide file name explicitly\n"); - exit(1); - } - } - fd = open(file, 0); - if(fd < 0) { - fprint(2, "prof: can't open %s: %r\n", file); - exit(1); - } - if(crackhdr(fd, &fhdr)) { - have_syms = syminit(fd, &fhdr); - if(!have_syms) { - fprint(2, "prof: no symbols for %s: %r\n", file); - } - } else { - fprint(2, "prof: crack header for %s: %r\n", file); - exit(1); - } - if(pid <= 0) - pid = startprocess(argv); - attachproc(pid, &fhdr); // initializes thread list - if(setarch() < 0) { - detach(); - fprint(2, "prof: can't identify binary architecture for pid %d\n", pid); - exit(1); - } - if(getthreads() <= 0) { - detach(); - fprint(2, "prof: can't find threads for pid %d\n", pid); - exit(1); - } - for(i = 0; i < nthread; i++) - ctlproc(thread[i], "start"); - samples(); - detach(); - dumphistogram(); - dumppprof(); - exit(0); -} diff --git a/src/pkg/exp/README b/src/pkg/exp/README deleted file mode 100644 index e602e3ac9f..0000000000 --- a/src/pkg/exp/README +++ /dev/null @@ -1,3 +0,0 @@ -This directory tree contains experimental packages and -unfinished code that is subject to even more change than the -rest of the Go tree. diff --git a/src/pkg/exp/ebnf/ebnf.go b/src/pkg/exp/ebnf/ebnf.go deleted file mode 100644 index cd8c83c921..0000000000 --- a/src/pkg/exp/ebnf/ebnf.go +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ebnf is a library for EBNF grammars. The input is text ([]byte) -// satisfying the following grammar (represented itself in EBNF): -// -// Production = name "=" [ Expression ] "." . -// Expression = Alternative { "|" Alternative } . -// Alternative = Term { Term } . -// Term = name | token [ "…" token ] | Group | Option | Repetition . -// Group = "(" Expression ")" . -// Option = "[" Expression "]" . -// Repetition = "{" Expression "}" . -// -// A name is a Go identifier, a token is a Go string, and comments -// and white space follow the same rules as for the Go language. -// Production names starting with an uppercase Unicode letter denote -// non-terminal productions (i.e., productions which allow white-space -// and comments between tokens); all other production names denote -// lexical productions. -// -package ebnf - -import ( - "errors" - "fmt" - "text/scanner" - "unicode" - "unicode/utf8" -) - -// ---------------------------------------------------------------------------- -// Error handling - -type errorList []error - -func (list errorList) Err() error { - if len(list) == 0 { - return nil - } - return list -} - -func (list errorList) Error() string { - switch len(list) { - case 0: - return "no errors" - case 1: - return list[0].Error() - } - return fmt.Sprintf("%s (and %d more errors)", list[0], len(list)-1) -} - -func newError(pos scanner.Position, msg string) error { - return errors.New(fmt.Sprintf("%s: %s", pos, msg)) -} - -// ---------------------------------------------------------------------------- -// Internal representation - -type ( - // An Expression node represents a production expression. - Expression interface { - // Pos is the position of the first character of the syntactic construct - Pos() scanner.Position - } - - // An Alternative node represents a non-empty list of alternative expressions. - Alternative []Expression // x | y | z - - // A Sequence node represents a non-empty list of sequential expressions. - Sequence []Expression // x y z - - // A Name node represents a production name. - Name struct { - StringPos scanner.Position - String string - } - - // A Token node represents a literal. - Token struct { - StringPos scanner.Position - String string - } - - // A List node represents a range of characters. - Range struct { - Begin, End *Token // begin ... end - } - - // A Group node represents a grouped expression. - Group struct { - Lparen scanner.Position - Body Expression // (body) - } - - // An Option node represents an optional expression. - Option struct { - Lbrack scanner.Position - Body Expression // [body] - } - - // A Repetition node represents a repeated expression. - Repetition struct { - Lbrace scanner.Position - Body Expression // {body} - } - - // A Production node represents an EBNF production. - Production struct { - Name *Name - Expr Expression - } - - // A Bad node stands for pieces of source code that lead to a parse error. - Bad struct { - TokPos scanner.Position - Error string // parser error message - } - - // A Grammar is a set of EBNF productions. The map - // is indexed by production name. - // - Grammar map[string]*Production -) - -func (x Alternative) Pos() scanner.Position { return x[0].Pos() } // the parser always generates non-empty Alternative -func (x Sequence) Pos() scanner.Position { return x[0].Pos() } // the parser always generates non-empty Sequences -func (x *Name) Pos() scanner.Position { return x.StringPos } -func (x *Token) Pos() scanner.Position { return x.StringPos } -func (x *Range) Pos() scanner.Position { return x.Begin.Pos() } -func (x *Group) Pos() scanner.Position { return x.Lparen } -func (x *Option) Pos() scanner.Position { return x.Lbrack } -func (x *Repetition) Pos() scanner.Position { return x.Lbrace } -func (x *Production) Pos() scanner.Position { return x.Name.Pos() } -func (x *Bad) Pos() scanner.Position { return x.TokPos } - -// ---------------------------------------------------------------------------- -// Grammar verification - -func isLexical(name string) bool { - ch, _ := utf8.DecodeRuneInString(name) - return !unicode.IsUpper(ch) -} - -type verifier struct { - errors errorList - worklist []*Production - reached Grammar // set of productions reached from (and including) the root production - grammar Grammar -} - -func (v *verifier) error(pos scanner.Position, msg string) { - v.errors = append(v.errors, newError(pos, msg)) -} - -func (v *verifier) push(prod *Production) { - name := prod.Name.String - if _, found := v.reached[name]; !found { - v.worklist = append(v.worklist, prod) - v.reached[name] = prod - } -} - -func (v *verifier) verifyChar(x *Token) rune { - s := x.String - if utf8.RuneCountInString(s) != 1 { - v.error(x.Pos(), "single char expected, found "+s) - return 0 - } - ch, _ := utf8.DecodeRuneInString(s) - return ch -} - -func (v *verifier) verifyExpr(expr Expression, lexical bool) { - switch x := expr.(type) { - case nil: - // empty expression - case Alternative: - for _, e := range x { - v.verifyExpr(e, lexical) - } - case Sequence: - for _, e := range x { - v.verifyExpr(e, lexical) - } - case *Name: - // a production with this name must exist; - // add it to the worklist if not yet processed - if prod, found := v.grammar[x.String]; found { - v.push(prod) - } else { - v.error(x.Pos(), "missing production "+x.String) - } - // within a lexical production references - // to non-lexical productions are invalid - if lexical && !isLexical(x.String) { - v.error(x.Pos(), "reference to non-lexical production "+x.String) - } - case *Token: - // nothing to do for now - case *Range: - i := v.verifyChar(x.Begin) - j := v.verifyChar(x.End) - if i >= j { - v.error(x.Pos(), "decreasing character range") - } - case *Group: - v.verifyExpr(x.Body, lexical) - case *Option: - v.verifyExpr(x.Body, lexical) - case *Repetition: - v.verifyExpr(x.Body, lexical) - case *Bad: - v.error(x.Pos(), x.Error) - default: - panic(fmt.Sprintf("internal error: unexpected type %T", expr)) - } -} - -func (v *verifier) verify(grammar Grammar, start string) { - // find root production - root, found := grammar[start] - if !found { - var noPos scanner.Position - v.error(noPos, "no start production "+start) - return - } - - // initialize verifier - v.worklist = v.worklist[0:0] - v.reached = make(Grammar) - v.grammar = grammar - - // work through the worklist - v.push(root) - for { - n := len(v.worklist) - 1 - if n < 0 { - break - } - prod := v.worklist[n] - v.worklist = v.worklist[0:n] - v.verifyExpr(prod.Expr, isLexical(prod.Name.String)) - } - - // check if all productions were reached - if len(v.reached) < len(v.grammar) { - for name, prod := range v.grammar { - if _, found := v.reached[name]; !found { - v.error(prod.Pos(), name+" is unreachable") - } - } - } -} - -// Verify checks that: -// - all productions used are defined -// - all productions defined are used when beginning at start -// - lexical productions refer only to other lexical productions -// -// Position information is interpreted relative to the file set fset. -// -func Verify(grammar Grammar, start string) error { - var v verifier - v.verify(grammar, start) - return v.errors.Err() -} diff --git a/src/pkg/exp/ebnf/ebnf_test.go b/src/pkg/exp/ebnf/ebnf_test.go deleted file mode 100644 index 8cfd6b9c37..0000000000 --- a/src/pkg/exp/ebnf/ebnf_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ebnf - -import ( - "bytes" - "testing" -) - -var goodGrammars = []string{ - `Program = .`, - - `Program = foo . - foo = "foo" .`, - - `Program = "a" | "b" "c" .`, - - `Program = "a" … "z" .`, - - `Program = Song . - Song = { Note } . - Note = Do | (Re | Mi | Fa | So | La) | Ti . - Do = "c" . - Re = "d" . - Mi = "e" . - Fa = "f" . - So = "g" . - La = "a" . - Ti = ti . - ti = "b" .`, -} - -var badGrammars = []string{ - `Program = | .`, - `Program = | b .`, - `Program = a … b .`, - `Program = "a" … .`, - `Program = … "b" .`, - `Program = () .`, - `Program = [] .`, - `Program = {} .`, -} - -func checkGood(t *testing.T, src string) { - grammar, err := Parse("", bytes.NewBuffer([]byte(src))) - if err != nil { - t.Errorf("Parse(%s) failed: %v", src, err) - return - } - if err = Verify(grammar, "Program"); err != nil { - t.Errorf("Verify(%s) failed: %v", src, err) - } -} - -func checkBad(t *testing.T, src string) { - _, err := Parse("", bytes.NewBuffer([]byte(src))) - if err == nil { - t.Errorf("Parse(%s) should have failed", src) - } -} - -func TestGrammars(t *testing.T) { - for _, src := range goodGrammars { - checkGood(t, src) - } - for _, src := range badGrammars { - checkBad(t, src) - } -} diff --git a/src/pkg/exp/ebnf/parser.go b/src/pkg/exp/ebnf/parser.go deleted file mode 100644 index 7a7e3cc16e..0000000000 --- a/src/pkg/exp/ebnf/parser.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ebnf - -import ( - "io" - "strconv" - "text/scanner" -) - -type parser struct { - errors errorList - scanner scanner.Scanner - pos scanner.Position // token position - tok rune // one token look-ahead - lit string // token literal -} - -func (p *parser) next() { - p.tok = p.scanner.Scan() - p.pos = p.scanner.Position - p.lit = p.scanner.TokenText() -} - -func (p *parser) error(pos scanner.Position, msg string) { - p.errors = append(p.errors, newError(pos, msg)) -} - -func (p *parser) errorExpected(pos scanner.Position, msg string) { - msg = `expected "` + msg + `"` - if pos.Offset == p.pos.Offset { - // the error happened at the current position; - // make the error message more specific - msg += ", found " + scanner.TokenString(p.tok) - if p.tok < 0 { - msg += " " + p.lit - } - } - p.error(pos, msg) -} - -func (p *parser) expect(tok rune) scanner.Position { - pos := p.pos - if p.tok != tok { - p.errorExpected(pos, scanner.TokenString(tok)) - } - p.next() // make progress in any case - return pos -} - -func (p *parser) parseIdentifier() *Name { - pos := p.pos - name := p.lit - p.expect(scanner.Ident) - return &Name{pos, name} -} - -func (p *parser) parseToken() *Token { - pos := p.pos - value := "" - if p.tok == scanner.String { - value, _ = strconv.Unquote(p.lit) - // Unquote may fail with an error, but only if the scanner found - // an illegal string in the first place. In this case the error - // has already been reported. - p.next() - } else { - p.expect(scanner.String) - } - return &Token{pos, value} -} - -// ParseTerm returns nil if no term was found. -func (p *parser) parseTerm() (x Expression) { - pos := p.pos - - switch p.tok { - case scanner.Ident: - x = p.parseIdentifier() - - case scanner.String: - tok := p.parseToken() - x = tok - const ellipsis = '…' // U+2026, the horizontal ellipsis character - if p.tok == ellipsis { - p.next() - x = &Range{tok, p.parseToken()} - } - - case '(': - p.next() - x = &Group{pos, p.parseExpression()} - p.expect(')') - - case '[': - p.next() - x = &Option{pos, p.parseExpression()} - p.expect(']') - - case '{': - p.next() - x = &Repetition{pos, p.parseExpression()} - p.expect('}') - } - - return x -} - -func (p *parser) parseSequence() Expression { - var list Sequence - - for x := p.parseTerm(); x != nil; x = p.parseTerm() { - list = append(list, x) - } - - // no need for a sequence if list.Len() < 2 - switch len(list) { - case 0: - p.errorExpected(p.pos, "term") - return &Bad{p.pos, "term expected"} - case 1: - return list[0] - } - - return list -} - -func (p *parser) parseExpression() Expression { - var list Alternative - - for { - list = append(list, p.parseSequence()) - if p.tok != '|' { - break - } - p.next() - } - // len(list) > 0 - - // no need for an Alternative node if list.Len() < 2 - if len(list) == 1 { - return list[0] - } - - return list -} - -func (p *parser) parseProduction() *Production { - name := p.parseIdentifier() - p.expect('=') - var expr Expression - if p.tok != '.' { - expr = p.parseExpression() - } - p.expect('.') - return &Production{name, expr} -} - -func (p *parser) parse(filename string, src io.Reader) Grammar { - p.scanner.Init(src) - p.scanner.Filename = filename - p.next() // initializes pos, tok, lit - - grammar := make(Grammar) - for p.tok != scanner.EOF { - prod := p.parseProduction() - name := prod.Name.String - if _, found := grammar[name]; !found { - grammar[name] = prod - } else { - p.error(prod.Pos(), name+" declared already") - } - } - - return grammar -} - -// Parse parses a set of EBNF productions from source src. -// It returns a set of productions. Errors are reported -// for incorrect syntax and if a production is declared -// more than once; the filename is used only for error -// positions. -// -func Parse(filename string, src io.Reader) (Grammar, error) { - var p parser - grammar := p.parse(filename, src) - return grammar, p.errors.Err() -} diff --git a/src/pkg/exp/ebnflint/doc.go b/src/pkg/exp/ebnflint/doc.go deleted file mode 100644 index 4bb22a4cb8..0000000000 --- a/src/pkg/exp/ebnflint/doc.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* - -Ebnflint verifies that EBNF productions are consistent and grammatically correct. -It reads them from an HTML document such as the Go specification. - -Grammar productions are grouped in boxes demarcated by the HTML elements - <pre class="ebnf"> - </pre> - - -Usage: - go tool ebnflint [--start production] [file] - -The --start flag specifies the name of the start production for -the grammar; it defaults to "Start". - -*/ -package documentation diff --git a/src/pkg/exp/ebnflint/ebnflint.go b/src/pkg/exp/ebnflint/ebnflint.go deleted file mode 100644 index d54fb229d0..0000000000 --- a/src/pkg/exp/ebnflint/ebnflint.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "bytes" - "exp/ebnf" - "flag" - "fmt" - "go/scanner" - "go/token" - "io" - "io/ioutil" - "os" - "path/filepath" -) - -var fset = token.NewFileSet() -var start = flag.String("start", "Start", "name of start production") - -func usage() { - fmt.Fprintf(os.Stderr, "usage: go tool ebnflint [flags] [filename]\n") - flag.PrintDefaults() - os.Exit(1) -} - -// Markers around EBNF sections in .html files -var ( - open = []byte(`<pre class="ebnf">`) - close = []byte(`</pre>`) -) - -func report(err error) { - scanner.PrintError(os.Stderr, err) - os.Exit(1) -} - -func extractEBNF(src []byte) []byte { - var buf bytes.Buffer - - for { - // i = beginning of EBNF text - i := bytes.Index(src, open) - if i < 0 { - break // no EBNF found - we are done - } - i += len(open) - - // write as many newlines as found in the excluded text - // to maintain correct line numbers in error messages - for _, ch := range src[0:i] { - if ch == '\n' { - buf.WriteByte('\n') - } - } - - // j = end of EBNF text (or end of source) - j := bytes.Index(src[i:], close) // close marker - if j < 0 { - j = len(src) - i - } - j += i - - // copy EBNF text - buf.Write(src[i:j]) - - // advance - src = src[j:] - } - - return buf.Bytes() -} - -func main() { - flag.Parse() - - var ( - name string - r io.Reader - ) - switch flag.NArg() { - case 0: - name, r = "<stdin>", os.Stdin - case 1: - name = flag.Arg(0) - default: - usage() - } - - if err := verify(name, *start, r); err != nil { - report(err) - } -} - -func verify(name, start string, r io.Reader) error { - if r == nil { - f, err := os.Open(name) - if err != nil { - return err - } - defer f.Close() - r = f - } - - src, err := ioutil.ReadAll(r) - if err != nil { - return err - } - - if filepath.Ext(name) == ".html" || bytes.Index(src, open) >= 0 { - src = extractEBNF(src) - } - - grammar, err := ebnf.Parse(name, bytes.NewBuffer(src)) - if err != nil { - return err - } - - return ebnf.Verify(grammar, start) -} diff --git a/src/pkg/exp/ebnflint/ebnflint_test.go b/src/pkg/exp/ebnflint/ebnflint_test.go deleted file mode 100644 index 875dbc19ac..0000000000 --- a/src/pkg/exp/ebnflint/ebnflint_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "runtime" - "testing" -) - -func TestSpec(t *testing.T) { - if err := verify(runtime.GOROOT()+"/doc/go_spec.html", "SourceFile", nil); err != nil { - t.Fatal(err) - } -} diff --git a/src/pkg/exp/gotype/doc.go b/src/pkg/exp/gotype/doc.go deleted file mode 100644 index 1168086771..0000000000 --- a/src/pkg/exp/gotype/doc.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -The gotype command does syntactic and semantic analysis of Go files -and packages similar to the analysis performed by the front-end of -a Go compiler. Errors are reported if the analysis fails; otherwise -gotype is quiet (unless -v is set). - -Without a list of paths, gotype processes the standard input, which must -be the source of a single package file. - -Given a list of file names, each file must be a source file belonging to -the same package unless the package name is explicitly specified with the --p flag. - -Given a directory name, gotype collects all .go files in the directory -and processes them as if they were provided as an explicit list of file -names. Each directory is processed independently. Files starting with . -or not ending in .go are ignored. - -Usage: - gotype [flags] [path ...] - -The flags are: - -e - Print all (including spurious) errors. - -p pkgName - Process only those files in package pkgName. - -r - Recursively process subdirectories. - -v - Verbose mode. - -Debugging flags: - -comments - Parse comments (ignored if -ast not set). - -ast - Print AST (disables concurrent parsing). - -trace - Print parse trace (disables concurrent parsing). - - -Examples - -To check the files file.go, old.saved, and .ignored: - - gotype file.go old.saved .ignored - -To check all .go files belonging to package main in the current directory -and recursively in all subdirectories: - - gotype -p main -r . - -To verify the output of a pipe: - - echo "package foo" | gotype - -*/ -package documentation - -// BUG(gri): At the moment, only single-file scope analysis is performed. diff --git a/src/pkg/exp/gotype/gotype.go b/src/pkg/exp/gotype/gotype.go deleted file mode 100644 index 3aca40e8e7..0000000000 --- a/src/pkg/exp/gotype/gotype.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "errors" - "exp/types" - "flag" - "fmt" - "go/ast" - "go/parser" - "go/scanner" - "go/token" - "io/ioutil" - "os" - "path/filepath" - "strings" -) - -var ( - // main operation modes - pkgName = flag.String("p", "", "process only those files in package pkgName") - recursive = flag.Bool("r", false, "recursively process subdirectories") - verbose = flag.Bool("v", false, "verbose mode") - allErrors = flag.Bool("e", false, "print all (including spurious) errors") - - // debugging support - parseComments = flag.Bool("comments", false, "parse comments (ignored if -ast not set)") - printTrace = flag.Bool("trace", false, "print parse trace") - printAST = flag.Bool("ast", false, "print AST") -) - -var exitCode = 0 - -func usage() { - fmt.Fprintf(os.Stderr, "usage: gotype [flags] [path ...]\n") - flag.PrintDefaults() - os.Exit(2) -} - -func report(err error) { - scanner.PrintError(os.Stderr, err) - exitCode = 2 -} - -// parse returns the AST for the Go source src. -// The filename is for error reporting only. -// The result is nil if there were errors or if -// the file does not belong to the -p package. -func parse(fset *token.FileSet, filename string, src []byte) *ast.File { - if *verbose { - fmt.Println(filename) - } - - // ignore files with different package name - if *pkgName != "" { - file, err := parser.ParseFile(fset, filename, src, parser.PackageClauseOnly) - if err != nil { - report(err) - return nil - } - if file.Name.Name != *pkgName { - if *verbose { - fmt.Printf("\tignored (package %s)\n", file.Name.Name) - } - return nil - } - } - - // parse entire file - mode := parser.DeclarationErrors - if *allErrors { - mode |= parser.SpuriousErrors - } - if *parseComments && *printAST { - mode |= parser.ParseComments - } - if *printTrace { - mode |= parser.Trace - } - file, err := parser.ParseFile(fset, filename, src, mode) - if err != nil { - report(err) - return nil - } - if *printAST { - ast.Print(fset, file) - } - - return file -} - -func parseStdin(fset *token.FileSet) (files map[string]*ast.File) { - files = make(map[string]*ast.File) - src, err := ioutil.ReadAll(os.Stdin) - if err != nil { - report(err) - return - } - const filename = "<standard input>" - if file := parse(fset, filename, src); file != nil { - files[filename] = file - } - return -} - -func parseFiles(fset *token.FileSet, filenames []string) (files map[string]*ast.File) { - files = make(map[string]*ast.File) - for _, filename := range filenames { - src, err := ioutil.ReadFile(filename) - if err != nil { - report(err) - continue - } - if file := parse(fset, filename, src); file != nil { - if files[filename] != nil { - report(errors.New(fmt.Sprintf("%q: duplicate file", filename))) - continue - } - files[filename] = file - } - } - return -} - -func isGoFilename(filename string) bool { - // ignore non-Go files - return !strings.HasPrefix(filename, ".") && strings.HasSuffix(filename, ".go") -} - -func processDirectory(dirname string) { - f, err := os.Open(dirname) - if err != nil { - report(err) - return - } - filenames, err := f.Readdirnames(-1) - f.Close() - if err != nil { - report(err) - // continue since filenames may not be empty - } - for i, filename := range filenames { - filenames[i] = filepath.Join(dirname, filename) - } - processFiles(filenames, false) -} - -func processFiles(filenames []string, allFiles bool) { - i := 0 - for _, filename := range filenames { - switch info, err := os.Stat(filename); { - case err != nil: - report(err) - case info.IsDir(): - if allFiles || *recursive { - processDirectory(filename) - } - default: - if allFiles || isGoFilename(info.Name()) { - filenames[i] = filename - i++ - } - } - } - fset := token.NewFileSet() - processPackage(fset, parseFiles(fset, filenames[0:i])) -} - -func processPackage(fset *token.FileSet, files map[string]*ast.File) { - // make a package (resolve all identifiers) - pkg, err := ast.NewPackage(fset, files, types.GcImport, types.Universe) - if err != nil { - report(err) - return - } - _, err = types.Check(fset, pkg) - if err != nil { - report(err) - } -} - -func main() { - flag.Usage = usage - flag.Parse() - - if flag.NArg() == 0 { - fset := token.NewFileSet() - processPackage(fset, parseStdin(fset)) - } else { - processFiles(flag.Args(), true) - } - - os.Exit(exitCode) -} diff --git a/src/pkg/exp/gotype/gotype_test.go b/src/pkg/exp/gotype/gotype_test.go deleted file mode 100644 index 8732d4c5aa..0000000000 --- a/src/pkg/exp/gotype/gotype_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "path/filepath" - "runtime" - "testing" -) - -func runTest(t *testing.T, path, pkg string) { - exitCode = 0 - *pkgName = pkg - *recursive = false - - if pkg == "" { - processFiles([]string{path}, true) - } else { - processDirectory(path) - } - - if exitCode != 0 { - t.Errorf("processing %s failed: exitCode = %d", path, exitCode) - } -} - -var tests = []struct { - path string - pkg string -}{ - // individual files - {"testdata/test1.go", ""}, - - // directories - {filepath.Join(runtime.GOROOT(), "src/pkg/go/ast"), "ast"}, - {filepath.Join(runtime.GOROOT(), "src/pkg/go/doc"), "doc"}, - {filepath.Join(runtime.GOROOT(), "src/pkg/go/token"), "scanner"}, - {filepath.Join(runtime.GOROOT(), "src/pkg/go/scanner"), "scanner"}, - {filepath.Join(runtime.GOROOT(), "src/pkg/go/parser"), "parser"}, - {filepath.Join(runtime.GOROOT(), "src/pkg/exp/types"), "types"}, -} - -func Test(t *testing.T) { - for _, test := range tests { - runTest(t, test.path, test.pkg) - } -} diff --git a/src/pkg/exp/gotype/testdata/test1.go b/src/pkg/exp/gotype/testdata/test1.go deleted file mode 100644 index ba8a51f135..0000000000 --- a/src/pkg/exp/gotype/testdata/test1.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package p - -func _() { - // the scope of a local type declaration starts immediately after the type name - type T struct{ _ *T } -} - -func _(x interface{}) { - // the variable defined by a TypeSwitchGuard is declared in each TypeCaseClause - switch t := x.(type) { - case int: - _ = t - case float32: - _ = t - default: - _ = t - } - - // the variable defined by a TypeSwitchGuard must not conflict with other - // variables declared in the initial simple statement - switch t := 0; t := x.(type) { - } -} diff --git a/src/pkg/exp/html/const.go b/src/pkg/exp/html/const.go deleted file mode 100644 index d7cc8bb9a9..0000000000 --- a/src/pkg/exp/html/const.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -// Section 12.2.3.2 of the HTML5 specification says "The following elements -// have varying levels of special parsing rules". -// http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#the-stack-of-open-elements -var isSpecialElementMap = map[string]bool{ - "address": true, - "applet": true, - "area": true, - "article": true, - "aside": true, - "base": true, - "basefont": true, - "bgsound": true, - "blockquote": true, - "body": true, - "br": true, - "button": true, - "caption": true, - "center": true, - "col": true, - "colgroup": true, - "command": true, - "dd": true, - "details": true, - "dir": true, - "div": true, - "dl": true, - "dt": true, - "embed": true, - "fieldset": true, - "figcaption": true, - "figure": true, - "footer": true, - "form": true, - "frame": true, - "frameset": true, - "h1": true, - "h2": true, - "h3": true, - "h4": true, - "h5": true, - "h6": true, - "head": true, - "header": true, - "hgroup": true, - "hr": true, - "html": true, - "iframe": true, - "img": true, - "input": true, - "isindex": true, - "li": true, - "link": true, - "listing": true, - "marquee": true, - "menu": true, - "meta": true, - "nav": true, - "noembed": true, - "noframes": true, - "noscript": true, - "object": true, - "ol": true, - "p": true, - "param": true, - "plaintext": true, - "pre": true, - "script": true, - "section": true, - "select": true, - "style": true, - "summary": true, - "table": true, - "tbody": true, - "td": true, - "textarea": true, - "tfoot": true, - "th": true, - "thead": true, - "title": true, - "tr": true, - "ul": true, - "wbr": true, - "xmp": true, -} - -func isSpecialElement(element *Node) bool { - switch element.Namespace { - case "", "html": - return isSpecialElementMap[element.Data] - case "svg": - return element.Data == "foreignObject" - } - return false -} diff --git a/src/pkg/exp/html/doc.go b/src/pkg/exp/html/doc.go deleted file mode 100644 index 56b194ffb9..0000000000 --- a/src/pkg/exp/html/doc.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package html implements an HTML5-compliant tokenizer and parser. -INCOMPLETE. - -Tokenization is done by creating a Tokenizer for an io.Reader r. It is the -caller's responsibility to ensure that r provides UTF-8 encoded HTML. - - z := html.NewTokenizer(r) - -Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), -which parses the next token and returns its type, or an error: - - for { - tt := z.Next() - if tt == html.ErrorToken { - // ... - return ... - } - // Process the current token. - } - -There are two APIs for retrieving the current token. The high-level API is to -call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs -allow optionally calling Raw after Next but before Token, Text, TagName, or -TagAttr. In EBNF notation, the valid call sequence per token is: - - Next {Raw} [ Token | Text | TagName {TagAttr} ] - -Token returns an independent data structure that completely describes a token. -Entities (such as "<") are unescaped, tag names and attribute keys are -lower-cased, and attributes are collected into a []Attribute. For example: - - for { - if z.Next() == html.ErrorToken { - // Returning io.EOF indicates success. - return z.Err() - } - emitToken(z.Token()) - } - -The low-level API performs fewer allocations and copies, but the contents of -the []byte values returned by Text, TagName and TagAttr may change on the next -call to Next. For example, to extract an HTML page's anchor text: - - depth := 0 - for { - tt := z.Next() - switch tt { - case ErrorToken: - return z.Err() - case TextToken: - if depth > 0 { - // emitBytes should copy the []byte it receives, - // if it doesn't process it immediately. - emitBytes(z.Text()) - } - case StartTagToken, EndTagToken: - tn, _ := z.TagName() - if len(tn) == 1 && tn[0] == 'a' { - if tt == StartTagToken { - depth++ - } else { - depth-- - } - } - } - } - -Parsing is done by calling Parse with an io.Reader, which returns the root of -the parse tree (the document element) as a *Node. It is the caller's -responsibility to ensure that the Reader provides UTF-8 encoded HTML. For -example, to process each anchor node in depth-first order: - - doc, err := html.Parse(r) - if err != nil { - // ... - } - var f func(*html.Node) - f = func(n *html.Node) { - if n.Type == html.ElementNode && n.Data == "a" { - // Do something with n... - } - for _, c := range n.Child { - f(c) - } - } - f(doc) - -The relevant specifications include: -http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html and -http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html -*/ -package html - -// The tokenization algorithm implemented by this package is not a line-by-line -// transliteration of the relatively verbose state-machine in the WHATWG -// specification. A more direct approach is used instead, where the program -// counter implies the state, such as whether it is tokenizing a tag or a text -// node. Specification compliance is verified by checking expected and actual -// outputs over a test suite rather than aiming for algorithmic fidelity. - -// TODO(nigeltao): Does a DOM API belong in this package or a separate one? -// TODO(nigeltao): How does parsing interact with a JavaScript engine? diff --git a/src/pkg/exp/html/doctype.go b/src/pkg/exp/html/doctype.go deleted file mode 100644 index f692061a55..0000000000 --- a/src/pkg/exp/html/doctype.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "strings" -) - -// parseDoctype parses the data from a DoctypeToken into a name, -// public identifier, and system identifier. It returns a Node whose Type -// is DoctypeNode, whose Data is the name, and which has attributes -// named "system" and "public" for the two identifiers if they were present. -// quirks is whether the document should be parsed in "quirks mode". -func parseDoctype(s string) (n *Node, quirks bool) { - n = &Node{Type: DoctypeNode} - - // Find the name. - space := strings.IndexAny(s, whitespace) - if space == -1 { - space = len(s) - } - n.Data = s[:space] - // The comparison to "html" is case-sensitive. - if n.Data != "html" { - quirks = true - } - n.Data = strings.ToLower(n.Data) - s = strings.TrimLeft(s[space:], whitespace) - - if len(s) < 6 { - // It can't start with "PUBLIC" or "SYSTEM". - // Ignore the rest of the string. - return n, quirks || s != "" - } - - key := strings.ToLower(s[:6]) - s = s[6:] - for key == "public" || key == "system" { - s = strings.TrimLeft(s, whitespace) - if s == "" { - break - } - quote := s[0] - if quote != '"' && quote != '\'' { - break - } - s = s[1:] - q := strings.IndexRune(s, rune(quote)) - var id string - if q == -1 { - id = s - s = "" - } else { - id = s[:q] - s = s[q+1:] - } - n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) - if key == "public" { - key = "system" - } else { - key = "" - } - } - - if key != "" || s != "" { - quirks = true - } else if len(n.Attr) > 0 { - if n.Attr[0].Key == "public" { - public := strings.ToLower(n.Attr[0].Val) - switch public { - case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": - quirks = true - default: - for _, q := range quirkyIDs { - if strings.HasPrefix(public, q) { - quirks = true - break - } - } - } - // The following two public IDs only cause quirks mode if there is no system ID. - if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || - strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { - quirks = true - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && - strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { - quirks = true - } - } - - return n, quirks -} - -// quirkyIDs is a list of public doctype identifiers that cause a document -// to be interpreted in quirks mode. The identifiers should be in lower case. -var quirkyIDs = []string{ - "+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//", -} diff --git a/src/pkg/exp/html/entity.go b/src/pkg/exp/html/entity.go deleted file mode 100644 index bd83075235..0000000000 --- a/src/pkg/exp/html/entity.go +++ /dev/null @@ -1,2253 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -// All entities that do not end with ';' are 6 or fewer bytes long. -const longestEntityWithoutSemicolon = 6 - -// entity is a map from HTML entity names to their values. The semicolon matters: -// http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html -// lists both "amp" and "amp;" as two separate entries. -// -// Note that the HTML5 list is larger than the HTML4 list at -// http://www.w3.org/TR/html4/sgml/entities.html -var entity = map[string]rune{ - "AElig;": '\U000000C6', - "AMP;": '\U00000026', - "Aacute;": '\U000000C1', - "Abreve;": '\U00000102', - "Acirc;": '\U000000C2', - "Acy;": '\U00000410', - "Afr;": '\U0001D504', - "Agrave;": '\U000000C0', - "Alpha;": '\U00000391', - "Amacr;": '\U00000100', - "And;": '\U00002A53', - "Aogon;": '\U00000104', - "Aopf;": '\U0001D538', - "ApplyFunction;": '\U00002061', - "Aring;": '\U000000C5', - "Ascr;": '\U0001D49C', - "Assign;": '\U00002254', - "Atilde;": '\U000000C3', - "Auml;": '\U000000C4', - "Backslash;": '\U00002216', - "Barv;": '\U00002AE7', - "Barwed;": '\U00002306', - "Bcy;": '\U00000411', - "Because;": '\U00002235', - "Bernoullis;": '\U0000212C', - "Beta;": '\U00000392', - "Bfr;": '\U0001D505', - "Bopf;": '\U0001D539', - "Breve;": '\U000002D8', - "Bscr;": '\U0000212C', - "Bumpeq;": '\U0000224E', - "CHcy;": '\U00000427', - "COPY;": '\U000000A9', - "Cacute;": '\U00000106', - "Cap;": '\U000022D2', - "CapitalDifferentialD;": '\U00002145', - "Cayleys;": '\U0000212D', - "Ccaron;": '\U0000010C', - "Ccedil;": '\U000000C7', - "Ccirc;": '\U00000108', - "Cconint;": '\U00002230', - "Cdot;": '\U0000010A', - "Cedilla;": '\U000000B8', - "CenterDot;": '\U000000B7', - "Cfr;": '\U0000212D', - "Chi;": '\U000003A7', - "CircleDot;": '\U00002299', - "CircleMinus;": '\U00002296', - "CirclePlus;": '\U00002295', - "CircleTimes;": '\U00002297', - "ClockwiseContourIntegral;": '\U00002232', - "CloseCurlyDoubleQuote;": '\U0000201D', - "CloseCurlyQuote;": '\U00002019', - "Colon;": '\U00002237', - "Colone;": '\U00002A74', - "Congruent;": '\U00002261', - "Conint;": '\U0000222F', - "ContourIntegral;": '\U0000222E', - "Copf;": '\U00002102', - "Coproduct;": '\U00002210', - "CounterClockwiseContourIntegral;": '\U00002233', - "Cross;": '\U00002A2F', - "Cscr;": '\U0001D49E', - "Cup;": '\U000022D3', - "CupCap;": '\U0000224D', - "DD;": '\U00002145', - "DDotrahd;": '\U00002911', - "DJcy;": '\U00000402', - "DScy;": '\U00000405', - "DZcy;": '\U0000040F', - "Dagger;": '\U00002021', - "Darr;": '\U000021A1', - "Dashv;": '\U00002AE4', - "Dcaron;": '\U0000010E', - "Dcy;": '\U00000414', - "Del;": '\U00002207', - "Delta;": '\U00000394', - "Dfr;": '\U0001D507', - "DiacriticalAcute;": '\U000000B4', - "DiacriticalDot;": '\U000002D9', - "DiacriticalDoubleAcute;": '\U000002DD', - "DiacriticalGrave;": '\U00000060', - "DiacriticalTilde;": '\U000002DC', - "Diamond;": '\U000022C4', - "DifferentialD;": '\U00002146', - "Dopf;": '\U0001D53B', - "Dot;": '\U000000A8', - "DotDot;": '\U000020DC', - "DotEqual;": '\U00002250', - "DoubleContourIntegral;": '\U0000222F', - "DoubleDot;": '\U000000A8', - "DoubleDownArrow;": '\U000021D3', - "DoubleLeftArrow;": '\U000021D0', - "DoubleLeftRightArrow;": '\U000021D4', - "DoubleLeftTee;": '\U00002AE4', - "DoubleLongLeftArrow;": '\U000027F8', - "DoubleLongLeftRightArrow;": '\U000027FA', - "DoubleLongRightArrow;": '\U000027F9', - "DoubleRightArrow;": '\U000021D2', - "DoubleRightTee;": '\U000022A8', - "DoubleUpArrow;": '\U000021D1', - "DoubleUpDownArrow;": '\U000021D5', - "DoubleVerticalBar;": '\U00002225', - "DownArrow;": '\U00002193', - "DownArrowBar;": '\U00002913', - "DownArrowUpArrow;": '\U000021F5', - "DownBreve;": '\U00000311', - "DownLeftRightVector;": '\U00002950', - "DownLeftTeeVector;": '\U0000295E', - "DownLeftVector;": '\U000021BD', - "DownLeftVectorBar;": '\U00002956', - "DownRightTeeVector;": '\U0000295F', - "DownRightVector;": '\U000021C1', - "DownRightVectorBar;": '\U00002957', - "DownTee;": '\U000022A4', - "DownTeeArrow;": '\U000021A7', - "Downarrow;": '\U000021D3', - "Dscr;": '\U0001D49F', - "Dstrok;": '\U00000110', - "ENG;": '\U0000014A', - "ETH;": '\U000000D0', - "Eacute;": '\U000000C9', - "Ecaron;": '\U0000011A', - "Ecirc;": '\U000000CA', - "Ecy;": '\U0000042D', - "Edot;": '\U00000116', - "Efr;": '\U0001D508', - "Egrave;": '\U000000C8', - "Element;": '\U00002208', - "Emacr;": '\U00000112', - "EmptySmallSquare;": '\U000025FB', - "EmptyVerySmallSquare;": '\U000025AB', - "Eogon;": '\U00000118', - "Eopf;": '\U0001D53C', - "Epsilon;": '\U00000395', - "Equal;": '\U00002A75', - "EqualTilde;": '\U00002242', - "Equilibrium;": '\U000021CC', - "Escr;": '\U00002130', - "Esim;": '\U00002A73', - "Eta;": '\U00000397', - "Euml;": '\U000000CB', - "Exists;": '\U00002203', - "ExponentialE;": '\U00002147', - "Fcy;": '\U00000424', - "Ffr;": '\U0001D509', - "FilledSmallSquare;": '\U000025FC', - "FilledVerySmallSquare;": '\U000025AA', - "Fopf;": '\U0001D53D', - "ForAll;": '\U00002200', - "Fouriertrf;": '\U00002131', - "Fscr;": '\U00002131', - "GJcy;": '\U00000403', - "GT;": '\U0000003E', - "Gamma;": '\U00000393', - "Gammad;": '\U000003DC', - "Gbreve;": '\U0000011E', - "Gcedil;": '\U00000122', - "Gcirc;": '\U0000011C', - "Gcy;": '\U00000413', - "Gdot;": '\U00000120', - "Gfr;": '\U0001D50A', - "Gg;": '\U000022D9', - "Gopf;": '\U0001D53E', - "GreaterEqual;": '\U00002265', - "GreaterEqualLess;": '\U000022DB', - "GreaterFullEqual;": '\U00002267', - "GreaterGreater;": '\U00002AA2', - "GreaterLess;": '\U00002277', - "GreaterSlantEqual;": '\U00002A7E', - "GreaterTilde;": '\U00002273', - "Gscr;": '\U0001D4A2', - "Gt;": '\U0000226B', - "HARDcy;": '\U0000042A', - "Hacek;": '\U000002C7', - "Hat;": '\U0000005E', - "Hcirc;": '\U00000124', - "Hfr;": '\U0000210C', - "HilbertSpace;": '\U0000210B', - "Hopf;": '\U0000210D', - "HorizontalLine;": '\U00002500', - "Hscr;": '\U0000210B', - "Hstrok;": '\U00000126', - "HumpDownHump;": '\U0000224E', - "HumpEqual;": '\U0000224F', - "IEcy;": '\U00000415', - "IJlig;": '\U00000132', - "IOcy;": '\U00000401', - "Iacute;": '\U000000CD', - "Icirc;": '\U000000CE', - "Icy;": '\U00000418', - "Idot;": '\U00000130', - "Ifr;": '\U00002111', - "Igrave;": '\U000000CC', - "Im;": '\U00002111', - "Imacr;": '\U0000012A', - "ImaginaryI;": '\U00002148', - "Implies;": '\U000021D2', - "Int;": '\U0000222C', - "Integral;": '\U0000222B', - "Intersection;": '\U000022C2', - "InvisibleComma;": '\U00002063', - "InvisibleTimes;": '\U00002062', - "Iogon;": '\U0000012E', - "Iopf;": '\U0001D540', - "Iota;": '\U00000399', - "Iscr;": '\U00002110', - "Itilde;": '\U00000128', - "Iukcy;": '\U00000406', - "Iuml;": '\U000000CF', - "Jcirc;": '\U00000134', - "Jcy;": '\U00000419', - "Jfr;": '\U0001D50D', - "Jopf;": '\U0001D541', - "Jscr;": '\U0001D4A5', - "Jsercy;": '\U00000408', - "Jukcy;": '\U00000404', - "KHcy;": '\U00000425', - "KJcy;": '\U0000040C', - "Kappa;": '\U0000039A', - "Kcedil;": '\U00000136', - "Kcy;": '\U0000041A', - "Kfr;": '\U0001D50E', - "Kopf;": '\U0001D542', - "Kscr;": '\U0001D4A6', - "LJcy;": '\U00000409', - "LT;": '\U0000003C', - "Lacute;": '\U00000139', - "Lambda;": '\U0000039B', - "Lang;": '\U000027EA', - "Laplacetrf;": '\U00002112', - "Larr;": '\U0000219E', - "Lcaron;": '\U0000013D', - "Lcedil;": '\U0000013B', - "Lcy;": '\U0000041B', - "LeftAngleBracket;": '\U000027E8', - "LeftArrow;": '\U00002190', - "LeftArrowBar;": '\U000021E4', - "LeftArrowRightArrow;": '\U000021C6', - "LeftCeiling;": '\U00002308', - "LeftDoubleBracket;": '\U000027E6', - "LeftDownTeeVector;": '\U00002961', - "LeftDownVector;": '\U000021C3', - "LeftDownVectorBar;": '\U00002959', - "LeftFloor;": '\U0000230A', - "LeftRightArrow;": '\U00002194', - "LeftRightVector;": '\U0000294E', - "LeftTee;": '\U000022A3', - "LeftTeeArrow;": '\U000021A4', - "LeftTeeVector;": '\U0000295A', - "LeftTriangle;": '\U000022B2', - "LeftTriangleBar;": '\U000029CF', - "LeftTriangleEqual;": '\U000022B4', - "LeftUpDownVector;": '\U00002951', - "LeftUpTeeVector;": '\U00002960', - "LeftUpVector;": '\U000021BF', - "LeftUpVectorBar;": '\U00002958', - "LeftVector;": '\U000021BC', - "LeftVectorBar;": '\U00002952', - "Leftarrow;": '\U000021D0', - "Leftrightarrow;": '\U000021D4', - "LessEqualGreater;": '\U000022DA', - "LessFullEqual;": '\U00002266', - "LessGreater;": '\U00002276', - "LessLess;": '\U00002AA1', - "LessSlantEqual;": '\U00002A7D', - "LessTilde;": '\U00002272', - "Lfr;": '\U0001D50F', - "Ll;": '\U000022D8', - "Lleftarrow;": '\U000021DA', - "Lmidot;": '\U0000013F', - "LongLeftArrow;": '\U000027F5', - "LongLeftRightArrow;": '\U000027F7', - "LongRightArrow;": '\U000027F6', - "Longleftarrow;": '\U000027F8', - "Longleftrightarrow;": '\U000027FA', - "Longrightarrow;": '\U000027F9', - "Lopf;": '\U0001D543', - "LowerLeftArrow;": '\U00002199', - "LowerRightArrow;": '\U00002198', - "Lscr;": '\U00002112', - "Lsh;": '\U000021B0', - "Lstrok;": '\U00000141', - "Lt;": '\U0000226A', - "Map;": '\U00002905', - "Mcy;": '\U0000041C', - "MediumSpace;": '\U0000205F', - "Mellintrf;": '\U00002133', - "Mfr;": '\U0001D510', - "MinusPlus;": '\U00002213', - "Mopf;": '\U0001D544', - "Mscr;": '\U00002133', - "Mu;": '\U0000039C', - "NJcy;": '\U0000040A', - "Nacute;": '\U00000143', - "Ncaron;": '\U00000147', - "Ncedil;": '\U00000145', - "Ncy;": '\U0000041D', - "NegativeMediumSpace;": '\U0000200B', - "NegativeThickSpace;": '\U0000200B', - "NegativeThinSpace;": '\U0000200B', - "NegativeVeryThinSpace;": '\U0000200B', - "NestedGreaterGreater;": '\U0000226B', - "NestedLessLess;": '\U0000226A', - "NewLine;": '\U0000000A', - "Nfr;": '\U0001D511', - "NoBreak;": '\U00002060', - "NonBreakingSpace;": '\U000000A0', - "Nopf;": '\U00002115', - "Not;": '\U00002AEC', - "NotCongruent;": '\U00002262', - "NotCupCap;": '\U0000226D', - "NotDoubleVerticalBar;": '\U00002226', - "NotElement;": '\U00002209', - "NotEqual;": '\U00002260', - "NotExists;": '\U00002204', - "NotGreater;": '\U0000226F', - "NotGreaterEqual;": '\U00002271', - "NotGreaterLess;": '\U00002279', - "NotGreaterTilde;": '\U00002275', - "NotLeftTriangle;": '\U000022EA', - "NotLeftTriangleEqual;": '\U000022EC', - "NotLess;": '\U0000226E', - "NotLessEqual;": '\U00002270', - "NotLessGreater;": '\U00002278', - "NotLessTilde;": '\U00002274', - "NotPrecedes;": '\U00002280', - "NotPrecedesSlantEqual;": '\U000022E0', - "NotReverseElement;": '\U0000220C', - "NotRightTriangle;": '\U000022EB', - "NotRightTriangleEqual;": '\U000022ED', - "NotSquareSubsetEqual;": '\U000022E2', - "NotSquareSupersetEqual;": '\U000022E3', - "NotSubsetEqual;": '\U00002288', - "NotSucceeds;": '\U00002281', - "NotSucceedsSlantEqual;": '\U000022E1', - "NotSupersetEqual;": '\U00002289', - "NotTilde;": '\U00002241', - "NotTildeEqual;": '\U00002244', - "NotTildeFullEqual;": '\U00002247', - "NotTildeTilde;": '\U00002249', - "NotVerticalBar;": '\U00002224', - "Nscr;": '\U0001D4A9', - "Ntilde;": '\U000000D1', - "Nu;": '\U0000039D', - "OElig;": '\U00000152', - "Oacute;": '\U000000D3', - "Ocirc;": '\U000000D4', - "Ocy;": '\U0000041E', - "Odblac;": '\U00000150', - "Ofr;": '\U0001D512', - "Ograve;": '\U000000D2', - "Omacr;": '\U0000014C', - "Omega;": '\U000003A9', - "Omicron;": '\U0000039F', - "Oopf;": '\U0001D546', - "OpenCurlyDoubleQuote;": '\U0000201C', - "OpenCurlyQuote;": '\U00002018', - "Or;": '\U00002A54', - "Oscr;": '\U0001D4AA', - "Oslash;": '\U000000D8', - "Otilde;": '\U000000D5', - "Otimes;": '\U00002A37', - "Ouml;": '\U000000D6', - "OverBar;": '\U0000203E', - "OverBrace;": '\U000023DE', - "OverBracket;": '\U000023B4', - "OverParenthesis;": '\U000023DC', - "PartialD;": '\U00002202', - "Pcy;": '\U0000041F', - "Pfr;": '\U0001D513', - "Phi;": '\U000003A6', - "Pi;": '\U000003A0', - "PlusMinus;": '\U000000B1', - "Poincareplane;": '\U0000210C', - "Popf;": '\U00002119', - "Pr;": '\U00002ABB', - "Precedes;": '\U0000227A', - "PrecedesEqual;": '\U00002AAF', - "PrecedesSlantEqual;": '\U0000227C', - "PrecedesTilde;": '\U0000227E', - "Prime;": '\U00002033', - "Product;": '\U0000220F', - "Proportion;": '\U00002237', - "Proportional;": '\U0000221D', - "Pscr;": '\U0001D4AB', - "Psi;": '\U000003A8', - "QUOT;": '\U00000022', - "Qfr;": '\U0001D514', - "Qopf;": '\U0000211A', - "Qscr;": '\U0001D4AC', - "RBarr;": '\U00002910', - "REG;": '\U000000AE', - "Racute;": '\U00000154', - "Rang;": '\U000027EB', - "Rarr;": '\U000021A0', - "Rarrtl;": '\U00002916', - "Rcaron;": '\U00000158', - "Rcedil;": '\U00000156', - "Rcy;": '\U00000420', - "Re;": '\U0000211C', - "ReverseElement;": '\U0000220B', - "ReverseEquilibrium;": '\U000021CB', - "ReverseUpEquilibrium;": '\U0000296F', - "Rfr;": '\U0000211C', - "Rho;": '\U000003A1', - "RightAngleBracket;": '\U000027E9', - "RightArrow;": '\U00002192', - "RightArrowBar;": '\U000021E5', - "RightArrowLeftArrow;": '\U000021C4', - "RightCeiling;": '\U00002309', - "RightDoubleBracket;": '\U000027E7', - "RightDownTeeVector;": '\U0000295D', - "RightDownVector;": '\U000021C2', - "RightDownVectorBar;": '\U00002955', - "RightFloor;": '\U0000230B', - "RightTee;": '\U000022A2', - "RightTeeArrow;": '\U000021A6', - "RightTeeVector;": '\U0000295B', - "RightTriangle;": '\U000022B3', - "RightTriangleBar;": '\U000029D0', - "RightTriangleEqual;": '\U000022B5', - "RightUpDownVector;": '\U0000294F', - "RightUpTeeVector;": '\U0000295C', - "RightUpVector;": '\U000021BE', - "RightUpVectorBar;": '\U00002954', - "RightVector;": '\U000021C0', - "RightVectorBar;": '\U00002953', - "Rightarrow;": '\U000021D2', - "Ropf;": '\U0000211D', - "RoundImplies;": '\U00002970', - "Rrightarrow;": '\U000021DB', - "Rscr;": '\U0000211B', - "Rsh;": '\U000021B1', - "RuleDelayed;": '\U000029F4', - "SHCHcy;": '\U00000429', - "SHcy;": '\U00000428', - "SOFTcy;": '\U0000042C', - "Sacute;": '\U0000015A', - "Sc;": '\U00002ABC', - "Scaron;": '\U00000160', - "Scedil;": '\U0000015E', - "Scirc;": '\U0000015C', - "Scy;": '\U00000421', - "Sfr;": '\U0001D516', - "ShortDownArrow;": '\U00002193', - "ShortLeftArrow;": '\U00002190', - "ShortRightArrow;": '\U00002192', - "ShortUpArrow;": '\U00002191', - "Sigma;": '\U000003A3', - "SmallCircle;": '\U00002218', - "Sopf;": '\U0001D54A', - "Sqrt;": '\U0000221A', - "Square;": '\U000025A1', - "SquareIntersection;": '\U00002293', - "SquareSubset;": '\U0000228F', - "SquareSubsetEqual;": '\U00002291', - "SquareSuperset;": '\U00002290', - "SquareSupersetEqual;": '\U00002292', - "SquareUnion;": '\U00002294', - "Sscr;": '\U0001D4AE', - "Star;": '\U000022C6', - "Sub;": '\U000022D0', - "Subset;": '\U000022D0', - "SubsetEqual;": '\U00002286', - "Succeeds;": '\U0000227B', - "SucceedsEqual;": '\U00002AB0', - "SucceedsSlantEqual;": '\U0000227D', - "SucceedsTilde;": '\U0000227F', - "SuchThat;": '\U0000220B', - "Sum;": '\U00002211', - "Sup;": '\U000022D1', - "Superset;": '\U00002283', - "SupersetEqual;": '\U00002287', - "Supset;": '\U000022D1', - "THORN;": '\U000000DE', - "TRADE;": '\U00002122', - "TSHcy;": '\U0000040B', - "TScy;": '\U00000426', - "Tab;": '\U00000009', - "Tau;": '\U000003A4', - "Tcaron;": '\U00000164', - "Tcedil;": '\U00000162', - "Tcy;": '\U00000422', - "Tfr;": '\U0001D517', - "Therefore;": '\U00002234', - "Theta;": '\U00000398', - "ThinSpace;": '\U00002009', - "Tilde;": '\U0000223C', - "TildeEqual;": '\U00002243', - "TildeFullEqual;": '\U00002245', - "TildeTilde;": '\U00002248', - "Topf;": '\U0001D54B', - "TripleDot;": '\U000020DB', - "Tscr;": '\U0001D4AF', - "Tstrok;": '\U00000166', - "Uacute;": '\U000000DA', - "Uarr;": '\U0000219F', - "Uarrocir;": '\U00002949', - "Ubrcy;": '\U0000040E', - "Ubreve;": '\U0000016C', - "Ucirc;": '\U000000DB', - "Ucy;": '\U00000423', - "Udblac;": '\U00000170', - "Ufr;": '\U0001D518', - "Ugrave;": '\U000000D9', - "Umacr;": '\U0000016A', - "UnderBar;": '\U0000005F', - "UnderBrace;": '\U000023DF', - "UnderBracket;": '\U000023B5', - "UnderParenthesis;": '\U000023DD', - "Union;": '\U000022C3', - "UnionPlus;": '\U0000228E', - "Uogon;": '\U00000172', - "Uopf;": '\U0001D54C', - "UpArrow;": '\U00002191', - "UpArrowBar;": '\U00002912', - "UpArrowDownArrow;": '\U000021C5', - "UpDownArrow;": '\U00002195', - "UpEquilibrium;": '\U0000296E', - "UpTee;": '\U000022A5', - "UpTeeArrow;": '\U000021A5', - "Uparrow;": '\U000021D1', - "Updownarrow;": '\U000021D5', - "UpperLeftArrow;": '\U00002196', - "UpperRightArrow;": '\U00002197', - "Upsi;": '\U000003D2', - "Upsilon;": '\U000003A5', - "Uring;": '\U0000016E', - "Uscr;": '\U0001D4B0', - "Utilde;": '\U00000168', - "Uuml;": '\U000000DC', - "VDash;": '\U000022AB', - "Vbar;": '\U00002AEB', - "Vcy;": '\U00000412', - "Vdash;": '\U000022A9', - "Vdashl;": '\U00002AE6', - "Vee;": '\U000022C1', - "Verbar;": '\U00002016', - "Vert;": '\U00002016', - "VerticalBar;": '\U00002223', - "VerticalLine;": '\U0000007C', - "VerticalSeparator;": '\U00002758', - "VerticalTilde;": '\U00002240', - "VeryThinSpace;": '\U0000200A', - "Vfr;": '\U0001D519', - "Vopf;": '\U0001D54D', - "Vscr;": '\U0001D4B1', - "Vvdash;": '\U000022AA', - "Wcirc;": '\U00000174', - "Wedge;": '\U000022C0', - "Wfr;": '\U0001D51A', - "Wopf;": '\U0001D54E', - "Wscr;": '\U0001D4B2', - "Xfr;": '\U0001D51B', - "Xi;": '\U0000039E', - "Xopf;": '\U0001D54F', - "Xscr;": '\U0001D4B3', - "YAcy;": '\U0000042F', - "YIcy;": '\U00000407', - "YUcy;": '\U0000042E', - "Yacute;": '\U000000DD', - "Ycirc;": '\U00000176', - "Ycy;": '\U0000042B', - "Yfr;": '\U0001D51C', - "Yopf;": '\U0001D550', - "Yscr;": '\U0001D4B4', - "Yuml;": '\U00000178', - "ZHcy;": '\U00000416', - "Zacute;": '\U00000179', - "Zcaron;": '\U0000017D', - "Zcy;": '\U00000417', - "Zdot;": '\U0000017B', - "ZeroWidthSpace;": '\U0000200B', - "Zeta;": '\U00000396', - "Zfr;": '\U00002128', - "Zopf;": '\U00002124', - "Zscr;": '\U0001D4B5', - "aacute;": '\U000000E1', - "abreve;": '\U00000103', - "ac;": '\U0000223E', - "acd;": '\U0000223F', - "acirc;": '\U000000E2', - "acute;": '\U000000B4', - "acy;": '\U00000430', - "aelig;": '\U000000E6', - "af;": '\U00002061', - "afr;": '\U0001D51E', - "agrave;": '\U000000E0', - "alefsym;": '\U00002135', - "aleph;": '\U00002135', - "alpha;": '\U000003B1', - "amacr;": '\U00000101', - "amalg;": '\U00002A3F', - "amp;": '\U00000026', - "and;": '\U00002227', - "andand;": '\U00002A55', - "andd;": '\U00002A5C', - "andslope;": '\U00002A58', - "andv;": '\U00002A5A', - "ang;": '\U00002220', - "ange;": '\U000029A4', - "angle;": '\U00002220', - "angmsd;": '\U00002221', - "angmsdaa;": '\U000029A8', - "angmsdab;": '\U000029A9', - "angmsdac;": '\U000029AA', - "angmsdad;": '\U000029AB', - "angmsdae;": '\U000029AC', - "angmsdaf;": '\U000029AD', - "angmsdag;": '\U000029AE', - "angmsdah;": '\U000029AF', - "angrt;": '\U0000221F', - "angrtvb;": '\U000022BE', - "angrtvbd;": '\U0000299D', - "angsph;": '\U00002222', - "angst;": '\U000000C5', - "angzarr;": '\U0000237C', - "aogon;": '\U00000105', - "aopf;": '\U0001D552', - "ap;": '\U00002248', - "apE;": '\U00002A70', - "apacir;": '\U00002A6F', - "ape;": '\U0000224A', - "apid;": '\U0000224B', - "apos;": '\U00000027', - "approx;": '\U00002248', - "approxeq;": '\U0000224A', - "aring;": '\U000000E5', - "ascr;": '\U0001D4B6', - "ast;": '\U0000002A', - "asymp;": '\U00002248', - "asympeq;": '\U0000224D', - "atilde;": '\U000000E3', - "auml;": '\U000000E4', - "awconint;": '\U00002233', - "awint;": '\U00002A11', - "bNot;": '\U00002AED', - "backcong;": '\U0000224C', - "backepsilon;": '\U000003F6', - "backprime;": '\U00002035', - "backsim;": '\U0000223D', - "backsimeq;": '\U000022CD', - "barvee;": '\U000022BD', - "barwed;": '\U00002305', - "barwedge;": '\U00002305', - "bbrk;": '\U000023B5', - "bbrktbrk;": '\U000023B6', - "bcong;": '\U0000224C', - "bcy;": '\U00000431', - "bdquo;": '\U0000201E', - "becaus;": '\U00002235', - "because;": '\U00002235', - "bemptyv;": '\U000029B0', - "bepsi;": '\U000003F6', - "bernou;": '\U0000212C', - "beta;": '\U000003B2', - "beth;": '\U00002136', - "between;": '\U0000226C', - "bfr;": '\U0001D51F', - "bigcap;": '\U000022C2', - "bigcirc;": '\U000025EF', - "bigcup;": '\U000022C3', - "bigodot;": '\U00002A00', - "bigoplus;": '\U00002A01', - "bigotimes;": '\U00002A02', - "bigsqcup;": '\U00002A06', - "bigstar;": '\U00002605', - "bigtriangledown;": '\U000025BD', - "bigtriangleup;": '\U000025B3', - "biguplus;": '\U00002A04', - "bigvee;": '\U000022C1', - "bigwedge;": '\U000022C0', - "bkarow;": '\U0000290D', - "blacklozenge;": '\U000029EB', - "blacksquare;": '\U000025AA', - "blacktriangle;": '\U000025B4', - "blacktriangledown;": '\U000025BE', - "blacktriangleleft;": '\U000025C2', - "blacktriangleright;": '\U000025B8', - "blank;": '\U00002423', - "blk12;": '\U00002592', - "blk14;": '\U00002591', - "blk34;": '\U00002593', - "block;": '\U00002588', - "bnot;": '\U00002310', - "bopf;": '\U0001D553', - "bot;": '\U000022A5', - "bottom;": '\U000022A5', - "bowtie;": '\U000022C8', - "boxDL;": '\U00002557', - "boxDR;": '\U00002554', - "boxDl;": '\U00002556', - "boxDr;": '\U00002553', - "boxH;": '\U00002550', - "boxHD;": '\U00002566', - "boxHU;": '\U00002569', - "boxHd;": '\U00002564', - "boxHu;": '\U00002567', - "boxUL;": '\U0000255D', - "boxUR;": '\U0000255A', - "boxUl;": '\U0000255C', - "boxUr;": '\U00002559', - "boxV;": '\U00002551', - "boxVH;": '\U0000256C', - "boxVL;": '\U00002563', - "boxVR;": '\U00002560', - "boxVh;": '\U0000256B', - "boxVl;": '\U00002562', - "boxVr;": '\U0000255F', - "boxbox;": '\U000029C9', - "boxdL;": '\U00002555', - "boxdR;": '\U00002552', - "boxdl;": '\U00002510', - "boxdr;": '\U0000250C', - "boxh;": '\U00002500', - "boxhD;": '\U00002565', - "boxhU;": '\U00002568', - "boxhd;": '\U0000252C', - "boxhu;": '\U00002534', - "boxminus;": '\U0000229F', - "boxplus;": '\U0000229E', - "boxtimes;": '\U000022A0', - "boxuL;": '\U0000255B', - "boxuR;": '\U00002558', - "boxul;": '\U00002518', - "boxur;": '\U00002514', - "boxv;": '\U00002502', - "boxvH;": '\U0000256A', - "boxvL;": '\U00002561', - "boxvR;": '\U0000255E', - "boxvh;": '\U0000253C', - "boxvl;": '\U00002524', - "boxvr;": '\U0000251C', - "bprime;": '\U00002035', - "breve;": '\U000002D8', - "brvbar;": '\U000000A6', - "bscr;": '\U0001D4B7', - "bsemi;": '\U0000204F', - "bsim;": '\U0000223D', - "bsime;": '\U000022CD', - "bsol;": '\U0000005C', - "bsolb;": '\U000029C5', - "bsolhsub;": '\U000027C8', - "bull;": '\U00002022', - "bullet;": '\U00002022', - "bump;": '\U0000224E', - "bumpE;": '\U00002AAE', - "bumpe;": '\U0000224F', - "bumpeq;": '\U0000224F', - "cacute;": '\U00000107', - "cap;": '\U00002229', - "capand;": '\U00002A44', - "capbrcup;": '\U00002A49', - "capcap;": '\U00002A4B', - "capcup;": '\U00002A47', - "capdot;": '\U00002A40', - "caret;": '\U00002041', - "caron;": '\U000002C7', - "ccaps;": '\U00002A4D', - "ccaron;": '\U0000010D', - "ccedil;": '\U000000E7', - "ccirc;": '\U00000109', - "ccups;": '\U00002A4C', - "ccupssm;": '\U00002A50', - "cdot;": '\U0000010B', - "cedil;": '\U000000B8', - "cemptyv;": '\U000029B2', - "cent;": '\U000000A2', - "centerdot;": '\U000000B7', - "cfr;": '\U0001D520', - "chcy;": '\U00000447', - "check;": '\U00002713', - "checkmark;": '\U00002713', - "chi;": '\U000003C7', - "cir;": '\U000025CB', - "cirE;": '\U000029C3', - "circ;": '\U000002C6', - "circeq;": '\U00002257', - "circlearrowleft;": '\U000021BA', - "circlearrowright;": '\U000021BB', - "circledR;": '\U000000AE', - "circledS;": '\U000024C8', - "circledast;": '\U0000229B', - "circledcirc;": '\U0000229A', - "circleddash;": '\U0000229D', - "cire;": '\U00002257', - "cirfnint;": '\U00002A10', - "cirmid;": '\U00002AEF', - "cirscir;": '\U000029C2', - "clubs;": '\U00002663', - "clubsuit;": '\U00002663', - "colon;": '\U0000003A', - "colone;": '\U00002254', - "coloneq;": '\U00002254', - "comma;": '\U0000002C', - "commat;": '\U00000040', - "comp;": '\U00002201', - "compfn;": '\U00002218', - "complement;": '\U00002201', - "complexes;": '\U00002102', - "cong;": '\U00002245', - "congdot;": '\U00002A6D', - "conint;": '\U0000222E', - "copf;": '\U0001D554', - "coprod;": '\U00002210', - "copy;": '\U000000A9', - "copysr;": '\U00002117', - "crarr;": '\U000021B5', - "cross;": '\U00002717', - "cscr;": '\U0001D4B8', - "csub;": '\U00002ACF', - "csube;": '\U00002AD1', - "csup;": '\U00002AD0', - "csupe;": '\U00002AD2', - "ctdot;": '\U000022EF', - "cudarrl;": '\U00002938', - "cudarrr;": '\U00002935', - "cuepr;": '\U000022DE', - "cuesc;": '\U000022DF', - "cularr;": '\U000021B6', - "cularrp;": '\U0000293D', - "cup;": '\U0000222A', - "cupbrcap;": '\U00002A48', - "cupcap;": '\U00002A46', - "cupcup;": '\U00002A4A', - "cupdot;": '\U0000228D', - "cupor;": '\U00002A45', - "curarr;": '\U000021B7', - "curarrm;": '\U0000293C', - "curlyeqprec;": '\U000022DE', - "curlyeqsucc;": '\U000022DF', - "curlyvee;": '\U000022CE', - "curlywedge;": '\U000022CF', - "curren;": '\U000000A4', - "curvearrowleft;": '\U000021B6', - "curvearrowright;": '\U000021B7', - "cuvee;": '\U000022CE', - "cuwed;": '\U000022CF', - "cwconint;": '\U00002232', - "cwint;": '\U00002231', - "cylcty;": '\U0000232D', - "dArr;": '\U000021D3', - "dHar;": '\U00002965', - "dagger;": '\U00002020', - "daleth;": '\U00002138', - "darr;": '\U00002193', - "dash;": '\U00002010', - "dashv;": '\U000022A3', - "dbkarow;": '\U0000290F', - "dblac;": '\U000002DD', - "dcaron;": '\U0000010F', - "dcy;": '\U00000434', - "dd;": '\U00002146', - "ddagger;": '\U00002021', - "ddarr;": '\U000021CA', - "ddotseq;": '\U00002A77', - "deg;": '\U000000B0', - "delta;": '\U000003B4', - "demptyv;": '\U000029B1', - "dfisht;": '\U0000297F', - "dfr;": '\U0001D521', - "dharl;": '\U000021C3', - "dharr;": '\U000021C2', - "diam;": '\U000022C4', - "diamond;": '\U000022C4', - "diamondsuit;": '\U00002666', - "diams;": '\U00002666', - "die;": '\U000000A8', - "digamma;": '\U000003DD', - "disin;": '\U000022F2', - "div;": '\U000000F7', - "divide;": '\U000000F7', - "divideontimes;": '\U000022C7', - "divonx;": '\U000022C7', - "djcy;": '\U00000452', - "dlcorn;": '\U0000231E', - "dlcrop;": '\U0000230D', - "dollar;": '\U00000024', - "dopf;": '\U0001D555', - "dot;": '\U000002D9', - "doteq;": '\U00002250', - "doteqdot;": '\U00002251', - "dotminus;": '\U00002238', - "dotplus;": '\U00002214', - "dotsquare;": '\U000022A1', - "doublebarwedge;": '\U00002306', - "downarrow;": '\U00002193', - "downdownarrows;": '\U000021CA', - "downharpoonleft;": '\U000021C3', - "downharpoonright;": '\U000021C2', - "drbkarow;": '\U00002910', - "drcorn;": '\U0000231F', - "drcrop;": '\U0000230C', - "dscr;": '\U0001D4B9', - "dscy;": '\U00000455', - "dsol;": '\U000029F6', - "dstrok;": '\U00000111', - "dtdot;": '\U000022F1', - "dtri;": '\U000025BF', - "dtrif;": '\U000025BE', - "duarr;": '\U000021F5', - "duhar;": '\U0000296F', - "dwangle;": '\U000029A6', - "dzcy;": '\U0000045F', - "dzigrarr;": '\U000027FF', - "eDDot;": '\U00002A77', - "eDot;": '\U00002251', - "eacute;": '\U000000E9', - "easter;": '\U00002A6E', - "ecaron;": '\U0000011B', - "ecir;": '\U00002256', - "ecirc;": '\U000000EA', - "ecolon;": '\U00002255', - "ecy;": '\U0000044D', - "edot;": '\U00000117', - "ee;": '\U00002147', - "efDot;": '\U00002252', - "efr;": '\U0001D522', - "eg;": '\U00002A9A', - "egrave;": '\U000000E8', - "egs;": '\U00002A96', - "egsdot;": '\U00002A98', - "el;": '\U00002A99', - "elinters;": '\U000023E7', - "ell;": '\U00002113', - "els;": '\U00002A95', - "elsdot;": '\U00002A97', - "emacr;": '\U00000113', - "empty;": '\U00002205', - "emptyset;": '\U00002205', - "emptyv;": '\U00002205', - "emsp;": '\U00002003', - "emsp13;": '\U00002004', - "emsp14;": '\U00002005', - "eng;": '\U0000014B', - "ensp;": '\U00002002', - "eogon;": '\U00000119', - "eopf;": '\U0001D556', - "epar;": '\U000022D5', - "eparsl;": '\U000029E3', - "eplus;": '\U00002A71', - "epsi;": '\U000003B5', - "epsilon;": '\U000003B5', - "epsiv;": '\U000003F5', - "eqcirc;": '\U00002256', - "eqcolon;": '\U00002255', - "eqsim;": '\U00002242', - "eqslantgtr;": '\U00002A96', - "eqslantless;": '\U00002A95', - "equals;": '\U0000003D', - "equest;": '\U0000225F', - "equiv;": '\U00002261', - "equivDD;": '\U00002A78', - "eqvparsl;": '\U000029E5', - "erDot;": '\U00002253', - "erarr;": '\U00002971', - "escr;": '\U0000212F', - "esdot;": '\U00002250', - "esim;": '\U00002242', - "eta;": '\U000003B7', - "eth;": '\U000000F0', - "euml;": '\U000000EB', - "euro;": '\U000020AC', - "excl;": '\U00000021', - "exist;": '\U00002203', - "expectation;": '\U00002130', - "exponentiale;": '\U00002147', - "fallingdotseq;": '\U00002252', - "fcy;": '\U00000444', - "female;": '\U00002640', - "ffilig;": '\U0000FB03', - "fflig;": '\U0000FB00', - "ffllig;": '\U0000FB04', - "ffr;": '\U0001D523', - "filig;": '\U0000FB01', - "flat;": '\U0000266D', - "fllig;": '\U0000FB02', - "fltns;": '\U000025B1', - "fnof;": '\U00000192', - "fopf;": '\U0001D557', - "forall;": '\U00002200', - "fork;": '\U000022D4', - "forkv;": '\U00002AD9', - "fpartint;": '\U00002A0D', - "frac12;": '\U000000BD', - "frac13;": '\U00002153', - "frac14;": '\U000000BC', - "frac15;": '\U00002155', - "frac16;": '\U00002159', - "frac18;": '\U0000215B', - "frac23;": '\U00002154', - "frac25;": '\U00002156', - "frac34;": '\U000000BE', - "frac35;": '\U00002157', - "frac38;": '\U0000215C', - "frac45;": '\U00002158', - "frac56;": '\U0000215A', - "frac58;": '\U0000215D', - "frac78;": '\U0000215E', - "frasl;": '\U00002044', - "frown;": '\U00002322', - "fscr;": '\U0001D4BB', - "gE;": '\U00002267', - "gEl;": '\U00002A8C', - "gacute;": '\U000001F5', - "gamma;": '\U000003B3', - "gammad;": '\U000003DD', - "gap;": '\U00002A86', - "gbreve;": '\U0000011F', - "gcirc;": '\U0000011D', - "gcy;": '\U00000433', - "gdot;": '\U00000121', - "ge;": '\U00002265', - "gel;": '\U000022DB', - "geq;": '\U00002265', - "geqq;": '\U00002267', - "geqslant;": '\U00002A7E', - "ges;": '\U00002A7E', - "gescc;": '\U00002AA9', - "gesdot;": '\U00002A80', - "gesdoto;": '\U00002A82', - "gesdotol;": '\U00002A84', - "gesles;": '\U00002A94', - "gfr;": '\U0001D524', - "gg;": '\U0000226B', - "ggg;": '\U000022D9', - "gimel;": '\U00002137', - "gjcy;": '\U00000453', - "gl;": '\U00002277', - "glE;": '\U00002A92', - "gla;": '\U00002AA5', - "glj;": '\U00002AA4', - "gnE;": '\U00002269', - "gnap;": '\U00002A8A', - "gnapprox;": '\U00002A8A', - "gne;": '\U00002A88', - "gneq;": '\U00002A88', - "gneqq;": '\U00002269', - "gnsim;": '\U000022E7', - "gopf;": '\U0001D558', - "grave;": '\U00000060', - "gscr;": '\U0000210A', - "gsim;": '\U00002273', - "gsime;": '\U00002A8E', - "gsiml;": '\U00002A90', - "gt;": '\U0000003E', - "gtcc;": '\U00002AA7', - "gtcir;": '\U00002A7A', - "gtdot;": '\U000022D7', - "gtlPar;": '\U00002995', - "gtquest;": '\U00002A7C', - "gtrapprox;": '\U00002A86', - "gtrarr;": '\U00002978', - "gtrdot;": '\U000022D7', - "gtreqless;": '\U000022DB', - "gtreqqless;": '\U00002A8C', - "gtrless;": '\U00002277', - "gtrsim;": '\U00002273', - "hArr;": '\U000021D4', - "hairsp;": '\U0000200A', - "half;": '\U000000BD', - "hamilt;": '\U0000210B', - "hardcy;": '\U0000044A', - "harr;": '\U00002194', - "harrcir;": '\U00002948', - "harrw;": '\U000021AD', - "hbar;": '\U0000210F', - "hcirc;": '\U00000125', - "hearts;": '\U00002665', - "heartsuit;": '\U00002665', - "hellip;": '\U00002026', - "hercon;": '\U000022B9', - "hfr;": '\U0001D525', - "hksearow;": '\U00002925', - "hkswarow;": '\U00002926', - "hoarr;": '\U000021FF', - "homtht;": '\U0000223B', - "hookleftarrow;": '\U000021A9', - "hookrightarrow;": '\U000021AA', - "hopf;": '\U0001D559', - "horbar;": '\U00002015', - "hscr;": '\U0001D4BD', - "hslash;": '\U0000210F', - "hstrok;": '\U00000127', - "hybull;": '\U00002043', - "hyphen;": '\U00002010', - "iacute;": '\U000000ED', - "ic;": '\U00002063', - "icirc;": '\U000000EE', - "icy;": '\U00000438', - "iecy;": '\U00000435', - "iexcl;": '\U000000A1', - "iff;": '\U000021D4', - "ifr;": '\U0001D526', - "igrave;": '\U000000EC', - "ii;": '\U00002148', - "iiiint;": '\U00002A0C', - "iiint;": '\U0000222D', - "iinfin;": '\U000029DC', - "iiota;": '\U00002129', - "ijlig;": '\U00000133', - "imacr;": '\U0000012B', - "image;": '\U00002111', - "imagline;": '\U00002110', - "imagpart;": '\U00002111', - "imath;": '\U00000131', - "imof;": '\U000022B7', - "imped;": '\U000001B5', - "in;": '\U00002208', - "incare;": '\U00002105', - "infin;": '\U0000221E', - "infintie;": '\U000029DD', - "inodot;": '\U00000131', - "int;": '\U0000222B', - "intcal;": '\U000022BA', - "integers;": '\U00002124', - "intercal;": '\U000022BA', - "intlarhk;": '\U00002A17', - "intprod;": '\U00002A3C', - "iocy;": '\U00000451', - "iogon;": '\U0000012F', - "iopf;": '\U0001D55A', - "iota;": '\U000003B9', - "iprod;": '\U00002A3C', - "iquest;": '\U000000BF', - "iscr;": '\U0001D4BE', - "isin;": '\U00002208', - "isinE;": '\U000022F9', - "isindot;": '\U000022F5', - "isins;": '\U000022F4', - "isinsv;": '\U000022F3', - "isinv;": '\U00002208', - "it;": '\U00002062', - "itilde;": '\U00000129', - "iukcy;": '\U00000456', - "iuml;": '\U000000EF', - "jcirc;": '\U00000135', - "jcy;": '\U00000439', - "jfr;": '\U0001D527', - "jmath;": '\U00000237', - "jopf;": '\U0001D55B', - "jscr;": '\U0001D4BF', - "jsercy;": '\U00000458', - "jukcy;": '\U00000454', - "kappa;": '\U000003BA', - "kappav;": '\U000003F0', - "kcedil;": '\U00000137', - "kcy;": '\U0000043A', - "kfr;": '\U0001D528', - "kgreen;": '\U00000138', - "khcy;": '\U00000445', - "kjcy;": '\U0000045C', - "kopf;": '\U0001D55C', - "kscr;": '\U0001D4C0', - "lAarr;": '\U000021DA', - "lArr;": '\U000021D0', - "lAtail;": '\U0000291B', - "lBarr;": '\U0000290E', - "lE;": '\U00002266', - "lEg;": '\U00002A8B', - "lHar;": '\U00002962', - "lacute;": '\U0000013A', - "laemptyv;": '\U000029B4', - "lagran;": '\U00002112', - "lambda;": '\U000003BB', - "lang;": '\U000027E8', - "langd;": '\U00002991', - "langle;": '\U000027E8', - "lap;": '\U00002A85', - "laquo;": '\U000000AB', - "larr;": '\U00002190', - "larrb;": '\U000021E4', - "larrbfs;": '\U0000291F', - "larrfs;": '\U0000291D', - "larrhk;": '\U000021A9', - "larrlp;": '\U000021AB', - "larrpl;": '\U00002939', - "larrsim;": '\U00002973', - "larrtl;": '\U000021A2', - "lat;": '\U00002AAB', - "latail;": '\U00002919', - "late;": '\U00002AAD', - "lbarr;": '\U0000290C', - "lbbrk;": '\U00002772', - "lbrace;": '\U0000007B', - "lbrack;": '\U0000005B', - "lbrke;": '\U0000298B', - "lbrksld;": '\U0000298F', - "lbrkslu;": '\U0000298D', - "lcaron;": '\U0000013E', - "lcedil;": '\U0000013C', - "lceil;": '\U00002308', - "lcub;": '\U0000007B', - "lcy;": '\U0000043B', - "ldca;": '\U00002936', - "ldquo;": '\U0000201C', - "ldquor;": '\U0000201E', - "ldrdhar;": '\U00002967', - "ldrushar;": '\U0000294B', - "ldsh;": '\U000021B2', - "le;": '\U00002264', - "leftarrow;": '\U00002190', - "leftarrowtail;": '\U000021A2', - "leftharpoondown;": '\U000021BD', - "leftharpoonup;": '\U000021BC', - "leftleftarrows;": '\U000021C7', - "leftrightarrow;": '\U00002194', - "leftrightarrows;": '\U000021C6', - "leftrightharpoons;": '\U000021CB', - "leftrightsquigarrow;": '\U000021AD', - "leftthreetimes;": '\U000022CB', - "leg;": '\U000022DA', - "leq;": '\U00002264', - "leqq;": '\U00002266', - "leqslant;": '\U00002A7D', - "les;": '\U00002A7D', - "lescc;": '\U00002AA8', - "lesdot;": '\U00002A7F', - "lesdoto;": '\U00002A81', - "lesdotor;": '\U00002A83', - "lesges;": '\U00002A93', - "lessapprox;": '\U00002A85', - "lessdot;": '\U000022D6', - "lesseqgtr;": '\U000022DA', - "lesseqqgtr;": '\U00002A8B', - "lessgtr;": '\U00002276', - "lesssim;": '\U00002272', - "lfisht;": '\U0000297C', - "lfloor;": '\U0000230A', - "lfr;": '\U0001D529', - "lg;": '\U00002276', - "lgE;": '\U00002A91', - "lhard;": '\U000021BD', - "lharu;": '\U000021BC', - "lharul;": '\U0000296A', - "lhblk;": '\U00002584', - "ljcy;": '\U00000459', - "ll;": '\U0000226A', - "llarr;": '\U000021C7', - "llcorner;": '\U0000231E', - "llhard;": '\U0000296B', - "lltri;": '\U000025FA', - "lmidot;": '\U00000140', - "lmoust;": '\U000023B0', - "lmoustache;": '\U000023B0', - "lnE;": '\U00002268', - "lnap;": '\U00002A89', - "lnapprox;": '\U00002A89', - "lne;": '\U00002A87', - "lneq;": '\U00002A87', - "lneqq;": '\U00002268', - "lnsim;": '\U000022E6', - "loang;": '\U000027EC', - "loarr;": '\U000021FD', - "lobrk;": '\U000027E6', - "longleftarrow;": '\U000027F5', - "longleftrightarrow;": '\U000027F7', - "longmapsto;": '\U000027FC', - "longrightarrow;": '\U000027F6', - "looparrowleft;": '\U000021AB', - "looparrowright;": '\U000021AC', - "lopar;": '\U00002985', - "lopf;": '\U0001D55D', - "loplus;": '\U00002A2D', - "lotimes;": '\U00002A34', - "lowast;": '\U00002217', - "lowbar;": '\U0000005F', - "loz;": '\U000025CA', - "lozenge;": '\U000025CA', - "lozf;": '\U000029EB', - "lpar;": '\U00000028', - "lparlt;": '\U00002993', - "lrarr;": '\U000021C6', - "lrcorner;": '\U0000231F', - "lrhar;": '\U000021CB', - "lrhard;": '\U0000296D', - "lrm;": '\U0000200E', - "lrtri;": '\U000022BF', - "lsaquo;": '\U00002039', - "lscr;": '\U0001D4C1', - "lsh;": '\U000021B0', - "lsim;": '\U00002272', - "lsime;": '\U00002A8D', - "lsimg;": '\U00002A8F', - "lsqb;": '\U0000005B', - "lsquo;": '\U00002018', - "lsquor;": '\U0000201A', - "lstrok;": '\U00000142', - "lt;": '\U0000003C', - "ltcc;": '\U00002AA6', - "ltcir;": '\U00002A79', - "ltdot;": '\U000022D6', - "lthree;": '\U000022CB', - "ltimes;": '\U000022C9', - "ltlarr;": '\U00002976', - "ltquest;": '\U00002A7B', - "ltrPar;": '\U00002996', - "ltri;": '\U000025C3', - "ltrie;": '\U000022B4', - "ltrif;": '\U000025C2', - "lurdshar;": '\U0000294A', - "luruhar;": '\U00002966', - "mDDot;": '\U0000223A', - "macr;": '\U000000AF', - "male;": '\U00002642', - "malt;": '\U00002720', - "maltese;": '\U00002720', - "map;": '\U000021A6', - "mapsto;": '\U000021A6', - "mapstodown;": '\U000021A7', - "mapstoleft;": '\U000021A4', - "mapstoup;": '\U000021A5', - "marker;": '\U000025AE', - "mcomma;": '\U00002A29', - "mcy;": '\U0000043C', - "mdash;": '\U00002014', - "measuredangle;": '\U00002221', - "mfr;": '\U0001D52A', - "mho;": '\U00002127', - "micro;": '\U000000B5', - "mid;": '\U00002223', - "midast;": '\U0000002A', - "midcir;": '\U00002AF0', - "middot;": '\U000000B7', - "minus;": '\U00002212', - "minusb;": '\U0000229F', - "minusd;": '\U00002238', - "minusdu;": '\U00002A2A', - "mlcp;": '\U00002ADB', - "mldr;": '\U00002026', - "mnplus;": '\U00002213', - "models;": '\U000022A7', - "mopf;": '\U0001D55E', - "mp;": '\U00002213', - "mscr;": '\U0001D4C2', - "mstpos;": '\U0000223E', - "mu;": '\U000003BC', - "multimap;": '\U000022B8', - "mumap;": '\U000022B8', - "nLeftarrow;": '\U000021CD', - "nLeftrightarrow;": '\U000021CE', - "nRightarrow;": '\U000021CF', - "nVDash;": '\U000022AF', - "nVdash;": '\U000022AE', - "nabla;": '\U00002207', - "nacute;": '\U00000144', - "nap;": '\U00002249', - "napos;": '\U00000149', - "napprox;": '\U00002249', - "natur;": '\U0000266E', - "natural;": '\U0000266E', - "naturals;": '\U00002115', - "nbsp;": '\U000000A0', - "ncap;": '\U00002A43', - "ncaron;": '\U00000148', - "ncedil;": '\U00000146', - "ncong;": '\U00002247', - "ncup;": '\U00002A42', - "ncy;": '\U0000043D', - "ndash;": '\U00002013', - "ne;": '\U00002260', - "neArr;": '\U000021D7', - "nearhk;": '\U00002924', - "nearr;": '\U00002197', - "nearrow;": '\U00002197', - "nequiv;": '\U00002262', - "nesear;": '\U00002928', - "nexist;": '\U00002204', - "nexists;": '\U00002204', - "nfr;": '\U0001D52B', - "nge;": '\U00002271', - "ngeq;": '\U00002271', - "ngsim;": '\U00002275', - "ngt;": '\U0000226F', - "ngtr;": '\U0000226F', - "nhArr;": '\U000021CE', - "nharr;": '\U000021AE', - "nhpar;": '\U00002AF2', - "ni;": '\U0000220B', - "nis;": '\U000022FC', - "nisd;": '\U000022FA', - "niv;": '\U0000220B', - "njcy;": '\U0000045A', - "nlArr;": '\U000021CD', - "nlarr;": '\U0000219A', - "nldr;": '\U00002025', - "nle;": '\U00002270', - "nleftarrow;": '\U0000219A', - "nleftrightarrow;": '\U000021AE', - "nleq;": '\U00002270', - "nless;": '\U0000226E', - "nlsim;": '\U00002274', - "nlt;": '\U0000226E', - "nltri;": '\U000022EA', - "nltrie;": '\U000022EC', - "nmid;": '\U00002224', - "nopf;": '\U0001D55F', - "not;": '\U000000AC', - "notin;": '\U00002209', - "notinva;": '\U00002209', - "notinvb;": '\U000022F7', - "notinvc;": '\U000022F6', - "notni;": '\U0000220C', - "notniva;": '\U0000220C', - "notnivb;": '\U000022FE', - "notnivc;": '\U000022FD', - "npar;": '\U00002226', - "nparallel;": '\U00002226', - "npolint;": '\U00002A14', - "npr;": '\U00002280', - "nprcue;": '\U000022E0', - "nprec;": '\U00002280', - "nrArr;": '\U000021CF', - "nrarr;": '\U0000219B', - "nrightarrow;": '\U0000219B', - "nrtri;": '\U000022EB', - "nrtrie;": '\U000022ED', - "nsc;": '\U00002281', - "nsccue;": '\U000022E1', - "nscr;": '\U0001D4C3', - "nshortmid;": '\U00002224', - "nshortparallel;": '\U00002226', - "nsim;": '\U00002241', - "nsime;": '\U00002244', - "nsimeq;": '\U00002244', - "nsmid;": '\U00002224', - "nspar;": '\U00002226', - "nsqsube;": '\U000022E2', - "nsqsupe;": '\U000022E3', - "nsub;": '\U00002284', - "nsube;": '\U00002288', - "nsubseteq;": '\U00002288', - "nsucc;": '\U00002281', - "nsup;": '\U00002285', - "nsupe;": '\U00002289', - "nsupseteq;": '\U00002289', - "ntgl;": '\U00002279', - "ntilde;": '\U000000F1', - "ntlg;": '\U00002278', - "ntriangleleft;": '\U000022EA', - "ntrianglelefteq;": '\U000022EC', - "ntriangleright;": '\U000022EB', - "ntrianglerighteq;": '\U000022ED', - "nu;": '\U000003BD', - "num;": '\U00000023', - "numero;": '\U00002116', - "numsp;": '\U00002007', - "nvDash;": '\U000022AD', - "nvHarr;": '\U00002904', - "nvdash;": '\U000022AC', - "nvinfin;": '\U000029DE', - "nvlArr;": '\U00002902', - "nvrArr;": '\U00002903', - "nwArr;": '\U000021D6', - "nwarhk;": '\U00002923', - "nwarr;": '\U00002196', - "nwarrow;": '\U00002196', - "nwnear;": '\U00002927', - "oS;": '\U000024C8', - "oacute;": '\U000000F3', - "oast;": '\U0000229B', - "ocir;": '\U0000229A', - "ocirc;": '\U000000F4', - "ocy;": '\U0000043E', - "odash;": '\U0000229D', - "odblac;": '\U00000151', - "odiv;": '\U00002A38', - "odot;": '\U00002299', - "odsold;": '\U000029BC', - "oelig;": '\U00000153', - "ofcir;": '\U000029BF', - "ofr;": '\U0001D52C', - "ogon;": '\U000002DB', - "ograve;": '\U000000F2', - "ogt;": '\U000029C1', - "ohbar;": '\U000029B5', - "ohm;": '\U000003A9', - "oint;": '\U0000222E', - "olarr;": '\U000021BA', - "olcir;": '\U000029BE', - "olcross;": '\U000029BB', - "oline;": '\U0000203E', - "olt;": '\U000029C0', - "omacr;": '\U0000014D', - "omega;": '\U000003C9', - "omicron;": '\U000003BF', - "omid;": '\U000029B6', - "ominus;": '\U00002296', - "oopf;": '\U0001D560', - "opar;": '\U000029B7', - "operp;": '\U000029B9', - "oplus;": '\U00002295', - "or;": '\U00002228', - "orarr;": '\U000021BB', - "ord;": '\U00002A5D', - "order;": '\U00002134', - "orderof;": '\U00002134', - "ordf;": '\U000000AA', - "ordm;": '\U000000BA', - "origof;": '\U000022B6', - "oror;": '\U00002A56', - "orslope;": '\U00002A57', - "orv;": '\U00002A5B', - "oscr;": '\U00002134', - "oslash;": '\U000000F8', - "osol;": '\U00002298', - "otilde;": '\U000000F5', - "otimes;": '\U00002297', - "otimesas;": '\U00002A36', - "ouml;": '\U000000F6', - "ovbar;": '\U0000233D', - "par;": '\U00002225', - "para;": '\U000000B6', - "parallel;": '\U00002225', - "parsim;": '\U00002AF3', - "parsl;": '\U00002AFD', - "part;": '\U00002202', - "pcy;": '\U0000043F', - "percnt;": '\U00000025', - "period;": '\U0000002E', - "permil;": '\U00002030', - "perp;": '\U000022A5', - "pertenk;": '\U00002031', - "pfr;": '\U0001D52D', - "phi;": '\U000003C6', - "phiv;": '\U000003D5', - "phmmat;": '\U00002133', - "phone;": '\U0000260E', - "pi;": '\U000003C0', - "pitchfork;": '\U000022D4', - "piv;": '\U000003D6', - "planck;": '\U0000210F', - "planckh;": '\U0000210E', - "plankv;": '\U0000210F', - "plus;": '\U0000002B', - "plusacir;": '\U00002A23', - "plusb;": '\U0000229E', - "pluscir;": '\U00002A22', - "plusdo;": '\U00002214', - "plusdu;": '\U00002A25', - "pluse;": '\U00002A72', - "plusmn;": '\U000000B1', - "plussim;": '\U00002A26', - "plustwo;": '\U00002A27', - "pm;": '\U000000B1', - "pointint;": '\U00002A15', - "popf;": '\U0001D561', - "pound;": '\U000000A3', - "pr;": '\U0000227A', - "prE;": '\U00002AB3', - "prap;": '\U00002AB7', - "prcue;": '\U0000227C', - "pre;": '\U00002AAF', - "prec;": '\U0000227A', - "precapprox;": '\U00002AB7', - "preccurlyeq;": '\U0000227C', - "preceq;": '\U00002AAF', - "precnapprox;": '\U00002AB9', - "precneqq;": '\U00002AB5', - "precnsim;": '\U000022E8', - "precsim;": '\U0000227E', - "prime;": '\U00002032', - "primes;": '\U00002119', - "prnE;": '\U00002AB5', - "prnap;": '\U00002AB9', - "prnsim;": '\U000022E8', - "prod;": '\U0000220F', - "profalar;": '\U0000232E', - "profline;": '\U00002312', - "profsurf;": '\U00002313', - "prop;": '\U0000221D', - "propto;": '\U0000221D', - "prsim;": '\U0000227E', - "prurel;": '\U000022B0', - "pscr;": '\U0001D4C5', - "psi;": '\U000003C8', - "puncsp;": '\U00002008', - "qfr;": '\U0001D52E', - "qint;": '\U00002A0C', - "qopf;": '\U0001D562', - "qprime;": '\U00002057', - "qscr;": '\U0001D4C6', - "quaternions;": '\U0000210D', - "quatint;": '\U00002A16', - "quest;": '\U0000003F', - "questeq;": '\U0000225F', - "quot;": '\U00000022', - "rAarr;": '\U000021DB', - "rArr;": '\U000021D2', - "rAtail;": '\U0000291C', - "rBarr;": '\U0000290F', - "rHar;": '\U00002964', - "racute;": '\U00000155', - "radic;": '\U0000221A', - "raemptyv;": '\U000029B3', - "rang;": '\U000027E9', - "rangd;": '\U00002992', - "range;": '\U000029A5', - "rangle;": '\U000027E9', - "raquo;": '\U000000BB', - "rarr;": '\U00002192', - "rarrap;": '\U00002975', - "rarrb;": '\U000021E5', - "rarrbfs;": '\U00002920', - "rarrc;": '\U00002933', - "rarrfs;": '\U0000291E', - "rarrhk;": '\U000021AA', - "rarrlp;": '\U000021AC', - "rarrpl;": '\U00002945', - "rarrsim;": '\U00002974', - "rarrtl;": '\U000021A3', - "rarrw;": '\U0000219D', - "ratail;": '\U0000291A', - "ratio;": '\U00002236', - "rationals;": '\U0000211A', - "rbarr;": '\U0000290D', - "rbbrk;": '\U00002773', - "rbrace;": '\U0000007D', - "rbrack;": '\U0000005D', - "rbrke;": '\U0000298C', - "rbrksld;": '\U0000298E', - "rbrkslu;": '\U00002990', - "rcaron;": '\U00000159', - "rcedil;": '\U00000157', - "rceil;": '\U00002309', - "rcub;": '\U0000007D', - "rcy;": '\U00000440', - "rdca;": '\U00002937', - "rdldhar;": '\U00002969', - "rdquo;": '\U0000201D', - "rdquor;": '\U0000201D', - "rdsh;": '\U000021B3', - "real;": '\U0000211C', - "realine;": '\U0000211B', - "realpart;": '\U0000211C', - "reals;": '\U0000211D', - "rect;": '\U000025AD', - "reg;": '\U000000AE', - "rfisht;": '\U0000297D', - "rfloor;": '\U0000230B', - "rfr;": '\U0001D52F', - "rhard;": '\U000021C1', - "rharu;": '\U000021C0', - "rharul;": '\U0000296C', - "rho;": '\U000003C1', - "rhov;": '\U000003F1', - "rightarrow;": '\U00002192', - "rightarrowtail;": '\U000021A3', - "rightharpoondown;": '\U000021C1', - "rightharpoonup;": '\U000021C0', - "rightleftarrows;": '\U000021C4', - "rightleftharpoons;": '\U000021CC', - "rightrightarrows;": '\U000021C9', - "rightsquigarrow;": '\U0000219D', - "rightthreetimes;": '\U000022CC', - "ring;": '\U000002DA', - "risingdotseq;": '\U00002253', - "rlarr;": '\U000021C4', - "rlhar;": '\U000021CC', - "rlm;": '\U0000200F', - "rmoust;": '\U000023B1', - "rmoustache;": '\U000023B1', - "rnmid;": '\U00002AEE', - "roang;": '\U000027ED', - "roarr;": '\U000021FE', - "robrk;": '\U000027E7', - "ropar;": '\U00002986', - "ropf;": '\U0001D563', - "roplus;": '\U00002A2E', - "rotimes;": '\U00002A35', - "rpar;": '\U00000029', - "rpargt;": '\U00002994', - "rppolint;": '\U00002A12', - "rrarr;": '\U000021C9', - "rsaquo;": '\U0000203A', - "rscr;": '\U0001D4C7', - "rsh;": '\U000021B1', - "rsqb;": '\U0000005D', - "rsquo;": '\U00002019', - "rsquor;": '\U00002019', - "rthree;": '\U000022CC', - "rtimes;": '\U000022CA', - "rtri;": '\U000025B9', - "rtrie;": '\U000022B5', - "rtrif;": '\U000025B8', - "rtriltri;": '\U000029CE', - "ruluhar;": '\U00002968', - "rx;": '\U0000211E', - "sacute;": '\U0000015B', - "sbquo;": '\U0000201A', - "sc;": '\U0000227B', - "scE;": '\U00002AB4', - "scap;": '\U00002AB8', - "scaron;": '\U00000161', - "sccue;": '\U0000227D', - "sce;": '\U00002AB0', - "scedil;": '\U0000015F', - "scirc;": '\U0000015D', - "scnE;": '\U00002AB6', - "scnap;": '\U00002ABA', - "scnsim;": '\U000022E9', - "scpolint;": '\U00002A13', - "scsim;": '\U0000227F', - "scy;": '\U00000441', - "sdot;": '\U000022C5', - "sdotb;": '\U000022A1', - "sdote;": '\U00002A66', - "seArr;": '\U000021D8', - "searhk;": '\U00002925', - "searr;": '\U00002198', - "searrow;": '\U00002198', - "sect;": '\U000000A7', - "semi;": '\U0000003B', - "seswar;": '\U00002929', - "setminus;": '\U00002216', - "setmn;": '\U00002216', - "sext;": '\U00002736', - "sfr;": '\U0001D530', - "sfrown;": '\U00002322', - "sharp;": '\U0000266F', - "shchcy;": '\U00000449', - "shcy;": '\U00000448', - "shortmid;": '\U00002223', - "shortparallel;": '\U00002225', - "shy;": '\U000000AD', - "sigma;": '\U000003C3', - "sigmaf;": '\U000003C2', - "sigmav;": '\U000003C2', - "sim;": '\U0000223C', - "simdot;": '\U00002A6A', - "sime;": '\U00002243', - "simeq;": '\U00002243', - "simg;": '\U00002A9E', - "simgE;": '\U00002AA0', - "siml;": '\U00002A9D', - "simlE;": '\U00002A9F', - "simne;": '\U00002246', - "simplus;": '\U00002A24', - "simrarr;": '\U00002972', - "slarr;": '\U00002190', - "smallsetminus;": '\U00002216', - "smashp;": '\U00002A33', - "smeparsl;": '\U000029E4', - "smid;": '\U00002223', - "smile;": '\U00002323', - "smt;": '\U00002AAA', - "smte;": '\U00002AAC', - "softcy;": '\U0000044C', - "sol;": '\U0000002F', - "solb;": '\U000029C4', - "solbar;": '\U0000233F', - "sopf;": '\U0001D564', - "spades;": '\U00002660', - "spadesuit;": '\U00002660', - "spar;": '\U00002225', - "sqcap;": '\U00002293', - "sqcup;": '\U00002294', - "sqsub;": '\U0000228F', - "sqsube;": '\U00002291', - "sqsubset;": '\U0000228F', - "sqsubseteq;": '\U00002291', - "sqsup;": '\U00002290', - "sqsupe;": '\U00002292', - "sqsupset;": '\U00002290', - "sqsupseteq;": '\U00002292', - "squ;": '\U000025A1', - "square;": '\U000025A1', - "squarf;": '\U000025AA', - "squf;": '\U000025AA', - "srarr;": '\U00002192', - "sscr;": '\U0001D4C8', - "ssetmn;": '\U00002216', - "ssmile;": '\U00002323', - "sstarf;": '\U000022C6', - "star;": '\U00002606', - "starf;": '\U00002605', - "straightepsilon;": '\U000003F5', - "straightphi;": '\U000003D5', - "strns;": '\U000000AF', - "sub;": '\U00002282', - "subE;": '\U00002AC5', - "subdot;": '\U00002ABD', - "sube;": '\U00002286', - "subedot;": '\U00002AC3', - "submult;": '\U00002AC1', - "subnE;": '\U00002ACB', - "subne;": '\U0000228A', - "subplus;": '\U00002ABF', - "subrarr;": '\U00002979', - "subset;": '\U00002282', - "subseteq;": '\U00002286', - "subseteqq;": '\U00002AC5', - "subsetneq;": '\U0000228A', - "subsetneqq;": '\U00002ACB', - "subsim;": '\U00002AC7', - "subsub;": '\U00002AD5', - "subsup;": '\U00002AD3', - "succ;": '\U0000227B', - "succapprox;": '\U00002AB8', - "succcurlyeq;": '\U0000227D', - "succeq;": '\U00002AB0', - "succnapprox;": '\U00002ABA', - "succneqq;": '\U00002AB6', - "succnsim;": '\U000022E9', - "succsim;": '\U0000227F', - "sum;": '\U00002211', - "sung;": '\U0000266A', - "sup;": '\U00002283', - "sup1;": '\U000000B9', - "sup2;": '\U000000B2', - "sup3;": '\U000000B3', - "supE;": '\U00002AC6', - "supdot;": '\U00002ABE', - "supdsub;": '\U00002AD8', - "supe;": '\U00002287', - "supedot;": '\U00002AC4', - "suphsol;": '\U000027C9', - "suphsub;": '\U00002AD7', - "suplarr;": '\U0000297B', - "supmult;": '\U00002AC2', - "supnE;": '\U00002ACC', - "supne;": '\U0000228B', - "supplus;": '\U00002AC0', - "supset;": '\U00002283', - "supseteq;": '\U00002287', - "supseteqq;": '\U00002AC6', - "supsetneq;": '\U0000228B', - "supsetneqq;": '\U00002ACC', - "supsim;": '\U00002AC8', - "supsub;": '\U00002AD4', - "supsup;": '\U00002AD6', - "swArr;": '\U000021D9', - "swarhk;": '\U00002926', - "swarr;": '\U00002199', - "swarrow;": '\U00002199', - "swnwar;": '\U0000292A', - "szlig;": '\U000000DF', - "target;": '\U00002316', - "tau;": '\U000003C4', - "tbrk;": '\U000023B4', - "tcaron;": '\U00000165', - "tcedil;": '\U00000163', - "tcy;": '\U00000442', - "tdot;": '\U000020DB', - "telrec;": '\U00002315', - "tfr;": '\U0001D531', - "there4;": '\U00002234', - "therefore;": '\U00002234', - "theta;": '\U000003B8', - "thetasym;": '\U000003D1', - "thetav;": '\U000003D1', - "thickapprox;": '\U00002248', - "thicksim;": '\U0000223C', - "thinsp;": '\U00002009', - "thkap;": '\U00002248', - "thksim;": '\U0000223C', - "thorn;": '\U000000FE', - "tilde;": '\U000002DC', - "times;": '\U000000D7', - "timesb;": '\U000022A0', - "timesbar;": '\U00002A31', - "timesd;": '\U00002A30', - "tint;": '\U0000222D', - "toea;": '\U00002928', - "top;": '\U000022A4', - "topbot;": '\U00002336', - "topcir;": '\U00002AF1', - "topf;": '\U0001D565', - "topfork;": '\U00002ADA', - "tosa;": '\U00002929', - "tprime;": '\U00002034', - "trade;": '\U00002122', - "triangle;": '\U000025B5', - "triangledown;": '\U000025BF', - "triangleleft;": '\U000025C3', - "trianglelefteq;": '\U000022B4', - "triangleq;": '\U0000225C', - "triangleright;": '\U000025B9', - "trianglerighteq;": '\U000022B5', - "tridot;": '\U000025EC', - "trie;": '\U0000225C', - "triminus;": '\U00002A3A', - "triplus;": '\U00002A39', - "trisb;": '\U000029CD', - "tritime;": '\U00002A3B', - "trpezium;": '\U000023E2', - "tscr;": '\U0001D4C9', - "tscy;": '\U00000446', - "tshcy;": '\U0000045B', - "tstrok;": '\U00000167', - "twixt;": '\U0000226C', - "twoheadleftarrow;": '\U0000219E', - "twoheadrightarrow;": '\U000021A0', - "uArr;": '\U000021D1', - "uHar;": '\U00002963', - "uacute;": '\U000000FA', - "uarr;": '\U00002191', - "ubrcy;": '\U0000045E', - "ubreve;": '\U0000016D', - "ucirc;": '\U000000FB', - "ucy;": '\U00000443', - "udarr;": '\U000021C5', - "udblac;": '\U00000171', - "udhar;": '\U0000296E', - "ufisht;": '\U0000297E', - "ufr;": '\U0001D532', - "ugrave;": '\U000000F9', - "uharl;": '\U000021BF', - "uharr;": '\U000021BE', - "uhblk;": '\U00002580', - "ulcorn;": '\U0000231C', - "ulcorner;": '\U0000231C', - "ulcrop;": '\U0000230F', - "ultri;": '\U000025F8', - "umacr;": '\U0000016B', - "uml;": '\U000000A8', - "uogon;": '\U00000173', - "uopf;": '\U0001D566', - "uparrow;": '\U00002191', - "updownarrow;": '\U00002195', - "upharpoonleft;": '\U000021BF', - "upharpoonright;": '\U000021BE', - "uplus;": '\U0000228E', - "upsi;": '\U000003C5', - "upsih;": '\U000003D2', - "upsilon;": '\U000003C5', - "upuparrows;": '\U000021C8', - "urcorn;": '\U0000231D', - "urcorner;": '\U0000231D', - "urcrop;": '\U0000230E', - "uring;": '\U0000016F', - "urtri;": '\U000025F9', - "uscr;": '\U0001D4CA', - "utdot;": '\U000022F0', - "utilde;": '\U00000169', - "utri;": '\U000025B5', - "utrif;": '\U000025B4', - "uuarr;": '\U000021C8', - "uuml;": '\U000000FC', - "uwangle;": '\U000029A7', - "vArr;": '\U000021D5', - "vBar;": '\U00002AE8', - "vBarv;": '\U00002AE9', - "vDash;": '\U000022A8', - "vangrt;": '\U0000299C', - "varepsilon;": '\U000003F5', - "varkappa;": '\U000003F0', - "varnothing;": '\U00002205', - "varphi;": '\U000003D5', - "varpi;": '\U000003D6', - "varpropto;": '\U0000221D', - "varr;": '\U00002195', - "varrho;": '\U000003F1', - "varsigma;": '\U000003C2', - "vartheta;": '\U000003D1', - "vartriangleleft;": '\U000022B2', - "vartriangleright;": '\U000022B3', - "vcy;": '\U00000432', - "vdash;": '\U000022A2', - "vee;": '\U00002228', - "veebar;": '\U000022BB', - "veeeq;": '\U0000225A', - "vellip;": '\U000022EE', - "verbar;": '\U0000007C', - "vert;": '\U0000007C', - "vfr;": '\U0001D533', - "vltri;": '\U000022B2', - "vopf;": '\U0001D567', - "vprop;": '\U0000221D', - "vrtri;": '\U000022B3', - "vscr;": '\U0001D4CB', - "vzigzag;": '\U0000299A', - "wcirc;": '\U00000175', - "wedbar;": '\U00002A5F', - "wedge;": '\U00002227', - "wedgeq;": '\U00002259', - "weierp;": '\U00002118', - "wfr;": '\U0001D534', - "wopf;": '\U0001D568', - "wp;": '\U00002118', - "wr;": '\U00002240', - "wreath;": '\U00002240', - "wscr;": '\U0001D4CC', - "xcap;": '\U000022C2', - "xcirc;": '\U000025EF', - "xcup;": '\U000022C3', - "xdtri;": '\U000025BD', - "xfr;": '\U0001D535', - "xhArr;": '\U000027FA', - "xharr;": '\U000027F7', - "xi;": '\U000003BE', - "xlArr;": '\U000027F8', - "xlarr;": '\U000027F5', - "xmap;": '\U000027FC', - "xnis;": '\U000022FB', - "xodot;": '\U00002A00', - "xopf;": '\U0001D569', - "xoplus;": '\U00002A01', - "xotime;": '\U00002A02', - "xrArr;": '\U000027F9', - "xrarr;": '\U000027F6', - "xscr;": '\U0001D4CD', - "xsqcup;": '\U00002A06', - "xuplus;": '\U00002A04', - "xutri;": '\U000025B3', - "xvee;": '\U000022C1', - "xwedge;": '\U000022C0', - "yacute;": '\U000000FD', - "yacy;": '\U0000044F', - "ycirc;": '\U00000177', - "ycy;": '\U0000044B', - "yen;": '\U000000A5', - "yfr;": '\U0001D536', - "yicy;": '\U00000457', - "yopf;": '\U0001D56A', - "yscr;": '\U0001D4CE', - "yucy;": '\U0000044E', - "yuml;": '\U000000FF', - "zacute;": '\U0000017A', - "zcaron;": '\U0000017E', - "zcy;": '\U00000437', - "zdot;": '\U0000017C', - "zeetrf;": '\U00002128', - "zeta;": '\U000003B6', - "zfr;": '\U0001D537', - "zhcy;": '\U00000436', - "zigrarr;": '\U000021DD', - "zopf;": '\U0001D56B', - "zscr;": '\U0001D4CF', - "zwj;": '\U0000200D', - "zwnj;": '\U0000200C', - "AElig": '\U000000C6', - "AMP": '\U00000026', - "Aacute": '\U000000C1', - "Acirc": '\U000000C2', - "Agrave": '\U000000C0', - "Aring": '\U000000C5', - "Atilde": '\U000000C3', - "Auml": '\U000000C4', - "COPY": '\U000000A9', - "Ccedil": '\U000000C7', - "ETH": '\U000000D0', - "Eacute": '\U000000C9', - "Ecirc": '\U000000CA', - "Egrave": '\U000000C8', - "Euml": '\U000000CB', - "GT": '\U0000003E', - "Iacute": '\U000000CD', - "Icirc": '\U000000CE', - "Igrave": '\U000000CC', - "Iuml": '\U000000CF', - "LT": '\U0000003C', - "Ntilde": '\U000000D1', - "Oacute": '\U000000D3', - "Ocirc": '\U000000D4', - "Ograve": '\U000000D2', - "Oslash": '\U000000D8', - "Otilde": '\U000000D5', - "Ouml": '\U000000D6', - "QUOT": '\U00000022', - "REG": '\U000000AE', - "THORN": '\U000000DE', - "Uacute": '\U000000DA', - "Ucirc": '\U000000DB', - "Ugrave": '\U000000D9', - "Uuml": '\U000000DC', - "Yacute": '\U000000DD', - "aacute": '\U000000E1', - "acirc": '\U000000E2', - "acute": '\U000000B4', - "aelig": '\U000000E6', - "agrave": '\U000000E0', - "amp": '\U00000026', - "aring": '\U000000E5', - "atilde": '\U000000E3', - "auml": '\U000000E4', - "brvbar": '\U000000A6', - "ccedil": '\U000000E7', - "cedil": '\U000000B8', - "cent": '\U000000A2', - "copy": '\U000000A9', - "curren": '\U000000A4', - "deg": '\U000000B0', - "divide": '\U000000F7', - "eacute": '\U000000E9', - "ecirc": '\U000000EA', - "egrave": '\U000000E8', - "eth": '\U000000F0', - "euml": '\U000000EB', - "frac12": '\U000000BD', - "frac14": '\U000000BC', - "frac34": '\U000000BE', - "gt": '\U0000003E', - "iacute": '\U000000ED', - "icirc": '\U000000EE', - "iexcl": '\U000000A1', - "igrave": '\U000000EC', - "iquest": '\U000000BF', - "iuml": '\U000000EF', - "laquo": '\U000000AB', - "lt": '\U0000003C', - "macr": '\U000000AF', - "micro": '\U000000B5', - "middot": '\U000000B7', - "nbsp": '\U000000A0', - "not": '\U000000AC', - "ntilde": '\U000000F1', - "oacute": '\U000000F3', - "ocirc": '\U000000F4', - "ograve": '\U000000F2', - "ordf": '\U000000AA', - "ordm": '\U000000BA', - "oslash": '\U000000F8', - "otilde": '\U000000F5', - "ouml": '\U000000F6', - "para": '\U000000B6', - "plusmn": '\U000000B1', - "pound": '\U000000A3', - "quot": '\U00000022', - "raquo": '\U000000BB', - "reg": '\U000000AE', - "sect": '\U000000A7', - "shy": '\U000000AD', - "sup1": '\U000000B9', - "sup2": '\U000000B2', - "sup3": '\U000000B3', - "szlig": '\U000000DF', - "thorn": '\U000000FE', - "times": '\U000000D7', - "uacute": '\U000000FA', - "ucirc": '\U000000FB', - "ugrave": '\U000000F9', - "uml": '\U000000A8', - "uuml": '\U000000FC', - "yacute": '\U000000FD', - "yen": '\U000000A5', - "yuml": '\U000000FF', -} - -// HTML entities that are two unicode codepoints. -var entity2 = map[string][2]rune{ - // TODO(nigeltao): Handle replacements that are wider than their names. - // "nLt;": {'\u226A', '\u20D2'}, - // "nGt;": {'\u226B', '\u20D2'}, - "NotEqualTilde;": {'\u2242', '\u0338'}, - "NotGreaterFullEqual;": {'\u2267', '\u0338'}, - "NotGreaterGreater;": {'\u226B', '\u0338'}, - "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, - "NotHumpDownHump;": {'\u224E', '\u0338'}, - "NotHumpEqual;": {'\u224F', '\u0338'}, - "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, - "NotLessLess;": {'\u226A', '\u0338'}, - "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, - "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, - "NotNestedLessLess;": {'\u2AA1', '\u0338'}, - "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, - "NotRightTriangleBar;": {'\u29D0', '\u0338'}, - "NotSquareSubset;": {'\u228F', '\u0338'}, - "NotSquareSuperset;": {'\u2290', '\u0338'}, - "NotSubset;": {'\u2282', '\u20D2'}, - "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, - "NotSucceedsTilde;": {'\u227F', '\u0338'}, - "NotSuperset;": {'\u2283', '\u20D2'}, - "ThickSpace;": {'\u205F', '\u200A'}, - "acE;": {'\u223E', '\u0333'}, - "bne;": {'\u003D', '\u20E5'}, - "bnequiv;": {'\u2261', '\u20E5'}, - "caps;": {'\u2229', '\uFE00'}, - "cups;": {'\u222A', '\uFE00'}, - "fjlig;": {'\u0066', '\u006A'}, - "gesl;": {'\u22DB', '\uFE00'}, - "gvertneqq;": {'\u2269', '\uFE00'}, - "gvnE;": {'\u2269', '\uFE00'}, - "lates;": {'\u2AAD', '\uFE00'}, - "lesg;": {'\u22DA', '\uFE00'}, - "lvertneqq;": {'\u2268', '\uFE00'}, - "lvnE;": {'\u2268', '\uFE00'}, - "nGg;": {'\u22D9', '\u0338'}, - "nGtv;": {'\u226B', '\u0338'}, - "nLl;": {'\u22D8', '\u0338'}, - "nLtv;": {'\u226A', '\u0338'}, - "nang;": {'\u2220', '\u20D2'}, - "napE;": {'\u2A70', '\u0338'}, - "napid;": {'\u224B', '\u0338'}, - "nbump;": {'\u224E', '\u0338'}, - "nbumpe;": {'\u224F', '\u0338'}, - "ncongdot;": {'\u2A6D', '\u0338'}, - "nedot;": {'\u2250', '\u0338'}, - "nesim;": {'\u2242', '\u0338'}, - "ngE;": {'\u2267', '\u0338'}, - "ngeqq;": {'\u2267', '\u0338'}, - "ngeqslant;": {'\u2A7E', '\u0338'}, - "nges;": {'\u2A7E', '\u0338'}, - "nlE;": {'\u2266', '\u0338'}, - "nleqq;": {'\u2266', '\u0338'}, - "nleqslant;": {'\u2A7D', '\u0338'}, - "nles;": {'\u2A7D', '\u0338'}, - "notinE;": {'\u22F9', '\u0338'}, - "notindot;": {'\u22F5', '\u0338'}, - "nparsl;": {'\u2AFD', '\u20E5'}, - "npart;": {'\u2202', '\u0338'}, - "npre;": {'\u2AAF', '\u0338'}, - "npreceq;": {'\u2AAF', '\u0338'}, - "nrarrc;": {'\u2933', '\u0338'}, - "nrarrw;": {'\u219D', '\u0338'}, - "nsce;": {'\u2AB0', '\u0338'}, - "nsubE;": {'\u2AC5', '\u0338'}, - "nsubset;": {'\u2282', '\u20D2'}, - "nsubseteqq;": {'\u2AC5', '\u0338'}, - "nsucceq;": {'\u2AB0', '\u0338'}, - "nsupE;": {'\u2AC6', '\u0338'}, - "nsupset;": {'\u2283', '\u20D2'}, - "nsupseteqq;": {'\u2AC6', '\u0338'}, - "nvap;": {'\u224D', '\u20D2'}, - "nvge;": {'\u2265', '\u20D2'}, - "nvgt;": {'\u003E', '\u20D2'}, - "nvle;": {'\u2264', '\u20D2'}, - "nvlt;": {'\u003C', '\u20D2'}, - "nvltrie;": {'\u22B4', '\u20D2'}, - "nvrtrie;": {'\u22B5', '\u20D2'}, - "nvsim;": {'\u223C', '\u20D2'}, - "race;": {'\u223D', '\u0331'}, - "smtes;": {'\u2AAC', '\uFE00'}, - "sqcaps;": {'\u2293', '\uFE00'}, - "sqcups;": {'\u2294', '\uFE00'}, - "varsubsetneq;": {'\u228A', '\uFE00'}, - "varsubsetneqq;": {'\u2ACB', '\uFE00'}, - "varsupsetneq;": {'\u228B', '\uFE00'}, - "varsupsetneqq;": {'\u2ACC', '\uFE00'}, - "vnsub;": {'\u2282', '\u20D2'}, - "vnsup;": {'\u2283', '\u20D2'}, - "vsubnE;": {'\u2ACB', '\uFE00'}, - "vsubne;": {'\u228A', '\uFE00'}, - "vsupnE;": {'\u2ACC', '\uFE00'}, - "vsupne;": {'\u228B', '\uFE00'}, -} diff --git a/src/pkg/exp/html/entity_test.go b/src/pkg/exp/html/entity_test.go deleted file mode 100644 index b53f866fa2..0000000000 --- a/src/pkg/exp/html/entity_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "testing" - "unicode/utf8" -) - -func TestEntityLength(t *testing.T) { - // We verify that the length of UTF-8 encoding of each value is <= 1 + len(key). - // The +1 comes from the leading "&". This property implies that the length of - // unescaped text is <= the length of escaped text. - for k, v := range entity { - if 1+len(k) < utf8.RuneLen(v) { - t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v)) - } - if len(k) > longestEntityWithoutSemicolon && k[len(k)-1] != ';' { - t.Errorf("entity name %s is %d characters, but longestEntityWithoutSemicolon=%d", k, len(k), longestEntityWithoutSemicolon) - } - } - for k, v := range entity2 { - if 1+len(k) < utf8.RuneLen(v[0])+utf8.RuneLen(v[1]) { - t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v[0]) + string(v[1])) - } - } -} diff --git a/src/pkg/exp/html/escape.go b/src/pkg/exp/html/escape.go deleted file mode 100644 index 8f62a8c288..0000000000 --- a/src/pkg/exp/html/escape.go +++ /dev/null @@ -1,253 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bytes" - "strings" - "unicode/utf8" -) - -// These replacements permit compatibility with old numeric entities that -// assumed Windows-1252 encoding. -// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference -var replacementTable = [...]rune{ - '\u20AC', // First entry is what 0x80 should be replaced with. - '\u0081', - '\u201A', - '\u0192', - '\u201E', - '\u2026', - '\u2020', - '\u2021', - '\u02C6', - '\u2030', - '\u0160', - '\u2039', - '\u0152', - '\u008D', - '\u017D', - '\u008F', - '\u0090', - '\u2018', - '\u2019', - '\u201C', - '\u201D', - '\u2022', - '\u2013', - '\u2014', - '\u02DC', - '\u2122', - '\u0161', - '\u203A', - '\u0153', - '\u009D', - '\u017E', - '\u0178', // Last entry is 0x9F. - // 0x00->'\uFFFD' is handled programmatically. - // 0x0D->'\u000D' is a no-op. -} - -// unescapeEntity reads an entity like "<" from b[src:] and writes the -// corresponding "<" to b[dst:], returning the incremented dst and src cursors. -// Precondition: b[src] == '&' && dst <= src. -// attribute should be true if parsing an attribute value. -func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { - // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference - - // i starts at 1 because we already know that s[0] == '&'. - i, s := 1, b[src:] - - if len(s) <= 1 { - b[dst] = b[src] - return dst + 1, src + 1 - } - - if s[i] == '#' { - if len(s) <= 3 { // We need to have at least "&#.". - b[dst] = b[src] - return dst + 1, src + 1 - } - i++ - c := s[i] - hex := false - if c == 'x' || c == 'X' { - hex = true - i++ - } - - x := '\x00' - for i < len(s) { - c = s[i] - i++ - if hex { - if '0' <= c && c <= '9' { - x = 16*x + rune(c) - '0' - continue - } else if 'a' <= c && c <= 'f' { - x = 16*x + rune(c) - 'a' + 10 - continue - } else if 'A' <= c && c <= 'F' { - x = 16*x + rune(c) - 'A' + 10 - continue - } - } else if '0' <= c && c <= '9' { - x = 10*x + rune(c) - '0' - continue - } - if c != ';' { - i-- - } - break - } - - if i <= 3 { // No characters matched. - b[dst] = b[src] - return dst + 1, src + 1 - } - - if 0x80 <= x && x <= 0x9F { - // Replace characters from Windows-1252 with UTF-8 equivalents. - x = replacementTable[x-0x80] - } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { - // Replace invalid characters with the replacement character. - x = '\uFFFD' - } - - return dst + utf8.EncodeRune(b[dst:], x), src + i - } - - // Consume the maximum number of characters possible, with the - // consumed characters matching one of the named references. - - for i < len(s) { - c := s[i] - i++ - // Lower-cased characters are more common in entities, so we check for them first. - if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { - continue - } - if c != ';' { - i-- - } - break - } - - entityName := string(s[1:i]) - if entityName == "" { - // No-op. - } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { - // No-op. - } else if x := entity[entityName]; x != 0 { - return dst + utf8.EncodeRune(b[dst:], x), src + i - } else if x := entity2[entityName]; x[0] != 0 { - dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) - return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i - } else if !attribute { - maxLen := len(entityName) - 1 - if maxLen > longestEntityWithoutSemicolon { - maxLen = longestEntityWithoutSemicolon - } - for j := maxLen; j > 1; j-- { - if x := entity[entityName[:j]]; x != 0 { - return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 - } - } - } - - dst1, src1 = dst+i, src+i - copy(b[dst:dst1], b[src:src1]) - return dst1, src1 -} - -// unescape unescapes b's entities in-place, so that "a<b" becomes "a<b". -func unescape(b []byte) []byte { - for i, c := range b { - if c == '&' { - dst, src := unescapeEntity(b, i, i, false) - for src < len(b) { - c := b[src] - if c == '&' { - dst, src = unescapeEntity(b, dst, src, false) - } else { - b[dst] = c - dst, src = dst+1, src+1 - } - } - return b[0:dst] - } - } - return b -} - -// lower lower-cases the A-Z bytes in b in-place, so that "aBc" becomes "abc". -func lower(b []byte) []byte { - for i, c := range b { - if 'A' <= c && c <= 'Z' { - b[i] = c + 'a' - 'A' - } - } - return b -} - -const escapedChars = `&'<>"` - -func escape(w writer, s string) error { - i := strings.IndexAny(s, escapedChars) - for i != -1 { - if _, err := w.WriteString(s[:i]); err != nil { - return err - } - var esc string - switch s[i] { - case '&': - esc = "&" - case '\'': - esc = "'" - case '<': - esc = "<" - case '>': - esc = ">" - case '"': - esc = """ - default: - panic("unrecognized escape character") - } - s = s[i+1:] - if _, err := w.WriteString(esc); err != nil { - return err - } - i = strings.IndexAny(s, escapedChars) - } - _, err := w.WriteString(s) - return err -} - -// EscapeString escapes special characters like "<" to become "<". It -// escapes only five such characters: amp, apos, lt, gt and quot. -// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't -// always true. -func EscapeString(s string) string { - if strings.IndexAny(s, escapedChars) == -1 { - return s - } - var buf bytes.Buffer - escape(&buf, s) - return buf.String() -} - -// UnescapeString unescapes entities like "<" to become "<". It unescapes a -// larger range of entities than EscapeString escapes. For example, "á" -// unescapes to "á", as does "á" and "&xE1;". -// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't -// always true. -func UnescapeString(s string) string { - for _, c := range s { - if c == '&' { - return string(unescape([]byte(s))) - } - } - return s -} diff --git a/src/pkg/exp/html/foreign.go b/src/pkg/exp/html/foreign.go deleted file mode 100644 index 3ba81ce4d6..0000000000 --- a/src/pkg/exp/html/foreign.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "strings" -) - -func adjustForeignAttributes(aa []Attribute) { - for i, a := range aa { - if a.Key == "" || a.Key[0] != 'x' { - continue - } - switch a.Key { - case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", - "xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink": - j := strings.Index(a.Key, ":") - aa[i].Namespace = a.Key[:j] - aa[i].Key = a.Key[j+1:] - } - } -} - -func htmlIntegrationPoint(n *Node) bool { - if n.Type != ElementNode { - return false - } - switch n.Namespace { - case "math": - // TODO: annotation-xml elements whose start tags have "text/html" or - // "application/xhtml+xml" encodings. - case "svg": - switch n.Data { - case "desc", "foreignObject", "title": - return true - } - } - return false -} - -// Section 12.2.5.5. -var breakout = map[string]bool{ - "b": true, - "big": true, - "blockquote": true, - "body": true, - "br": true, - "center": true, - "code": true, - "dd": true, - "div": true, - "dl": true, - "dt": true, - "em": true, - "embed": true, - "font": true, - "h1": true, - "h2": true, - "h3": true, - "h4": true, - "h5": true, - "h6": true, - "head": true, - "hr": true, - "i": true, - "img": true, - "li": true, - "listing": true, - "menu": true, - "meta": true, - "nobr": true, - "ol": true, - "p": true, - "pre": true, - "ruby": true, - "s": true, - "small": true, - "span": true, - "strong": true, - "strike": true, - "sub": true, - "sup": true, - "table": true, - "tt": true, - "u": true, - "ul": true, - "var": true, -} - -// Section 12.2.5.5. -var svgTagNameAdjustments = map[string]string{ - "altglyph": "altGlyph", - "altglyphdef": "altGlyphDef", - "altglyphitem": "altGlyphItem", - "animatecolor": "animateColor", - "animatemotion": "animateMotion", - "animatetransform": "animateTransform", - "clippath": "clipPath", - "feblend": "feBlend", - "fecolormatrix": "feColorMatrix", - "fecomponenttransfer": "feComponentTransfer", - "fecomposite": "feComposite", - "feconvolvematrix": "feConvolveMatrix", - "fediffuselighting": "feDiffuseLighting", - "fedisplacementmap": "feDisplacementMap", - "fedistantlight": "feDistantLight", - "feflood": "feFlood", - "fefunca": "feFuncA", - "fefuncb": "feFuncB", - "fefuncg": "feFuncG", - "fefuncr": "feFuncR", - "fegaussianblur": "feGaussianBlur", - "feimage": "feImage", - "femerge": "feMerge", - "femergenode": "feMergeNode", - "femorphology": "feMorphology", - "feoffset": "feOffset", - "fepointlight": "fePointLight", - "fespecularlighting": "feSpecularLighting", - "fespotlight": "feSpotLight", - "fetile": "feTile", - "feturbulence": "feTurbulence", - "foreignobject": "foreignObject", - "glyphref": "glyphRef", - "lineargradient": "linearGradient", - "radialgradient": "radialGradient", - "textpath": "textPath", -} - -// TODO: add look-up tables for MathML and SVG attribute adjustments. diff --git a/src/pkg/exp/html/node.go b/src/pkg/exp/html/node.go deleted file mode 100644 index c105a4e709..0000000000 --- a/src/pkg/exp/html/node.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -// A NodeType is the type of a Node. -type NodeType int - -const ( - ErrorNode NodeType = iota - TextNode - DocumentNode - ElementNode - CommentNode - DoctypeNode - scopeMarkerNode -) - -// Section 12.2.3.3 says "scope markers are inserted when entering applet -// elements, buttons, object elements, marquees, table cells, and table -// captions, and are used to prevent formatting from 'leaking'". -var scopeMarker = Node{Type: scopeMarkerNode} - -// A Node consists of a NodeType and some Data (tag name for element nodes, -// content for text) and are part of a tree of Nodes. Element nodes may also -// have a Namespace and contain a slice of Attributes. Data is unescaped, so -// that it looks like "a<b" rather than "a<b". -// -// An empty Namespace implies a "http://www.w3.org/1999/xhtml" namespace. -// Similarly, "math" is short for "http://www.w3.org/1998/Math/MathML", and -// "svg" is short for "http://www.w3.org/2000/svg". -type Node struct { - Parent *Node - Child []*Node - Type NodeType - Data string - Namespace string - Attr []Attribute -} - -// Add adds a node as a child of n. -// It will panic if the child's parent is not nil. -func (n *Node) Add(child *Node) { - if child.Parent != nil { - panic("html: Node.Add called for a child Node that already has a parent") - } - child.Parent = n - n.Child = append(n.Child, child) -} - -// Remove removes a node as a child of n. -// It will panic if the child's parent is not n. -func (n *Node) Remove(child *Node) { - if child.Parent == n { - child.Parent = nil - for i, m := range n.Child { - if m == child { - copy(n.Child[i:], n.Child[i+1:]) - j := len(n.Child) - 1 - n.Child[j] = nil - n.Child = n.Child[:j] - return - } - } - } - panic("html: Node.Remove called for a non-child Node") -} - -// reparentChildren reparents all of src's child nodes to dst. -func reparentChildren(dst, src *Node) { - for _, n := range src.Child { - if n.Parent != src { - panic("html: nodes have an inconsistent parent/child relationship") - } - n.Parent = dst - } - dst.Child = append(dst.Child, src.Child...) - src.Child = nil -} - -// clone returns a new node with the same type, data and attributes. -// The clone has no parent and no children. -func (n *Node) clone() *Node { - m := &Node{ - Type: n.Type, - Data: n.Data, - Attr: make([]Attribute, len(n.Attr)), - } - copy(m.Attr, n.Attr) - return m -} - -// nodeStack is a stack of nodes. -type nodeStack []*Node - -// pop pops the stack. It will panic if s is empty. -func (s *nodeStack) pop() *Node { - i := len(*s) - n := (*s)[i-1] - *s = (*s)[:i-1] - return n -} - -// top returns the most recently pushed node, or nil if s is empty. -func (s *nodeStack) top() *Node { - if i := len(*s); i > 0 { - return (*s)[i-1] - } - return nil -} - -// index returns the index of the top-most occurrence of n in the stack, or -1 -// if n is not present. -func (s *nodeStack) index(n *Node) int { - for i := len(*s) - 1; i >= 0; i-- { - if (*s)[i] == n { - return i - } - } - return -1 -} - -// insert inserts a node at the given index. -func (s *nodeStack) insert(i int, n *Node) { - (*s) = append(*s, nil) - copy((*s)[i+1:], (*s)[i:]) - (*s)[i] = n -} - -// remove removes a node from the stack. It is a no-op if n is not present. -func (s *nodeStack) remove(n *Node) { - i := s.index(n) - if i == -1 { - return - } - copy((*s)[i:], (*s)[i+1:]) - j := len(*s) - 1 - (*s)[j] = nil - *s = (*s)[:j] -} - -// TODO(nigeltao): forTag no longer used. Should it be deleted? - -// forTag returns the top-most element node with the given tag. -func (s *nodeStack) forTag(tag string) *Node { - for i := len(*s) - 1; i >= 0; i-- { - n := (*s)[i] - if n.Type == ElementNode && n.Data == tag { - return n - } - } - return nil -} diff --git a/src/pkg/exp/html/parse.go b/src/pkg/exp/html/parse.go deleted file mode 100644 index 04f4ae7533..0000000000 --- a/src/pkg/exp/html/parse.go +++ /dev/null @@ -1,1869 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "io" - "strings" -) - -// A parser implements the HTML5 parsing algorithm: -// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tree-construction -type parser struct { - // tokenizer provides the tokens for the parser. - tokenizer *Tokenizer - // tok is the most recently read token. - tok Token - // Self-closing tags like <hr/> are re-interpreted as a two-token sequence: - // <hr> followed by </hr>. hasSelfClosingToken is true if we have just read - // the synthetic start tag and the next one due is the matching end tag. - hasSelfClosingToken bool - // doc is the document root element. - doc *Node - // The stack of open elements (section 12.2.3.2) and active formatting - // elements (section 12.2.3.3). - oe, afe nodeStack - // Element pointers (section 12.2.3.4). - head, form *Node - // Other parsing state flags (section 12.2.3.5). - scripting, framesetOK bool - // im is the current insertion mode. - im insertionMode - // originalIM is the insertion mode to go back to after completing a text - // or inTableText insertion mode. - originalIM insertionMode - // fosterParenting is whether new elements should be inserted according to - // the foster parenting rules (section 12.2.5.3). - fosterParenting bool - // quirks is whether the parser is operating in "quirks mode." - quirks bool - // context is the context element when parsing an HTML fragment - // (section 12.4). - context *Node -} - -func (p *parser) top() *Node { - if n := p.oe.top(); n != nil { - return n - } - return p.doc -} - -// Stop tags for use in popUntil. These come from section 12.2.3.2. -var ( - defaultScopeStopTags = map[string][]string{ - "": {"applet", "caption", "html", "table", "td", "th", "marquee", "object"}, - "math": {"annotation-xml", "mi", "mn", "mo", "ms", "mtext"}, - "svg": {"desc", "foreignObject", "title"}, - } -) - -type scope int - -const ( - defaultScope scope = iota - listItemScope - buttonScope - tableScope - tableRowScope -) - -// popUntil pops the stack of open elements at the highest element whose tag -// is in matchTags, provided there is no higher element in the scope's stop -// tags (as defined in section 12.2.3.2). It returns whether or not there was -// such an element. If there was not, popUntil leaves the stack unchanged. -// -// For example, the set of stop tags for table scope is: "html", "table". If -// the stack was: -// ["html", "body", "font", "table", "b", "i", "u"] -// then popUntil(tableScope, "font") would return false, but -// popUntil(tableScope, "i") would return true and the stack would become: -// ["html", "body", "font", "table", "b"] -// -// If an element's tag is in both the stop tags and matchTags, then the stack -// will be popped and the function returns true (provided, of course, there was -// no higher element in the stack that was also in the stop tags). For example, -// popUntil(tableScope, "table") returns true and leaves: -// ["html", "body", "font"] -func (p *parser) popUntil(s scope, matchTags ...string) bool { - if i := p.indexOfElementInScope(s, matchTags...); i != -1 { - p.oe = p.oe[:i] - return true - } - return false -} - -// indexOfElementInScope returns the index in p.oe of the highest element whose -// tag is in matchTags that is in scope. If no matching element is in scope, it -// returns -1. -func (p *parser) indexOfElementInScope(s scope, matchTags ...string) int { - for i := len(p.oe) - 1; i >= 0; i-- { - tag := p.oe[i].Data - if p.oe[i].Namespace == "" { - for _, t := range matchTags { - if t == tag { - return i - } - } - switch s { - case defaultScope: - // No-op. - case listItemScope: - if tag == "ol" || tag == "ul" { - return -1 - } - case buttonScope: - if tag == "button" { - return -1 - } - case tableScope: - if tag == "html" || tag == "table" { - return -1 - } - default: - panic("unreachable") - } - } - switch s { - case defaultScope, listItemScope, buttonScope: - for _, t := range defaultScopeStopTags[p.oe[i].Namespace] { - if t == tag { - return -1 - } - } - } - } - return -1 -} - -// elementInScope is like popUntil, except that it doesn't modify the stack of -// open elements. -func (p *parser) elementInScope(s scope, matchTags ...string) bool { - return p.indexOfElementInScope(s, matchTags...) != -1 -} - -// clearStackToContext pops elements off the stack of open elements until a -// scope-defined element is found. -func (p *parser) clearStackToContext(s scope) { - for i := len(p.oe) - 1; i >= 0; i-- { - tag := p.oe[i].Data - switch s { - case tableScope: - if tag == "html" || tag == "table" { - p.oe = p.oe[:i+1] - return - } - case tableRowScope: - if tag == "html" || tag == "tr" { - p.oe = p.oe[:i+1] - return - } - default: - panic("unreachable") - } - } -} - -// addChild adds a child node n to the top element, and pushes n onto the stack -// of open elements if it is an element node. -func (p *parser) addChild(n *Node) { - if p.fosterParenting { - p.fosterParent(n) - } else { - p.top().Add(n) - } - - if n.Type == ElementNode { - p.oe = append(p.oe, n) - } -} - -// fosterParent adds a child node according to the foster parenting rules. -// Section 12.2.5.3, "foster parenting". -func (p *parser) fosterParent(n *Node) { - p.fosterParenting = false - var table, parent *Node - var i int - for i = len(p.oe) - 1; i >= 0; i-- { - if p.oe[i].Data == "table" { - table = p.oe[i] - break - } - } - - if table == nil { - // The foster parent is the html element. - parent = p.oe[0] - } else { - parent = table.Parent - } - if parent == nil { - parent = p.oe[i-1] - } - - var child *Node - for i, child = range parent.Child { - if child == table { - break - } - } - - if i > 0 && parent.Child[i-1].Type == TextNode && n.Type == TextNode { - parent.Child[i-1].Data += n.Data - return - } - - if i == len(parent.Child) { - parent.Add(n) - } else { - // Insert n into parent.Child at index i. - parent.Child = append(parent.Child[:i+1], parent.Child[i:]...) - parent.Child[i] = n - n.Parent = parent - } -} - -// addText adds text to the preceding node if it is a text node, or else it -// calls addChild with a new text node. -func (p *parser) addText(text string) { - // TODO: distinguish whitespace text from others. - t := p.top() - if i := len(t.Child); i > 0 && t.Child[i-1].Type == TextNode { - t.Child[i-1].Data += text - return - } - p.addChild(&Node{ - Type: TextNode, - Data: text, - }) -} - -// addElement calls addChild with an element node. -func (p *parser) addElement(tag string, attr []Attribute) { - p.addChild(&Node{ - Type: ElementNode, - Data: tag, - Attr: attr, - }) -} - -// Section 12.2.3.3. -func (p *parser) addFormattingElement(tag string, attr []Attribute) { - p.addElement(tag, attr) - p.afe = append(p.afe, p.top()) - // TODO. -} - -// Section 12.2.3.3. -func (p *parser) clearActiveFormattingElements() { - for { - n := p.afe.pop() - if len(p.afe) == 0 || n.Type == scopeMarkerNode { - return - } - } -} - -// Section 12.2.3.3. -func (p *parser) reconstructActiveFormattingElements() { - n := p.afe.top() - if n == nil { - return - } - if n.Type == scopeMarkerNode || p.oe.index(n) != -1 { - return - } - i := len(p.afe) - 1 - for n.Type != scopeMarkerNode && p.oe.index(n) == -1 { - if i == 0 { - i = -1 - break - } - i-- - n = p.afe[i] - } - for { - i++ - clone := p.afe[i].clone() - p.addChild(clone) - p.afe[i] = clone - if i == len(p.afe)-1 { - break - } - } -} - -// read reads the next token. This is usually from the tokenizer, but it may -// be the synthesized end tag implied by a self-closing tag. -func (p *parser) read() error { - if p.hasSelfClosingToken { - p.hasSelfClosingToken = false - p.tok.Type = EndTagToken - p.tok.Attr = nil - return nil - } - p.tokenizer.Next() - p.tok = p.tokenizer.Token() - switch p.tok.Type { - case ErrorToken: - return p.tokenizer.Err() - case SelfClosingTagToken: - p.hasSelfClosingToken = true - p.tok.Type = StartTagToken - } - return nil -} - -// Section 12.2.4. -func (p *parser) acknowledgeSelfClosingTag() { - p.hasSelfClosingToken = false -} - -// An insertion mode (section 12.2.3.1) is the state transition function from -// a particular state in the HTML5 parser's state machine. It updates the -// parser's fields depending on parser.tok (where ErrorToken means EOF). -// It returns whether the token was consumed. -type insertionMode func(*parser) bool - -// setOriginalIM sets the insertion mode to return to after completing a text or -// inTableText insertion mode. -// Section 12.2.3.1, "using the rules for". -func (p *parser) setOriginalIM() { - if p.originalIM != nil { - panic("html: bad parser state: originalIM was set twice") - } - p.originalIM = p.im -} - -// Section 12.2.3.1, "reset the insertion mode". -func (p *parser) resetInsertionMode() { - for i := len(p.oe) - 1; i >= 0; i-- { - n := p.oe[i] - if i == 0 && p.context != nil { - n = p.context - } - - switch n.Data { - case "select": - p.im = inSelectIM - case "td", "th": - p.im = inCellIM - case "tr": - p.im = inRowIM - case "tbody", "thead", "tfoot": - p.im = inTableBodyIM - case "caption": - p.im = inCaptionIM - case "colgroup": - p.im = inColumnGroupIM - case "table": - p.im = inTableIM - case "head": - p.im = inBodyIM - case "body": - p.im = inBodyIM - case "frameset": - p.im = inFramesetIM - case "html": - p.im = beforeHeadIM - default: - continue - } - return - } - p.im = inBodyIM -} - -const whitespace = " \t\r\n\f" - -// Section 12.2.5.4.1. -func initialIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) - if len(p.tok.Data) == 0 { - // It was all whitespace, so ignore it. - return true - } - case CommentToken: - p.doc.Add(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - n, quirks := parseDoctype(p.tok.Data) - p.doc.Add(n) - p.quirks = quirks - p.im = beforeHTMLIM - return true - } - p.quirks = true - p.im = beforeHTMLIM - return false -} - -// Section 12.2.5.4.2. -func beforeHTMLIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) - if len(p.tok.Data) == 0 { - // It was all whitespace, so ignore it. - return true - } - case StartTagToken: - if p.tok.Data == "html" { - p.addElement(p.tok.Data, p.tok.Attr) - p.im = beforeHeadIM - return true - } - case EndTagToken: - switch p.tok.Data { - case "head", "body", "html", "br": - // Drop down to creating an implied <html> tag. - default: - // Ignore the token. - return true - } - case CommentToken: - p.doc.Add(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - // Create an implied <html> tag. - p.addElement("html", nil) - p.im = beforeHeadIM - return false -} - -// Section 12.2.5.4.3. -func beforeHeadIM(p *parser) bool { - var ( - add bool - attr []Attribute - implied bool - ) - switch p.tok.Type { - case ErrorToken: - implied = true - case TextToken: - p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) - if len(p.tok.Data) == 0 { - // It was all whitespace, so ignore it. - return true - } - implied = true - case StartTagToken: - switch p.tok.Data { - case "head": - add = true - attr = p.tok.Attr - case "html": - return inBodyIM(p) - default: - implied = true - } - case EndTagToken: - switch p.tok.Data { - case "head", "body", "html", "br": - implied = true - default: - // Ignore the token. - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - if add || implied { - p.addElement("head", attr) - p.head = p.top() - } - p.im = inHeadIM - return !implied -} - -// Section 12.2.5.4.4. -func inHeadIM(p *parser) bool { - var ( - pop bool - implied bool - ) - switch p.tok.Type { - case ErrorToken: - implied = true - case TextToken: - s := strings.TrimLeft(p.tok.Data, whitespace) - if len(s) < len(p.tok.Data) { - // Add the initial whitespace to the current node. - p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) - if s == "" { - return true - } - p.tok.Data = s - } - implied = true - case StartTagToken: - switch p.tok.Data { - case "html": - return inBodyIM(p) - case "base", "basefont", "bgsound", "command", "link", "meta": - p.addElement(p.tok.Data, p.tok.Attr) - p.oe.pop() - p.acknowledgeSelfClosingTag() - case "script", "title", "noscript", "noframes", "style": - p.addElement(p.tok.Data, p.tok.Attr) - p.setOriginalIM() - p.im = textIM - return true - case "head": - // Ignore the token. - return true - default: - implied = true - } - case EndTagToken: - switch p.tok.Data { - case "head": - pop = true - case "body", "html", "br": - implied = true - default: - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - if pop || implied { - n := p.oe.pop() - if n.Data != "head" { - panic("html: bad parser state: <head> element not found, in the in-head insertion mode") - } - p.im = afterHeadIM - return !implied - } - return true -} - -// Section 12.2.5.4.6. -func afterHeadIM(p *parser) bool { - var ( - add bool - attr []Attribute - framesetOK bool - implied bool - ) - switch p.tok.Type { - case ErrorToken: - implied = true - framesetOK = true - case TextToken: - s := strings.TrimLeft(p.tok.Data, whitespace) - if len(s) < len(p.tok.Data) { - // Add the initial whitespace to the current node. - p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) - if s == "" { - return true - } - p.tok.Data = s - } - implied = true - framesetOK = true - case StartTagToken: - switch p.tok.Data { - case "html": - // TODO. - case "body": - add = true - attr = p.tok.Attr - framesetOK = false - case "frameset": - p.addElement(p.tok.Data, p.tok.Attr) - p.im = inFramesetIM - return true - case "base", "basefont", "bgsound", "link", "meta", "noframes", "script", "style", "title": - p.oe = append(p.oe, p.head) - defer p.oe.pop() - return inHeadIM(p) - case "head": - // Ignore the token. - return true - default: - implied = true - framesetOK = true - } - case EndTagToken: - switch p.tok.Data { - case "body", "html", "br": - implied = true - framesetOK = true - default: - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - if add || implied { - p.addElement("body", attr) - p.framesetOK = framesetOK - } - p.im = inBodyIM - return !implied -} - -// copyAttributes copies attributes of src not found on dst to dst. -func copyAttributes(dst *Node, src Token) { - if len(src.Attr) == 0 { - return - } - attr := map[string]string{} - for _, a := range dst.Attr { - attr[a.Key] = a.Val - } - for _, a := range src.Attr { - if _, ok := attr[a.Key]; !ok { - dst.Attr = append(dst.Attr, a) - attr[a.Key] = a.Val - } - } -} - -// Section 12.2.5.4.7. -func inBodyIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - switch n := p.oe.top(); n.Data { - case "pre", "listing", "textarea": - if len(n.Child) == 0 { - // Ignore a newline at the start of a <pre> block. - d := p.tok.Data - if d != "" && d[0] == '\r' { - d = d[1:] - } - if d != "" && d[0] == '\n' { - d = d[1:] - } - if d == "" { - return true - } - p.tok.Data = d - } - } - p.reconstructActiveFormattingElements() - p.addText(p.tok.Data) - p.framesetOK = false - case StartTagToken: - switch p.tok.Data { - case "html": - copyAttributes(p.oe[0], p.tok) - case "address", "article", "aside", "blockquote", "center", "details", "dir", "div", "dl", "fieldset", "figcaption", "figure", "footer", "header", "hgroup", "menu", "nav", "ol", "p", "section", "summary", "ul": - p.popUntil(buttonScope, "p") - p.addElement(p.tok.Data, p.tok.Attr) - case "h1", "h2", "h3", "h4", "h5", "h6": - p.popUntil(buttonScope, "p") - switch n := p.top(); n.Data { - case "h1", "h2", "h3", "h4", "h5", "h6": - p.oe.pop() - } - p.addElement(p.tok.Data, p.tok.Attr) - case "a": - for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- { - if n := p.afe[i]; n.Type == ElementNode && n.Data == "a" { - p.inBodyEndTagFormatting("a") - p.oe.remove(n) - p.afe.remove(n) - break - } - } - p.reconstructActiveFormattingElements() - p.addFormattingElement(p.tok.Data, p.tok.Attr) - case "b", "big", "code", "em", "font", "i", "s", "small", "strike", "strong", "tt", "u": - p.reconstructActiveFormattingElements() - p.addFormattingElement(p.tok.Data, p.tok.Attr) - case "nobr": - p.reconstructActiveFormattingElements() - if p.elementInScope(defaultScope, "nobr") { - p.inBodyEndTagFormatting("nobr") - p.reconstructActiveFormattingElements() - } - p.addFormattingElement(p.tok.Data, p.tok.Attr) - case "applet", "marquee", "object": - p.reconstructActiveFormattingElements() - p.addElement(p.tok.Data, p.tok.Attr) - p.afe = append(p.afe, &scopeMarker) - p.framesetOK = false - case "area", "br", "embed", "img", "input", "keygen", "wbr": - p.reconstructActiveFormattingElements() - p.addElement(p.tok.Data, p.tok.Attr) - p.oe.pop() - p.acknowledgeSelfClosingTag() - p.framesetOK = false - case "table": - if !p.quirks { - p.popUntil(buttonScope, "p") - } - p.addElement(p.tok.Data, p.tok.Attr) - p.framesetOK = false - p.im = inTableIM - return true - case "hr": - p.popUntil(buttonScope, "p") - p.addElement(p.tok.Data, p.tok.Attr) - p.oe.pop() - p.acknowledgeSelfClosingTag() - p.framesetOK = false - case "select": - p.reconstructActiveFormattingElements() - p.addElement(p.tok.Data, p.tok.Attr) - p.framesetOK = false - p.im = inSelectIM - return true - case "form": - if p.form == nil { - p.popUntil(buttonScope, "p") - p.addElement(p.tok.Data, p.tok.Attr) - p.form = p.top() - } - case "li": - p.framesetOK = false - for i := len(p.oe) - 1; i >= 0; i-- { - node := p.oe[i] - switch node.Data { - case "li": - p.popUntil(listItemScope, "li") - case "address", "div", "p": - continue - default: - if !isSpecialElement(node) { - continue - } - } - break - } - p.popUntil(buttonScope, "p") - p.addElement(p.tok.Data, p.tok.Attr) - case "dd", "dt": - p.framesetOK = false - for i := len(p.oe) - 1; i >= 0; i-- { - node := p.oe[i] - switch node.Data { - case "dd", "dt": - p.oe = p.oe[:i] - case "address", "div", "p": - continue - default: - if !isSpecialElement(node) { - continue - } - } - break - } - p.popUntil(buttonScope, "p") - p.addElement(p.tok.Data, p.tok.Attr) - case "plaintext": - p.popUntil(buttonScope, "p") - p.addElement(p.tok.Data, p.tok.Attr) - case "button": - p.popUntil(defaultScope, "button") - p.reconstructActiveFormattingElements() - p.addElement(p.tok.Data, p.tok.Attr) - p.framesetOK = false - case "optgroup", "option": - if p.top().Data == "option" { - p.oe.pop() - } - p.reconstructActiveFormattingElements() - p.addElement(p.tok.Data, p.tok.Attr) - case "body": - if len(p.oe) >= 2 { - body := p.oe[1] - if body.Type == ElementNode && body.Data == "body" { - p.framesetOK = false - copyAttributes(body, p.tok) - } - } - case "frameset": - if !p.framesetOK || len(p.oe) < 2 || p.oe[1].Data != "body" { - // Ignore the token. - return true - } - body := p.oe[1] - if body.Parent != nil { - body.Parent.Remove(body) - } - p.oe = p.oe[:1] - p.addElement(p.tok.Data, p.tok.Attr) - p.im = inFramesetIM - return true - case "base", "basefont", "bgsound", "command", "link", "meta", "noframes", "script", "style", "title": - return inHeadIM(p) - case "image": - p.tok.Data = "img" - return false - case "isindex": - if p.form != nil { - // Ignore the token. - return true - } - action := "" - prompt := "This is a searchable index. Enter search keywords: " - attr := []Attribute{{Key: "name", Val: "isindex"}} - for _, a := range p.tok.Attr { - switch a.Key { - case "action": - action = a.Val - case "name": - // Ignore the attribute. - case "prompt": - prompt = a.Val - default: - attr = append(attr, a) - } - } - p.acknowledgeSelfClosingTag() - p.popUntil(buttonScope, "p") - p.addElement("form", nil) - p.form = p.top() - if action != "" { - p.form.Attr = []Attribute{{Key: "action", Val: action}} - } - p.addElement("hr", nil) - p.oe.pop() - p.addElement("label", nil) - p.addText(prompt) - p.addElement("input", attr) - p.oe.pop() - p.oe.pop() - p.addElement("hr", nil) - p.oe.pop() - p.oe.pop() - p.form = nil - case "xmp": - p.popUntil(buttonScope, "p") - p.reconstructActiveFormattingElements() - p.framesetOK = false - p.addElement(p.tok.Data, p.tok.Attr) - case "math", "svg": - p.reconstructActiveFormattingElements() - if p.tok.Data == "math" { - // TODO: adjust MathML attributes. - } else { - // TODO: adjust SVG attributes. - } - adjustForeignAttributes(p.tok.Attr) - p.addElement(p.tok.Data, p.tok.Attr) - p.top().Namespace = p.tok.Data - return true - case "caption", "col", "colgroup", "frame", "head", "tbody", "td", "tfoot", "th", "thead", "tr": - // Ignore the token. - default: - // TODO. - p.addElement(p.tok.Data, p.tok.Attr) - } - case EndTagToken: - switch p.tok.Data { - case "body": - // TODO: autoclose the stack of open elements. - p.im = afterBodyIM - return true - case "p": - if !p.elementInScope(buttonScope, "p") { - p.addElement("p", nil) - } - p.popUntil(buttonScope, "p") - case "a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u": - p.inBodyEndTagFormatting(p.tok.Data) - case "address", "article", "aside", "blockquote", "button", "center", "details", "dir", "div", "dl", "fieldset", "figcaption", "figure", "footer", "header", "hgroup", "listing", "menu", "nav", "ol", "pre", "section", "summary", "ul": - p.popUntil(defaultScope, p.tok.Data) - case "applet", "marquee", "object": - if p.popUntil(defaultScope, p.tok.Data) { - p.clearActiveFormattingElements() - } - case "br": - p.tok.Type = StartTagToken - return false - default: - p.inBodyEndTagOther(p.tok.Data) - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - } - - return true -} - -func (p *parser) inBodyEndTagFormatting(tag string) { - // This is the "adoption agency" algorithm, described at - // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#adoptionAgency - - // TODO: this is a fairly literal line-by-line translation of that algorithm. - // Once the code successfully parses the comprehensive test suite, we should - // refactor this code to be more idiomatic. - - // Steps 1-3. The outer loop. - for i := 0; i < 8; i++ { - // Step 4. Find the formatting element. - var formattingElement *Node - for j := len(p.afe) - 1; j >= 0; j-- { - if p.afe[j].Type == scopeMarkerNode { - break - } - if p.afe[j].Data == tag { - formattingElement = p.afe[j] - break - } - } - if formattingElement == nil { - p.inBodyEndTagOther(tag) - return - } - feIndex := p.oe.index(formattingElement) - if feIndex == -1 { - p.afe.remove(formattingElement) - return - } - if !p.elementInScope(defaultScope, tag) { - // Ignore the tag. - return - } - - // Steps 5-6. Find the furthest block. - var furthestBlock *Node - for _, e := range p.oe[feIndex:] { - if isSpecialElement(e) { - furthestBlock = e - break - } - } - if furthestBlock == nil { - e := p.oe.pop() - for e != formattingElement { - e = p.oe.pop() - } - p.afe.remove(e) - return - } - - // Steps 7-8. Find the common ancestor and bookmark node. - commonAncestor := p.oe[feIndex-1] - bookmark := p.afe.index(formattingElement) - - // Step 9. The inner loop. Find the lastNode to reparent. - lastNode := furthestBlock - node := furthestBlock - x := p.oe.index(node) - // Steps 9.1-9.3. - for j := 0; j < 3; j++ { - // Step 9.4. - x-- - node = p.oe[x] - // Step 9.5. - if p.afe.index(node) == -1 { - p.oe.remove(node) - continue - } - // Step 9.6. - if node == formattingElement { - break - } - // Step 9.7. - clone := node.clone() - p.afe[p.afe.index(node)] = clone - p.oe[p.oe.index(node)] = clone - node = clone - // Step 9.8. - if lastNode == furthestBlock { - bookmark = p.afe.index(node) + 1 - } - // Step 9.9. - if lastNode.Parent != nil { - lastNode.Parent.Remove(lastNode) - } - node.Add(lastNode) - // Step 9.10. - lastNode = node - } - - // Step 10. Reparent lastNode to the common ancestor, - // or for misnested table nodes, to the foster parent. - if lastNode.Parent != nil { - lastNode.Parent.Remove(lastNode) - } - switch commonAncestor.Data { - case "table", "tbody", "tfoot", "thead", "tr": - p.fosterParent(lastNode) - default: - commonAncestor.Add(lastNode) - } - - // Steps 11-13. Reparent nodes from the furthest block's children - // to a clone of the formatting element. - clone := formattingElement.clone() - reparentChildren(clone, furthestBlock) - furthestBlock.Add(clone) - - // Step 14. Fix up the list of active formatting elements. - if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark { - // Move the bookmark with the rest of the list. - bookmark-- - } - p.afe.remove(formattingElement) - p.afe.insert(bookmark, clone) - - // Step 15. Fix up the stack of open elements. - p.oe.remove(formattingElement) - p.oe.insert(p.oe.index(furthestBlock)+1, clone) - } -} - -// inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM. -func (p *parser) inBodyEndTagOther(tag string) { - for i := len(p.oe) - 1; i >= 0; i-- { - if p.oe[i].Data == tag { - p.oe = p.oe[:i] - break - } - if isSpecialElement(p.oe[i]) { - break - } - } -} - -// Section 12.2.5.4.8. -func textIM(p *parser) bool { - switch p.tok.Type { - case ErrorToken: - p.oe.pop() - case TextToken: - p.addText(p.tok.Data) - return true - case EndTagToken: - p.oe.pop() - } - p.im = p.originalIM - p.originalIM = nil - return p.tok.Type == EndTagToken -} - -// Section 12.2.5.4.9. -func inTableIM(p *parser) bool { - switch p.tok.Type { - case ErrorToken: - // Stop parsing. - return true - case TextToken: - // TODO. - case StartTagToken: - switch p.tok.Data { - case "caption": - p.clearStackToContext(tableScope) - p.afe = append(p.afe, &scopeMarker) - p.addElement(p.tok.Data, p.tok.Attr) - p.im = inCaptionIM - return true - case "tbody", "tfoot", "thead": - p.clearStackToContext(tableScope) - p.addElement(p.tok.Data, p.tok.Attr) - p.im = inTableBodyIM - return true - case "td", "th", "tr": - p.clearStackToContext(tableScope) - p.addElement("tbody", nil) - p.im = inTableBodyIM - return false - case "table": - if p.popUntil(tableScope, "table") { - p.resetInsertionMode() - return false - } - // Ignore the token. - return true - case "colgroup": - p.clearStackToContext(tableScope) - p.addElement(p.tok.Data, p.tok.Attr) - p.im = inColumnGroupIM - return true - case "col": - p.clearStackToContext(tableScope) - p.addElement("colgroup", p.tok.Attr) - p.im = inColumnGroupIM - return false - case "select": - p.reconstructActiveFormattingElements() - switch p.top().Data { - case "table", "tbody", "tfoot", "thead", "tr": - p.fosterParenting = true - } - p.addElement(p.tok.Data, p.tok.Attr) - p.fosterParenting = false - p.framesetOK = false - p.im = inSelectInTableIM - return true - default: - // TODO. - } - case EndTagToken: - switch p.tok.Data { - case "table": - if p.popUntil(tableScope, "table") { - p.resetInsertionMode() - return true - } - // Ignore the token. - return true - case "body", "caption", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr": - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - - switch p.top().Data { - case "table", "tbody", "tfoot", "thead", "tr": - p.fosterParenting = true - defer func() { p.fosterParenting = false }() - } - - return inBodyIM(p) -} - -// Section 12.2.5.4.11. -func inCaptionIM(p *parser) bool { - switch p.tok.Type { - case StartTagToken: - switch p.tok.Data { - case "caption", "col", "colgroup", "tbody", "td", "tfoot", "thead", "tr": - if p.popUntil(tableScope, "caption") { - p.clearActiveFormattingElements() - p.im = inTableIM - return false - } else { - // Ignore the token. - return true - } - case "select": - p.reconstructActiveFormattingElements() - p.addElement(p.tok.Data, p.tok.Attr) - p.framesetOK = false - p.im = inSelectInTableIM - return true - } - case EndTagToken: - switch p.tok.Data { - case "caption": - if p.popUntil(tableScope, "caption") { - p.clearActiveFormattingElements() - p.im = inTableIM - } - return true - case "table": - if p.popUntil(tableScope, "caption") { - p.clearActiveFormattingElements() - p.im = inTableIM - return false - } else { - // Ignore the token. - return true - } - case "body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr": - // Ignore the token. - return true - } - } - return inBodyIM(p) -} - -// Section 12.2.5.4.12. -func inColumnGroupIM(p *parser) bool { - switch p.tok.Type { - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - // Ignore the token. - return true - case StartTagToken: - switch p.tok.Data { - case "html": - return inBodyIM(p) - case "col": - p.addElement(p.tok.Data, p.tok.Attr) - p.oe.pop() - p.acknowledgeSelfClosingTag() - return true - } - case EndTagToken: - switch p.tok.Data { - case "colgroup": - if p.oe.top().Data != "html" { - p.oe.pop() - p.im = inTableIM - } - return true - case "col": - // Ignore the token. - return true - } - } - if p.oe.top().Data != "html" { - p.oe.pop() - p.im = inTableIM - return false - } - return true -} - -// Section 12.2.5.4.13. -func inTableBodyIM(p *parser) bool { - var ( - add bool - data string - attr []Attribute - consumed bool - ) - switch p.tok.Type { - case ErrorToken: - // TODO. - case TextToken: - // TODO. - case StartTagToken: - switch p.tok.Data { - case "tr": - add = true - data = p.tok.Data - attr = p.tok.Attr - consumed = true - case "td", "th": - add = true - data = "tr" - consumed = false - case "caption", "col", "colgroup", "tbody", "tfoot", "thead": - if !p.popUntil(tableScope, "tbody", "thead", "tfoot") { - // Ignore the token. - return true - } - p.im = inTableIM - return false - default: - // TODO. - } - case EndTagToken: - switch p.tok.Data { - case "table": - if p.popUntil(tableScope, "tbody", "thead", "tfoot") { - p.im = inTableIM - return false - } - // Ignore the token. - return true - case "body", "caption", "col", "colgroup", "html", "td", "th", "tr": - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - if add { - // TODO: clear the stack back to a table body context. - p.addElement(data, attr) - p.im = inRowIM - return consumed - } - return inTableIM(p) -} - -// Section 12.2.5.4.14. -func inRowIM(p *parser) bool { - switch p.tok.Type { - case ErrorToken: - // TODO. - case TextToken: - // TODO. - case StartTagToken: - switch p.tok.Data { - case "td", "th": - p.clearStackToContext(tableRowScope) - p.addElement(p.tok.Data, p.tok.Attr) - p.afe = append(p.afe, &scopeMarker) - p.im = inCellIM - return true - case "caption", "col", "colgroup", "tbody", "tfoot", "thead", "tr": - if p.popUntil(tableScope, "tr") { - p.im = inTableBodyIM - return false - } - // Ignore the token. - return true - default: - // TODO. - } - case EndTagToken: - switch p.tok.Data { - case "tr": - if p.popUntil(tableScope, "tr") { - p.im = inTableBodyIM - return true - } - // Ignore the token. - return true - case "table": - if p.popUntil(tableScope, "tr") { - p.im = inTableBodyIM - return false - } - // Ignore the token. - return true - case "tbody", "tfoot", "thead": - // TODO. - case "body", "caption", "col", "colgroup", "html", "td", "th": - // Ignore the token. - return true - default: - // TODO. - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - return inTableIM(p) -} - -// Section 12.2.5.4.15. -func inCellIM(p *parser) bool { - var ( - closeTheCellAndReprocess bool - ) - switch p.tok.Type { - case StartTagToken: - switch p.tok.Data { - case "caption", "col", "colgroup", "tbody", "td", "tfoot", "th", "thead", "tr": - // TODO: check for "td" or "th" in table scope. - closeTheCellAndReprocess = true - case "select": - p.reconstructActiveFormattingElements() - p.addElement(p.tok.Data, p.tok.Attr) - p.framesetOK = false - p.im = inSelectInTableIM - return true - } - case EndTagToken: - switch p.tok.Data { - case "td", "th": - if !p.popUntil(tableScope, p.tok.Data) { - // Ignore the token. - return true - } - p.clearActiveFormattingElements() - p.im = inRowIM - return true - case "body", "caption", "col", "colgroup", "html": - // TODO. - case "table", "tbody", "tfoot", "thead", "tr": - // TODO: check for matching element in table scope. - closeTheCellAndReprocess = true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - if closeTheCellAndReprocess { - if p.popUntil(tableScope, "td") || p.popUntil(tableScope, "th") { - p.clearActiveFormattingElements() - p.im = inRowIM - return false - } - } - return inBodyIM(p) -} - -// Section 12.2.5.4.16. -func inSelectIM(p *parser) bool { - endSelect := false - switch p.tok.Type { - case ErrorToken: - // TODO. - case TextToken: - p.addText(p.tok.Data) - case StartTagToken: - switch p.tok.Data { - case "html": - // TODO. - case "option": - if p.top().Data == "option" { - p.oe.pop() - } - p.addElement(p.tok.Data, p.tok.Attr) - case "optgroup": - if p.top().Data == "option" { - p.oe.pop() - } - if p.top().Data == "optgroup" { - p.oe.pop() - } - p.addElement(p.tok.Data, p.tok.Attr) - case "select": - endSelect = true - case "input", "keygen", "textarea": - // TODO. - case "script": - // TODO. - default: - // Ignore the token. - } - case EndTagToken: - switch p.tok.Data { - case "option": - if p.top().Data == "option" { - p.oe.pop() - } - case "optgroup": - i := len(p.oe) - 1 - if p.oe[i].Data == "option" { - i-- - } - if p.oe[i].Data == "optgroup" { - p.oe = p.oe[:i] - } - case "select": - endSelect = true - default: - // Ignore the token. - } - case CommentToken: - p.doc.Add(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - } - if endSelect { - p.endSelect() - } - return true -} - -// Section 12.2.5.4.17. -func inSelectInTableIM(p *parser) bool { - switch p.tok.Type { - case StartTagToken, EndTagToken: - switch p.tok.Data { - case "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th": - if p.tok.Type == StartTagToken || p.elementInScope(tableScope, p.tok.Data) { - p.endSelect() - return false - } else { - // Ignore the token. - return true - } - } - } - return inSelectIM(p) -} - -func (p *parser) endSelect() { - for i := len(p.oe) - 1; i >= 0; i-- { - switch p.oe[i].Data { - case "option", "optgroup": - continue - case "select": - p.oe = p.oe[:i] - p.resetInsertionMode() - } - return - } -} - -// Section 12.2.5.4.18. -func afterBodyIM(p *parser) bool { - switch p.tok.Type { - case ErrorToken: - // Stop parsing. - return true - case StartTagToken: - if p.tok.Data == "html" { - return inBodyIM(p) - } - case EndTagToken: - if p.tok.Data == "html" { - p.im = afterAfterBodyIM - return true - } - case CommentToken: - // The comment is attached to the <html> element. - if len(p.oe) < 1 || p.oe[0].Data != "html" { - panic("html: bad parser state: <html> element not found, in the after-body insertion mode") - } - p.oe[0].Add(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - p.im = inBodyIM - return false -} - -// Section 12.2.5.4.19. -func inFramesetIM(p *parser) bool { - switch p.tok.Type { - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - case TextToken: - // Ignore all text but whitespace. - s := strings.Map(func(c rune) rune { - switch c { - case ' ', '\t', '\n', '\f', '\r': - return c - } - return -1 - }, p.tok.Data) - if s != "" { - p.addText(s) - } - case StartTagToken: - switch p.tok.Data { - case "html": - return inBodyIM(p) - case "frameset": - p.addElement(p.tok.Data, p.tok.Attr) - case "frame": - p.addElement(p.tok.Data, p.tok.Attr) - p.oe.pop() - p.acknowledgeSelfClosingTag() - case "noframes": - return inHeadIM(p) - } - case EndTagToken: - switch p.tok.Data { - case "frameset": - if p.oe.top().Data != "html" { - p.oe.pop() - if p.oe.top().Data != "frameset" { - p.im = afterFramesetIM - return true - } - } - } - default: - // Ignore the token. - } - return true -} - -// Section 12.2.5.4.20. -func afterFramesetIM(p *parser) bool { - switch p.tok.Type { - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - case TextToken: - // Ignore all text but whitespace. - s := strings.Map(func(c rune) rune { - switch c { - case ' ', '\t', '\n', '\f', '\r': - return c - } - return -1 - }, p.tok.Data) - if s != "" { - p.addText(s) - } - case StartTagToken: - switch p.tok.Data { - case "html": - return inBodyIM(p) - case "noframes": - return inHeadIM(p) - } - case EndTagToken: - switch p.tok.Data { - case "html": - p.im = afterAfterFramesetIM - return true - } - default: - // Ignore the token. - } - return true -} - -// Section 12.2.5.4.21. -func afterAfterBodyIM(p *parser) bool { - switch p.tok.Type { - case ErrorToken: - // Stop parsing. - return true - case TextToken: - // TODO. - case StartTagToken: - if p.tok.Data == "html" { - return inBodyIM(p) - } - case CommentToken: - p.doc.Add(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - p.im = inBodyIM - return false -} - -// Section 12.2.5.4.22. -func afterAfterFramesetIM(p *parser) bool { - switch p.tok.Type { - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - case TextToken: - // Ignore all text but whitespace. - s := strings.Map(func(c rune) rune { - switch c { - case ' ', '\t', '\n', '\f', '\r': - return c - } - return -1 - }, p.tok.Data) - if s != "" { - p.reconstructActiveFormattingElements() - p.addText(s) - } - case StartTagToken: - switch p.tok.Data { - case "html": - return inBodyIM(p) - case "noframes": - return inHeadIM(p) - } - default: - // Ignore the token. - } - return true -} - -// Section 12.2.5.5. -func parseForeignContent(p *parser) bool { - switch p.tok.Type { - case TextToken: - // TODO: HTML integration points. - if p.top().Namespace == "" { - inBodyIM(p) - p.resetInsertionMode() - return true - } - if p.framesetOK { - p.framesetOK = strings.TrimLeft(p.tok.Data, whitespace) == "" - } - p.addText(p.tok.Data) - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - case StartTagToken: - if htmlIntegrationPoint(p.top()) { - inBodyIM(p) - p.resetInsertionMode() - return true - } - if breakout[p.tok.Data] { - for i := len(p.oe) - 1; i >= 0; i-- { - // TODO: MathML integration points. - if p.oe[i].Namespace == "" || htmlIntegrationPoint(p.oe[i]) { - p.oe = p.oe[:i+1] - break - } - } - return false - } - switch p.top().Namespace { - case "math": - // TODO: adjust MathML attributes. - case "svg": - // Adjust SVG tag names. The tokenizer lower-cases tag names, but - // SVG wants e.g. "foreignObject" with a capital second "O". - if x := svgTagNameAdjustments[p.tok.Data]; x != "" { - p.tok.Data = x - } - // TODO: adjust SVG attributes. - default: - panic("html: bad parser state: unexpected namespace") - } - adjustForeignAttributes(p.tok.Attr) - namespace := p.top().Namespace - p.addElement(p.tok.Data, p.tok.Attr) - p.top().Namespace = namespace - case EndTagToken: - for i := len(p.oe) - 1; i >= 0; i-- { - if p.oe[i].Namespace == "" { - return p.im(p) - } - if strings.EqualFold(p.oe[i].Data, p.tok.Data) { - p.oe = p.oe[:i] - break - } - } - return true - default: - // Ignore the token. - } - return true -} - -// Section 12.2.5. -func (p *parser) inForeignContent() bool { - if len(p.oe) == 0 { - return false - } - n := p.oe[len(p.oe)-1] - if n.Namespace == "" { - return false - } - // TODO: MathML, HTML integration points. - // TODO: MathML's annotation-xml combining with SVG's svg. - return true -} - -func (p *parser) parse() error { - // Iterate until EOF. Any other error will cause an early return. - consumed := true - for { - if consumed { - if err := p.read(); err != nil { - if err == io.EOF { - break - } - return err - } - } - if p.inForeignContent() { - consumed = parseForeignContent(p) - } else { - consumed = p.im(p) - } - } - // Loop until the final token (the ErrorToken signifying EOF) is consumed. - for { - if consumed = p.im(p); consumed { - break - } - } - return nil -} - -// Parse returns the parse tree for the HTML from the given Reader. -// The input is assumed to be UTF-8 encoded. -func Parse(r io.Reader) (*Node, error) { - p := &parser{ - tokenizer: NewTokenizer(r), - doc: &Node{ - Type: DocumentNode, - }, - scripting: true, - framesetOK: true, - im: initialIM, - } - err := p.parse() - if err != nil { - return nil, err - } - return p.doc, nil -} - -// ParseFragment parses a fragment of HTML and returns the nodes that were -// found. If the fragment is the InnerHTML for an existing element, pass that -// element in context. -func ParseFragment(r io.Reader, context *Node) ([]*Node, error) { - p := &parser{ - tokenizer: NewTokenizer(r), - doc: &Node{ - Type: DocumentNode, - }, - scripting: true, - context: context, - } - - if context != nil { - switch context.Data { - case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "title", "textarea", "xmp": - p.tokenizer.rawTag = context.Data - } - } - - root := &Node{ - Type: ElementNode, - Data: "html", - } - p.doc.Add(root) - p.oe = nodeStack{root} - p.resetInsertionMode() - - for n := context; n != nil; n = n.Parent { - if n.Type == ElementNode && n.Data == "form" { - p.form = n - break - } - } - - err := p.parse() - if err != nil { - return nil, err - } - - parent := p.doc - if context != nil { - parent = root - } - - result := parent.Child - parent.Child = nil - for _, n := range result { - n.Parent = nil - } - return result, nil -} diff --git a/src/pkg/exp/html/parse_test.go b/src/pkg/exp/html/parse_test.go deleted file mode 100644 index f3f966cf58..0000000000 --- a/src/pkg/exp/html/parse_test.go +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "os" - "strings" - "testing" -) - -// readParseTest reads a single test case from r. -func readParseTest(r *bufio.Reader) (text, want, context string, err error) { - line, err := r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - var b []byte - - // Read the HTML. - if string(line) != "#data\n" { - return "", "", "", fmt.Errorf(`got %q want "#data\n"`, line) - } - for { - line, err = r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - if line[0] == '#' { - break - } - b = append(b, line...) - } - text = strings.TrimRight(string(b), "\n") - b = b[:0] - - // Skip the error list. - if string(line) != "#errors\n" { - return "", "", "", fmt.Errorf(`got %q want "#errors\n"`, line) - } - for { - line, err = r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - if line[0] == '#' { - break - } - } - - if string(line) == "#document-fragment\n" { - line, err = r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - context = strings.TrimSpace(string(line)) - line, err = r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - } - - // Read the dump of what the parse tree should be. - if string(line) != "#document\n" { - return "", "", "", fmt.Errorf(`got %q want "#document\n"`, line) - } - for { - line, err = r.ReadSlice('\n') - if err != nil && err != io.EOF { - return "", "", "", err - } - if len(line) == 0 || len(line) == 1 && line[0] == '\n' { - break - } - b = append(b, line...) - } - return text, string(b), context, nil -} - -func dumpIndent(w io.Writer, level int) { - io.WriteString(w, "| ") - for i := 0; i < level; i++ { - io.WriteString(w, " ") - } -} - -func dumpLevel(w io.Writer, n *Node, level int) error { - dumpIndent(w, level) - switch n.Type { - case ErrorNode: - return errors.New("unexpected ErrorNode") - case DocumentNode: - return errors.New("unexpected DocumentNode") - case ElementNode: - if n.Namespace != "" { - fmt.Fprintf(w, "<%s %s>", n.Namespace, n.Data) - } else { - fmt.Fprintf(w, "<%s>", n.Data) - } - attr := n.Attr - if len(attr) == 2 && attr[0].Namespace == "xml" && attr[1].Namespace == "xlink" { - // Some of the test cases in tests10.dat change the order of adjusted - // foreign attributes, but that behavior is not in the spec, and could - // simply be an implementation detail of html5lib's python map ordering. - attr[0], attr[1] = attr[1], attr[0] - } - for _, a := range attr { - io.WriteString(w, "\n") - dumpIndent(w, level+1) - if a.Namespace != "" { - fmt.Fprintf(w, `%s %s="%s"`, a.Namespace, a.Key, a.Val) - } else { - fmt.Fprintf(w, `%s="%s"`, a.Key, a.Val) - } - } - case TextNode: - fmt.Fprintf(w, `"%s"`, n.Data) - case CommentNode: - fmt.Fprintf(w, "<!-- %s -->", n.Data) - case DoctypeNode: - fmt.Fprintf(w, "<!DOCTYPE %s", n.Data) - if n.Attr != nil { - var p, s string - for _, a := range n.Attr { - switch a.Key { - case "public": - p = a.Val - case "system": - s = a.Val - } - } - if p != "" || s != "" { - fmt.Fprintf(w, ` "%s"`, p) - fmt.Fprintf(w, ` "%s"`, s) - } - } - io.WriteString(w, ">") - case scopeMarkerNode: - return errors.New("unexpected scopeMarkerNode") - default: - return errors.New("unknown node type") - } - io.WriteString(w, "\n") - for _, c := range n.Child { - if err := dumpLevel(w, c, level+1); err != nil { - return err - } - } - return nil -} - -func dump(n *Node) (string, error) { - if n == nil || len(n.Child) == 0 { - return "", nil - } - var b bytes.Buffer - for _, child := range n.Child { - if err := dumpLevel(&b, child, 0); err != nil { - return "", err - } - } - return b.String(), nil -} - -func TestParser(t *testing.T) { - testFiles := []struct { - filename string - // n is the number of test cases to run from that file. - // -1 means all test cases. - n int - }{ - // TODO(nigeltao): Process all the test cases from all the .dat files. - {"adoption01.dat", -1}, - {"doctype01.dat", -1}, - {"tests1.dat", -1}, - {"tests2.dat", -1}, - {"tests3.dat", -1}, - {"tests4.dat", -1}, - {"tests5.dat", -1}, - {"tests6.dat", -1}, - {"tests10.dat", 35}, - } - for _, tf := range testFiles { - f, err := os.Open("testdata/webkit/" + tf.filename) - if err != nil { - t.Fatal(err) - } - defer f.Close() - r := bufio.NewReader(f) - for i := 0; i != tf.n; i++ { - text, want, context, err := readParseTest(r) - if err == io.EOF && tf.n == -1 { - break - } - if err != nil { - t.Fatal(err) - } - - var doc *Node - if context == "" { - doc, err = Parse(strings.NewReader(text)) - if err != nil { - t.Fatal(err) - } - } else { - contextNode := &Node{ - Type: ElementNode, - Data: context, - } - nodes, err := ParseFragment(strings.NewReader(text), contextNode) - if err != nil { - t.Fatal(err) - } - doc = &Node{ - Type: DocumentNode, - } - for _, n := range nodes { - doc.Add(n) - } - } - - got, err := dump(doc) - if err != nil { - t.Fatal(err) - } - // Compare the parsed tree to the #document section. - if got != want { - t.Errorf("%s test #%d %q, got vs want:\n----\n%s----\n%s----", tf.filename, i, text, got, want) - continue - } - if renderTestBlacklist[text] || context != "" { - continue - } - // Check that rendering and re-parsing results in an identical tree. - pr, pw := io.Pipe() - go func() { - pw.CloseWithError(Render(pw, doc)) - }() - doc1, err := Parse(pr) - if err != nil { - t.Fatal(err) - } - got1, err := dump(doc1) - if err != nil { - t.Fatal(err) - } - if got != got1 { - t.Errorf("%s test #%d %q, got vs got1:\n----\n%s----\n%s----", tf.filename, i, text, got, got1) - continue - } - } - } -} - -// Some test input result in parse trees are not 'well-formed' despite -// following the HTML5 recovery algorithms. Rendering and re-parsing such a -// tree will not result in an exact clone of that tree. We blacklist such -// inputs from the render test. -var renderTestBlacklist = map[string]bool{ - // The second <a> will be reparented to the first <table>'s parent. This - // results in an <a> whose parent is an <a>, which is not 'well-formed'. - `<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y`: true, - // More cases of <a> being reparented: - `<a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe`: true, - `<a><table><a></table><p><a><div><a>`: true, - `<a><table><td><a><table></table><a></tr><a></table><a>`: true, - // A <plaintext> element is reparented, putting it before a table. - // A <plaintext> element can't have anything after it in HTML. - `<table><plaintext><td>`: true, -} diff --git a/src/pkg/exp/html/render.go b/src/pkg/exp/html/render.go deleted file mode 100644 index 07859faa7d..0000000000 --- a/src/pkg/exp/html/render.go +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bufio" - "errors" - "fmt" - "io" - "strings" -) - -type writer interface { - io.Writer - WriteByte(byte) error - WriteString(string) (int, error) -} - -// Render renders the parse tree n to the given writer. -// -// Rendering is done on a 'best effort' basis: calling Parse on the output of -// Render will always result in something similar to the original tree, but it -// is not necessarily an exact clone unless the original tree was 'well-formed'. -// 'Well-formed' is not easily specified; the HTML5 specification is -// complicated. -// -// Calling Parse on arbitrary input typically results in a 'well-formed' parse -// tree. However, it is possible for Parse to yield a 'badly-formed' parse tree. -// For example, in a 'well-formed' parse tree, no <a> element is a child of -// another <a> element: parsing "<a><a>" results in two sibling elements. -// Similarly, in a 'well-formed' parse tree, no <a> element is a child of a -// <table> element: parsing "<p><table><a>" results in a <p> with two sibling -// children; the <a> is reparented to the <table>'s parent. However, calling -// Parse on "<a><table><a>" does not return an error, but the result has an <a> -// element with an <a> child, and is therefore not 'well-formed'. -// -// Programmatically constructed trees are typically also 'well-formed', but it -// is possible to construct a tree that looks innocuous but, when rendered and -// re-parsed, results in a different tree. A simple example is that a solitary -// text node would become a tree containing <html>, <head> and <body> elements. -// Another example is that the programmatic equivalent of "a<head>b</head>c" -// becomes "<html><head><head/><body>abc</body></html>". -func Render(w io.Writer, n *Node) error { - if x, ok := w.(writer); ok { - return render(x, n) - } - buf := bufio.NewWriter(w) - if err := render(buf, n); err != nil { - return err - } - return buf.Flush() -} - -// plaintextAbort is returned from render1 when a <plaintext> element -// has been rendered. No more end tags should be rendered after that. -var plaintextAbort = errors.New("html: internal error (plaintext abort)") - -func render(w writer, n *Node) error { - err := render1(w, n) - if err == plaintextAbort { - err = nil - } - return err -} - -func render1(w writer, n *Node) error { - // Render non-element nodes; these are the easy cases. - switch n.Type { - case ErrorNode: - return errors.New("html: cannot render an ErrorNode node") - case TextNode: - return escape(w, n.Data) - case DocumentNode: - for _, c := range n.Child { - if err := render1(w, c); err != nil { - return err - } - } - return nil - case ElementNode: - // No-op. - case CommentNode: - if _, err := w.WriteString("<!--"); err != nil { - return err - } - if _, err := w.WriteString(n.Data); err != nil { - return err - } - if _, err := w.WriteString("-->"); err != nil { - return err - } - return nil - case DoctypeNode: - if _, err := w.WriteString("<!DOCTYPE "); err != nil { - return err - } - if _, err := w.WriteString(n.Data); err != nil { - return err - } - if n.Attr != nil { - var p, s string - for _, a := range n.Attr { - switch a.Key { - case "public": - p = a.Val - case "system": - s = a.Val - } - } - if p != "" { - if _, err := w.WriteString(" PUBLIC "); err != nil { - return err - } - if err := writeQuoted(w, p); err != nil { - return err - } - if s != "" { - if err := w.WriteByte(' '); err != nil { - return err - } - if err := writeQuoted(w, s); err != nil { - return err - } - } - } else if s != "" { - if _, err := w.WriteString(" SYSTEM "); err != nil { - return err - } - if err := writeQuoted(w, s); err != nil { - return err - } - } - } - return w.WriteByte('>') - default: - return errors.New("html: unknown node type") - } - - // Render the <xxx> opening tag. - if err := w.WriteByte('<'); err != nil { - return err - } - if _, err := w.WriteString(n.Data); err != nil { - return err - } - for _, a := range n.Attr { - if err := w.WriteByte(' '); err != nil { - return err - } - if a.Namespace != "" { - if _, err := w.WriteString(a.Namespace); err != nil { - return err - } - if err := w.WriteByte(':'); err != nil { - return err - } - } - if _, err := w.WriteString(a.Key); err != nil { - return err - } - if _, err := w.WriteString(`="`); err != nil { - return err - } - if err := escape(w, a.Val); err != nil { - return err - } - if err := w.WriteByte('"'); err != nil { - return err - } - } - if voidElements[n.Data] { - if len(n.Child) != 0 { - return fmt.Errorf("html: void element <%s> has child nodes", n.Data) - } - _, err := w.WriteString("/>") - return err - } - if err := w.WriteByte('>'); err != nil { - return err - } - - // Add initial newline where there is danger of a newline beging ignored. - if len(n.Child) > 0 && n.Child[0].Type == TextNode && strings.HasPrefix(n.Child[0].Data, "\n") { - switch n.Data { - case "pre", "listing", "textarea": - if err := w.WriteByte('\n'); err != nil { - return err - } - } - } - - // Render any child nodes. - switch n.Data { - case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp": - for _, c := range n.Child { - if c.Type != TextNode { - return fmt.Errorf("html: raw text element <%s> has non-text child node", n.Data) - } - if _, err := w.WriteString(c.Data); err != nil { - return err - } - } - if n.Data == "plaintext" { - // Don't render anything else. <plaintext> must be the - // last element in the file, with no closing tag. - return plaintextAbort - } - case "textarea", "title": - for _, c := range n.Child { - if c.Type != TextNode { - return fmt.Errorf("html: RCDATA element <%s> has non-text child node", n.Data) - } - if err := render1(w, c); err != nil { - return err - } - } - default: - for _, c := range n.Child { - if err := render1(w, c); err != nil { - return err - } - } - } - - // Render the </xxx> closing tag. - if _, err := w.WriteString("</"); err != nil { - return err - } - if _, err := w.WriteString(n.Data); err != nil { - return err - } - return w.WriteByte('>') -} - -// writeQuoted writes s to w surrounded by quotes. Normally it will use double -// quotes, but if s contains a double quote, it will use single quotes. -// It is used for writing the identifiers in a doctype declaration. -// In valid HTML, they can't contain both types of quotes. -func writeQuoted(w writer, s string) error { - var q byte = '"' - if strings.Contains(s, `"`) { - q = '\'' - } - if err := w.WriteByte(q); err != nil { - return err - } - if _, err := w.WriteString(s); err != nil { - return err - } - if err := w.WriteByte(q); err != nil { - return err - } - return nil -} - -// Section 12.1.2, "Elements", gives this list of void elements. Void elements -// are those that can't have any contents. -var voidElements = map[string]bool{ - "area": true, - "base": true, - "br": true, - "col": true, - "command": true, - "embed": true, - "hr": true, - "img": true, - "input": true, - "keygen": true, - "link": true, - "meta": true, - "param": true, - "source": true, - "track": true, - "wbr": true, -} diff --git a/src/pkg/exp/html/render_test.go b/src/pkg/exp/html/render_test.go deleted file mode 100644 index 0584f35abd..0000000000 --- a/src/pkg/exp/html/render_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bytes" - "testing" -) - -func TestRenderer(t *testing.T) { - n := &Node{ - Type: ElementNode, - Data: "html", - Child: []*Node{ - { - Type: ElementNode, - Data: "head", - }, - { - Type: ElementNode, - Data: "body", - Child: []*Node{ - { - Type: TextNode, - Data: "0<1", - }, - { - Type: ElementNode, - Data: "p", - Attr: []Attribute{ - { - Key: "id", - Val: "A", - }, - { - Key: "foo", - Val: `abc"def`, - }, - }, - Child: []*Node{ - { - Type: TextNode, - Data: "2", - }, - { - Type: ElementNode, - Data: "b", - Attr: []Attribute{ - { - Key: "empty", - Val: "", - }, - }, - Child: []*Node{ - { - Type: TextNode, - Data: "3", - }, - }, - }, - { - Type: ElementNode, - Data: "i", - Attr: []Attribute{ - { - Key: "backslash", - Val: `\`, - }, - }, - Child: []*Node{ - { - Type: TextNode, - Data: "&4", - }, - }, - }, - }, - }, - { - Type: TextNode, - Data: "5", - }, - { - Type: ElementNode, - Data: "blockquote", - }, - { - Type: ElementNode, - Data: "br", - }, - { - Type: TextNode, - Data: "6", - }, - }, - }, - }, - } - want := `<html><head></head><body>0<1<p id="A" foo="abc"def">` + - `2<b empty="">3</b><i backslash="\">&4</i></p>` + - `5<blockquote></blockquote><br/>6</body></html>` - b := new(bytes.Buffer) - if err := Render(b, n); err != nil { - t.Fatal(err) - } - if got := b.String(); got != want { - t.Errorf("got vs want:\n%s\n%s\n", got, want) - } -} diff --git a/src/pkg/exp/html/testdata/webkit/README b/src/pkg/exp/html/testdata/webkit/README deleted file mode 100644 index 9b4c2d8be0..0000000000 --- a/src/pkg/exp/html/testdata/webkit/README +++ /dev/null @@ -1,28 +0,0 @@ -The *.dat files in this directory are copied from The WebKit Open Source -Project, specifically $WEBKITROOT/LayoutTests/html5lib/resources. -WebKit is licensed under a BSD style license. -http://webkit.org/coding/bsd-license.html says: - -Copyright (C) 2009 Apple Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/src/pkg/exp/html/testdata/webkit/adoption01.dat b/src/pkg/exp/html/testdata/webkit/adoption01.dat deleted file mode 100644 index 787e1b01e1..0000000000 --- a/src/pkg/exp/html/testdata/webkit/adoption01.dat +++ /dev/null @@ -1,194 +0,0 @@ -#data -<a><p></a></p> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <p> -| <a> - -#data -<a>1<p>2</a>3</p> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <p> -| <a> -| "2" -| "3" - -#data -<a>1<button>2</a>3</button> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <button> -| <a> -| "2" -| "3" - -#data -<a>1<b>2</a>3</b> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <b> -| "2" -| <b> -| "3" - -#data -<a>1<div>2<div>3</a>4</div>5</div> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <div> -| <a> -| "2" -| <div> -| <a> -| "3" -| "4" -| "5" - -#data -<table><a>1<p>2</a>3</p> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <p> -| <a> -| "2" -| "3" -| <table> - -#data -<b><b><a><p></a> -#errors -#document -| <html> -| <head> -| <body> -| <b> -| <b> -| <a> -| <p> -| <a> - -#data -<b><a><b><p></a> -#errors -#document -| <html> -| <head> -| <body> -| <b> -| <a> -| <b> -| <b> -| <p> -| <a> - -#data -<a><b><b><p></a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <b> -| <b> -| <b> -| <p> -| <a> - -#data -<p>1<s id="A">2<b id="B">3</p>4</s>5</b> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| "1" -| <s> -| id="A" -| "2" -| <b> -| id="B" -| "3" -| <s> -| id="A" -| <b> -| id="B" -| "4" -| <b> -| id="B" -| "5" - -#data -<table><a>1<td>2</td>3</table> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <a> -| "3" -| <table> -| <tbody> -| <tr> -| <td> -| "2" - -#data -<table>A<td>B</td>C</table> -#errors -#document -| <html> -| <head> -| <body> -| "AC" -| <table> -| <tbody> -| <tr> -| <td> -| "B" - -#data -<a><svg><tr><input></a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <svg svg> -| <svg tr> -| <svg input> diff --git a/src/pkg/exp/html/testdata/webkit/adoption02.dat b/src/pkg/exp/html/testdata/webkit/adoption02.dat deleted file mode 100644 index d18151b44f..0000000000 --- a/src/pkg/exp/html/testdata/webkit/adoption02.dat +++ /dev/null @@ -1,31 +0,0 @@ -#data -<b>1<i>2<p>3</b>4 -#errors -#document -| <html> -| <head> -| <body> -| <b> -| "1" -| <i> -| "2" -| <i> -| <p> -| <b> -| "3" -| "4" - -#data -<a><div><style></style><address><a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <div> -| <a> -| <style> -| <address> -| <a> -| <a> diff --git a/src/pkg/exp/html/testdata/webkit/comments01.dat b/src/pkg/exp/html/testdata/webkit/comments01.dat deleted file mode 100644 index 44f1876830..0000000000 --- a/src/pkg/exp/html/testdata/webkit/comments01.dat +++ /dev/null @@ -1,135 +0,0 @@ -#data -FOO<!-- BAR -->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR --> -| "BAZ" - -#data -FOO<!-- BAR --!>BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR --> -| "BAZ" - -#data -FOO<!-- BAR -- >BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR -- >BAZ --> - -#data -FOO<!-- BAR -- <QUX> -- MUX -->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR -- <QUX> -- MUX --> -| "BAZ" - -#data -FOO<!-- BAR -- <QUX> -- MUX --!>BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR -- <QUX> -- MUX --> -| "BAZ" - -#data -FOO<!-- BAR -- <QUX> -- MUX -- >BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR -- <QUX> -- MUX -- >BAZ --> - -#data -FOO<!---->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- --> -| "BAZ" - -#data -FOO<!--->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- --> -| "BAZ" - -#data -FOO<!-->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- --> -| "BAZ" - -#data -<?xml version="1.0">Hi -#errors -#document -| <!-- ?xml version="1.0" --> -| <html> -| <head> -| <body> -| "Hi" - -#data -<?xml version="1.0"> -#errors -#document -| <!-- ?xml version="1.0" --> -| <html> -| <head> -| <body> - -#data -<?xml version -#errors -#document -| <!-- ?xml version --> -| <html> -| <head> -| <body> - -#data -FOO<!----->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- - --> -| "BAZ" diff --git a/src/pkg/exp/html/testdata/webkit/doctype01.dat b/src/pkg/exp/html/testdata/webkit/doctype01.dat deleted file mode 100644 index ae457328a4..0000000000 --- a/src/pkg/exp/html/testdata/webkit/doctype01.dat +++ /dev/null @@ -1,370 +0,0 @@ -#data -<!DOCTYPE html>Hello -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!dOctYpE HtMl>Hello -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPEhtml>Hello -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE>Hello -#errors -#document -| <!DOCTYPE > -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE >Hello -#errors -#document -| <!DOCTYPE > -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato >Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato taco>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato taco "ddd>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato sYstEM>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato sYstEM >Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato sYstEM ggg>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEM taco >Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEM 'taco"'>Hello -#errors -#document -| <!DOCTYPE potato "" "taco""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEM "taco">Hello -#errors -#document -| <!DOCTYPE potato "" "taco"> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEM "tai'co">Hello -#errors -#document -| <!DOCTYPE potato "" "tai'co"> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEMtaco "ddd">Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato grass SYSTEM taco>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato pUbLIc>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato pUbLIc >Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato pUbLIcgoof>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC goof>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC "go'of">Hello -#errors -#document -| <!DOCTYPE potato "go'of" ""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC 'go'of'>Hello -#errors -#document -| <!DOCTYPE potato "go" ""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC 'go:hh of' >Hello -#errors -#document -| <!DOCTYPE potato "go:hh of" ""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC "W3C-//dfdf" SYSTEM ggg>Hello -#errors -#document -| <!DOCTYPE potato "W3C-//dfdf" ""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd">Hello -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE ...>Hello -#errors -#document -| <!DOCTYPE ...> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" -"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" -"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE root-element [SYSTEM OR PUBLIC FPI] "uri" [ -<!-- internal declarations --> -]> -#errors -#document -| <!DOCTYPE root-element> -| <html> -| <head> -| <body> -| "]>" - -#data -<!DOCTYPE html PUBLIC - "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" - "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> -#errors -#document -| <!DOCTYPE html "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML SYSTEM "http://www.w3.org/DTD/HTML4-strict.dtd"><body><b>Mine!</b></body> -#errors -#document -| <!DOCTYPE html "" "http://www.w3.org/DTD/HTML4-strict.dtd"> -| <html> -| <head> -| <body> -| <b> -| "Mine!" - -#data -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML PUBLIC'-//W3C//DTD HTML 4.01//EN''http://www.w3.org/TR/html4/strict.dtd'> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> diff --git a/src/pkg/exp/html/testdata/webkit/entities01.dat b/src/pkg/exp/html/testdata/webkit/entities01.dat deleted file mode 100644 index c8073b7810..0000000000 --- a/src/pkg/exp/html/testdata/webkit/entities01.dat +++ /dev/null @@ -1,603 +0,0 @@ -#data -FOO>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO>BAR" - -#data -FOO>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO>BAR" - -#data -FOO> BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO> BAR" - -#data -FOO>;;BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO>;;BAR" - -#data -I'm ¬it; I tell you -#errors -#document -| <html> -| <head> -| <body> -| "I'm ¬it; I tell you" - -#data -I'm ∉ I tell you -#errors -#document -| <html> -| <head> -| <body> -| "I'm ∉ I tell you" - -#data -FOO& BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO& BAR" - -#data -FOO&<BAR> -#errors -#document -| <html> -| <head> -| <body> -| "FOO&" -| <bar> - -#data -FOO&&&>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO&&&>BAR" - -#data -FOO)BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO)BAR" - -#data -FOOABAR -#errors -#document -| <html> -| <head> -| <body> -| "FOOABAR" - -#data -FOOABAR -#errors -#document -| <html> -| <head> -| <body> -| "FOOABAR" - -#data -FOO&#BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO&#BAR" - -#data -FOO&#ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO&#ZOO" - -#data -FOOºR -#errors -#document -| <html> -| <head> -| <body> -| "FOOºR" - -#data -FOO&#xZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO&#xZOO" - -#data -FOO&#XZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO&#XZOO" - -#data -FOO)BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO)BAR" - -#data -FOO䆺R -#errors -#document -| <html> -| <head> -| <body> -| "FOO䆺R" - -#data -FOOAZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOAZOO" - -#data -FOO�ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOOxZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOxZOO" - -#data -FOOyZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOyZOO" - -#data -FOO€ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO€ZOO" - -#data -FOOZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOO‚ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‚ZOO" - -#data -FOOƒZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOƒZOO" - -#data -FOO„ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO„ZOO" - -#data -FOO…ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO…ZOO" - -#data -FOO†ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO†ZOO" - -#data -FOO‡ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‡ZOO" - -#data -FOOˆZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOˆZOO" - -#data -FOO‰ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‰ZOO" - -#data -FOOŠZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOŠZOO" - -#data -FOO‹ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‹ZOO" - -#data -FOOŒZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOŒZOO" - -#data -FOOZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOOŽZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOŽZOO" - -#data -FOOZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOOZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOO‘ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‘ZOO" - -#data -FOO’ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO’ZOO" - -#data -FOO“ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO“ZOO" - -#data -FOO”ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO”ZOO" - -#data -FOO•ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO•ZOO" - -#data -FOO–ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO–ZOO" - -#data -FOO—ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO—ZOO" - -#data -FOO˜ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO˜ZOO" - -#data -FOO™ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO™ZOO" - -#data -FOOšZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOšZOO" - -#data -FOO›ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO›ZOO" - -#data -FOOœZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOœZOO" - -#data -FOOZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOOžZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOžZOO" - -#data -FOOŸZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOŸZOO" - -#data -FOO ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO ZOO" - -#data -FOO퟿ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOO�ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO�ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO�ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO�ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOOZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOOZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOO􈟔ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOOZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOO�ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO�ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" diff --git a/src/pkg/exp/html/testdata/webkit/entities02.dat b/src/pkg/exp/html/testdata/webkit/entities02.dat deleted file mode 100644 index e2fb42a078..0000000000 --- a/src/pkg/exp/html/testdata/webkit/entities02.dat +++ /dev/null @@ -1,249 +0,0 @@ -#data -<div bar="ZZ>YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>YY" - -#data -<div bar="ZZ&"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&" - -#data -<div bar='ZZ&'></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&" - -#data -<div bar=ZZ&></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&" - -#data -<div bar="ZZ>=YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>=YY" - -#data -<div bar="ZZ>0YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>0YY" - -#data -<div bar="ZZ>9YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>9YY" - -#data -<div bar="ZZ>aYY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>aYY" - -#data -<div bar="ZZ>ZYY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>ZYY" - -#data -<div bar="ZZ> YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ> YY" - -#data -<div bar="ZZ>"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>" - -#data -<div bar='ZZ>'></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>" - -#data -<div bar=ZZ>></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>" - -#data -<div bar="ZZ£_id=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ£_id=23" - -#data -<div bar="ZZ&prod_id=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&prod_id=23" - -#data -<div bar="ZZ£_id=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ£_id=23" - -#data -<div bar="ZZ∏_id=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ∏_id=23" - -#data -<div bar="ZZ£=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ£=23" - -#data -<div bar="ZZ&prod=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&prod=23" - -#data -<div>ZZ£_id=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ£_id=23" - -#data -<div>ZZ&prod_id=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ&prod_id=23" - -#data -<div>ZZ£_id=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ£_id=23" - -#data -<div>ZZ∏_id=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ∏_id=23" - -#data -<div>ZZ£=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ£=23" - -#data -<div>ZZ&prod=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ&prod=23" diff --git a/src/pkg/exp/html/testdata/webkit/html5test-com.dat b/src/pkg/exp/html/testdata/webkit/html5test-com.dat deleted file mode 100644 index d7cb71db05..0000000000 --- a/src/pkg/exp/html/testdata/webkit/html5test-com.dat +++ /dev/null @@ -1,246 +0,0 @@ -#data -<div<div> -#errors -#document -| <html> -| <head> -| <body> -| <div<div> - -#data -<div foo<bar=''> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| foo<bar="" - -#data -<div foo=`bar`> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| foo="`bar`" - -#data -<div \"foo=''> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| \"foo="" - -#data -<a href='\nbar'></a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| href="\nbar" - -#data -<!DOCTYPE html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -⟨⟩ -#errors -#document -| <html> -| <head> -| <body> -| "⟨⟩" - -#data -' -#errors -#document -| <html> -| <head> -| <body> -| "'" - -#data -ⅈ -#errors -#document -| <html> -| <head> -| <body> -| "ⅈ" - -#data -𝕂 -#errors -#document -| <html> -| <head> -| <body> -| "𝕂" - -#data -∉ -#errors -#document -| <html> -| <head> -| <body> -| "∉" - -#data -<?import namespace="foo" implementation="#bar"> -#errors -#document -| <!-- ?import namespace="foo" implementation="#bar" --> -| <html> -| <head> -| <body> - -#data -<!--foo--bar--> -#errors -#document -| <!-- foo--bar --> -| <html> -| <head> -| <body> - -#data -<![CDATA[x]]> -#errors -#document -| <!-- [CDATA[x]] --> -| <html> -| <head> -| <body> - -#data -<textarea><!--</textarea>--></textarea> -#errors -#document -| <html> -| <head> -| <body> -| <textarea> -| "<!--" -| "-->" - -#data -<textarea><!--</textarea>--> -#errors -#document -| <html> -| <head> -| <body> -| <textarea> -| "<!--" -| "-->" - -#data -<style><!--</style>--></style> -#errors -#document -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "-->" - -#data -<style><!--</style>--> -#errors -#document -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "-->" - -#data -<ul><li>A </li> <li>B</li></ul> -#errors -#document -| <html> -| <head> -| <body> -| <ul> -| <li> -| "A " -| " " -| <li> -| "B" - -#data -<table><form><input type=hidden><input></form><div></div></table> -#errors -#document -| <html> -| <head> -| <body> -| <input> -| <div> -| <table> -| <form> -| <input> -| type="hidden" - -#data -<i>A<b>B<p></i>C</b>D -#errors -#document -| <html> -| <head> -| <body> -| <i> -| "A" -| <b> -| "B" -| <b> -| <p> -| <b> -| <i> -| "C" -| "D" - -#data -<div></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> - -#data -<svg></svg> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> - -#data -<math></math> -#errors -#document -| <html> -| <head> -| <body> -| <math math> diff --git a/src/pkg/exp/html/testdata/webkit/inbody01.dat b/src/pkg/exp/html/testdata/webkit/inbody01.dat deleted file mode 100644 index 3f2bd374c0..0000000000 --- a/src/pkg/exp/html/testdata/webkit/inbody01.dat +++ /dev/null @@ -1,43 +0,0 @@ -#data -<button>1</foo> -#errors -#document -| <html> -| <head> -| <body> -| <button> -| "1" - -#data -<foo>1<p>2</foo> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| "1" -| <p> -| "2" - -#data -<dd>1</foo> -#errors -#document -| <html> -| <head> -| <body> -| <dd> -| "1" - -#data -<foo>1<dd>2</foo> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| "1" -| <dd> -| "2" diff --git a/src/pkg/exp/html/testdata/webkit/isindex.dat b/src/pkg/exp/html/testdata/webkit/isindex.dat deleted file mode 100644 index 88325ffe64..0000000000 --- a/src/pkg/exp/html/testdata/webkit/isindex.dat +++ /dev/null @@ -1,40 +0,0 @@ -#data -<isindex> -#errors -#document -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<isindex name="A" action="B" prompt="C" foo="D"> -#errors -#document -| <html> -| <head> -| <body> -| <form> -| action="B" -| <hr> -| <label> -| "C" -| <input> -| foo="D" -| name="isindex" -| <hr> - -#data -<form><isindex> -#errors -#document -| <html> -| <head> -| <body> -| <form> diff --git a/src/pkg/exp/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat b/src/pkg/exp/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat Binary files differdeleted file mode 100644 index a5ebb1eb28..0000000000 --- a/src/pkg/exp/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat +++ /dev/null diff --git a/src/pkg/exp/html/testdata/webkit/pending-spec-changes.dat b/src/pkg/exp/html/testdata/webkit/pending-spec-changes.dat deleted file mode 100644 index e00ee85d3b..0000000000 --- a/src/pkg/exp/html/testdata/webkit/pending-spec-changes.dat +++ /dev/null @@ -1,28 +0,0 @@ -#data -<input type="hidden"><frameset> -#errors -21: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. -31: “frameset” start tag seen. -31: End of file seen and there were open elements. -#document -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><table><caption><svg>foo</table>bar -#errors -47: End tag “table” did not match the name of the current open element (“svg”). -47: “table” closed but “caption” was still open. -47: End tag “table” seen, but there were open elements. -36: Unclosed element “svg”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <svg svg> -| "foo" -| "bar" diff --git a/src/pkg/exp/html/testdata/webkit/plain-text-unsafe.dat b/src/pkg/exp/html/testdata/webkit/plain-text-unsafe.dat deleted file mode 100644 index 2f40e83bab..0000000000 --- a/src/pkg/exp/html/testdata/webkit/plain-text-unsafe.dat +++ /dev/null @@ -1,8 +0,0 @@ -#data -FOO
ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO
ZOO" diff --git a/src/pkg/exp/html/testdata/webkit/scriptdata01.dat b/src/pkg/exp/html/testdata/webkit/scriptdata01.dat deleted file mode 100644 index 76b67f4ba6..0000000000 --- a/src/pkg/exp/html/testdata/webkit/scriptdata01.dat +++ /dev/null @@ -1,308 +0,0 @@ -#data -FOO<script>'Hello'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'Hello'" -| "BAR" - -#data -FOO<script></script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script></script >BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script></script/>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script></script/ >BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script type="text/plain"></scriptx>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "</scriptx>BAR" - -#data -FOO<script></script foo=">" dd>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script>'<'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<'" -| "BAR" - -#data -FOO<script>'<!'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!'" -| "BAR" - -#data -FOO<script>'<!-'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-'" -| "BAR" - -#data -FOO<script>'<!--'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!--'" -| "BAR" - -#data -FOO<script>'<!---'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!---'" -| "BAR" - -#data -FOO<script>'<!-->'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-->'" -| "BAR" - -#data -FOO<script>'<!-->'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-->'" -| "BAR" - -#data -FOO<script>'<!-- potato'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-- potato'" -| "BAR" - -#data -FOO<script>'<!-- <sCrIpt'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-- <sCrIpt'" -| "BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt>'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt>'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt> -'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt> -'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt> --'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt> --'</script>BAR" - -#data -FOO<script>'<!-- <sCrIpt> -->'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-- <sCrIpt> -->'" -| "BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt> --!>'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt> --!>'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt> -- >'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt> -- >'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt '</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt '</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt/'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt\'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt\'" -| "BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR</script>QUX -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt/'</script>BAR" -| "QUX" diff --git a/src/pkg/exp/html/testdata/webkit/scripted/adoption01.dat b/src/pkg/exp/html/testdata/webkit/scripted/adoption01.dat deleted file mode 100644 index 4e08d0e84a..0000000000 --- a/src/pkg/exp/html/testdata/webkit/scripted/adoption01.dat +++ /dev/null @@ -1,15 +0,0 @@ -#data -<p><b id="A"><script>document.getElementById("A").id = "B"</script></p>TEXT</b> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| id="B" -| <script> -| "document.getElementById("A").id = "B"" -| <b> -| id="A" -| "TEXT" diff --git a/src/pkg/exp/html/testdata/webkit/scripted/webkit01.dat b/src/pkg/exp/html/testdata/webkit/scripted/webkit01.dat deleted file mode 100644 index ef4a41ca00..0000000000 --- a/src/pkg/exp/html/testdata/webkit/scripted/webkit01.dat +++ /dev/null @@ -1,28 +0,0 @@ -#data -1<script>document.write("2")</script>3 -#errors -#document -| <html> -| <head> -| <body> -| "1" -| <script> -| "document.write("2")" -| "23" - -#data -1<script>document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")</script>4 -#errors -#document -| <html> -| <head> -| <body> -| "1" -| <script> -| "document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")" -| <script> -| "document.write('2')" -| "2" -| <script> -| "document.write('3')" -| "34" diff --git a/src/pkg/exp/html/testdata/webkit/tables01.dat b/src/pkg/exp/html/testdata/webkit/tables01.dat deleted file mode 100644 index 88ef1fe2ee..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tables01.dat +++ /dev/null @@ -1,197 +0,0 @@ -#data -<table><th> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <th> - -#data -<table><td> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><col foo='bar'> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> -| <col> -| foo="bar" - -#data -<table><colgroup></html>foo -#errors -#document -| <html> -| <head> -| <body> -| "foo" -| <table> -| <colgroup> - -#data -<table></table><p>foo -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <p> -| "foo" - -#data -<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr><td> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><select><option>3</select></table> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| "3" -| <table> - -#data -<table><select><table></table></select></table> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <table> -| <table> - -#data -<table><select></table> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <table> - -#data -<table><select><option>A<tr><td>B</td></tr></table> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| "A" -| <table> -| <tbody> -| <tr> -| <td> -| "B" - -#data -<table><td></body></caption></col></colgroup></html>foo -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "foo" - -#data -<table><td>A</table>B -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "A" -| "B" - -#data -<table><tr><caption> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <caption> - -#data -<table><tr></body></caption></col></colgroup></html></td></th><td>foo -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "foo" - -#data -<table><td><tr> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <tr> - -#data -<table><td><button><td> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <button> -| <td> diff --git a/src/pkg/exp/html/testdata/webkit/tests1.dat b/src/pkg/exp/html/testdata/webkit/tests1.dat deleted file mode 100644 index cbf8bdda63..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests1.dat +++ /dev/null @@ -1,1952 +0,0 @@ -#data -Test -#errors -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "Test" - -#data -<p>One<p>Two -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <p> -| "One" -| <p> -| "Two" - -#data -Line1<br>Line2<br>Line3<br>Line4 -#errors -Line: 1 Col: 5 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "Line1" -| <br> -| "Line2" -| <br> -| "Line3" -| <br> -| "Line4" - -#data -<html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<head> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<body> -#errors -Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head></head> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head></head><body> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head></head><body></body> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head><body></body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head></body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end tag (body). -Line: 1 Col: 26 Unexpected end tag (html). -#document -| <html> -| <head> -| <body> - -#data -<html><head><body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<head></html> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end tag (html). Ignored. -#document -| <html> -| <head> -| <body> - -#data -</head> -#errors -Line: 1 Col: 7 Unexpected end tag (head). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -</body> -#errors -Line: 1 Col: 7 Unexpected end tag (body). Expected DOCTYPE. -Line: 1 Col: 7 Unexpected end tag (body) after the (implied) root element. -#document -| <html> -| <head> -| <body> - -#data -</html> -#errors -Line: 1 Col: 7 Unexpected end tag (html). Expected DOCTYPE. -Line: 1 Col: 7 Unexpected end tag (html) after the (implied) root element. -#document -| <html> -| <head> -| <body> - -#data -<b><table><td><i></table> -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 25 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| <table> -| <tbody> -| <tr> -| <td> -| <i> - -#data -<b><table><td></b><i></table>X -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 18 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 29 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 30 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| <table> -| <tbody> -| <tr> -| <td> -| <i> -| "X" - -#data -<h1>Hello<h2>World -#errors -4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. -13: Heading cannot be a child of another heading. -18: End of file seen and there were open elements. -#document -| <html> -| <head> -| <body> -| <h1> -| "Hello" -| <h2> -| "World" - -#data -<a><p>X<a>Y</a>Z</p></a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 10 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 24 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <a> -| <p> -| <a> -| "X" -| <a> -| "Y" -| "Z" - -#data -<b><button>foo</b>bar -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 15 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <b> -| <button> -| <b> -| "foo" -| "bar" - -#data -<!DOCTYPE html><span><button>foo</span>bar -#errors -39: End tag “span” seen but there were unclosed elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <span> -| <button> -| "foobar" - -#data -<p><b><div><marquee></p></b></div>X -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end tag (p). Ignored. -Line: 1 Col: 24 Unexpected end tag (p). Ignored. -Line: 1 Col: 28 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 34 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 35 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| <div> -| <b> -| <marquee> -| <p> -| "X" - -#data -<script><div></script></div><title><p></title><p><p> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected end tag (div). Ignored. -#document -| <html> -| <head> -| <script> -| "<div>" -| <title> -| "<p>" -| <body> -| <p> -| <p> - -#data -<!--><div>--<!--> -#errors -Line: 1 Col: 5 Incorrect comment. -Line: 1 Col: 10 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 17 Incorrect comment. -Line: 1 Col: 17 Expected closing tag. Unexpected end of file. -#document -| <!-- --> -| <html> -| <head> -| <body> -| <div> -| "--" -| <!-- --> - -#data -<p><hr></p> -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end tag (p). Ignored. -#document -| <html> -| <head> -| <body> -| <p> -| <hr> -| <p> - -#data -<select><b><option><select><option></b></select>X -#errors -Line: 1 Col: 8 Unexpected start tag (select). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected start tag token (b) in the select phase. Ignored. -Line: 1 Col: 27 Unexpected select start tag in the select phase treated as select end tag. -Line: 1 Col: 39 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 48 Unexpected end tag (select). Ignored. -Line: 1 Col: 49 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| <option> -| "X" - -#data -<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 40 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 43 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 43 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 43 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 51 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 63 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 64 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| <a> -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| <table> -| <a> -| <a> -| <b> -| "X" -| "C" -| <a> -| "Y" - -#data -<a X>0<b>1<a Y>2 -#errors -Line: 1 Col: 5 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 16 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| x="" -| "0" -| <b> -| "1" -| <b> -| <a> -| y="" -| "2" - -#data -<!-----><font><div>hello<table>excite!<b>me!<th><i>please!</tr><!--X--> -#errors -Line: 1 Col: 7 Unexpected '-' after '--' found in comment. -Line: 1 Col: 14 Unexpected start tag (font). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 41 Unexpected start tag (b) in table context caused voodoo mode. -Line: 1 Col: 48 Unexpected implied end tag (b) in the table phase. -Line: 1 Col: 48 Unexpected table cell start tag (th) in the table body phase. -Line: 1 Col: 63 Got table cell end tag (th) while required end tags are missing. -Line: 1 Col: 71 Unexpected end of file. Expected table content. -#document -| <!-- - --> -| <html> -| <head> -| <body> -| <font> -| <div> -| "helloexcite!" -| <b> -| "me!" -| <table> -| <tbody> -| <tr> -| <th> -| <i> -| "please!" -| <!-- X --> - -#data -<!DOCTYPE html><li>hello<li>world<ul>how<li>do</ul>you</body><!--do--> -#errors -Line: 1 Col: 61 Unexpected end tag (li). Missing end tag (body). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <li> -| "hello" -| <li> -| "world" -| <ul> -| "how" -| <li> -| "do" -| "you" -| <!-- do --> - -#data -<!DOCTYPE html>A<option>B<optgroup>C<select>D</option>E -#errors -Line: 1 Col: 54 Unexpected end tag (option) in the select phase. Ignored. -Line: 1 Col: 55 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "A" -| <option> -| "B" -| <optgroup> -| "C" -| <select> -| "DE" - -#data -< -#errors -Line: 1 Col: 1 Expected tag name. Got something else instead -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "<" - -#data -<# -#errors -Line: 1 Col: 1 Expected tag name. Got something else instead -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "<#" - -#data -</ -#errors -Line: 1 Col: 2 Expected closing tag. Unexpected end of file. -Line: 1 Col: 2 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "</" - -#data -</# -#errors -Line: 1 Col: 2 Expected closing tag. Unexpected character '#' found. -Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- # --> -| <html> -| <head> -| <body> - -#data -<? -#errors -Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) -Line: 1 Col: 2 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- ? --> -| <html> -| <head> -| <body> - -#data -<?# -#errors -Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) -Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- ?# --> -| <html> -| <head> -| <body> - -#data -<! -#errors -Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found. -Line: 1 Col: 2 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- --> -| <html> -| <head> -| <body> - -#data -<!# -#errors -Line: 1 Col: 3 Expected '--' or 'DOCTYPE'. Not found. -Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- # --> -| <html> -| <head> -| <body> - -#data -<?COMMENT?> -#errors -Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) -Line: 1 Col: 11 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- ?COMMENT? --> -| <html> -| <head> -| <body> - -#data -<!COMMENT> -#errors -Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found. -Line: 1 Col: 10 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- COMMENT --> -| <html> -| <head> -| <body> - -#data -</ COMMENT > -#errors -Line: 1 Col: 2 Expected closing tag. Unexpected character ' ' found. -Line: 1 Col: 12 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- COMMENT --> -| <html> -| <head> -| <body> - -#data -<?COM--MENT?> -#errors -Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) -Line: 1 Col: 13 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- ?COM--MENT? --> -| <html> -| <head> -| <body> - -#data -<!COM--MENT> -#errors -Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found. -Line: 1 Col: 12 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- COM--MENT --> -| <html> -| <head> -| <body> - -#data -</ COM--MENT > -#errors -Line: 1 Col: 2 Expected closing tag. Unexpected character ' ' found. -Line: 1 Col: 14 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- COM--MENT --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><style> EOF -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| " EOF" -| <body> - -#data -<!DOCTYPE html><script> <!-- </script> --> </script> EOF -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| " <!-- " -| " " -| <body> -| "--> EOF" - -#data -<b><p></b>TEST -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 10 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <b> -| <p> -| <b> -| "TEST" - -#data -<p id=a><b><p id=b></b>TEST -#errors -Line: 1 Col: 8 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end tag (p). Ignored. -Line: 1 Col: 23 End tag (b) violates step 1, paragraph 2 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <p> -| id="a" -| <b> -| <p> -| id="b" -| "TEST" - -#data -<b id=a><p><b id=b></p></b>TEST -#errors -Line: 1 Col: 8 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end tag (p). Ignored. -Line: 1 Col: 27 End tag (b) violates step 1, paragraph 2 of the adoption agency algorithm. -Line: 1 Col: 31 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| id="a" -| <p> -| <b> -| id="b" -| "TEST" - -#data -<!DOCTYPE html><title>U-test</title><body><div><p>Test<u></p></div></body> -#errors -Line: 1 Col: 61 Unexpected end tag (p). Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "U-test" -| <body> -| <div> -| <p> -| "Test" -| <u> - -#data -<!DOCTYPE html><font><table></font></table></font> -#errors -Line: 1 Col: 35 Unexpected end tag (font) in table context caused voodoo mode. -Line: 1 Col: 35 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <table> - -#data -<font><p>hello<b>cruel</font>world -#errors -Line: 1 Col: 6 Unexpected start tag (font). Expected DOCTYPE. -Line: 1 Col: 29 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 29 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 34 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <font> -| <p> -| <font> -| "hello" -| <b> -| "cruel" -| <b> -| "world" - -#data -<b>Test</i>Test -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 11 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "TestTest" - -#data -<b>A<cite>B<div>C -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 17 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "A" -| <cite> -| "B" -| <div> -| "C" - -#data -<b>A<cite>B<div>C</cite>D -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 24 Unexpected end tag (cite). Ignored. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "A" -| <cite> -| "B" -| <div> -| "CD" - -#data -<b>A<cite>B<div>C</b>D -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 21 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 22 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "A" -| <cite> -| "B" -| <div> -| <b> -| "C" -| "D" - -#data - -#errors -Line: 1 Col: 0 Unexpected End of file. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<DIV> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 5 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> - -#data -<DIV> abc -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 9 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc" - -#data -<DIV> abc <B> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 13 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> - -#data -<DIV> abc <B> def -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 17 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def" - -#data -<DIV> abc <B> def <I> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 21 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> - -#data -<DIV> abc <B> def <I> ghi -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi" - -#data -<DIV> abc <B> def <I> ghi <P> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 29 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <p> - -#data -<DIV> abc <B> def <I> ghi <P> jkl -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 33 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <p> -| " jkl" - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 38 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <b> -| " jkl " - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 42 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <b> -| " jkl " -| " mno" - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <i> -| <b> -| " jkl " -| " mno " - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 51 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <i> -| <b> -| " jkl " -| " mno " -| " pqr" - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 56 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <i> -| <b> -| " jkl " -| " mno " -| " pqr " - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> stu -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 60 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <i> -| <b> -| " jkl " -| " mno " -| " pqr " -| " stu" - -#data -<test attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> -#errors -Line: 1 Col: 1040 Unexpected start tag (test). Expected DOCTYPE. -Line: 1 Col: 1040 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <test> -| attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------="" - -#data -<a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe -#errors -Line: 1 Col: 15 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 39 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 39 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 39 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 45 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 68 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 71 Expected closing tag. Unexpected end of file. - -#document -| <html> -| <head> -| <body> -| <a> -| href="blah" -| "aba" -| <a> -| href="foo" -| "br" -| <a> -| href="foo" -| "x" -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| href="foo" -| "aoe" - -#data -<a href="blah">aba<table><tr><td><a href="foo">br</td></tr>x</table>aoe -#errors -Line: 1 Col: 15 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 54 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 60 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 71 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| href="blah" -| "abax" -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| href="foo" -| "br" -| "aoe" - -#data -<table><a href="blah">aba<tr><td><a href="foo">br</td></tr>x</table>aoe -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 29 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 54 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 68 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 71 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| href="blah" -| "aba" -| <a> -| href="blah" -| "x" -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| href="foo" -| "br" -| <a> -| href="blah" -| "aoe" - -#data -<a href=a>aa<marquee>aa<a href=b>bb</marquee>aa -#errors -Line: 1 Col: 10 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 45 End tag (marquee) seen too early. Expected other end tag. -Line: 1 Col: 47 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| href="a" -| "aa" -| <marquee> -| "aa" -| <a> -| href="b" -| "bb" -| "aa" - -#data -<wbr><strike><code></strike><code><strike></code> -#errors -Line: 1 Col: 5 Unexpected start tag (wbr). Expected DOCTYPE. -Line: 1 Col: 28 End tag (strike) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 49 Unexpected end tag (code). Ignored. -#document -| <html> -| <head> -| <body> -| <wbr> -| <strike> -| <code> -| <code> -| <code> -| <strike> - -#data -<!DOCTYPE html><spacer>foo -#errors -26: End of file seen and there were open elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <spacer> -| "foo" - -#data -<title><meta></title><link><title><meta></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| "<meta>" -| <link> -| <title> -| "<meta>" -| <body> - -#data -<style><!--</style><meta><script>--><link></script> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 51 Unexpected end of file. Expected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--" -| <meta> -| <script> -| "--><link>" -| <body> - -#data -<head><meta></head><link> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected start tag (link) that can be in head. Moved. -#document -| <html> -| <head> -| <meta> -| <link> -| <body> - -#data -<table><tr><tr><td><td><span><th><span>X</table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 33 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 48 Got table cell end tag (th) while required end tags are missing. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <tr> -| <td> -| <td> -| <span> -| <th> -| <span> -| "X" - -#data -<body><body><base><link><meta><title><p></title><body><p></body> -#errors -Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected start tag (body). -Line: 1 Col: 54 Unexpected start tag (body). -Line: 1 Col: 64 Unexpected end tag (p). Missing end tag (body). -#document -| <html> -| <head> -| <body> -| <base> -| <link> -| <meta> -| <title> -| "<p>" -| <p> - -#data -<textarea><p></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <textarea> -| "<p>" - -#data -<p><image></p> -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected start tag (image). Treated as img. -#document -| <html> -| <head> -| <body> -| <p> -| <img> - -#data -<a><table><a></table><p><a><div><a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 13 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 13 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 21 Unexpected end tag (table). Expected end tag (a). -Line: 1 Col: 27 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 27 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm. -Line: 1 Col: 32 Unexpected end tag (p). Ignored. -Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 35 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm. -Line: 1 Col: 35 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| <a> -| <table> -| <p> -| <a> -| <div> -| <a> - -#data -<head></p><meta><p> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end tag (p). Ignored. -#document -| <html> -| <head> -| <meta> -| <body> -| <p> - -#data -<head></html><meta><p> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected start tag (meta). -#document -| <html> -| <head> -| <body> -| <meta> -| <p> - -#data -<b><table><td><i></table> -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 25 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| <table> -| <tbody> -| <tr> -| <td> -| <i> - -#data -<b><table><td></b><i></table> -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 18 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 29 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 29 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| <table> -| <tbody> -| <tr> -| <td> -| <i> - -#data -<h1><h2> -#errors -4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. -8: Heading cannot be a child of another heading. -8: End of file seen and there were open elements. -#document -| <html> -| <head> -| <body> -| <h1> -| <h2> - -#data -<a><p><a></a></p></a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 9 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 21 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <a> -| <p> -| <a> -| <a> - -#data -<b><button></b></button></b> -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 15 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <b> -| <button> -| <b> - -#data -<p><b><div><marquee></p></b></div> -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end tag (p). Ignored. -Line: 1 Col: 24 Unexpected end tag (p). Ignored. -Line: 1 Col: 28 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 34 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 34 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| <div> -| <b> -| <marquee> -| <p> - -#data -<script></script></div><title></title><p><p> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end tag (div). Ignored. -#document -| <html> -| <head> -| <script> -| <title> -| <body> -| <p> -| <p> - -#data -<p><hr></p> -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end tag (p). Ignored. -#document -| <html> -| <head> -| <body> -| <p> -| <hr> -| <p> - -#data -<select><b><option><select><option></b></select> -#errors -Line: 1 Col: 8 Unexpected start tag (select). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected start tag token (b) in the select phase. Ignored. -Line: 1 Col: 27 Unexpected select start tag in the select phase treated as select end tag. -Line: 1 Col: 39 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 48 Unexpected end tag (select). Ignored. -Line: 1 Col: 48 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| <option> - -#data -<html><head><title></title><body></body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| <body> - -#data -<a><table><td><a><table></table><a></tr><a></table><a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 40 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 43 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 43 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 43 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 51 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 54 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 54 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm. -Line: 1 Col: 54 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| <a> -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| <table> -| <a> -| <a> - -#data -<ul><li></li><div><li></div><li><li><div><li><address><li><b><em></b><li></ul> -#errors -Line: 1 Col: 4 Unexpected start tag (ul). Expected DOCTYPE. -Line: 1 Col: 45 Missing end tag (div, li). -Line: 1 Col: 58 Missing end tag (address, li). -Line: 1 Col: 69 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <ul> -| <li> -| <div> -| <li> -| <li> -| <li> -| <div> -| <li> -| <address> -| <li> -| <b> -| <em> -| <li> - -#data -<ul><li><ul></li><li>a</li></ul></li></ul> -#errors -XXX: fix me -#document -| <html> -| <head> -| <body> -| <ul> -| <li> -| <ul> -| <li> -| "a" - -#data -<frameset><frame><frameset><frame></frameset><noframes></noframes></frameset> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -#document -| <html> -| <head> -| <frameset> -| <frame> -| <frameset> -| <frame> -| <noframes> - -#data -<h1><table><td><h3></table><h3></h1> -#errors -4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. -15: “td” start tag in table body. -27: Unclosed elements. -31: Heading cannot be a child of another heading. -36: End tag “h1” seen but there were unclosed elements. -#document -| <html> -| <head> -| <body> -| <h1> -| <table> -| <tbody> -| <tr> -| <td> -| <h3> -| <h3> - -#data -<table><colgroup><col><colgroup><col><col><col><colgroup><col><col><thead><tr><td></table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> -| <col> -| <colgroup> -| <col> -| <col> -| <col> -| <colgroup> -| <col> -| <col> -| <thead> -| <tr> -| <td> - -#data -<table><col><tbody><col><tr><col><td><col></table><col> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 55 Unexpected start tag col. Ignored. -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> -| <col> -| <tbody> -| <colgroup> -| <col> -| <tbody> -| <tr> -| <colgroup> -| <col> -| <tbody> -| <tr> -| <td> -| <colgroup> -| <col> - -#data -<table><colgroup><tbody><colgroup><tr><colgroup><td><colgroup></table><colgroup> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 52 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 80 Unexpected start tag colgroup. Ignored. -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> -| <tbody> -| <colgroup> -| <tbody> -| <tr> -| <colgroup> -| <tbody> -| <tr> -| <td> -| <colgroup> - -#data -</strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea> -#errors -Line: 1 Col: 9 Unexpected end tag (strong). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end tag (strong) after the (implied) root element. -Line: 1 Col: 13 Unexpected end tag (b) after the (implied) root element. -Line: 1 Col: 18 Unexpected end tag (em) after the (implied) root element. -Line: 1 Col: 22 Unexpected end tag (i) after the (implied) root element. -Line: 1 Col: 26 Unexpected end tag (u) after the (implied) root element. -Line: 1 Col: 35 Unexpected end tag (strike) after the (implied) root element. -Line: 1 Col: 39 Unexpected end tag (s) after the (implied) root element. -Line: 1 Col: 47 Unexpected end tag (blink) after the (implied) root element. -Line: 1 Col: 52 Unexpected end tag (tt) after the (implied) root element. -Line: 1 Col: 58 Unexpected end tag (pre) after the (implied) root element. -Line: 1 Col: 64 Unexpected end tag (big) after the (implied) root element. -Line: 1 Col: 72 Unexpected end tag (small) after the (implied) root element. -Line: 1 Col: 79 Unexpected end tag (font) after the (implied) root element. -Line: 1 Col: 88 Unexpected end tag (select) after the (implied) root element. -Line: 1 Col: 93 Unexpected end tag (h1) after the (implied) root element. -Line: 1 Col: 98 Unexpected end tag (h2) after the (implied) root element. -Line: 1 Col: 103 Unexpected end tag (h3) after the (implied) root element. -Line: 1 Col: 108 Unexpected end tag (h4) after the (implied) root element. -Line: 1 Col: 113 Unexpected end tag (h5) after the (implied) root element. -Line: 1 Col: 118 Unexpected end tag (h6) after the (implied) root element. -Line: 1 Col: 125 Unexpected end tag (body) after the (implied) root element. -Line: 1 Col: 130 Unexpected end tag (br). Treated as br element. -Line: 1 Col: 134 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 140 This element (img) has no end tag. -Line: 1 Col: 148 Unexpected end tag (title). Ignored. -Line: 1 Col: 155 Unexpected end tag (span). Ignored. -Line: 1 Col: 163 Unexpected end tag (style). Ignored. -Line: 1 Col: 172 Unexpected end tag (script). Ignored. -Line: 1 Col: 180 Unexpected end tag (table). Ignored. -Line: 1 Col: 185 Unexpected end tag (th). Ignored. -Line: 1 Col: 190 Unexpected end tag (td). Ignored. -Line: 1 Col: 195 Unexpected end tag (tr). Ignored. -Line: 1 Col: 203 This element (frame) has no end tag. -Line: 1 Col: 210 This element (area) has no end tag. -Line: 1 Col: 217 Unexpected end tag (link). Ignored. -Line: 1 Col: 225 This element (param) has no end tag. -Line: 1 Col: 230 This element (hr) has no end tag. -Line: 1 Col: 238 This element (input) has no end tag. -Line: 1 Col: 244 Unexpected end tag (col). Ignored. -Line: 1 Col: 251 Unexpected end tag (base). Ignored. -Line: 1 Col: 258 Unexpected end tag (meta). Ignored. -Line: 1 Col: 269 This element (basefont) has no end tag. -Line: 1 Col: 279 This element (bgsound) has no end tag. -Line: 1 Col: 287 This element (embed) has no end tag. -Line: 1 Col: 296 This element (spacer) has no end tag. -Line: 1 Col: 300 Unexpected end tag (p). Ignored. -Line: 1 Col: 305 End tag (dd) seen too early. Expected other end tag. -Line: 1 Col: 310 End tag (dt) seen too early. Expected other end tag. -Line: 1 Col: 320 Unexpected end tag (caption). Ignored. -Line: 1 Col: 331 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 339 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 347 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 355 Unexpected end tag (thead). Ignored. -Line: 1 Col: 365 End tag (address) seen too early. Expected other end tag. -Line: 1 Col: 378 End tag (blockquote) seen too early. Expected other end tag. -Line: 1 Col: 387 End tag (center) seen too early. Expected other end tag. -Line: 1 Col: 393 Unexpected end tag (dir). Ignored. -Line: 1 Col: 399 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 404 End tag (dl) seen too early. Expected other end tag. -Line: 1 Col: 415 End tag (fieldset) seen too early. Expected other end tag. -Line: 1 Col: 425 End tag (listing) seen too early. Expected other end tag. -Line: 1 Col: 432 End tag (menu) seen too early. Expected other end tag. -Line: 1 Col: 437 End tag (ol) seen too early. Expected other end tag. -Line: 1 Col: 442 End tag (ul) seen too early. Expected other end tag. -Line: 1 Col: 447 End tag (li) seen too early. Expected other end tag. -Line: 1 Col: 454 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 460 This element (wbr) has no end tag. -Line: 1 Col: 476 End tag (button) seen too early. Expected other end tag. -Line: 1 Col: 486 End tag (marquee) seen too early. Expected other end tag. -Line: 1 Col: 495 End tag (object) seen too early. Expected other end tag. -Line: 1 Col: 513 Unexpected end tag (html). Ignored. -Line: 1 Col: 513 Unexpected end tag (frameset). Ignored. -Line: 1 Col: 520 Unexpected end tag (head). Ignored. -Line: 1 Col: 529 Unexpected end tag (iframe). Ignored. -Line: 1 Col: 537 This element (image) has no end tag. -Line: 1 Col: 547 This element (isindex) has no end tag. -Line: 1 Col: 557 Unexpected end tag (noembed). Ignored. -Line: 1 Col: 568 Unexpected end tag (noframes). Ignored. -Line: 1 Col: 579 Unexpected end tag (noscript). Ignored. -Line: 1 Col: 590 Unexpected end tag (optgroup). Ignored. -Line: 1 Col: 599 Unexpected end tag (option). Ignored. -Line: 1 Col: 611 Unexpected end tag (plaintext). Ignored. -Line: 1 Col: 622 Unexpected end tag (textarea). Ignored. -#document -| <html> -| <head> -| <body> -| <br> -| <p> - -#data -<table><tr></strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. -Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. -Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. -Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. -Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. -Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. -Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. -Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. -Line: 1 Col: 58 Unexpected end tag (blink). Ignored. -Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. -Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. -Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. -Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. -Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. -Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. -Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. -Line: 1 Col: 99 Unexpected end tag (select). Ignored. -Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. -Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. -Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. -Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. -Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. -Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. -Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. -Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. -Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. -Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. -Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. -Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. -Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. -Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. -Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. -Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. -Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. -Line: 1 Col: 151 This element (img) has no end tag. -Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. -Line: 1 Col: 159 Unexpected end tag (title). Ignored. -Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. -Line: 1 Col: 166 Unexpected end tag (span). Ignored. -Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. -Line: 1 Col: 174 Unexpected end tag (style). Ignored. -Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. -Line: 1 Col: 183 Unexpected end tag (script). Ignored. -Line: 1 Col: 196 Unexpected end tag (th). Ignored. -Line: 1 Col: 201 Unexpected end tag (td). Ignored. -Line: 1 Col: 206 Unexpected end tag (tr). Ignored. -Line: 1 Col: 214 This element (frame) has no end tag. -Line: 1 Col: 221 This element (area) has no end tag. -Line: 1 Col: 228 Unexpected end tag (link). Ignored. -Line: 1 Col: 236 This element (param) has no end tag. -Line: 1 Col: 241 This element (hr) has no end tag. -Line: 1 Col: 249 This element (input) has no end tag. -Line: 1 Col: 255 Unexpected end tag (col). Ignored. -Line: 1 Col: 262 Unexpected end tag (base). Ignored. -Line: 1 Col: 269 Unexpected end tag (meta). Ignored. -Line: 1 Col: 280 This element (basefont) has no end tag. -Line: 1 Col: 290 This element (bgsound) has no end tag. -Line: 1 Col: 298 This element (embed) has no end tag. -Line: 1 Col: 307 This element (spacer) has no end tag. -Line: 1 Col: 311 Unexpected end tag (p). Ignored. -Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. -Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. -Line: 1 Col: 331 Unexpected end tag (caption). Ignored. -Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 366 Unexpected end tag (thead). Ignored. -Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. -Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. -Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. -Line: 1 Col: 404 Unexpected end tag (dir). Ignored. -Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. -Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. -Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. -Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. -Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. -Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. -Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. -Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 471 This element (wbr) has no end tag. -Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. -Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. -Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. -Line: 1 Col: 524 Unexpected end tag (html). Ignored. -Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. -Line: 1 Col: 531 Unexpected end tag (head). Ignored. -Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. -Line: 1 Col: 548 This element (image) has no end tag. -Line: 1 Col: 558 This element (isindex) has no end tag. -Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. -Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. -Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. -Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. -Line: 1 Col: 610 Unexpected end tag (option). Ignored. -Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. -Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. -#document -| <html> -| <head> -| <body> -| <br> -| <table> -| <tbody> -| <tr> -| <p> - -#data -<frameset> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 1 Col: 10 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <frameset> diff --git a/src/pkg/exp/html/testdata/webkit/tests10.dat b/src/pkg/exp/html/testdata/webkit/tests10.dat deleted file mode 100644 index 4f8df86f20..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests10.dat +++ /dev/null @@ -1,799 +0,0 @@ -#data -<!DOCTYPE html><svg></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> - -#data -<!DOCTYPE html><svg></svg><![CDATA[a]]> -#errors -29: Bogus comment -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <!-- [CDATA[a]] --> - -#data -<!DOCTYPE html><body><svg></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> - -#data -<!DOCTYPE html><body><select><svg></svg></select> -#errors -35: Stray “svg” start tag. -42: Stray end tag “svg” -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!DOCTYPE html><body><select><option><svg></svg></option></select> -#errors -43: Stray “svg” start tag. -50: Stray end tag “svg” -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!DOCTYPE html><body><table><svg></svg></table> -#errors -34: Start tag “svg” seen in “table”. -41: Stray end tag “svg”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <table> - -#data -<!DOCTYPE html><body><table><svg><g>foo</g></svg></table> -#errors -34: Start tag “svg” seen in “table”. -46: Stray end tag “g”. -53: Stray end tag “svg”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <table> - -#data -<!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table> -#errors -34: Start tag “svg” seen in “table”. -46: Stray end tag “g”. -58: Stray end tag “g”. -65: Stray end tag “svg”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <table> - -#data -<!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table> -#errors -41: Start tag “svg” seen in “table”. -53: Stray end tag “g”. -65: Stray end tag “g”. -72: Stray end tag “svg”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <table> -| <tbody> - -#data -<!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table> -#errors -45: Start tag “svg” seen in “table”. -57: Stray end tag “g”. -69: Stray end tag “g”. -76: Stray end tag “svg”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <table> -| <tbody> -| <tr> - -#data -<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" - -#data -<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux -#errors -70: HTML start tag “p” in a foreign namespace context. -81: “table” closed but “caption” was still open. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux -#errors -78: “table” closed but “caption” was still open. -78: Unclosed elements on stack. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| "baz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><colgroup><svg><g>foo</g><g>bar</g><p>baz</table><p>quux -#errors -44: Start tag “svg” seen in “table”. -56: Stray end tag “g”. -68: Stray end tag “g”. -71: HTML start tag “p” in a foreign namespace context. -71: Start tag “p” seen in “table”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" -| <table> -| <colgroup> -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux -#errors -50: Stray “svg” start tag. -54: Stray “g” start tag. -62: Stray end tag “g” -66: Stray “g” start tag. -74: Stray end tag “g” -77: Stray “p” start tag. -88: “table” end tag with “select” open. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <select> -| "foobarbaz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux -#errors -36: Start tag “select” seen in “table”. -42: Stray “svg” start tag. -46: Stray “g” start tag. -54: Stray end tag “g” -58: Stray “g” start tag. -66: Stray end tag “g” -69: Stray “p” start tag. -80: “table” end tag with “select” open. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "foobarbaz" -| <table> -| <p> -| "quux" - -#data -<!DOCTYPE html><body></body></html><svg><g>foo</g><g>bar</g><p>baz -#errors -41: Stray “svg” start tag. -68: HTML start tag “p” in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body></body><svg><g>foo</g><g>bar</g><p>baz -#errors -34: Stray “svg” start tag. -61: HTML start tag “p” in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><frameset><svg><g></g><g></g><p><span> -#errors -31: Stray “svg” start tag. -35: Stray “g” start tag. -40: Stray end tag “g” -44: Stray “g” start tag. -49: Stray end tag “g” -52: Stray “p” start tag. -58: Stray “span” start tag. -58: End of file seen and there were open elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span> -#errors -42: Stray “svg” start tag. -46: Stray “g” start tag. -51: Stray end tag “g” -55: Stray “g” start tag. -60: Stray end tag “g” -63: Stray “p” start tag. -69: Stray “span” start tag. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><body xlink:href=foo><svg xlink:href=foo></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| <svg svg> -| xlink href="foo" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo></g></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <svg svg> -| <svg g> -| xlink href="foo" -| xml lang="en" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo /></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <svg svg> -| <svg g> -| xlink href="foo" -| xml lang="en" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo />bar</svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <svg svg> -| <svg g> -| xlink href="foo" -| xml lang="en" -| "bar" - -#data -<svg></path> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> - -#data -<div><svg></div>a -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| "a" - -#data -<div><svg><path></div>a -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| "a" - -#data -<div><svg><path></svg><path> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| <path> - -#data -<div><svg><path><foreignObject><math></div>a -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| <svg foreignObject> -| <math math> -| "a" - -#data -<div><svg><path><foreignObject><p></div>a -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| <svg foreignObject> -| <p> -| "a" - -#data -<!DOCTYPE html><svg><desc><div><svg><ul>a -#errors -40: HTML start tag “ul” in a foreign namespace context. -41: End of file in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg desc> -| <div> -| <svg svg> -| <ul> -| "a" - -#data -<!DOCTYPE html><svg><desc><svg><ul>a -#errors -35: HTML start tag “ul” in a foreign namespace context. -36: End of file in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg desc> -| <svg svg> -| <ul> -| "a" - -#data -<!DOCTYPE html><p><svg><desc><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <svg svg> -| <svg desc> -| <p> - -#data -<!DOCTYPE html><p><svg><title><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <svg svg> -| <svg title> -| <p> - -#data -<div><svg><path><foreignObject><p></foreignObject><p> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| <svg foreignObject> -| <p> -| <p> - -#data -<math><mi><div><object><div><span></span></div></object></div></mi><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| <div> -| <object> -| <div> -| <span> -| <math mi> - -#data -<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| <svg svg> -| <svg foreignObject> -| <div> -| <div> -| <math mi> - -#data -<svg><script></script><path> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg script> -| <svg path> - -#data -<table><svg></svg><tr> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <table> -| <tbody> -| <tr> - -#data -<math><mi><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| <math mglyph> - -#data -<math><mi><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| <math malignmark> - -#data -<math><mo><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mo> -| <math mglyph> - -#data -<math><mo><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mo> -| <math malignmark> - -#data -<math><mn><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mn> -| <math mglyph> - -#data -<math><mn><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mn> -| <math malignmark> - -#data -<math><ms><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math ms> -| <math mglyph> - -#data -<math><ms><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math ms> -| <math malignmark> - -#data -<math><mtext><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mtext> -| <math mglyph> - -#data -<math><mtext><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mtext> -| <math malignmark> - -#data -<math><annotation-xml><svg></svg></annotation-xml><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <svg svg> -| <math mi> - -#data -<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <svg svg> -| <svg foreignObject> -| <div> -| <math math> -| <math mi> -| <span> -| <svg path> -| <math mi> - -#data -<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <svg svg> -| <svg foreignObject> -| <math math> -| <math mi> -| <svg svg> -| <math mo> -| <span> -| <svg path> -| <math mi> diff --git a/src/pkg/exp/html/testdata/webkit/tests11.dat b/src/pkg/exp/html/testdata/webkit/tests11.dat deleted file mode 100644 index 638cde479f..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests11.dat +++ /dev/null @@ -1,482 +0,0 @@ -#data -<!DOCTYPE html><body><svg attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data -<!DOCTYPE html><BODY><SVG ATTRIBUTENAME='' ATTRIBUTETYPE='' BASEFREQUENCY='' BASEPROFILE='' CALCMODE='' CLIPPATHUNITS='' CONTENTSCRIPTTYPE='' CONTENTSTYLETYPE='' DIFFUSECONSTANT='' EDGEMODE='' EXTERNALRESOURCESREQUIRED='' FILTERRES='' FILTERUNITS='' GLYPHREF='' GRADIENTTRANSFORM='' GRADIENTUNITS='' KERNELMATRIX='' KERNELUNITLENGTH='' KEYPOINTS='' KEYSPLINES='' KEYTIMES='' LENGTHADJUST='' LIMITINGCONEANGLE='' MARKERHEIGHT='' MARKERUNITS='' MARKERWIDTH='' MASKCONTENTUNITS='' MASKUNITS='' NUMOCTAVES='' PATHLENGTH='' PATTERNCONTENTUNITS='' PATTERNTRANSFORM='' PATTERNUNITS='' POINTSATX='' POINTSATY='' POINTSATZ='' PRESERVEALPHA='' PRESERVEASPECTRATIO='' PRIMITIVEUNITS='' REFX='' REFY='' REPEATCOUNT='' REPEATDUR='' REQUIREDEXTENSIONS='' REQUIREDFEATURES='' SPECULARCONSTANT='' SPECULAREXPONENT='' SPREADMETHOD='' STARTOFFSET='' STDDEVIATION='' STITCHTILES='' SURFACESCALE='' SYSTEMLANGUAGE='' TABLEVALUES='' TARGETX='' TARGETY='' TEXTLENGTH='' VIEWBOX='' VIEWTARGET='' XCHANNELSELECTOR='' YCHANNELSELECTOR='' ZOOMANDPAN=''></SVG> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data -<!DOCTYPE html><body><svg attributename='' attributetype='' basefrequency='' baseprofile='' calcmode='' clippathunits='' contentscripttype='' contentstyletype='' diffuseconstant='' edgemode='' externalresourcesrequired='' filterres='' filterunits='' glyphref='' gradienttransform='' gradientunits='' kernelmatrix='' kernelunitlength='' keypoints='' keysplines='' keytimes='' lengthadjust='' limitingconeangle='' markerheight='' markerunits='' markerwidth='' maskcontentunits='' maskunits='' numoctaves='' pathlength='' patterncontentunits='' patterntransform='' patternunits='' pointsatx='' pointsaty='' pointsatz='' preservealpha='' preserveaspectratio='' primitiveunits='' refx='' refy='' repeatcount='' repeatdur='' requiredextensions='' requiredfeatures='' specularconstant='' specularexponent='' spreadmethod='' startoffset='' stddeviation='' stitchtiles='' surfacescale='' systemlanguage='' tablevalues='' targetx='' targety='' textlength='' viewbox='' viewtarget='' xchannelselector='' ychannelselector='' zoomandpan=''></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data -<!DOCTYPE html><body><math attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| attributename="" -| attributetype="" -| basefrequency="" -| baseprofile="" -| calcmode="" -| clippathunits="" -| contentscripttype="" -| contentstyletype="" -| diffuseconstant="" -| edgemode="" -| externalresourcesrequired="" -| filterres="" -| filterunits="" -| glyphref="" -| gradienttransform="" -| gradientunits="" -| kernelmatrix="" -| kernelunitlength="" -| keypoints="" -| keysplines="" -| keytimes="" -| lengthadjust="" -| limitingconeangle="" -| markerheight="" -| markerunits="" -| markerwidth="" -| maskcontentunits="" -| maskunits="" -| numoctaves="" -| pathlength="" -| patterncontentunits="" -| patterntransform="" -| patternunits="" -| pointsatx="" -| pointsaty="" -| pointsatz="" -| preservealpha="" -| preserveaspectratio="" -| primitiveunits="" -| refx="" -| refy="" -| repeatcount="" -| repeatdur="" -| requiredextensions="" -| requiredfeatures="" -| specularconstant="" -| specularexponent="" -| spreadmethod="" -| startoffset="" -| stddeviation="" -| stitchtiles="" -| surfacescale="" -| systemlanguage="" -| tablevalues="" -| targetx="" -| targety="" -| textlength="" -| viewbox="" -| viewtarget="" -| xchannelselector="" -| ychannelselector="" -| zoomandpan="" - -#data -<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg altGlyph> -| <svg altGlyphDef> -| <svg altGlyphItem> -| <svg animateColor> -| <svg animateMotion> -| <svg animateTransform> -| <svg clipPath> -| <svg feBlend> -| <svg feColorMatrix> -| <svg feComponentTransfer> -| <svg feComposite> -| <svg feConvolveMatrix> -| <svg feDiffuseLighting> -| <svg feDisplacementMap> -| <svg feDistantLight> -| <svg feFlood> -| <svg feFuncA> -| <svg feFuncB> -| <svg feFuncG> -| <svg feFuncR> -| <svg feGaussianBlur> -| <svg feImage> -| <svg feMerge> -| <svg feMergeNode> -| <svg feMorphology> -| <svg feOffset> -| <svg fePointLight> -| <svg feSpecularLighting> -| <svg feSpotLight> -| <svg feTile> -| <svg feTurbulence> -| <svg foreignObject> -| <svg glyphRef> -| <svg linearGradient> -| <svg radialGradient> -| <svg textPath> - -#data -<!DOCTYPE html><body><svg><altglyph /><altglyphdef /><altglyphitem /><animatecolor /><animatemotion /><animatetransform /><clippath /><feblend /><fecolormatrix /><fecomponenttransfer /><fecomposite /><feconvolvematrix /><fediffuselighting /><fedisplacementmap /><fedistantlight /><feflood /><fefunca /><fefuncb /><fefuncg /><fefuncr /><fegaussianblur /><feimage /><femerge /><femergenode /><femorphology /><feoffset /><fepointlight /><fespecularlighting /><fespotlight /><fetile /><feturbulence /><foreignobject /><glyphref /><lineargradient /><radialgradient /><textpath /></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg altGlyph> -| <svg altGlyphDef> -| <svg altGlyphItem> -| <svg animateColor> -| <svg animateMotion> -| <svg animateTransform> -| <svg clipPath> -| <svg feBlend> -| <svg feColorMatrix> -| <svg feComponentTransfer> -| <svg feComposite> -| <svg feConvolveMatrix> -| <svg feDiffuseLighting> -| <svg feDisplacementMap> -| <svg feDistantLight> -| <svg feFlood> -| <svg feFuncA> -| <svg feFuncB> -| <svg feFuncG> -| <svg feFuncR> -| <svg feGaussianBlur> -| <svg feImage> -| <svg feMerge> -| <svg feMergeNode> -| <svg feMorphology> -| <svg feOffset> -| <svg fePointLight> -| <svg feSpecularLighting> -| <svg feSpotLight> -| <svg feTile> -| <svg feTurbulence> -| <svg foreignObject> -| <svg glyphRef> -| <svg linearGradient> -| <svg radialGradient> -| <svg textPath> - -#data -<!DOCTYPE html><BODY><SVG><ALTGLYPH /><ALTGLYPHDEF /><ALTGLYPHITEM /><ANIMATECOLOR /><ANIMATEMOTION /><ANIMATETRANSFORM /><CLIPPATH /><FEBLEND /><FECOLORMATRIX /><FECOMPONENTTRANSFER /><FECOMPOSITE /><FECONVOLVEMATRIX /><FEDIFFUSELIGHTING /><FEDISPLACEMENTMAP /><FEDISTANTLIGHT /><FEFLOOD /><FEFUNCA /><FEFUNCB /><FEFUNCG /><FEFUNCR /><FEGAUSSIANBLUR /><FEIMAGE /><FEMERGE /><FEMERGENODE /><FEMORPHOLOGY /><FEOFFSET /><FEPOINTLIGHT /><FESPECULARLIGHTING /><FESPOTLIGHT /><FETILE /><FETURBULENCE /><FOREIGNOBJECT /><GLYPHREF /><LINEARGRADIENT /><RADIALGRADIENT /><TEXTPATH /></SVG> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg altGlyph> -| <svg altGlyphDef> -| <svg altGlyphItem> -| <svg animateColor> -| <svg animateMotion> -| <svg animateTransform> -| <svg clipPath> -| <svg feBlend> -| <svg feColorMatrix> -| <svg feComponentTransfer> -| <svg feComposite> -| <svg feConvolveMatrix> -| <svg feDiffuseLighting> -| <svg feDisplacementMap> -| <svg feDistantLight> -| <svg feFlood> -| <svg feFuncA> -| <svg feFuncB> -| <svg feFuncG> -| <svg feFuncR> -| <svg feGaussianBlur> -| <svg feImage> -| <svg feMerge> -| <svg feMergeNode> -| <svg feMorphology> -| <svg feOffset> -| <svg fePointLight> -| <svg feSpecularLighting> -| <svg feSpotLight> -| <svg feTile> -| <svg feTurbulence> -| <svg foreignObject> -| <svg glyphRef> -| <svg linearGradient> -| <svg radialGradient> -| <svg textPath> - -#data -<!DOCTYPE html><body><math><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math altglyph> -| <math altglyphdef> -| <math altglyphitem> -| <math animatecolor> -| <math animatemotion> -| <math animatetransform> -| <math clippath> -| <math feblend> -| <math fecolormatrix> -| <math fecomponenttransfer> -| <math fecomposite> -| <math feconvolvematrix> -| <math fediffuselighting> -| <math fedisplacementmap> -| <math fedistantlight> -| <math feflood> -| <math fefunca> -| <math fefuncb> -| <math fefuncg> -| <math fefuncr> -| <math fegaussianblur> -| <math feimage> -| <math femerge> -| <math femergenode> -| <math femorphology> -| <math feoffset> -| <math fepointlight> -| <math fespecularlighting> -| <math fespotlight> -| <math fetile> -| <math feturbulence> -| <math foreignobject> -| <math glyphref> -| <math lineargradient> -| <math radialgradient> -| <math textpath> - -#data -<!DOCTYPE html><body><svg><solidColor /></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg solidcolor> diff --git a/src/pkg/exp/html/testdata/webkit/tests12.dat b/src/pkg/exp/html/testdata/webkit/tests12.dat deleted file mode 100644 index 63107d277b..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests12.dat +++ /dev/null @@ -1,62 +0,0 @@ -#data -<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "foo" -| <math math> -| <math mtext> -| <i> -| "baz" -| <math annotation-xml> -| <svg svg> -| <svg desc> -| <b> -| "eggs" -| <svg g> -| <svg foreignObject> -| <p> -| "spam" -| <table> -| <tbody> -| <tr> -| <td> -| <img> -| <svg g> -| "quux" -| "bar" - -#data -<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "foo" -| <math math> -| <math mtext> -| <i> -| "baz" -| <math annotation-xml> -| <svg svg> -| <svg desc> -| <b> -| "eggs" -| <svg g> -| <svg foreignObject> -| <p> -| "spam" -| <table> -| <tbody> -| <tr> -| <td> -| <img> -| <svg g> -| "quux" -| "bar" diff --git a/src/pkg/exp/html/testdata/webkit/tests14.dat b/src/pkg/exp/html/testdata/webkit/tests14.dat deleted file mode 100644 index b8713f8858..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests14.dat +++ /dev/null @@ -1,74 +0,0 @@ -#data -<!DOCTYPE html><html><body><xyz:abc></xyz:abc> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xyz:abc> - -#data -<!DOCTYPE html><html><body><xyz:abc></xyz:abc><span></span> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xyz:abc> -| <span> - -#data -<!DOCTYPE html><html><html abc:def=gh><xyz:abc></xyz:abc> -#errors -15: Unexpected start tag html -#document -| <!DOCTYPE html> -| <html> -| abc:def="gh" -| <head> -| <body> -| <xyz:abc> - -#data -<!DOCTYPE html><html xml:lang=bar><html xml:lang=foo> -#errors -15: Unexpected start tag html -#document -| <!DOCTYPE html> -| <html> -| xml:lang="bar" -| <head> -| <body> - -#data -<!DOCTYPE html><html 123=456> -#errors -#document -| <!DOCTYPE html> -| <html> -| 123="456" -| <head> -| <body> - -#data -<!DOCTYPE html><html 123=456><html 789=012> -#errors -#document -| <!DOCTYPE html> -| <html> -| 123="456" -| 789="012" -| <head> -| <body> - -#data -<!DOCTYPE html><html><body 789=012> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| 789="012" diff --git a/src/pkg/exp/html/testdata/webkit/tests15.dat b/src/pkg/exp/html/testdata/webkit/tests15.dat deleted file mode 100644 index 6ce1c0d166..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests15.dat +++ /dev/null @@ -1,208 +0,0 @@ -#data -<!DOCTYPE html><p><b><i><u></p> <p>X -#errors -Line: 1 Col: 31 Unexpected end tag (p). Ignored. -Line: 1 Col: 36 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <b> -| <i> -| <u> -| <b> -| <i> -| <u> -| " " -| <p> -| "X" - -#data -<p><b><i><u></p> -<p>X -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end tag (p). Ignored. -Line: 2 Col: 4 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| <i> -| <u> -| <b> -| <i> -| <u> -| " -" -| <p> -| "X" - -#data -<!doctype html></html> <head> -#errors -Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " " - -#data -<!doctype html></body><meta> -#errors -Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <meta> - -#data -<html></html><!-- foo --> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. -#document -| <html> -| <head> -| <body> -| <!-- foo --> - -#data -<!doctype html></body><title>X</title> -#errors -Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "X" - -#data -<!doctype html><table> X<meta></table> -#errors -Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " X" -| <meta> -| <table> - -#data -<!doctype html><table> x</table> -#errors -Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x" -| <table> - -#data -<!doctype html><table> x </table> -#errors -Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x " -| <table> - -#data -<!doctype html><table><tr> x</table> -#errors -Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table>X<style> <tr>x </style> </table> -#errors -Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <table> -| <style> -| " <tr>x " -| " " - -#data -<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> -#errors -Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <a> -| "foo" -| <table> -| " " -| <tbody> -| <tr> -| <td> -| "bar" -| " " - -#data -<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> -#errors -6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. -13: Stray start tag “frame”. -21: Stray end tag “frame”. -29: Stray end tag “frame”. -39: “frameset” start tag after “body” already open. -105: End of file seen inside an [R]CDATA element. -105: End of file seen and there were open elements. -XXX: These errors are wrong, please fix me! -#document -| <html> -| <head> -| <frameset> -| <frame> -| <frameset> -| <frame> -| <noframes> -| "</frameset><noframes>" - -#data -<!DOCTYPE html><object></html> -#errors -1: Expected closing tag. Unexpected end of file -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <object> diff --git a/src/pkg/exp/html/testdata/webkit/tests16.dat b/src/pkg/exp/html/testdata/webkit/tests16.dat deleted file mode 100644 index 937dba9f42..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests16.dat +++ /dev/null @@ -1,2277 +0,0 @@ -#data -<!doctype html><script> -#errors -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script>a -#errors -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "a" -| <body> - -#data -<!doctype html><script>< -#errors -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<" -| <body> - -#data -<!doctype html><script></ -#errors -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</" -| <body> - -#data -<!doctype html><script></S -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</S" -| <body> - -#data -<!doctype html><script></SC -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SC" -| <body> - -#data -<!doctype html><script></SCR -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCR" -| <body> - -#data -<!doctype html><script></SCRI -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRI" -| <body> - -#data -<!doctype html><script></SCRIP -#errors -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRIP" -| <body> - -#data -<!doctype html><script></SCRIPT -#errors -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRIPT" -| <body> - -#data -<!doctype html><script></SCRIPT -#errors -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script></s -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</s" -| <body> - -#data -<!doctype html><script></sc -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</sc" -| <body> - -#data -<!doctype html><script></scr -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scr" -| <body> - -#data -<!doctype html><script></scri -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scri" -| <body> - -#data -<!doctype html><script></scrip -#errors -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scrip" -| <body> - -#data -<!doctype html><script></script -#errors -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</script" -| <body> - -#data -<!doctype html><script></script -#errors -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script><! -#errors -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!" -| <body> - -#data -<!doctype html><script><!a -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!a" -| <body> - -#data -<!doctype html><script><!- -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!-" -| <body> - -#data -<!doctype html><script><!-a -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!-a" -| <body> - -#data -<!doctype html><script><!-- -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<!doctype html><script><!--a -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--a" -| <body> - -#data -<!doctype html><script><!--< -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<" -| <body> - -#data -<!doctype html><script><!--<a -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<a" -| <body> - -#data -<!doctype html><script><!--</ -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--</" -| <body> - -#data -<!doctype html><script><!--</script -#errors -Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--</script" -| <body> - -#data -<!doctype html><script><!--</script -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<!doctype html><script><!--<s -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<s" -| <body> - -#data -<!doctype html><script><!--<script -#errors -Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script" -| <body> - -#data -<!doctype html><script><!--<script -#errors -Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script " -| <body> - -#data -<!doctype html><script><!--<script < -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script <" -| <body> - -#data -<!doctype html><script><!--<script <a -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script <a" -| <body> - -#data -<!doctype html><script><!--<script </ -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </" -| <body> - -#data -<!doctype html><script><!--<script </s -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </s" -| <body> - -#data -<!doctype html><script><!--<script </script -#errors -Line: 1 Col: 43 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script" -| <body> - -#data -<!doctype html><script><!--<script </scripta -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </scripta" -| <body> - -#data -<!doctype html><script><!--<script </script -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script> -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script>" -| <body> - -#data -<!doctype html><script><!--<script </script/ -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script/" -| <body> - -#data -<!doctype html><script><!--<script </script < -#errors -Line: 1 Col: 45 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script <" -| <body> - -#data -<!doctype html><script><!--<script </script <a -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script <a" -| <body> - -#data -<!doctype html><script><!--<script </script </ -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script </" -| <body> - -#data -<!doctype html><script><!--<script </script </script -#errors -Line: 1 Col: 52 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script </script" -| <body> - -#data -<!doctype html><script><!--<script </script </script -#errors -Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script </script/ -#errors -Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script </script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script - -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -" -| <body> - -#data -<!doctype html><script><!--<script -a -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -a" -| <body> - -#data -<!doctype html><script><!--<script -< -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -<" -| <body> - -#data -<!doctype html><script><!--<script -- -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --" -| <body> - -#data -<!doctype html><script><!--<script --a -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --a" -| <body> - -#data -<!doctype html><script><!--<script --< -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --<" -| <body> - -#data -<!doctype html><script><!--<script --> -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script -->< -#errors -Line: 1 Col: 39 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --><" -| <body> - -#data -<!doctype html><script><!--<script --></ -#errors -Line: 1 Col: 40 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --></" -| <body> - -#data -<!doctype html><script><!--<script --></script -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --></script" -| <body> - -#data -<!doctype html><script><!--<script --></script -#errors -Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script --></script/ -#errors -Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script --></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script><\/script>--></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script><\/script>-->" -| <body> - -#data -<!doctype html><script><!--<script></scr'+'ipt>--></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt>-->" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>--><!--</script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>--><!--" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>-- ></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>-- >" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>- -></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- ->" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>- - ></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- - >" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>-></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>->" -| <body> - -#data -<!doctype html><script><!--<script>--!></script>X -#errors -Line: 1 Col: 49 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script>--!></script>X" -| <body> - -#data -<!doctype html><script><!--<scr'+'ipt></script>--></script> -#errors -Line: 1 Col: 59 Unexpected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<scr'+'ipt>" -| <body> -| "-->" - -#data -<!doctype html><script><!--<script></scr'+'ipt></script>X -#errors -Line: 1 Col: 57 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt></script>X" -| <body> - -#data -<!doctype html><style><!--<style></style>--></style> -#errors -Line: 1 Col: 52 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--<style>" -| <body> -| "-->" - -#data -<!doctype html><style><!--</style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "X" - -#data -<!doctype html><style><!--...</style>...--></style> -#errors -Line: 1 Col: 51 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--..." -| <body> -| "...-->" - -#data -<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" -| <body> -| "X" - -#data -<!doctype html><style><!--...<style><!--...--!></style>--></style> -#errors -Line: 1 Col: 66 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--...<style><!--...--!>" -| <body> -| "-->" - -#data -<!doctype html><style><!--...</style><!-- --><style>@import ...</style> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--..." -| <!-- --> -| <style> -| "@import ..." -| <body> - -#data -<!doctype html><style>...<style><!--...</style><!-- --></style> -#errors -Line: 1 Col: 63 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "...<style><!--..." -| <!-- --> -| <body> - -#data -<!doctype html><style>...<!--[if IE]><style>...</style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "...<!--[if IE]><style>..." -| <body> -| "X" - -#data -<!doctype html><title><!--<title></title>--></title> -#errors -Line: 1 Col: 52 Unexpected end tag (title). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "<!--<title>" -| <body> -| "-->" - -#data -<!doctype html><title></title></title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "</title>" -| <body> - -#data -<!doctype html><title>foo/title><link></head><body>X -#errors -Line: 1 Col: 52 Unexpected end of file. Expected end tag (title). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "foo/title><link></head><body>X" -| <body> - -#data -<!doctype html><noscript><!--<noscript></noscript>--></noscript> -#errors -Line: 1 Col: 64 Unexpected end tag (noscript). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<!--<noscript>" -| <body> -| "-->" - -#data -<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "X" -| <noscript> -| "-->" - -#data -<!doctype html><noscript><iframe></noscript>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<iframe>" -| <body> -| "X" - -#data -<!doctype html><noframes><!--<noframes></noframes>--></noframes> -#errors -Line: 1 Col: 64 Unexpected end tag (noframes). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noframes> -| "<!--<noframes>" -| <body> -| "-->" - -#data -<!doctype html><noframes><body><script><!--...</script></body></noframes></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noframes> -| "<body><script><!--...</script></body>" -| <body> - -#data -<!doctype html><textarea><!--<textarea></textarea>--></textarea> -#errors -Line: 1 Col: 64 Unexpected end tag (textarea). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "<!--<textarea>" -| "-->" - -#data -<!doctype html><textarea></textarea></textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "</textarea>" - -#data -<!doctype html><iframe><!--<iframe></iframe>--></iframe> -#errors -Line: 1 Col: 56 Unexpected end tag (iframe). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> -| "<!--<iframe>" -| "-->" - -#data -<!doctype html><iframe>...<!--X->...<!--/X->...</iframe> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> -| "...<!--X->...<!--/X->..." - -#data -<!doctype html><xmp><!--<xmp></xmp>--></xmp> -#errors -Line: 1 Col: 44 Unexpected end tag (xmp). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xmp> -| "<!--<xmp>" -| "-->" - -#data -<!doctype html><noembed><!--<noembed></noembed>--></noembed> -#errors -Line: 1 Col: 60 Unexpected end tag (noembed). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <noembed> -| "<!--<noembed>" -| "-->" - -#data -<script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 8 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script>a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "a" -| <body> - -#data -<script>< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<" -| <body> - -#data -<script></ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</" -| <body> - -#data -<script></S -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</S" -| <body> - -#data -<script></SC -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SC" -| <body> - -#data -<script></SCR -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCR" -| <body> - -#data -<script></SCRI -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRI" -| <body> - -#data -<script></SCRIP -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRIP" -| <body> - -#data -<script></SCRIPT -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRIPT" -| <body> - -#data -<script></SCRIPT -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script></s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</s" -| <body> - -#data -<script></sc -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</sc" -| <body> - -#data -<script></scr -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scr" -| <body> - -#data -<script></scri -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scri" -| <body> - -#data -<script></scrip -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scrip" -| <body> - -#data -<script></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</script" -| <body> - -#data -<script></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script><! -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!" -| <body> - -#data -<script><!a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!a" -| <body> - -#data -<script><!- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!-" -| <body> - -#data -<script><!-a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!-a" -| <body> - -#data -<script><!-- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<script><!--a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--a" -| <body> - -#data -<script><!--< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<" -| <body> - -#data -<script><!--<a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<a" -| <body> - -#data -<script><!--</ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--</" -| <body> - -#data -<script><!--</script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--</script" -| <body> - -#data -<script><!--</script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<script><!--<s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<s" -| <body> - -#data -<script><!--<script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script" -| <body> - -#data -<script><!--<script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script " -| <body> - -#data -<script><!--<script < -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script <" -| <body> - -#data -<script><!--<script <a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script <a" -| <body> - -#data -<script><!--<script </ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </" -| <body> - -#data -<script><!--<script </s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </s" -| <body> - -#data -<script><!--<script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script" -| <body> - -#data -<script><!--<script </scripta -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </scripta" -| <body> - -#data -<script><!--<script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script>" -| <body> - -#data -<script><!--<script </script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script/" -| <body> - -#data -<script><!--<script </script < -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script <" -| <body> - -#data -<script><!--<script </script <a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script <a" -| <body> - -#data -<script><!--<script </script </ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script </" -| <body> - -#data -<script><!--<script </script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script </script" -| <body> - -#data -<script><!--<script </script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script </script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script </script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script - -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -" -| <body> - -#data -<script><!--<script -a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -a" -| <body> - -#data -<script><!--<script -- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --" -| <body> - -#data -<script><!--<script --a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --a" -| <body> - -#data -<script><!--<script --> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script -->< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --><" -| <body> - -#data -<script><!--<script --></ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --></" -| <body> - -#data -<script><!--<script --></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --></script" -| <body> - -#data -<script><!--<script --></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script --></script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script --></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script><\/script>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script><\/script>-->" -| <body> - -#data -<script><!--<script></scr'+'ipt>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt>-->" -| <body> - -#data -<script><!--<script></script><script></script></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>" -| <body> - -#data -<script><!--<script></script><script></script>--><!--</script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>--><!--" -| <body> - -#data -<script><!--<script></script><script></script>-- ></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>-- >" -| <body> - -#data -<script><!--<script></script><script></script>- -></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- ->" -| <body> - -#data -<script><!--<script></script><script></script>- - ></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- - >" -| <body> - -#data -<script><!--<script></script><script></script>-></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>->" -| <body> - -#data -<script><!--<script>--!></script>X -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script>--!></script>X" -| <body> - -#data -<script><!--<scr'+'ipt></script>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 44 Unexpected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<scr'+'ipt>" -| <body> -| "-->" - -#data -<script><!--<script></scr'+'ipt></script>X -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 42 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt></script>X" -| <body> - -#data -<style><!--<style></style>--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--<style>" -| <body> -| "-->" - -#data -<style><!--</style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "X" - -#data -<style><!--...</style>...--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 36 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--..." -| <body> -| "...-->" - -#data -<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" -| <body> -| "X" - -#data -<style><!--...<style><!--...--!></style>--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 51 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--...<style><!--...--!>" -| <body> -| "-->" - -#data -<style><!--...</style><!-- --><style>@import ...</style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--..." -| <!-- --> -| <style> -| "@import ..." -| <body> - -#data -<style>...<style><!--...</style><!-- --></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 48 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "...<style><!--..." -| <!-- --> -| <body> - -#data -<style>...<!--[if IE]><style>...</style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "...<!--[if IE]><style>..." -| <body> -| "X" - -#data -<title><!--<title></title>--></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end tag (title). -#document -| <html> -| <head> -| <title> -| "<!--<title>" -| <body> -| "-->" - -#data -<title></title></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| "</title>" -| <body> - -#data -<title>foo/title><link></head><body>X -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end of file. Expected end tag (title). -#document -| <html> -| <head> -| <title> -| "foo/title><link></head><body>X" -| <body> - -#data -<noscript><!--<noscript></noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (noscript). -#document -| <html> -| <head> -| <noscript> -| "<!--<noscript>" -| <body> -| "-->" - -#data -<noscript><!--</noscript>X<noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "X" -| <noscript> -| "-->" - -#data -<noscript><iframe></noscript>X -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<iframe>" -| <body> -| "X" - -#data -<noframes><!--<noframes></noframes>--></noframes> -#errors -Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (noframes). -#document -| <html> -| <head> -| <noframes> -| "<!--<noframes>" -| <body> -| "-->" - -#data -<noframes><body><script><!--...</script></body></noframes></html> -#errors -Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. -#document -| <html> -| <head> -| <noframes> -| "<body><script><!--...</script></body>" -| <body> - -#data -<textarea><!--<textarea></textarea>--></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (textarea). -#document -| <html> -| <head> -| <body> -| <textarea> -| "<!--<textarea>" -| "-->" - -#data -<textarea></textarea></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <textarea> -| "</textarea>" - -#data -<iframe><!--<iframe></iframe>--></iframe> -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -Line: 1 Col: 41 Unexpected end tag (iframe). -#document -| <html> -| <head> -| <body> -| <iframe> -| "<!--<iframe>" -| "-->" - -#data -<iframe>...<!--X->...<!--/X->...</iframe> -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <iframe> -| "...<!--X->...<!--/X->..." - -#data -<xmp><!--<xmp></xmp>--></xmp> -#errors -Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end tag (xmp). -#document -| <html> -| <head> -| <body> -| <xmp> -| "<!--<xmp>" -| "-->" - -#data -<noembed><!--<noembed></noembed>--></noembed> -#errors -Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE. -Line: 1 Col: 45 Unexpected end tag (noembed). -#document -| <html> -| <head> -| <body> -| <noembed> -| "<!--<noembed>" -| "-->" - -#data -<!doctype html><table> - -#errors -Line 2 Col 0 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " -" - -#data -<!doctype html><table><td><span><font></span><span> -#errors -Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase. -Line 1 Col 45 Unexpected end tag (span). -Line 1 Col 51 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <span> -| <font> -| <font> -| <span> - -#data -<!doctype html><form><table></form><form></table></form> -#errors -35: Stray end tag “form”. -41: Start tag “form” seen in “table”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <table> -| <form> diff --git a/src/pkg/exp/html/testdata/webkit/tests17.dat b/src/pkg/exp/html/testdata/webkit/tests17.dat deleted file mode 100644 index 7b555f888d..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests17.dat +++ /dev/null @@ -1,153 +0,0 @@ -#data -<!doctype html><table><tbody><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><tr><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<!doctype html><table><tr><td><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <select> -| <td> - -#data -<!doctype html><table><tr><th><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <th> -| <select> -| <td> - -#data -<!doctype html><table><caption><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <select> -| <tbody> -| <tr> - -#data -<!doctype html><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><th> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><tbody> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><thead> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><tfoot> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><caption> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><table><tr></table>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| "a" diff --git a/src/pkg/exp/html/testdata/webkit/tests18.dat b/src/pkg/exp/html/testdata/webkit/tests18.dat deleted file mode 100644 index 680e1f068a..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests18.dat +++ /dev/null @@ -1,269 +0,0 @@ -#data -<!doctype html><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> - -#data -<!doctype html><table><tbody><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> - -#data -<!doctype html><table><tbody><tr><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><tbody><tr><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><td><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><caption><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><tr><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <tbody> -| <tr> -| <style> -| "</script>" - -#data -<!doctype html><table><tr><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <tbody> -| <tr> -| <script> -| "</style>" - -#data -<!doctype html><table><caption><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <style> -| "</script>" -| "abc" - -#data -<!doctype html><table><td><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <style> -| "</script>" -| "abc" - -#data -<!doctype html><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" - -#data -<!doctype html><table><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" -| <table> - -#data -<!doctype html><table><tr><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><frameset></frameset><noframes>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" - -#data -<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" -| <!-- abc --> - -#data -<!doctype html><frameset></frameset></html><noframes>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" - -#data -<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" -| <!-- abc --> - -#data -<!doctype html><table><tr></tbody><tfoot> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <tfoot> - -#data -<!doctype html><table><td><svg></svg>abc<td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| "abc" -| <td> diff --git a/src/pkg/exp/html/testdata/webkit/tests19.dat b/src/pkg/exp/html/testdata/webkit/tests19.dat deleted file mode 100644 index 06222f5b9d..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests19.dat +++ /dev/null @@ -1,1220 +0,0 @@ -#data -<!doctype html><math><mn DefinitionUrl="foo"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mn> -| definitionURL="foo" - -#data -<!doctype html><html></p><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <!-- foo --> -| <head> -| <body> - -#data -<!doctype html><head></head></p><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <!-- foo --> -| <body> - -#data -<!doctype html><body><p><pre> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <pre> - -#data -<!doctype html><body><p><listing> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <listing> - -#data -<!doctype html><p><plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <plaintext> - -#data -<!doctype html><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <h1> - -#data -<!doctype html><form><isindex> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> - -#data -<!doctype html><isindex action="POST"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| action="POST" -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><isindex prompt="this is isindex"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "this is isindex" -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><isindex type="hidden"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| type="hidden" -| <hr> - -#data -<!doctype html><isindex name="foo"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><ruby><p><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <p> -| <rp> - -#data -<!doctype html><ruby><div><span><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <span> -| <rp> - -#data -<!doctype html><ruby><div><p><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <p> -| <rp> - -#data -<!doctype html><ruby><p><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <p> -| <rt> - -#data -<!doctype html><ruby><div><span><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <span> -| <rt> - -#data -<!doctype html><ruby><div><p><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <p> -| <rt> - -#data -<!doctype html><math/><foo> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <foo> - -#data -<!doctype html><svg/><foo> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <foo> - -#data -<!doctype html><div></body><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <!-- foo --> - -#data -<!doctype html><h1><div><h3><span></h1>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <h1> -| <div> -| <h3> -| <span> -| "foo" - -#data -<!doctype html><p></h3>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "foo" - -#data -<!doctype html><h3><li>abc</h2>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <h3> -| <li> -| "abc" -| "foo" - -#data -<!doctype html><table>abc<!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <!-- foo --> - -#data -<!doctype html><table> <!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " " -| <!-- foo --> - -#data -<!doctype html><table> b <!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " b " -| <table> -| <!-- foo --> - -#data -<!doctype html><select><option><option> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> -| <option> - -#data -<!doctype html><select><option></optgroup> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!doctype html><select><option></optgroup> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!doctype html><p><math><mi><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mi> -| <p> -| <h1> - -#data -<!doctype html><p><math><mo><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mo> -| <p> -| <h1> - -#data -<!doctype html><p><math><mn><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mn> -| <p> -| <h1> - -#data -<!doctype html><p><math><ms><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math ms> -| <p> -| <h1> - -#data -<!doctype html><p><math><mtext><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mtext> -| <p> -| <h1> - -#data -<!doctype html><frameset></noframes> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html c=d><body></html><html a=b> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <body> - -#data -<!doctype html><html c=d><frameset></frameset></html><html a=b> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <!-- foo --> - -#data -<!doctype html><html><frameset></frameset></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| " " - -#data -<!doctype html><html><frameset></frameset></html>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html></p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<html><frameset></frameset></html><!doctype html> -#errors -#document -| <html> -| <head> -| <frameset> - -#data -<!doctype html><body><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!doctype html><p><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><p>a<frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "a" - -#data -<!doctype html><p> <frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><pre><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> - -#data -<!doctype html><listing><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <listing> - -#data -<!doctype html><li><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <li> - -#data -<!doctype html><dd><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dd> - -#data -<!doctype html><dt><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dt> - -#data -<!doctype html><button><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <button> - -#data -<!doctype html><applet><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <applet> - -#data -<!doctype html><marquee><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <marquee> - -#data -<!doctype html><object><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <object> - -#data -<!doctype html><table><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> - -#data -<!doctype html><area><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <area> - -#data -<!doctype html><basefont><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <basefont> -| <frameset> - -#data -<!doctype html><bgsound><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <bgsound> -| <frameset> - -#data -<!doctype html><br><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <br> - -#data -<!doctype html><embed><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <embed> - -#data -<!doctype html><img><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> - -#data -<!doctype html><input><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> - -#data -<!doctype html><keygen><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <keygen> - -#data -<!doctype html><wbr><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <wbr> - -#data -<!doctype html><hr><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <hr> - -#data -<!doctype html><textarea></textarea><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> - -#data -<!doctype html><xmp></xmp><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xmp> - -#data -<!doctype html><iframe></iframe><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> - -#data -<!doctype html><select></select><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><svg></svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><math></math><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><svg><foreignObject><div> <frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><svg>a</svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| "a" - -#data -<!doctype html><svg> </svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<html>aaa<frameset></frameset> -#errors -#document -| <html> -| <head> -| <body> -| "aaa" - -#data -<html> a <frameset></frameset> -#errors -#document -| <html> -| <head> -| <body> -| "a " - -#data -<!doctype html><div><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><div><body><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> - -#data -<!doctype html><p><math></p>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| "a" - -#data -<!doctype html><p><math><mn><span></p>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mn> -| <span> -| <p> -| "a" - -#data -<!doctype html><math></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> - -#data -<!doctype html><meta charset="ascii"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| charset="ascii" -| <body> - -#data -<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| content="text/html;charset=ascii" -| http-equiv="content-type" -| <body> - -#data -<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> -| <meta> -| charset="utf8" -| <body> - -#data -<!doctype html><html a=b><head></head><html c=d> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <body> - -#data -<!doctype html><image/> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> - -#data -<!doctype html>a<i>b<table>c<b>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "a" -| <i> -| "bc" -| <b> -| "de" -| "f" -| <table> - -#data -<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" -| <table> - -#data -<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" - -#data -<!doctype html><table><i>a<b>b<div>c</i> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <i> -| "c" -| <table> - -#data -<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" -| <table> - -#data -<!doctype html><table><i>a<div>b<tr>c<b>d</i>e -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <div> -| "b" -| <i> -| "c" -| <b> -| "d" -| <b> -| "e" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><td><table><i>a<div>b<b>c</i>d -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <i> -| "a" -| <div> -| <i> -| "b" -| <b> -| "c" -| <b> -| "d" -| <table> - -#data -<!doctype html><body><bgsound> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <bgsound> - -#data -<!doctype html><body><basefont> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <basefont> - -#data -<!doctype html><a><b></a><basefont> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| <b> -| <basefont> - -#data -<!doctype html><a><b></a><bgsound> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| <b> -| <bgsound> - -#data -<!doctype html><figcaption><article></figcaption>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <figcaption> -| <article> -| "a" - -#data -<!doctype html><summary><article></summary>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <summary> -| <article> -| "a" - -#data -<!doctype html><p><a><plaintext>b -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <a> -| <plaintext> -| <a> -| "b" diff --git a/src/pkg/exp/html/testdata/webkit/tests2.dat b/src/pkg/exp/html/testdata/webkit/tests2.dat deleted file mode 100644 index 60d8592216..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests2.dat +++ /dev/null @@ -1,763 +0,0 @@ -#data -<!DOCTYPE html>Test -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Test" - -#data -<textarea>test</div>test -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 24 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <textarea> -| "test</div>test" - -#data -<table><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 11 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><td>test</tbody></table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "test" - -#data -<frame>test -#errors -Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. -Line: 1 Col: 7 Unexpected start tag frame. Ignored. -#document -| <html> -| <head> -| <body> -| "test" - -#data -<!DOCTYPE html><frameset>test -#errors -Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. -Line: 1 Col: 29 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><frameset><!DOCTYPE html> -#errors -Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. -Line: 1 Col: 40 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><font><p><b>test</font> -#errors -Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <p> -| <font> -| <b> -| "test" - -#data -<!DOCTYPE html><dt><div><dd> -#errors -Line: 1 Col: 28 Missing end tag (div, dt). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dt> -| <div> -| <dd> - -#data -<script></x -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</x" -| <body> - -#data -<table><plaintext><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. -Line: 1 Col: 22 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <plaintext> -| "<td>" -| <table> - -#data -<plaintext></plaintext> -#errors -Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" - -#data -<!DOCTYPE html><table><tr>TEST -#errors -Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 30 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "TEST" -| <table> -| <tbody> -| <tr> - -#data -<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> -#errors -Line: 1 Col: 37 Unexpected start tag (body). -Line: 1 Col: 53 Unexpected start tag (body). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| t1="1" -| t2="2" -| t3="3" -| t4="4" - -#data -</b test -#errors -Line: 1 Col: 8 Unexpected end of file in attribute name. -Line: 1 Col: 8 End tag contains unexpected attributes. -Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. -Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. -#document -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html></b test<b &=&>X -#errors -Line: 1 Col: 32 Named entity didn't end with ';'. -Line: 1 Col: 33 End tag contains unexpected attributes. -Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" - -#data -<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 54 Unexpected end of file in the tag name. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| type="text/x-foobar;baz" -| "X</SCRipt" -| <body> - -#data -& -#errors -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&" - -#data -&# -#errors -Line: 1 Col: 1 Numeric entity expected. Got end of file instead. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#" - -#data -&#X -#errors -Line: 1 Col: 3 Numeric entity expected but none found. -Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#X" - -#data -&#x -#errors -Line: 1 Col: 3 Numeric entity expected but none found. -Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#x" - -#data -- -#errors -Line: 1 Col: 4 Numeric entity didn't end with ';'. -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "-" - -#data -&x-test -#errors -Line: 1 Col: 1 Named entity expected. Got none. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&x-test" - -#data -<!doctypehtml><p><li> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <li> - -#data -<!doctypehtml><p><dt> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <dt> - -#data -<!doctypehtml><p><dd> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <dd> - -#data -<!doctypehtml><p><form> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <form> - -#data -<!DOCTYPE html><p></P>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "X" - -#data -& -#errors -Line: 1 Col: 4 Named entity didn't end with ';'. -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&" - -#data -&AMp; -#errors -Line: 1 Col: 1 Named entity expected. Got none. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&AMp;" - -#data -<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> -#errors -Line: 1 Col: 110 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> - -#data -<!DOCTYPE html>X</body>X -#errors -Line: 1 Col: 24 Unexpected non-space characters in the after body phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "XX" - -#data -<!DOCTYPE html><!-- X -#errors -Line: 1 Col: 21 Unexpected end of file in comment. -#document -| <!DOCTYPE html> -| <!-- X --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><table><caption>test TEST</caption><td>test -#errors -Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 58 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| "test TEST" -| <tbody> -| <tr> -| <td> -| "test" - -#data -<!DOCTYPE html><select><option><optgroup> -#errors -Line: 1 Col: 41 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> -| <optgroup> - -#data -<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> -#errors -Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. -Line: 1 Col: 76 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> -| <option> -| <option> -| <option> - -#data -<!DOCTYPE html><select><optgroup><option><optgroup> -#errors -Line: 1 Col: 51 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> -| <option> -| <optgroup> - -#data -<!DOCTYPE html><datalist><option>foo</datalist>bar -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <datalist> -| <option> -| "foo" -| "bar" - -#data -<!DOCTYPE html><font><input><input></font> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <input> -| <input> - -#data -<!DOCTYPE html><!-- XXX - XXX --> -#errors -#document -| <!DOCTYPE html> -| <!-- XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><!-- XXX - XXX -#errors -Line: 1 Col: 29 Unexpected end of file in comment (-) -#document -| <!DOCTYPE html> -| <!-- XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><!-- XXX - XXX - XXX --> -#errors -#document -| <!DOCTYPE html> -| <!-- XXX - XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<isindex test=x name=x> -#errors -Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! -#document -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| test="x" -| <hr> - -#data -test -test -#errors -Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "test -test" - -#data -<!DOCTYPE html><body><title>test</body></title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "test</body>" - -#data -<!DOCTYPE html><body><title>X</title><meta name=z><link rel=foo><style> -x { content:"</style" } </style> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "X" -| <meta> -| name="z" -| <link> -| rel="foo" -| <style> -| " -x { content:"</style" } " - -#data -<!DOCTYPE html><select><optgroup></optgroup></select> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> - -#data - - -#errors -Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html> <html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><script> -</script> <title>x</title> </head> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| " -" -| " " -| <title> -| "x" -| " " -| <body> - -#data -<!DOCTYPE html><html><body><html id=x> -#errors -Line: 1 Col: 38 html needs to be the first start tag. -#document -| <!DOCTYPE html> -| <html> -| id="x" -| <head> -| <body> - -#data -<!DOCTYPE html>X</body><html id="x"> -#errors -Line: 1 Col: 36 Unexpected start tag token (html) in the after body phase. -Line: 1 Col: 36 html needs to be the first start tag. -#document -| <!DOCTYPE html> -| <html> -| id="x" -| <head> -| <body> -| "X" - -#data -<!DOCTYPE html><head><html id=x> -#errors -Line: 1 Col: 32 html needs to be the first start tag. -#document -| <!DOCTYPE html> -| <html> -| id="x" -| <head> -| <body> - -#data -<!DOCTYPE html>X</html>X -#errors -Line: 1 Col: 24 Unexpected non-space characters in the after body phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "XX" - -#data -<!DOCTYPE html>X</html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X " - -#data -<!DOCTYPE html>X</html><p>X -#errors -Line: 1 Col: 26 Unexpected start tag (p). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <p> -| "X" - -#data -<!DOCTYPE html>X<p/x/y/z> -#errors -Line: 1 Col: 19 Expected a > after the /. -Line: 1 Col: 21 Solidus (/) incorrectly placed in tag. -Line: 1 Col: 23 Solidus (/) incorrectly placed in tag. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <p> -| x="" -| y="" -| z="" - -#data -<!DOCTYPE html><!--x-- -#errors -Line: 1 Col: 22 Unexpected end of file in comment (--). -#document -| <!DOCTYPE html> -| <!-- x --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><table><tr><td></p></table> -#errors -Line: 1 Col: 34 Unexpected end tag (p). Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <p> - -#data -<!DOCTYPE <!DOCTYPE HTML>><!--<!--x-->--> -#errors -Line: 1 Col: 20 Expected space or '>'. Got '' -Line: 1 Col: 25 Erroneous DOCTYPE. -Line: 1 Col: 35 Unexpected character in comment found. -#document -| <!DOCTYPE <!doctype> -| <html> -| <head> -| <body> -| ">" -| <!-- <!--x --> -| "-->" - -#data -<!doctype html><div><form></form><div></div></div> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <form> -| <div> diff --git a/src/pkg/exp/html/testdata/webkit/tests20.dat b/src/pkg/exp/html/testdata/webkit/tests20.dat deleted file mode 100644 index 6bd825608f..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests20.dat +++ /dev/null @@ -1,455 +0,0 @@ -#data -<!doctype html><p><button><button> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <button> - -#data -<!doctype html><p><button><address> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <address> - -#data -<!doctype html><p><button><blockquote> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <blockquote> - -#data -<!doctype html><p><button><menu> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <menu> - -#data -<!doctype html><p><button><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <p> - -#data -<!doctype html><p><button><ul> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <ul> - -#data -<!doctype html><p><button><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <h1> - -#data -<!doctype html><p><button><h6> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <h6> - -#data -<!doctype html><p><button><listing> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <listing> - -#data -<!doctype html><p><button><pre> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <pre> - -#data -<!doctype html><p><button><form> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <form> - -#data -<!doctype html><p><button><li> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <li> - -#data -<!doctype html><p><button><dd> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <dd> - -#data -<!doctype html><p><button><dt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <dt> - -#data -<!doctype html><p><button><plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <plaintext> - -#data -<!doctype html><p><button><table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <table> - -#data -<!doctype html><p><button><hr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <hr> - -#data -<!doctype html><p><button><xmp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <xmp> - -#data -<!doctype html><p><button></p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <p> - -#data -<!doctype html><address><button></address>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <address> -| <button> -| "a" - -#data -<!doctype html><address><button></address>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <address> -| <button> -| "a" - -#data -<p><table></p> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <p> -| <table> - -#data -<!doctype html><svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> - -#data -<!doctype html><p><figcaption> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <figcaption> - -#data -<!doctype html><p><summary> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <summary> - -#data -<!doctype html><form><table><form> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <table> - -#data -<!doctype html><table><form><form> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <form> - -#data -<!doctype html><table><form></table><form> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <form> - -#data -<!doctype html><svg><foreignObject><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg foreignObject> -| <p> - -#data -<!doctype html><svg><title>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg title> -| "abc" - -#data -<option><span><option> -#errors -#document -| <html> -| <head> -| <body> -| <option> -| <span> -| <option> - -#data -<option><option> -#errors -#document -| <html> -| <head> -| <body> -| <option> -| <option> - -#data -<math><annotation-xml><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <div> - -#data -<math><annotation-xml encoding="application/svg+xml"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="application/svg+xml" -| <div> - -#data -<math><annotation-xml encoding="application/xhtml+xml"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="application/xhtml+xml" -| <div> - -#data -<math><annotation-xml encoding="aPPlication/xhtmL+xMl"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="aPPlication/xhtmL+xMl" -| <div> - -#data -<math><annotation-xml encoding="text/html"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="text/html" -| <div> - -#data -<math><annotation-xml encoding="Text/htmL"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="Text/htmL" -| <div> - -#data -<math><annotation-xml encoding=" text/html "><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding=" text/html " -| <div> diff --git a/src/pkg/exp/html/testdata/webkit/tests21.dat b/src/pkg/exp/html/testdata/webkit/tests21.dat deleted file mode 100644 index 1260ec03e2..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests21.dat +++ /dev/null @@ -1,221 +0,0 @@ -#data -<svg><![CDATA[foo]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "foo" - -#data -<math><![CDATA[foo]]> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| "foo" - -#data -<div><![CDATA[foo]]> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <!-- [CDATA[foo]] --> - -#data -<svg><![CDATA[foo -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "foo" - -#data -<svg><![CDATA[foo -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "foo" - -#data -<svg><![CDATA[ -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> - -#data -<svg><![CDATA[]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> - -#data -<svg><![CDATA[]] >]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]] >" - -#data -<svg><![CDATA[]] >]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]] >" - -#data -<svg><![CDATA[]] -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]]" - -#data -<svg><![CDATA[] -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]" - -#data -<svg><![CDATA[]>a -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]>a" - -#data -<svg><foreignObject><div><![CDATA[foo]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg foreignObject> -| <div> -| <!-- [CDATA[foo]] --> - -#data -<svg><![CDATA[<svg>]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>" - -#data -<svg><![CDATA[</svg>a]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "</svg>a" - -#data -<svg><![CDATA[<svg>a -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>a" - -#data -<svg><![CDATA[</svg>a -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "</svg>a" - -#data -<svg><![CDATA[<svg>]]><path> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>" -| <svg path> - -#data -<svg><![CDATA[<svg>]]></path> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>" - -#data -<svg><![CDATA[<svg>]]><!--path--> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>" -| <!-- path --> - -#data -<svg><![CDATA[<svg>]]>path -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>path" - -#data -<svg><![CDATA[<!--svg-->]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<!--svg-->" diff --git a/src/pkg/exp/html/testdata/webkit/tests22.dat b/src/pkg/exp/html/testdata/webkit/tests22.dat deleted file mode 100644 index aab27b2e90..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests22.dat +++ /dev/null @@ -1,157 +0,0 @@ -#data -<a><b><big><em><strong><div>X</a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <big> -| <em> -| <strong> -| <big> -| <em> -| <strong> -| <div> -| <a> -| "X" - -#data -<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8>A</a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <b> -| <div> -| id="1" -| <a> -| <div> -| id="2" -| <a> -| <div> -| id="3" -| <a> -| <div> -| id="4" -| <a> -| <div> -| id="5" -| <a> -| <div> -| id="6" -| <a> -| <div> -| id="7" -| <a> -| <div> -| id="8" -| <a> -| "A" - -#data -<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9>A</a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <b> -| <div> -| id="1" -| <a> -| <div> -| id="2" -| <a> -| <div> -| id="3" -| <a> -| <div> -| id="4" -| <a> -| <div> -| id="5" -| <a> -| <div> -| id="6" -| <a> -| <div> -| id="7" -| <a> -| <div> -| id="8" -| <a> -| <div> -| id="9" -| "A" - -#data -<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9><div id=10>A</a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <b> -| <div> -| id="1" -| <a> -| <div> -| id="2" -| <a> -| <div> -| id="3" -| <a> -| <div> -| id="4" -| <a> -| <div> -| id="5" -| <a> -| <div> -| id="6" -| <a> -| <div> -| id="7" -| <a> -| <div> -| id="8" -| <a> -| <div> -| id="9" -| <div> -| id="10" -| "A" - -#data -<cite><b><cite><i><cite><i><cite><i><div>X</b>TEST -#errors -Line: 1 Col: 6 Unexpected start tag (cite). Expected DOCTYPE. -Line: 1 Col: 46 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 50 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <cite> -| <b> -| <cite> -| <i> -| <cite> -| <i> -| <cite> -| <i> -| <i> -| <i> -| <div> -| <b> -| "X" -| "TEST" diff --git a/src/pkg/exp/html/testdata/webkit/tests23.dat b/src/pkg/exp/html/testdata/webkit/tests23.dat deleted file mode 100644 index 34d2a73f1c..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests23.dat +++ /dev/null @@ -1,155 +0,0 @@ -#data -<p><font size=4><font color=red><font size=4><font size=4><font size=4><font size=4><font size=4><font color=red><p>X -#errors -3: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. -116: Unclosed elements. -117: End of file seen and there were open elements. -#document -| <html> -| <head> -| <body> -| <p> -| <font> -| size="4" -| <font> -| color="red" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| color="red" -| <p> -| <font> -| color="red" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| color="red" -| "X" - -#data -<p><font size=4><font size=4><font size=4><font size=4><p>X -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <p> -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| "X" - -#data -<p><font size=4><font size=4><font size=4><font size="5"><font size=4><p>X -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="5" -| <font> -| size="4" -| <p> -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="5" -| <font> -| size="4" -| "X" - -#data -<p><font size=4 id=a><font size=4 id=b><font size=4><font size=4><p>X -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <font> -| id="a" -| size="4" -| <font> -| id="b" -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <p> -| <font> -| id="a" -| size="4" -| <font> -| id="b" -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| "X" - -#data -<p><b id=a><b id=a><b id=a><b><object><b id=a><b id=a>X</object><p>Y -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| id="a" -| <b> -| id="a" -| <b> -| id="a" -| <b> -| <object> -| <b> -| id="a" -| <b> -| id="a" -| "X" -| <p> -| <b> -| id="a" -| <b> -| id="a" -| <b> -| id="a" -| <b> -| "Y" diff --git a/src/pkg/exp/html/testdata/webkit/tests24.dat b/src/pkg/exp/html/testdata/webkit/tests24.dat deleted file mode 100644 index f6dc7eb48a..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests24.dat +++ /dev/null @@ -1,79 +0,0 @@ -#data -<!DOCTYPE html>≂̸ -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "≂̸" - -#data -<!DOCTYPE html>≂̸A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "≂̸A" - -#data -<!DOCTYPE html>   -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " " - -#data -<!DOCTYPE html>  A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " A" - -#data -<!DOCTYPE html>⊂⃒ -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "⊂⃒" - -#data -<!DOCTYPE html>⊂⃒A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "⊂⃒A" - -#data -<!DOCTYPE html>𝔾 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "𝔾" - -#data -<!DOCTYPE html>𝔾A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "𝔾A" diff --git a/src/pkg/exp/html/testdata/webkit/tests25.dat b/src/pkg/exp/html/testdata/webkit/tests25.dat deleted file mode 100644 index 00de7295b7..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests25.dat +++ /dev/null @@ -1,219 +0,0 @@ -#data -<!DOCTYPE html><body><foo>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <foo> -| "A" - -#data -<!DOCTYPE html><body><area>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <area> -| "A" - -#data -<!DOCTYPE html><body><base>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <base> -| "A" - -#data -<!DOCTYPE html><body><basefont>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <basefont> -| "A" - -#data -<!DOCTYPE html><body><bgsound>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <bgsound> -| "A" - -#data -<!DOCTYPE html><body><br>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <br> -| "A" - -#data -<!DOCTYPE html><body><col>A -#errors -26: Stray start tag “col”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "A" - -#data -<!DOCTYPE html><body><command>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <command> -| "A" - -#data -<!DOCTYPE html><body><embed>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <embed> -| "A" - -#data -<!DOCTYPE html><body><frame>A -#errors -26: Stray start tag “frame”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "A" - -#data -<!DOCTYPE html><body><hr>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <hr> -| "A" - -#data -<!DOCTYPE html><body><img>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> -| "A" - -#data -<!DOCTYPE html><body><input>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> -| "A" - -#data -<!DOCTYPE html><body><keygen>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <keygen> -| "A" - -#data -<!DOCTYPE html><body><link>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <link> -| "A" - -#data -<!DOCTYPE html><body><meta>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <meta> -| "A" - -#data -<!DOCTYPE html><body><param>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <param> -| "A" - -#data -<!DOCTYPE html><body><source>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <source> -| "A" - -#data -<!DOCTYPE html><body><track>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <track> -| "A" - -#data -<!DOCTYPE html><body><wbr>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <wbr> -| "A" diff --git a/src/pkg/exp/html/testdata/webkit/tests26.dat b/src/pkg/exp/html/testdata/webkit/tests26.dat deleted file mode 100644 index da128e7794..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests26.dat +++ /dev/null @@ -1,195 +0,0 @@ -#data -<!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| href="#1" -| <nobr> -| "1" -| <nobr> -| <nobr> -| <br> -| <a> -| href="#2" -| <a> -| href="#2" -| <nobr> -| "2" -| <nobr> -| <nobr> -| <br> -| <a> -| href="#3" -| <a> -| href="#3" -| <nobr> -| "3" -| <nobr> - -#data -<!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <nobr> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" - -#data -<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" -| <table> - -#data -<!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <table> -| <tbody> -| <tr> -| <td> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" - -#data -<!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <div> -| <b> -| <nobr> -| <nobr> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" - -#data -<!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <nobr> -| <div> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" - -#data -<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <nobr> -| <ins> -| <nobr> -| <i> -| <i> -| <nobr> - -#data -<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <ins> -| <nobr> -| <nobr> -| <i> -| "2" - -#data -<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| "1" -| <nobr> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" diff --git a/src/pkg/exp/html/testdata/webkit/tests3.dat b/src/pkg/exp/html/testdata/webkit/tests3.dat deleted file mode 100644 index 38dc501be3..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests3.dat +++ /dev/null @@ -1,305 +0,0 @@ -#data -<head></head><style></style> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected start tag (style) that can be in head. Moved. -#document -| <html> -| <head> -| <style> -| <body> - -#data -<head></head><script></script> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. -#document -| <html> -| <head> -| <script> -| <body> - -#data -<head></head><!-- --><style></style><!-- --><script></script> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. -#document -| <html> -| <head> -| <style> -| <script> -| <!-- --> -| <!-- --> -| <body> - -#data -<head></head><!-- -->x<style></style><!-- --><script></script> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -#document -| <html> -| <head> -| <!-- --> -| <body> -| "x" -| <style> -| <!-- --> -| <script> - -#data -<!DOCTYPE html><html><head></head><body><pre> -</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> - -#data -<!DOCTYPE html><html><head></head><body><pre> -foo</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "foo" - -#data -<!DOCTYPE html><html><head></head><body><pre> - -foo</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| " -foo" - -#data -<!DOCTYPE html><html><head></head><body><pre> -foo -</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "foo -" - -#data -<!DOCTYPE html><html><head></head><body><pre>x</pre><span> -</span></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "x" -| <span> -| " -" - -#data -<!DOCTYPE html><html><head></head><body><pre>x -y</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "x -y" - -#data -<!DOCTYPE html><html><head></head><body><pre>x<div> -y</pre></body></html> -#errors -Line: 2 Col: 7 End tag (pre) seen too early. Expected other end tag. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "x" -| <div> -| " -y" - -#data -<!DOCTYPE html><pre>

A</pre> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| " -A" - -#data -<!DOCTYPE html><HTML><META><HEAD></HEAD></HTML> -#errors -Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| <body> - -#data -<!DOCTYPE html><HTML><HEAD><head></HEAD></HTML> -#errors -Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<textarea>foo<span>bar</span><i>baz -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 35 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <textarea> -| "foo<span>bar</span><i>baz" - -#data -<title>foo<span>bar</em><i>baz -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 30 Unexpected end of file. Expected end tag (title). -#document -| <html> -| <head> -| <title> -| "foo<span>bar</em><i>baz" -| <body> - -#data -<!DOCTYPE html><textarea> -</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> - -#data -<!DOCTYPE html><textarea> -foo</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "foo" - -#data -<!DOCTYPE html><textarea> - -foo</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| " -foo" - -#data -<!DOCTYPE html><html><head></head><body><ul><li><div><p><li></ul></body></html> -#errors -Line: 1 Col: 60 Missing end tag (div, li). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ul> -| <li> -| <div> -| <p> -| <li> - -#data -<!doctype html><nobr><nobr><nobr> -#errors -Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr). -Line: 1 Col: 33 Unexpected start tag (nobr) implies end tag (nobr). -Line: 1 Col: 33 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <nobr> -| <nobr> -| <nobr> - -#data -<!doctype html><nobr><nobr></nobr><nobr> -#errors -Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr). -Line: 1 Col: 40 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <nobr> -| <nobr> -| <nobr> - -#data -<!doctype html><html><body><p><table></table></body></html> -#errors -Not known -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <table> - -#data -<p><table></table> -#errors -Not known -#document -| <html> -| <head> -| <body> -| <p> -| <table> diff --git a/src/pkg/exp/html/testdata/webkit/tests4.dat b/src/pkg/exp/html/testdata/webkit/tests4.dat deleted file mode 100644 index 3c506326d1..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests4.dat +++ /dev/null @@ -1,59 +0,0 @@ -#data -direct div content -#errors -#document-fragment -div -#document -| "direct div content" - -#data -direct textarea content -#errors -#document-fragment -textarea -#document -| "direct textarea content" - -#data -textarea content with <em>pseudo</em> <foo>markup -#errors -#document-fragment -textarea -#document -| "textarea content with <em>pseudo</em> <foo>markup" - -#data -this is CDATA inside a <style> element -#errors -#document-fragment -style -#document -| "this is CDATA inside a <style> element" - -#data -</plaintext> -#errors -#document-fragment -plaintext -#document -| "</plaintext>" - -#data -setting html's innerHTML -#errors -Line: 1 Col: 24 Unexpected EOF in inner html mode. -#document-fragment -html -#document -| <head> -| <body> -| "setting html's innerHTML" - -#data -<title>setting head's innerHTML</title> -#errors -#document-fragment -head -#document -| <title> -| "setting head's innerHTML" diff --git a/src/pkg/exp/html/testdata/webkit/tests5.dat b/src/pkg/exp/html/testdata/webkit/tests5.dat deleted file mode 100644 index d7b5128a44..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests5.dat +++ /dev/null @@ -1,191 +0,0 @@ -#data -<style> <!-- </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). -#document -| <html> -| <head> -| <style> -| " <!-- " -| <body> -| "x" - -#data -<style> <!-- </style> --> </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| " <!-- " -| " " -| <body> -| "--> x" - -#data -<style> <!--> </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| " <!--> " -| <body> -| "x" - -#data -<style> <!---> </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| " <!---> " -| <body> -| "x" - -#data -<iframe> <!---> </iframe>x -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <iframe> -| " <!---> " -| "x" - -#data -<iframe> <!--- </iframe>->x</iframe> --> </iframe>x -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <iframe> -| " <!--- " -| "->x --> x" - -#data -<script> <!-- </script> --> </script>x -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| " <!-- " -| " " -| <body> -| "--> x" - -#data -<title> <!-- </title> --> </title>x -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| " <!-- " -| " " -| <body> -| "--> x" - -#data -<textarea> <!--- </textarea>->x</textarea> --> </textarea>x -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <textarea> -| " <!--- " -| "->x --> x" - -#data -<style> <!</-- </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| " <!</-- " -| <body> -| "x" - -#data -<p><xmp></xmp> -#errors -XXX: Unknown -#document -| <html> -| <head> -| <body> -| <p> -| <xmp> - -#data -<xmp> <!-- > --> </xmp> -#errors -Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <xmp> -| " <!-- > --> " - -#data -<title>&</title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| "&" -| <body> - -#data -<title><!--&--></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| "<!--&-->" -| <body> - -#data -<title><!--</title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end of file. Expected end tag (title). -#document -| <html> -| <head> -| <title> -| "<!--" -| <body> - -#data -<noscript><!--</noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "-->" diff --git a/src/pkg/exp/html/testdata/webkit/tests6.dat b/src/pkg/exp/html/testdata/webkit/tests6.dat deleted file mode 100644 index f28ece4fb0..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests6.dat +++ /dev/null @@ -1,663 +0,0 @@ -#data -<!doctype html></head> <head> -#errors -Line: 1 Col: 29 Unexpected start tag head. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| " " -| <body> - -#data -<!doctype html><form><div></form><div> -#errors -33: End tag "form" seen but there were unclosed elements. -38: End of file seen and there were open elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <div> -| <div> - -#data -<!doctype html><title>&</title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "&" -| <body> - -#data -<!doctype html><title><!--&--></title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "<!--&-->" -| <body> - -#data -<!doctype> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 10 Unexpected > character. Expected DOCTYPE name. -Line: 1 Col: 10 Erroneous DOCTYPE. -#document -| <!DOCTYPE > -| <html> -| <head> -| <body> - -#data -<!---x -#errors -Line: 1 Col: 6 Unexpected end of file in comment. -Line: 1 Col: 6 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- -x --> -| <html> -| <head> -| <body> - -#data -<body> -<div> -#errors -Line: 1 Col: 6 Unexpected start tag (body). -Line: 2 Col: 5 Expected closing tag. Unexpected end of file. -#document-fragment -div -#document -| " -" -| <div> - -#data -<frameset></frameset> -foo -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 2 Col: 3 Unexpected non-space characters in the after frameset phase. Ignored. -#document -| <html> -| <head> -| <frameset> -| " -" - -#data -<frameset></frameset> -<noframes> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 2 Col: 10 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <frameset> -| " -" -| <noframes> - -#data -<frameset></frameset> -<div> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 2 Col: 5 Unexpected start tag (div) in the after frameset phase. Ignored. -#document -| <html> -| <head> -| <frameset> -| " -" - -#data -<frameset></frameset> -</html> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -#document -| <html> -| <head> -| <frameset> -| " -" - -#data -<frameset></frameset> -</div> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 2 Col: 6 Unexpected end tag (div) in the after frameset phase. Ignored. -#document -| <html> -| <head> -| <frameset> -| " -" - -#data -<form><form> -#errors -Line: 1 Col: 6 Unexpected start tag (form). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected start tag (form). -Line: 1 Col: 12 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <form> - -#data -<button><button> -#errors -Line: 1 Col: 8 Unexpected start tag (button). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected start tag (button) implies end tag (button). -Line: 1 Col: 16 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <button> -| <button> - -#data -<table><tr><td></th> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (th). Ignored. -Line: 1 Col: 20 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><caption><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (td). Ignored. -Line: 1 Col: 20 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 20 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> -| <tbody> -| <tr> -| <td> - -#data -<table><caption><div> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 21 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> -| <div> - -#data -</caption><div> -#errors -Line: 1 Col: 10 Unexpected end tag (caption). Ignored. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document-fragment -caption -#document -| <div> - -#data -<table><caption><div></caption> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end tag (caption). Missing end tag (div). -Line: 1 Col: 31 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> -| <div> - -#data -<table><caption></table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 24 Unexpected end table tag in caption. Generates implied end caption. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> - -#data -</table><div> -#errors -Line: 1 Col: 8 Unexpected end table tag in caption. Generates implied end caption. -Line: 1 Col: 8 Unexpected end tag (caption). Ignored. -Line: 1 Col: 13 Expected closing tag. Unexpected end of file. -#document-fragment -caption -#document -| <div> - -#data -<table><caption></body></col></colgroup></html></tbody></td></tfoot></th></thead></tr> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end tag (body). Ignored. -Line: 1 Col: 29 Unexpected end tag (col). Ignored. -Line: 1 Col: 40 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 47 Unexpected end tag (html). Ignored. -Line: 1 Col: 55 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 60 Unexpected end tag (td). Ignored. -Line: 1 Col: 68 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 73 Unexpected end tag (th). Ignored. -Line: 1 Col: 81 Unexpected end tag (thead). Ignored. -Line: 1 Col: 86 Unexpected end tag (tr). Ignored. -Line: 1 Col: 86 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> - -#data -<table><caption><div></div> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 27 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> -| <div> - -#data -<table><tr><td></body></caption></col></colgroup></html> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end tag (body). Ignored. -Line: 1 Col: 32 Unexpected end tag (caption). Ignored. -Line: 1 Col: 38 Unexpected end tag (col). Ignored. -Line: 1 Col: 49 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 56 Unexpected end tag (html). Ignored. -Line: 1 Col: 56 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -</table></tbody></tfoot></thead></tr><div> -#errors -Line: 1 Col: 8 Unexpected end tag (table). Ignored. -Line: 1 Col: 16 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 24 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 32 Unexpected end tag (thead). Ignored. -Line: 1 Col: 37 Unexpected end tag (tr). Ignored. -Line: 1 Col: 42 Expected closing tag. Unexpected end of file. -#document-fragment -td -#document -| <div> - -#data -<table><colgroup>foo -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 20 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| "foo" -| <table> -| <colgroup> - -#data -foo<col> -#errors -Line: 1 Col: 3 Unexpected end tag (colgroup). Ignored. -#document-fragment -colgroup -#document -| <col> - -#data -<table><colgroup></col> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 23 This element (col) has no end tag. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> - -#data -<frameset><div> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected start tag token (div) in the frameset phase. Ignored. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <frameset> - -#data -</frameset><frame> -#errors -Line: 1 Col: 11 Unexpected end tag token (frameset) in the frameset phase (innerHTML). -#document-fragment -frameset -#document -| <frame> - -#data -<frameset></div> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end tag token (div) in the frameset phase. Ignored. -Line: 1 Col: 16 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <frameset> - -#data -</body><div> -#errors -Line: 1 Col: 7 Unexpected end tag (body). Ignored. -Line: 1 Col: 12 Expected closing tag. Unexpected end of file. -#document-fragment -body -#document -| <div> - -#data -<table><tr><div> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode. -Line: 1 Col: 16 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <div> -| <table> -| <tbody> -| <tr> - -#data -</tr><td> -#errors -Line: 1 Col: 5 Unexpected end tag (tr). Ignored. -#document-fragment -tr -#document -| <td> - -#data -</tbody></tfoot></thead><td> -#errors -Line: 1 Col: 8 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 16 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 24 Unexpected end tag (thead). Ignored. -#document-fragment -tr -#document -| <td> - -#data -<table><tr><div><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode. -Line: 1 Col: 20 Unexpected implied end tag (div) in the table row phase. -Line: 1 Col: 20 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<caption><col><colgroup><tbody><tfoot><thead><tr> -#errors -Line: 1 Col: 9 Unexpected start tag (caption). -Line: 1 Col: 14 Unexpected start tag (col). -Line: 1 Col: 24 Unexpected start tag (colgroup). -Line: 1 Col: 31 Unexpected start tag (tbody). -Line: 1 Col: 38 Unexpected start tag (tfoot). -Line: 1 Col: 45 Unexpected start tag (thead). -Line: 1 Col: 49 Unexpected end of file. Expected table content. -#document-fragment -tbody -#document -| <tr> - -#data -<table><tbody></thead> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end tag (thead) in the table body phase. Ignored. -Line: 1 Col: 22 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> - -#data -</table><tr> -#errors -Line: 1 Col: 8 Unexpected end tag (table). Ignored. -Line: 1 Col: 12 Unexpected end of file. Expected table content. -#document-fragment -tbody -#document -| <tr> - -#data -<table><tbody></body></caption></col></colgroup></html></td></th></tr> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end tag (body) in the table body phase. Ignored. -Line: 1 Col: 31 Unexpected end tag (caption) in the table body phase. Ignored. -Line: 1 Col: 37 Unexpected end tag (col) in the table body phase. Ignored. -Line: 1 Col: 48 Unexpected end tag (colgroup) in the table body phase. Ignored. -Line: 1 Col: 55 Unexpected end tag (html) in the table body phase. Ignored. -Line: 1 Col: 60 Unexpected end tag (td) in the table body phase. Ignored. -Line: 1 Col: 65 Unexpected end tag (th) in the table body phase. Ignored. -Line: 1 Col: 70 Unexpected end tag (tr) in the table body phase. Ignored. -Line: 1 Col: 70 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> - -#data -<table><tbody></div> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (div) in table context caused voodoo mode. -Line: 1 Col: 20 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 20 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> - -#data -<table><table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected start tag (table) implies end tag (table). -Line: 1 Col: 14 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <table> - -#data -<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end tag (body). Ignored. -Line: 1 Col: 24 Unexpected end tag (caption). Ignored. -Line: 1 Col: 30 Unexpected end tag (col). Ignored. -Line: 1 Col: 41 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 48 Unexpected end tag (html). Ignored. -Line: 1 Col: 56 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 61 Unexpected end tag (td). Ignored. -Line: 1 Col: 69 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 74 Unexpected end tag (th). Ignored. -Line: 1 Col: 82 Unexpected end tag (thead). Ignored. -Line: 1 Col: 87 Unexpected end tag (tr). Ignored. -Line: 1 Col: 87 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> - -#data -</table><tr> -#errors -Line: 1 Col: 8 Unexpected end tag (table). Ignored. -Line: 1 Col: 12 Unexpected end of file. Expected table content. -#document-fragment -table -#document -| <tbody> -| <tr> - -#data -<body></body></html> -#errors -Line: 1 Col: 20 Unexpected html end tag in inner html mode. -Line: 1 Col: 20 Unexpected EOF in inner html mode. -#document-fragment -html -#document -| <head> -| <body> - -#data -<html><frameset></frameset></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <frameset> -| " " - -#data -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"><html></html> -#errors -Line: 1 Col: 50 Erroneous DOCTYPE. -Line: 1 Col: 63 Unexpected end tag (html) after the (implied) root element. -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" ""> -| <html> -| <head> -| <body> - -#data -<param><frameset></frameset> -#errors -Line: 1 Col: 7 Unexpected start tag (param). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected start tag (frameset). -#document -| <html> -| <head> -| <frameset> - -#data -<source><frameset></frameset> -#errors -Line: 1 Col: 7 Unexpected start tag (source). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected start tag (frameset). -#document -| <html> -| <head> -| <frameset> - -#data -<track><frameset></frameset> -#errors -Line: 1 Col: 7 Unexpected start tag (track). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected start tag (frameset). -#document -| <html> -| <head> -| <frameset> - -#data -</html><frameset></frameset> -#errors -7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. -17: Stray “frameset” start tag. -17: “frameset” start tag seen. -#document -| <html> -| <head> -| <frameset> - -#data -</body><frameset></frameset> -#errors -7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. -17: Stray “frameset” start tag. -17: “frameset” start tag seen. -#document -| <html> -| <head> -| <frameset> diff --git a/src/pkg/exp/html/testdata/webkit/tests7.dat b/src/pkg/exp/html/testdata/webkit/tests7.dat deleted file mode 100644 index f5193c660b..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests7.dat +++ /dev/null @@ -1,390 +0,0 @@ -#data -<!doctype html><body><title>X</title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "X" - -#data -<!doctype html><table><title>X</title></table> -#errors -Line: 1 Col: 29 Unexpected start tag (title) in table context caused voodoo mode. -Line: 1 Col: 38 Unexpected end tag (title) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "X" -| <table> - -#data -<!doctype html><head></head><title>X</title> -#errors -Line: 1 Col: 35 Unexpected start tag (title) that can be in head. Moved. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "X" -| <body> - -#data -<!doctype html></head><title>X</title> -#errors -Line: 1 Col: 29 Unexpected start tag (title) that can be in head. Moved. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "X" -| <body> - -#data -<!doctype html><table><meta></table> -#errors -Line: 1 Col: 28 Unexpected start tag (meta) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <meta> -| <table> - -#data -<!doctype html><table>X<tr><td><table> <meta></table></table> -#errors -Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 45 Unexpected start tag (meta) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <table> -| <tbody> -| <tr> -| <td> -| <meta> -| <table> -| " " - -#data -<!doctype html><html> <head> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!doctype html> <head> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!doctype html><table><style> <tr>x </style> </table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <style> -| " <tr>x " -| " " - -#data -<!doctype html><table><TBODY><script> <tr>x </script> </table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <script> -| " <tr>x " -| " " - -#data -<!doctype html><p><applet><p>X</p></applet> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <applet> -| <p> -| "X" - -#data -<!doctype html><listing> -X</listing> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <listing> -| "X" - -#data -<!doctype html><select><input>X -#errors -Line: 1 Col: 30 Unexpected input start tag in the select phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <input> -| "X" - -#data -<!doctype html><select><select>X -#errors -Line: 1 Col: 31 Unexpected select start tag in the select phase treated as select end tag. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "X" - -#data -<!doctype html><table><input type=hidDEN></table> -#errors -Line: 1 Col: 41 Unexpected input with type hidden in table context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <input> -| type="hidDEN" - -#data -<!doctype html><table>X<input type=hidDEN></table> -#errors -Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <table> -| <input> -| type="hidDEN" - -#data -<!doctype html><table> <input type=hidDEN></table> -#errors -Line: 1 Col: 43 Unexpected input with type hidden in table context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " " -| <input> -| type="hidDEN" - -#data -<!doctype html><table> <input type='hidDEN'></table> -#errors -Line: 1 Col: 45 Unexpected input with type hidden in table context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " " -| <input> -| type="hidDEN" - -#data -<!doctype html><table><input type=" hidden"><input type=hidDEN></table> -#errors -Line: 1 Col: 44 Unexpected start tag (input) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> -| type=" hidden" -| <table> -| <input> -| type="hidDEN" - -#data -<!doctype html><table><select>X<tr> -#errors -Line: 1 Col: 30 Unexpected start tag (select) in table context caused voodoo mode. -Line: 1 Col: 35 Unexpected table element start tag (trs) in the select in table phase. -Line: 1 Col: 35 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "X" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><select>X</select> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "X" - -#data -<!DOCTYPE hTmL><html></html> -#errors -Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML><html></html> -#errors -Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<body>X</body></body> -#errors -Line: 1 Col: 21 Unexpected end tag token (body) in the after body phase. -Line: 1 Col: 21 Unexpected EOF in inner html mode. -#document-fragment -html -#document -| <head> -| <body> -| "X" - -#data -<div><p>a</x> b -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end tag (x). Ignored. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| <p> -| "a b" - -#data -<table><tr><td><code></code> </table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <code> -| " " - -#data -<table><b><tr><td>aaa</td></tr>bbb</table>ccc -#errors -XXX: Fix me -#document -| <html> -| <head> -| <body> -| <b> -| <b> -| "bbb" -| <table> -| <tbody> -| <tr> -| <td> -| "aaa" -| <b> -| "ccc" - -#data -A<table><tr> B</tr> B</table> -#errors -XXX: Fix me -#document -| <html> -| <head> -| <body> -| "A B B" -| <table> -| <tbody> -| <tr> - -#data -A<table><tr> B</tr> </em>C</table> -#errors -XXX: Fix me -#document -| <html> -| <head> -| <body> -| "A BC" -| <table> -| <tbody> -| <tr> -| " " - -#data -<select><keygen> -#errors -Not known -#document -| <html> -| <head> -| <body> -| <select> -| <keygen> diff --git a/src/pkg/exp/html/testdata/webkit/tests8.dat b/src/pkg/exp/html/testdata/webkit/tests8.dat deleted file mode 100644 index 90e6c919e8..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests8.dat +++ /dev/null @@ -1,148 +0,0 @@ -#data -<div> -<div></div> -</span>x -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 3 Col: 7 Unexpected end tag (span). Ignored. -Line: 3 Col: 8 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " -" -| <div> -| " -x" - -#data -<div>x<div></div> -</span>x -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 2 Col: 7 Unexpected end tag (span). Ignored. -Line: 2 Col: 8 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| "x" -| <div> -| " -x" - -#data -<div>x<div></div>x</span>x -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected end tag (span). Ignored. -Line: 1 Col: 26 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| "x" -| <div> -| "xx" - -#data -<div>x<div></div>y</span>z -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected end tag (span). Ignored. -Line: 1 Col: 26 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| "x" -| <div> -| "yz" - -#data -<table><div>x<div></div>x</span>x -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected start tag (div) in table context caused voodoo mode. -Line: 1 Col: 18 Unexpected start tag (div) in table context caused voodoo mode. -Line: 1 Col: 24 Unexpected end tag (div) in table context caused voodoo mode. -Line: 1 Col: 32 Unexpected end tag (span) in table context caused voodoo mode. -Line: 1 Col: 32 Unexpected end tag (span). Ignored. -Line: 1 Col: 33 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <div> -| "x" -| <div> -| "xx" -| <table> - -#data -x<table>x -#errors -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -Line: 1 Col: 9 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 9 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| "xx" -| <table> - -#data -x<table><table>x -#errors -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -Line: 1 Col: 15 Unexpected start tag (table) implies end tag (table). -Line: 1 Col: 16 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 16 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| "x" -| <table> -| "x" -| <table> - -#data -<b>a<div></div><div></b>y -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 24 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "a" -| <div> -| <div> -| <b> -| "y" - -#data -<a><div><p></a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| <div> -| <a> -| <p> -| <a> diff --git a/src/pkg/exp/html/testdata/webkit/tests9.dat b/src/pkg/exp/html/testdata/webkit/tests9.dat deleted file mode 100644 index 554e27aecf..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests9.dat +++ /dev/null @@ -1,457 +0,0 @@ -#data -<!DOCTYPE html><math></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> - -#data -<!DOCTYPE html><body><math></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> - -#data -<!DOCTYPE html><math><mi> -#errors -25: End of file in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> - -#data -<!DOCTYPE html><math><annotation-xml><svg><u> -#errors -45: HTML start tag “u” in a foreign namespace context. -45: End of file seen and there were open elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <svg svg> -| <u> - -#data -<!DOCTYPE html><body><select><math></math></select> -#errors -Line: 1 Col: 35 Unexpected start tag token (math) in the select phase. Ignored. -Line: 1 Col: 42 Unexpected end tag (math) in the select phase. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!DOCTYPE html><body><select><option><math></math></option></select> -#errors -Line: 1 Col: 43 Unexpected start tag token (math) in the select phase. Ignored. -Line: 1 Col: 50 Unexpected end tag (math) in the select phase. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!DOCTYPE html><body><table><math></math></table> -#errors -Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 41 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <table> - -#data -<!DOCTYPE html><body><table><math><mi>foo</mi></math></table> -#errors -Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 53 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <table> - -#data -<!DOCTYPE html><body><table><math><mi>foo</mi><mi>bar</mi></math></table> -#errors -Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 58 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 65 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <table> - -#data -<!DOCTYPE html><body><table><tbody><math><mi>foo</mi><mi>bar</mi></math></tbody></table> -#errors -Line: 1 Col: 41 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 53 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 65 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 72 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <table> -| <tbody> - -#data -<!DOCTYPE html><body><table><tbody><tr><math><mi>foo</mi><mi>bar</mi></math></tr></tbody></table> -#errors -Line: 1 Col: 45 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 57 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 69 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 76 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <table> -| <tbody> -| <tr> - -#data -<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" - -#data -<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</td></tr></tbody></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</caption></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux -#errors -Line: 1 Col: 70 HTML start tag "p" in a foreign namespace context. -Line: 1 Col: 81 Unexpected end table tag in caption. Generates implied end caption. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux -#errors -Line: 1 Col: 78 Unexpected end table tag in caption. Generates implied end caption. -Line: 1 Col: 78 Unexpected end tag (caption). Missing end tag (math). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| "baz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><colgroup><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux -#errors -Line: 1 Col: 44 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 56 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 68 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 71 HTML start tag "p" in a foreign namespace context. -Line: 1 Col: 71 Unexpected start tag (p) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" -| <table> -| <colgroup> -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><tr><td><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux -#errors -Line: 1 Col: 50 Unexpected start tag token (math) in the select phase. Ignored. -Line: 1 Col: 54 Unexpected start tag token (mi) in the select phase. Ignored. -Line: 1 Col: 62 Unexpected end tag (mi) in the select phase. Ignored. -Line: 1 Col: 66 Unexpected start tag token (mi) in the select phase. Ignored. -Line: 1 Col: 74 Unexpected end tag (mi) in the select phase. Ignored. -Line: 1 Col: 77 Unexpected start tag token (p) in the select phase. Ignored. -Line: 1 Col: 88 Unexpected table element end tag (tables) in the select in table phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <select> -| "foobarbaz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux -#errors -Line: 1 Col: 36 Unexpected start tag (select) in table context caused voodoo mode. -Line: 1 Col: 42 Unexpected start tag token (math) in the select phase. Ignored. -Line: 1 Col: 46 Unexpected start tag token (mi) in the select phase. Ignored. -Line: 1 Col: 54 Unexpected end tag (mi) in the select phase. Ignored. -Line: 1 Col: 58 Unexpected start tag token (mi) in the select phase. Ignored. -Line: 1 Col: 66 Unexpected end tag (mi) in the select phase. Ignored. -Line: 1 Col: 69 Unexpected start tag token (p) in the select phase. Ignored. -Line: 1 Col: 80 Unexpected table element end tag (tables) in the select in table phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "foobarbaz" -| <table> -| <p> -| "quux" - -#data -<!DOCTYPE html><body></body></html><math><mi>foo</mi><mi>bar</mi><p>baz -#errors -Line: 1 Col: 41 Unexpected start tag (math). -Line: 1 Col: 68 HTML start tag "p" in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body></body><math><mi>foo</mi><mi>bar</mi><p>baz -#errors -Line: 1 Col: 34 Unexpected start tag token (math) in the after body phase. -Line: 1 Col: 61 HTML start tag "p" in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><frameset><math><mi></mi><mi></mi><p><span> -#errors -Line: 1 Col: 31 Unexpected start tag token (math) in the frameset phase. Ignored. -Line: 1 Col: 35 Unexpected start tag token (mi) in the frameset phase. Ignored. -Line: 1 Col: 40 Unexpected end tag token (mi) in the frameset phase. Ignored. -Line: 1 Col: 44 Unexpected start tag token (mi) in the frameset phase. Ignored. -Line: 1 Col: 49 Unexpected end tag token (mi) in the frameset phase. Ignored. -Line: 1 Col: 52 Unexpected start tag token (p) in the frameset phase. Ignored. -Line: 1 Col: 58 Unexpected start tag token (span) in the frameset phase. Ignored. -Line: 1 Col: 58 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><frameset></frameset><math><mi></mi><mi></mi><p><span> -#errors -Line: 1 Col: 42 Unexpected start tag (math) in the after frameset phase. Ignored. -Line: 1 Col: 46 Unexpected start tag (mi) in the after frameset phase. Ignored. -Line: 1 Col: 51 Unexpected end tag (mi) in the after frameset phase. Ignored. -Line: 1 Col: 55 Unexpected start tag (mi) in the after frameset phase. Ignored. -Line: 1 Col: 60 Unexpected end tag (mi) in the after frameset phase. Ignored. -Line: 1 Col: 63 Unexpected start tag (p) in the after frameset phase. Ignored. -Line: 1 Col: 69 Unexpected start tag (span) in the after frameset phase. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><body xlink:href=foo><math xlink:href=foo></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| <math math> -| xlink href="foo" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo></mi></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <math math> -| <math mi> -| xlink href="foo" -| xml lang="en" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo /></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <math math> -| <math mi> -| xlink href="foo" -| xml lang="en" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo />bar</math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <math math> -| <math mi> -| xlink href="foo" -| xml lang="en" -| "bar" diff --git a/src/pkg/exp/html/testdata/webkit/tests_innerHTML_1.dat b/src/pkg/exp/html/testdata/webkit/tests_innerHTML_1.dat deleted file mode 100644 index 052fac7d55..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tests_innerHTML_1.dat +++ /dev/null @@ -1,733 +0,0 @@ -#data -<body><span> -#errors -#document-fragment -body -#document -| <span> - -#data -<span><body> -#errors -#document-fragment -body -#document -| <span> - -#data -<span><body> -#errors -#document-fragment -div -#document -| <span> - -#data -<body><span> -#errors -#document-fragment -html -#document -| <head> -| <body> -| <span> - -#data -<frameset><span> -#errors -#document-fragment -body -#document -| <span> - -#data -<span><frameset> -#errors -#document-fragment -body -#document -| <span> - -#data -<span><frameset> -#errors -#document-fragment -div -#document -| <span> - -#data -<frameset><span> -#errors -#document-fragment -html -#document -| <head> -| <frameset> - -#data -<table><tr> -#errors -#document-fragment -table -#document -| <tbody> -| <tr> - -#data -</table><tr> -#errors -#document-fragment -table -#document -| <tbody> -| <tr> - -#data -<a> -#errors -#document-fragment -table -#document -| <a> - -#data -<a> -#errors -#document-fragment -table -#document -| <a> - -#data -<a><caption>a -#errors -#document-fragment -table -#document -| <a> -| <caption> -| "a" - -#data -<a><colgroup><col> -#errors -#document-fragment -table -#document -| <a> -| <colgroup> -| <col> - -#data -<a><tbody><tr> -#errors -#document-fragment -table -#document -| <a> -| <tbody> -| <tr> - -#data -<a><tfoot><tr> -#errors -#document-fragment -table -#document -| <a> -| <tfoot> -| <tr> - -#data -<a><thead><tr> -#errors -#document-fragment -table -#document -| <a> -| <thead> -| <tr> - -#data -<a><tr> -#errors -#document-fragment -table -#document -| <a> -| <tbody> -| <tr> - -#data -<a><th> -#errors -#document-fragment -table -#document -| <a> -| <tbody> -| <tr> -| <th> - -#data -<a><td> -#errors -#document-fragment -table -#document -| <a> -| <tbody> -| <tr> -| <td> - -#data -<table></table><tbody> -#errors -#document-fragment -caption -#document -| <table> - -#data -</table><span> -#errors -#document-fragment -caption -#document -| <span> - -#data -<span></table> -#errors -#document-fragment -caption -#document -| <span> - -#data -</caption><span> -#errors -#document-fragment -caption -#document -| <span> - -#data -<span></caption><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><caption><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><col><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><colgroup><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><html><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><tbody><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><td><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><tfoot><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><thead><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><th><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><tr><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span></table><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -</colgroup><col> -#errors -#document-fragment -colgroup -#document -| <col> - -#data -<a><col> -#errors -#document-fragment -colgroup -#document -| <col> - -#data -<caption><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<col><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<colgroup><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<tbody><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<tfoot><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<thead><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -</table><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<a><tr> -#errors -#document-fragment -tbody -#document -| <a> -| <tr> - -#data -<a><td> -#errors -#document-fragment -tbody -#document -| <a> -| <tr> -| <td> - -#data -<a><td> -#errors -#document-fragment -tbody -#document -| <a> -| <tr> -| <td> - -#data -<a><td> -#errors -#document-fragment -tbody -#document -| <a> -| <tr> -| <td> - -#data -<td><table><tbody><a><tr> -#errors -#document-fragment -tbody -#document -| <tr> -| <td> -| <a> -| <table> -| <tbody> -| <tr> - -#data -</tr><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<td><table><a><tr></tr><tr> -#errors -#document-fragment -tr -#document -| <td> -| <a> -| <table> -| <tbody> -| <tr> -| <tr> - -#data -<caption><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<col><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<colgroup><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<tbody><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<tfoot><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<thead><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<tr><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -</table><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<td><table></table><td> -#errors -#document-fragment -tr -#document -| <td> -| <table> -| <td> - -#data -<td><table></table><td> -#errors -#document-fragment -tr -#document -| <td> -| <table> -| <td> - -#data -<caption><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<col><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<colgroup><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<tbody><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<tfoot><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<th><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<thead><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<tr><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</table><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</tbody><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</td><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</tfoot><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</thead><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</th><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</tr><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<table><td><td> -#errors -#document-fragment -td -#document -| <table> -| <tbody> -| <tr> -| <td> -| <td> - -#data -</select><option> -#errors -#document-fragment -select -#document -| <option> - -#data -<input><option> -#errors -#document-fragment -select -#document -| <option> - -#data -<keygen><option> -#errors -#document-fragment -select -#document -| <option> - -#data -<textarea><option> -#errors -#document-fragment -select -#document -| <option> - -#data -</html><!--abc--> -#errors -#document-fragment -html -#document -| <head> -| <body> -| <!-- abc --> - -#data -</frameset><frame> -#errors -#document-fragment -frameset -#document -| <frame> diff --git a/src/pkg/exp/html/testdata/webkit/tricky01.dat b/src/pkg/exp/html/testdata/webkit/tricky01.dat deleted file mode 100644 index 0841992448..0000000000 --- a/src/pkg/exp/html/testdata/webkit/tricky01.dat +++ /dev/null @@ -1,261 +0,0 @@ -#data -<b><p>Bold </b> Not bold</p> -Also not bold. -#errors -#document -| <html> -| <head> -| <body> -| <b> -| <p> -| <b> -| "Bold " -| " Not bold" -| " -Also not bold." - -#data -<html> -<font color=red><i>Italic and Red<p>Italic and Red </font> Just italic.</p> Italic only.</i> Plain -<p>I should not be red. <font color=red>Red. <i>Italic and red.</p> -<p>Italic and red. </i> Red.</font> I should not be red.</p> -<b>Bold <i>Bold and italic</b> Only Italic </i> Plain -#errors -#document -| <html> -| <head> -| <body> -| <font> -| color="red" -| <i> -| "Italic and Red" -| <i> -| <p> -| <font> -| color="red" -| "Italic and Red " -| " Just italic." -| " Italic only." -| " Plain -" -| <p> -| "I should not be red. " -| <font> -| color="red" -| "Red. " -| <i> -| "Italic and red." -| <font> -| color="red" -| <i> -| " -" -| <p> -| <font> -| color="red" -| <i> -| "Italic and red. " -| " Red." -| " I should not be red." -| " -" -| <b> -| "Bold " -| <i> -| "Bold and italic" -| <i> -| " Only Italic " -| " Plain" - -#data -<html><body> -<p><font size="7">First paragraph.</p> -<p>Second paragraph.</p></font> -<b><p><i>Bold and Italic</b> Italic</p> -#errors -#document -| <html> -| <head> -| <body> -| " -" -| <p> -| <font> -| size="7" -| "First paragraph." -| <font> -| size="7" -| " -" -| <p> -| "Second paragraph." -| " -" -| <b> -| <p> -| <b> -| <i> -| "Bold and Italic" -| <i> -| " Italic" - -#data -<html> -<dl> -<dt><b>Boo -<dd>Goo? -</dl> -</html> -#errors -#document -| <html> -| <head> -| <body> -| <dl> -| " -" -| <dt> -| <b> -| "Boo -" -| <dd> -| <b> -| "Goo? -" -| <b> -| " -" - -#data -<html><body> -<label><a><div>Hello<div>World</div></a></label> -</body></html> -#errors -#document -| <html> -| <head> -| <body> -| " -" -| <label> -| <a> -| <div> -| <a> -| "Hello" -| <div> -| "World" -| " -" - -#data -<table><center> <font>a</center> <img> <tr><td> </td> </tr> </table> -#errors -#document -| <html> -| <head> -| <body> -| <center> -| " " -| <font> -| "a" -| <font> -| <img> -| " " -| <table> -| " " -| <tbody> -| <tr> -| <td> -| " " -| " " -| " " - -#data -<table><tr><p><a><p>You should see this text. -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <a> -| <p> -| <a> -| "You should see this text." -| <table> -| <tbody> -| <tr> - -#data -<TABLE> -<TR> -<CENTER><CENTER><TD></TD></TR><TR> -<FONT> -<TABLE><tr></tr></TABLE> -</P> -<a></font><font></a> -This page contains an insanely badly-nested tag sequence. -#errors -#document -| <html> -| <head> -| <body> -| <center> -| <center> -| <font> -| " -" -| <table> -| " -" -| <tbody> -| <tr> -| " -" -| <td> -| <tr> -| " -" -| <table> -| <tbody> -| <tr> -| <font> -| " -" -| <p> -| " -" -| <a> -| <a> -| <font> -| <font> -| " -This page contains an insanely badly-nested tag sequence." - -#data -<html> -<body> -<b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the -nobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre> -</body> -</html> -#errors -#document -| <html> -| <head> -| <body> -| " -" -| <b> -| <nobr> -| <div> -| <b> -| <nobr> -| "This text is in a div inside a nobr" -| "More text that should not be in the nobr, i.e., the -nobr should have closed the div inside it implicitly. " -| <pre> -| "A pre tag outside everything else." -| " - -" diff --git a/src/pkg/exp/html/testdata/webkit/webkit01.dat b/src/pkg/exp/html/testdata/webkit/webkit01.dat deleted file mode 100644 index 4101b216e1..0000000000 --- a/src/pkg/exp/html/testdata/webkit/webkit01.dat +++ /dev/null @@ -1,609 +0,0 @@ -#data -Test -#errors -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "Test" - -#data -<div></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> - -#data -<div>Test</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "Test" - -#data -<di -#errors -#document -| <html> -| <head> -| <body> - -#data -<div>Hello</div> -<script> -console.log("PASS"); -</script> -<div>Bye</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "Hello" -| " -" -| <script> -| " -console.log("PASS"); -" -| " -" -| <div> -| "Bye" - -#data -<div foo="bar">Hello</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| foo="bar" -| "Hello" - -#data -<div>Hello</div> -<script> -console.log("FOO<span>BAR</span>BAZ"); -</script> -<div>Bye</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "Hello" -| " -" -| <script> -| " -console.log("FOO<span>BAR</span>BAZ"); -" -| " -" -| <div> -| "Bye" - -#data -<foo bar="baz"></foo><potato quack="duck"></potato> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| bar="baz" -| <potato> -| quack="duck" - -#data -<foo bar="baz"><potato quack="duck"></potato></foo> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| bar="baz" -| <potato> -| quack="duck" - -#data -<foo></foo bar="baz"><potato></potato quack="duck"> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| <potato> - -#data -</ tttt> -#errors -#document -| <!-- tttt --> -| <html> -| <head> -| <body> - -#data -<div FOO ><img><img></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| foo="" -| <img> -| <img> - -#data -<p>Test</p<p>Test2</p> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| "TestTest2" - -#data -<rdar://problem/6869687> -#errors -#document -| <html> -| <head> -| <body> -| <rdar:> -| 6869687="" -| problem="" - -#data -<A>test< /A> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "test< /A>" - -#data -< -#errors -#document -| <html> -| <head> -| <body> -| "<" - -#data -<body foo='bar'><body foo='baz' yo='mama'> -#errors -#document -| <html> -| <head> -| <body> -| foo="bar" -| yo="mama" - -#data -<body></br foo="bar"></body> -#errors -#document -| <html> -| <head> -| <body> -| <br> - -#data -<bdy><br foo="bar"></body> -#errors -#document -| <html> -| <head> -| <body> -| <bdy> -| <br> -| foo="bar" - -#data -<body></body></br foo="bar"> -#errors -#document -| <html> -| <head> -| <body> -| <br> - -#data -<bdy></body><br foo="bar"> -#errors -#document -| <html> -| <head> -| <body> -| <bdy> -| <br> -| foo="bar" - -#data -<html><body></body></html><!-- Hi there --> -#errors -#document -| <html> -| <head> -| <body> -| <!-- Hi there --> - -#data -<html><body></body></html>x<!-- Hi there --> -#errors -#document -| <html> -| <head> -| <body> -| "x" -| <!-- Hi there --> - -#data -<html><body></body></html>x<!-- Hi there --></html><!-- Again --> -#errors -#document -| <html> -| <head> -| <body> -| "x" -| <!-- Hi there --> -| <!-- Again --> - -#data -<html><body></body></html>x<!-- Hi there --></body></html><!-- Again --> -#errors -#document -| <html> -| <head> -| <body> -| "x" -| <!-- Hi there --> -| <!-- Again --> - -#data -<html><body><ruby><div><rp>xx</rp></div></ruby></body></html> -#errors -#document -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <rp> -| "xx" - -#data -<html><body><ruby><div><rt>xx</rt></div></ruby></body></html> -#errors -#document -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <rt> -| "xx" - -#data -<html><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--></html><!--5--><noframes>C</noframes><!--6--> -#errors -#document -| <html> -| <head> -| <frameset> -| <!-- 1 --> -| <noframes> -| "A" -| <!-- 2 --> -| <!-- 3 --> -| <noframes> -| "B" -| <!-- 4 --> -| <noframes> -| "C" -| <!-- 5 --> -| <!-- 6 --> - -#data -<select><option>A<select><option>B<select><option>C<select><option>D<select><option>E<select><option>F<select><option>G<select> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| "A" -| <option> -| "B" -| <select> -| <option> -| "C" -| <option> -| "D" -| <select> -| <option> -| "E" -| <option> -| "F" -| <select> -| <option> -| "G" - -#data -<dd><dd><dt><dt><dd><li><li> -#errors -#document -| <html> -| <head> -| <body> -| <dd> -| <dd> -| <dt> -| <dt> -| <dd> -| <li> -| <li> - -#data -<div><b></div><div><nobr>a<nobr> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <b> -| <div> -| <b> -| <nobr> -| "a" -| <nobr> - -#data -<head></head> -<body></body> -#errors -#document -| <html> -| <head> -| " -" -| <body> - -#data -<head></head> <style></style>ddd -#errors -#document -| <html> -| <head> -| <style> -| " " -| <body> -| "ddd" - -#data -<kbd><table></kbd><col><select><tr> -#errors -#document -| <html> -| <head> -| <body> -| <kbd> -| <select> -| <table> -| <colgroup> -| <col> -| <tbody> -| <tr> - -#data -<kbd><table></kbd><col><select><tr></table><div> -#errors -#document -| <html> -| <head> -| <body> -| <kbd> -| <select> -| <table> -| <colgroup> -| <col> -| <tbody> -| <tr> -| <div> - -#data -<a><li><style></style><title></title></a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <li> -| <a> -| <style> -| <title> - -#data -<font></p><p><meta><title></title></font> -#errors -#document -| <html> -| <head> -| <body> -| <font> -| <p> -| <p> -| <font> -| <meta> -| <title> - -#data -<a><center><title></title><a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <center> -| <a> -| <title> -| <a> - -#data -<svg><title><div> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg title> -| <div> - -#data -<svg><title><rect><div> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg title> -| <rect> -| <div> - -#data -<svg><title><svg><div> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg title> -| <svg svg> -| <div> - -#data -<img <="" FAIL> -#errors -#document -| <html> -| <head> -| <body> -| <img> -| <="" -| fail="" - -#data -<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul> -#errors -#document -| <html> -| <head> -| <body> -| <ul> -| <li> -| <div> -| id="foo" -| "A" -| <li> -| "B" -| <div> -| "C" - -#data -<svg><em><desc></em> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <em> -| <desc> - -#data -<table><tr><td><svg><desc><td></desc><circle> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| <svg desc> -| <svg circle> - -#data -<svg><tfoot></mi><td> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg tfoot> -| <svg td> - -#data -<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mrow> -| <math mrow> -| <math mn> -| "1" -| <math mi> -| "a" - -#data -<!doctype html><input type="hidden"><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><input type="button"><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> -| type="button" diff --git a/src/pkg/exp/html/testdata/webkit/webkit02.dat b/src/pkg/exp/html/testdata/webkit/webkit02.dat deleted file mode 100644 index 2218f4298c..0000000000 --- a/src/pkg/exp/html/testdata/webkit/webkit02.dat +++ /dev/null @@ -1,104 +0,0 @@ -#data -<foo bar=qux/> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| bar="qux/" - -#data -<p id="status"><noscript><strong>A</strong></noscript><span>B</span></p> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| id="status" -| <noscript> -| "<strong>A</strong>" -| <span> -| "B" - -#data -<div><sarcasm><div></div></sarcasm></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <sarcasm> -| <div> - -#data -<html><body><img src="" border="0" alt="><div>A</div></body></html> -#errors -#document -| <html> -| <head> -| <body> - -#data -<table><td></tbody>A -#errors -#document -| <html> -| <head> -| <body> -| "A" -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><td></thead>A -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "A" - -#data -<table><td></tfoot>A -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "A" - -#data -<table><thead><td></tbody>A -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <thead> -| <tr> -| <td> -| "A" - -#data -<legend>test</legend> -#errors -#document -| <html> -| <head> -| <body> -| <legend> -| "test" diff --git a/src/pkg/exp/html/token.go b/src/pkg/exp/html/token.go deleted file mode 100644 index b5e9c2d6ea..0000000000 --- a/src/pkg/exp/html/token.go +++ /dev/null @@ -1,779 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bytes" - "io" - "strconv" - "strings" -) - -// A TokenType is the type of a Token. -type TokenType int - -const ( - // ErrorToken means that an error occurred during tokenization. - ErrorToken TokenType = iota - // TextToken means a text node. - TextToken - // A StartTagToken looks like <a>. - StartTagToken - // An EndTagToken looks like </a>. - EndTagToken - // A SelfClosingTagToken tag looks like <br/>. - SelfClosingTagToken - // A CommentToken looks like <!--x-->. - CommentToken - // A DoctypeToken looks like <!DOCTYPE x> - DoctypeToken -) - -// String returns a string representation of the TokenType. -func (t TokenType) String() string { - switch t { - case ErrorToken: - return "Error" - case TextToken: - return "Text" - case StartTagToken: - return "StartTag" - case EndTagToken: - return "EndTag" - case SelfClosingTagToken: - return "SelfClosingTag" - case CommentToken: - return "Comment" - case DoctypeToken: - return "Doctype" - } - return "Invalid(" + strconv.Itoa(int(t)) + ")" -} - -// An Attribute is an attribute namespace-key-value triple. Namespace is -// non-empty for foreign attributes like xlink, Key is alphabetic (and hence -// does not contain escapable characters like '&', '<' or '>'), and Val is -// unescaped (it looks like "a<b" rather than "a<b"). -// -// Namespace is only used by the parser, not the tokenizer. -type Attribute struct { - Namespace, Key, Val string -} - -// A Token consists of a TokenType and some Data (tag name for start and end -// tags, content for text, comments and doctypes). A tag Token may also contain -// a slice of Attributes. Data is unescaped for all Tokens (it looks like "a<b" -// rather than "a<b"). -type Token struct { - Type TokenType - Data string - Attr []Attribute -} - -// tagString returns a string representation of a tag Token's Data and Attr. -func (t Token) tagString() string { - if len(t.Attr) == 0 { - return t.Data - } - buf := bytes.NewBufferString(t.Data) - for _, a := range t.Attr { - buf.WriteByte(' ') - buf.WriteString(a.Key) - buf.WriteString(`="`) - escape(buf, a.Val) - buf.WriteByte('"') - } - return buf.String() -} - -// String returns a string representation of the Token. -func (t Token) String() string { - switch t.Type { - case ErrorToken: - return "" - case TextToken: - return EscapeString(t.Data) - case StartTagToken: - return "<" + t.tagString() + ">" - case EndTagToken: - return "</" + t.tagString() + ">" - case SelfClosingTagToken: - return "<" + t.tagString() + "/>" - case CommentToken: - return "<!--" + t.Data + "-->" - case DoctypeToken: - return "<!DOCTYPE " + t.Data + ">" - } - return "Invalid(" + strconv.Itoa(int(t.Type)) + ")" -} - -// span is a range of bytes in a Tokenizer's buffer. The start is inclusive, -// the end is exclusive. -type span struct { - start, end int -} - -// A Tokenizer returns a stream of HTML Tokens. -type Tokenizer struct { - // r is the source of the HTML text. - r io.Reader - // tt is the TokenType of the current token. - tt TokenType - // err is the first error encountered during tokenization. It is possible - // for tt != Error && err != nil to hold: this means that Next returned a - // valid token but the subsequent Next call will return an error token. - // For example, if the HTML text input was just "plain", then the first - // Next call would set z.err to io.EOF but return a TextToken, and all - // subsequent Next calls would return an ErrorToken. - // err is never reset. Once it becomes non-nil, it stays non-nil. - err error - // buf[raw.start:raw.end] holds the raw bytes of the current token. - // buf[raw.end:] is buffered input that will yield future tokens. - raw span - buf []byte - // buf[data.start:data.end] holds the raw bytes of the current token's data: - // a text token's text, a tag token's tag name, etc. - data span - // pendingAttr is the attribute key and value currently being tokenized. - // When complete, pendingAttr is pushed onto attr. nAttrReturned is - // incremented on each call to TagAttr. - pendingAttr [2]span - attr [][2]span - nAttrReturned int - // rawTag is the "script" in "</script>" that closes the next token. If - // non-empty, the subsequent call to Next will return a raw or RCDATA text - // token: one that treats "<p>" as text instead of an element. - // rawTag's contents are lower-cased. - rawTag string - // textIsRaw is whether the current text token's data is not escaped. - textIsRaw bool -} - -// Err returns the error associated with the most recent ErrorToken token. -// This is typically io.EOF, meaning the end of tokenization. -func (z *Tokenizer) Err() error { - if z.tt != ErrorToken { - return nil - } - return z.err -} - -// readByte returns the next byte from the input stream, doing a buffered read -// from z.r into z.buf if necessary. z.buf[z.raw.start:z.raw.end] remains a contiguous byte -// slice that holds all the bytes read so far for the current token. -// It sets z.err if the underlying reader returns an error. -// Pre-condition: z.err == nil. -func (z *Tokenizer) readByte() byte { - if z.raw.end >= len(z.buf) { - // Our buffer is exhausted and we have to read from z.r. - // We copy z.buf[z.raw.start:z.raw.end] to the beginning of z.buf. If the length - // z.raw.end - z.raw.start is more than half the capacity of z.buf, then we - // allocate a new buffer before the copy. - c := cap(z.buf) - d := z.raw.end - z.raw.start - var buf1 []byte - if 2*d > c { - buf1 = make([]byte, d, 2*c) - } else { - buf1 = z.buf[:d] - } - copy(buf1, z.buf[z.raw.start:z.raw.end]) - if x := z.raw.start; x != 0 { - // Adjust the data/attr spans to refer to the same contents after the copy. - z.data.start -= x - z.data.end -= x - z.pendingAttr[0].start -= x - z.pendingAttr[0].end -= x - z.pendingAttr[1].start -= x - z.pendingAttr[1].end -= x - for i := range z.attr { - z.attr[i][0].start -= x - z.attr[i][0].end -= x - z.attr[i][1].start -= x - z.attr[i][1].end -= x - } - } - z.raw.start, z.raw.end, z.buf = 0, d, buf1[:d] - // Now that we have copied the live bytes to the start of the buffer, - // we read from z.r into the remainder. - n, err := z.r.Read(buf1[d:cap(buf1)]) - if err != nil { - z.err = err - return 0 - } - z.buf = buf1[:d+n] - } - x := z.buf[z.raw.end] - z.raw.end++ - return x -} - -// skipWhiteSpace skips past any white space. -func (z *Tokenizer) skipWhiteSpace() { - if z.err != nil { - return - } - for { - c := z.readByte() - if z.err != nil { - return - } - switch c { - case ' ', '\n', '\r', '\t', '\f': - // No-op. - default: - z.raw.end-- - return - } - } -} - -// readRawOrRCDATA reads until the next "</foo>", where "foo" is z.rawTag and -// is typically something like "script" or "textarea". -func (z *Tokenizer) readRawOrRCDATA() { -loop: - for { - c := z.readByte() - if z.err != nil { - break loop - } - if c != '<' { - continue loop - } - c = z.readByte() - if z.err != nil { - break loop - } - if c != '/' { - continue loop - } - for i := 0; i < len(z.rawTag); i++ { - c = z.readByte() - if z.err != nil { - break loop - } - if c != z.rawTag[i] && c != z.rawTag[i]-('a'-'A') { - continue loop - } - } - c = z.readByte() - if z.err != nil { - break loop - } - switch c { - case ' ', '\n', '\r', '\t', '\f', '/', '>': - // The 3 is 2 for the leading "</" plus 1 for the trailing character c. - z.raw.end -= 3 + len(z.rawTag) - break loop - case '<': - // Step back one, to catch "</foo</foo>". - z.raw.end-- - } - } - z.data.end = z.raw.end - // A textarea's or title's RCDATA can contain escaped entities. - z.textIsRaw = z.rawTag != "textarea" && z.rawTag != "title" - z.rawTag = "" -} - -// readComment reads the next comment token starting with "<!--". The opening -// "<!--" has already been consumed. -func (z *Tokenizer) readComment() { - z.data.start = z.raw.end - defer func() { - if z.data.end < z.data.start { - // It's a comment with no data, like <!-->. - z.data.end = z.data.start - } - }() - for dashCount := 2; ; { - c := z.readByte() - if z.err != nil { - // Ignore up to two dashes at EOF. - if dashCount > 2 { - dashCount = 2 - } - z.data.end = z.raw.end - dashCount - return - } - switch c { - case '-': - dashCount++ - continue - case '>': - if dashCount >= 2 { - z.data.end = z.raw.end - len("-->") - return - } - case '!': - if dashCount >= 2 { - c = z.readByte() - if z.err != nil { - z.data.end = z.raw.end - return - } - if c == '>' { - z.data.end = z.raw.end - len("--!>") - return - } - } - } - dashCount = 0 - } -} - -// readUntilCloseAngle reads until the next ">". -func (z *Tokenizer) readUntilCloseAngle() { - z.data.start = z.raw.end - for { - c := z.readByte() - if z.err != nil { - z.data.end = z.raw.end - return - } - if c == '>' { - z.data.end = z.raw.end - len(">") - return - } - } -} - -// readMarkupDeclaration reads the next token starting with "<!". It might be -// a "<!--comment-->", a "<!DOCTYPE foo>", or "<!a bogus comment". The opening -// "<!" has already been consumed. -func (z *Tokenizer) readMarkupDeclaration() TokenType { - z.data.start = z.raw.end - var c [2]byte - for i := 0; i < 2; i++ { - c[i] = z.readByte() - if z.err != nil { - z.data.end = z.raw.end - return CommentToken - } - } - if c[0] == '-' && c[1] == '-' { - z.readComment() - return CommentToken - } - z.raw.end -= 2 - const s = "DOCTYPE" - for i := 0; i < len(s); i++ { - c := z.readByte() - if z.err != nil { - z.data.end = z.raw.end - return CommentToken - } - if c != s[i] && c != s[i]+('a'-'A') { - // Back up to read the fragment of "DOCTYPE" again. - z.raw.end = z.data.start - z.readUntilCloseAngle() - return CommentToken - } - } - if z.skipWhiteSpace(); z.err != nil { - z.data.start = z.raw.end - z.data.end = z.raw.end - return DoctypeToken - } - z.readUntilCloseAngle() - return DoctypeToken -} - -// startTagIn returns whether the start tag in z.buf[z.data.start:z.data.end] -// case-insensitively matches any element of ss. -func (z *Tokenizer) startTagIn(ss ...string) bool { -loop: - for _, s := range ss { - if z.data.end-z.data.start != len(s) { - continue loop - } - for i := 0; i < len(s); i++ { - c := z.buf[z.data.start+i] - if 'A' <= c && c <= 'Z' { - c += 'a' - 'A' - } - if c != s[i] { - continue loop - } - } - return true - } - return false -} - -// readStartTag reads the next start tag token. The opening "<a" has already -// been consumed, where 'a' means anything in [A-Za-z]. -func (z *Tokenizer) readStartTag() TokenType { - z.attr = z.attr[:0] - z.nAttrReturned = 0 - // Read the tag name and attribute key/value pairs. - z.readTagName() - if z.skipWhiteSpace(); z.err != nil { - return ErrorToken - } - for { - c := z.readByte() - if z.err != nil || c == '>' { - break - } - z.raw.end-- - z.readTagAttrKey() - z.readTagAttrVal() - // Save pendingAttr if it has a non-empty key. - if z.pendingAttr[0].start != z.pendingAttr[0].end { - z.attr = append(z.attr, z.pendingAttr) - } - if z.skipWhiteSpace(); z.err != nil { - break - } - } - // Several tags flag the tokenizer's next token as raw. - c, raw := z.buf[z.data.start], false - if 'A' <= c && c <= 'Z' { - c += 'a' - 'A' - } - switch c { - case 'i': - raw = z.startTagIn("iframe") - case 'n': - raw = z.startTagIn("noembed", "noframes", "noscript") - case 'p': - raw = z.startTagIn("plaintext") - case 's': - raw = z.startTagIn("script", "style") - case 't': - raw = z.startTagIn("textarea", "title") - case 'x': - raw = z.startTagIn("xmp") - } - if raw { - z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end])) - } - // Look for a self-closing token like "<br/>". - if z.err == nil && z.buf[z.raw.end-2] == '/' { - return SelfClosingTagToken - } - return StartTagToken -} - -// readEndTag reads the next end tag token. The opening "</a" has already -// been consumed, where 'a' means anything in [A-Za-z]. -func (z *Tokenizer) readEndTag() { - z.attr = z.attr[:0] - z.nAttrReturned = 0 - z.readTagName() - for { - c := z.readByte() - if z.err != nil || c == '>' { - return - } - } -} - -// readTagName sets z.data to the "div" in "<div k=v>". The reader (z.raw.end) -// is positioned such that the first byte of the tag name (the "d" in "<div") -// has already been consumed. -func (z *Tokenizer) readTagName() { - z.data.start = z.raw.end - 1 - for { - c := z.readByte() - if z.err != nil { - z.data.end = z.raw.end - return - } - switch c { - case ' ', '\n', '\r', '\t', '\f': - z.data.end = z.raw.end - 1 - return - case '/', '>': - z.raw.end-- - z.data.end = z.raw.end - return - } - } -} - -// readTagAttrKey sets z.pendingAttr[0] to the "k" in "<div k=v>". -// Precondition: z.err == nil. -func (z *Tokenizer) readTagAttrKey() { - z.pendingAttr[0].start = z.raw.end - for { - c := z.readByte() - if z.err != nil { - z.pendingAttr[0].end = z.raw.end - return - } - switch c { - case ' ', '\n', '\r', '\t', '\f', '/': - z.pendingAttr[0].end = z.raw.end - 1 - return - case '=', '>': - z.raw.end-- - z.pendingAttr[0].end = z.raw.end - return - } - } -} - -// readTagAttrVal sets z.pendingAttr[1] to the "v" in "<div k=v>". -func (z *Tokenizer) readTagAttrVal() { - z.pendingAttr[1].start = z.raw.end - z.pendingAttr[1].end = z.raw.end - if z.skipWhiteSpace(); z.err != nil { - return - } - c := z.readByte() - if z.err != nil { - return - } - if c != '=' { - z.raw.end-- - return - } - if z.skipWhiteSpace(); z.err != nil { - return - } - quote := z.readByte() - if z.err != nil { - return - } - switch quote { - case '>': - z.raw.end-- - return - - case '\'', '"': - z.pendingAttr[1].start = z.raw.end - for { - c := z.readByte() - if z.err != nil { - z.pendingAttr[1].end = z.raw.end - return - } - if c == quote { - z.pendingAttr[1].end = z.raw.end - 1 - return - } - } - - default: - z.pendingAttr[1].start = z.raw.end - 1 - for { - c := z.readByte() - if z.err != nil { - z.pendingAttr[1].end = z.raw.end - return - } - switch c { - case ' ', '\n', '\r', '\t', '\f': - z.pendingAttr[1].end = z.raw.end - 1 - return - case '>': - z.raw.end-- - z.pendingAttr[1].end = z.raw.end - return - } - } - } -} - -// Next scans the next token and returns its type. -func (z *Tokenizer) Next() TokenType { - if z.err != nil { - z.tt = ErrorToken - return z.tt - } - z.raw.start = z.raw.end - z.data.start = z.raw.end - z.data.end = z.raw.end - if z.rawTag != "" { - if z.rawTag == "plaintext" { - // Read everything up to EOF. - for z.err == nil { - z.readByte() - } - z.textIsRaw = true - } else { - z.readRawOrRCDATA() - } - if z.data.end > z.data.start { - z.tt = TextToken - return z.tt - } - } - z.textIsRaw = false - -loop: - for { - c := z.readByte() - if z.err != nil { - break loop - } - if c != '<' { - continue loop - } - - // Check if the '<' we have just read is part of a tag, comment - // or doctype. If not, it's part of the accumulated text token. - c = z.readByte() - if z.err != nil { - break loop - } - var tokenType TokenType - switch { - case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z': - tokenType = StartTagToken - case c == '/': - tokenType = EndTagToken - case c == '!' || c == '?': - // We use CommentToken to mean any of "<!--actual comments-->", - // "<!DOCTYPE declarations>" and "<?xml processing instructions?>". - tokenType = CommentToken - default: - continue - } - - // We have a non-text token, but we might have accumulated some text - // before that. If so, we return the text first, and return the non- - // text token on the subsequent call to Next. - if x := z.raw.end - len("<a"); z.raw.start < x { - z.raw.end = x - z.data.end = x - z.tt = TextToken - return z.tt - } - switch tokenType { - case StartTagToken: - z.tt = z.readStartTag() - return z.tt - case EndTagToken: - c = z.readByte() - if z.err != nil { - break loop - } - if c == '>' { - // "</>" does not generate a token at all. - // Reset the tokenizer state and start again. - z.raw.start = z.raw.end - z.data.start = z.raw.end - z.data.end = z.raw.end - continue loop - } - if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' { - z.readEndTag() - z.tt = EndTagToken - return z.tt - } - z.raw.end-- - z.readUntilCloseAngle() - z.tt = CommentToken - return z.tt - case CommentToken: - if c == '!' { - z.tt = z.readMarkupDeclaration() - return z.tt - } - z.raw.end-- - z.readUntilCloseAngle() - z.tt = CommentToken - return z.tt - } - } - if z.raw.start < z.raw.end { - z.data.end = z.raw.end - z.tt = TextToken - return z.tt - } - z.tt = ErrorToken - return z.tt -} - -// Raw returns the unmodified text of the current token. Calling Next, Token, -// Text, TagName or TagAttr may change the contents of the returned slice. -func (z *Tokenizer) Raw() []byte { - return z.buf[z.raw.start:z.raw.end] -} - -// Text returns the unescaped text of a text, comment or doctype token. The -// contents of the returned slice may change on the next call to Next. -func (z *Tokenizer) Text() []byte { - switch z.tt { - case TextToken, CommentToken, DoctypeToken: - s := z.buf[z.data.start:z.data.end] - z.data.start = z.raw.end - z.data.end = z.raw.end - if !z.textIsRaw { - s = unescape(s) - } - return s - } - return nil -} - -// TagName returns the lower-cased name of a tag token (the `img` out of -// `<IMG SRC="foo">`) and whether the tag has attributes. -// The contents of the returned slice may change on the next call to Next. -func (z *Tokenizer) TagName() (name []byte, hasAttr bool) { - if z.data.start < z.data.end { - switch z.tt { - case StartTagToken, EndTagToken, SelfClosingTagToken: - s := z.buf[z.data.start:z.data.end] - z.data.start = z.raw.end - z.data.end = z.raw.end - return lower(s), z.nAttrReturned < len(z.attr) - } - } - return nil, false -} - -// TagAttr returns the lower-cased key and unescaped value of the next unparsed -// attribute for the current tag token and whether there are more attributes. -// The contents of the returned slices may change on the next call to Next. -func (z *Tokenizer) TagAttr() (key, val []byte, moreAttr bool) { - if z.nAttrReturned < len(z.attr) { - switch z.tt { - case StartTagToken, SelfClosingTagToken: - x := z.attr[z.nAttrReturned] - z.nAttrReturned++ - key = z.buf[x[0].start:x[0].end] - val = z.buf[x[1].start:x[1].end] - return lower(key), unescape(val), z.nAttrReturned < len(z.attr) - } - } - return nil, nil, false -} - -// Token returns the next Token. The result's Data and Attr values remain valid -// after subsequent Next calls. -func (z *Tokenizer) Token() Token { - t := Token{Type: z.tt} - switch z.tt { - case TextToken, CommentToken, DoctypeToken: - t.Data = string(z.Text()) - case StartTagToken, SelfClosingTagToken: - var attr []Attribute - name, moreAttr := z.TagName() - for moreAttr { - var key, val []byte - key, val, moreAttr = z.TagAttr() - attr = append(attr, Attribute{"", string(key), string(val)}) - } - t.Data = string(name) - t.Attr = attr - case EndTagToken: - name, _ := z.TagName() - t.Data = string(name) - } - return t -} - -// NewTokenizer returns a new HTML Tokenizer for the given Reader. -// The input is assumed to be UTF-8 encoded. -func NewTokenizer(r io.Reader) *Tokenizer { - return &Tokenizer{ - r: r, - buf: make([]byte, 0, 4096), - } -} diff --git a/src/pkg/exp/html/token_test.go b/src/pkg/exp/html/token_test.go deleted file mode 100644 index 61d74006ea..0000000000 --- a/src/pkg/exp/html/token_test.go +++ /dev/null @@ -1,590 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bytes" - "io" - "strings" - "testing" -) - -type tokenTest struct { - // A short description of the test case. - desc string - // The HTML to parse. - html string - // The string representations of the expected tokens, joined by '$'. - golden string -} - -var tokenTests = []tokenTest{ - { - "empty", - "", - "", - }, - // A single text node. The tokenizer should not break text nodes on whitespace, - // nor should it normalize whitespace within a text node. - { - "text", - "foo bar", - "foo bar", - }, - // An entity. - { - "entity", - "one < two", - "one < two", - }, - // A start, self-closing and end tag. The tokenizer does not care if the start - // and end tokens don't match; that is the job of the parser. - { - "tags", - "<a>b<c/>d</e>", - "<a>$b$<c/>$d$</e>", - }, - // Angle brackets that aren't a tag. - { - "not a tag #0", - "<", - "<", - }, - { - "not a tag #1", - "</", - "</", - }, - { - "not a tag #2", - "</>", - "", - }, - { - "not a tag #3", - "a</>b", - "a$b", - }, - { - "not a tag #4", - "</ >", - "<!-- -->", - }, - { - "not a tag #5", - "</.", - "<!--.-->", - }, - { - "not a tag #6", - "</.>", - "<!--.-->", - }, - { - "not a tag #7", - "a < b", - "a < b", - }, - { - "not a tag #8", - "<.>", - "<.>", - }, - { - "not a tag #9", - "a<<<b>>>c", - "a<<$<b>$>>c", - }, - { - "not a tag #10", - "if x<0 and y < 0 then x*y>0", - "if x<0 and y < 0 then x*y>0", - }, - // EOF in a tag name. - { - "tag name eof #0", - "<a", - "", - }, - { - "tag name eof #1", - "<a ", - "", - }, - { - "tag name eof #2", - "a<b", - "a", - }, - { - "tag name eof #3", - "<a><b", - "<a>", - }, - { - "tag name eof #4", - `<a x`, - `<a x="">`, - }, - // Some malformed tags that are missing a '>'. - { - "malformed tag #0", - `<p</p>`, - `<p< p="">`, - }, - { - "malformed tag #1", - `<p </p>`, - `<p <="" p="">`, - }, - { - "malformed tag #2", - `<p id`, - `<p id="">`, - }, - { - "malformed tag #3", - `<p id=`, - `<p id="">`, - }, - { - "malformed tag #4", - `<p id=>`, - `<p id="">`, - }, - { - "malformed tag #5", - `<p id=0`, - `<p id="0">`, - }, - { - "malformed tag #6", - `<p id=0</p>`, - `<p id="0</p">`, - }, - { - "malformed tag #7", - `<p id="0</p>`, - `<p id="0</p>">`, - }, - { - "malformed tag #8", - `<p id="0"</p>`, - `<p id="0" <="" p="">`, - }, - // Raw text and RCDATA. - { - "basic raw text", - "<script><a></b></script>", - "<script>$<a></b>$</script>", - }, - { - "unfinished script end tag", - "<SCRIPT>a</SCR", - "<script>$a</SCR", - }, - { - "broken script end tag", - "<SCRIPT>a</SCR ipt>", - "<script>$a</SCR ipt>", - }, - { - "EOF in script end tag", - "<SCRIPT>a</SCRipt", - "<script>$a</SCRipt", - }, - { - "scriptx end tag", - "<SCRIPT>a</SCRiptx", - "<script>$a</SCRiptx", - }, - { - "' ' completes script end tag", - "<SCRIPT>a</SCRipt ", - "<script>$a$</script>", - }, - { - "'>' completes script end tag", - "<SCRIPT>a</SCRipt>", - "<script>$a$</script>", - }, - { - "self-closing script end tag", - "<SCRIPT>a</SCRipt/>", - "<script>$a$</script>", - }, - { - "nested script tag", - "<SCRIPT>a</SCRipt<script>", - "<script>$a</SCRipt<script>", - }, - { - "script end tag after unfinished", - "<SCRIPT>a</SCRipt</script>", - "<script>$a</SCRipt$</script>", - }, - { - "script/style mismatched tags", - "<script>a</style>", - "<script>$a</style>", - }, - { - "style element with entity", - "<style>'", - "<style>$&apos;", - }, - { - "textarea with tag", - "<textarea><div></textarea>", - "<textarea>$<div>$</textarea>", - }, - { - "title with tag and entity", - "<title><b>K&R C</b></title>", - "<title>$<b>K&R C</b>$</title>", - }, - // DOCTYPE tests. - { - "Proper DOCTYPE", - "<!DOCTYPE html>", - "<!DOCTYPE html>", - }, - { - "DOCTYPE with no space", - "<!doctypehtml>", - "<!DOCTYPE html>", - }, - { - "DOCTYPE with two spaces", - "<!doctype html>", - "<!DOCTYPE html>", - }, - { - "looks like DOCTYPE but isn't", - "<!DOCUMENT html>", - "<!--DOCUMENT html-->", - }, - { - "DOCTYPE at EOF", - "<!DOCtype", - "<!DOCTYPE >", - }, - // XML processing instructions. - { - "XML processing instruction", - "<?xml?>", - "<!--?xml?-->", - }, - // Comments. - { - "comment0", - "abc<b><!-- skipme --></b>def", - "abc$<b>$<!-- skipme -->$</b>$def", - }, - { - "comment1", - "a<!-->z", - "a$<!---->$z", - }, - { - "comment2", - "a<!--->z", - "a$<!---->$z", - }, - { - "comment3", - "a<!--x>-->z", - "a$<!--x>-->$z", - }, - { - "comment4", - "a<!--x->-->z", - "a$<!--x->-->$z", - }, - { - "comment5", - "a<!>z", - "a$<!---->$z", - }, - { - "comment6", - "a<!->z", - "a$<!----->$z", - }, - { - "comment7", - "a<!---<>z", - "a$<!---<>z-->", - }, - { - "comment8", - "a<!--z", - "a$<!--z-->", - }, - { - "comment9", - "a<!--z-", - "a$<!--z-->", - }, - { - "comment10", - "a<!--z--", - "a$<!--z-->", - }, - { - "comment11", - "a<!--z---", - "a$<!--z--->", - }, - { - "comment12", - "a<!--z----", - "a$<!--z---->", - }, - { - "comment13", - "a<!--x--!>z", - "a$<!--x-->$z", - }, - // An attribute with a backslash. - { - "backslash", - `<p id="a\"b">`, - `<p id="a\" b"="">`, - }, - // Entities, tag name and attribute key lower-casing, and whitespace - // normalization within a tag. - { - "tricky", - "<p \t\n iD=\"a"B\" foo=\"bar\"><EM>te<&;xt</em></p>", - `<p id="a"B" foo="bar">$<em>$te<&;xt$</em>$</p>`, - }, - // A nonexistent entity. Tokenizing and converting back to a string should - // escape the "&" to become "&". - { - "noSuchEntity", - `<a b="c&noSuchEntity;d"><&alsoDoesntExist;&`, - `<a b="c&noSuchEntity;d">$<&alsoDoesntExist;&`, - }, - /* - // TODO: re-enable this test when it works. This input/output matches html5lib's behavior. - { - "entity without semicolon", - `¬it;∉<a b="q=z&=5¬ice=hello¬=world">`, - `¬it;∉$<a b="q=z&amp=5&notice=hello¬=world">`, - }, - */ - { - "entity with digits", - "½", - "½", - }, - // Attribute tests: - // http://dev.w3.org/html5/spec/Overview.html#attributes-0 - { - "Empty attribute", - `<input disabled FOO>`, - `<input disabled="" foo="">`, - }, - { - "Empty attribute, whitespace", - `<input disabled FOO >`, - `<input disabled="" foo="">`, - }, - { - "Unquoted attribute value", - `<input value=yes FOO=BAR>`, - `<input value="yes" foo="BAR">`, - }, - { - "Unquoted attribute value, spaces", - `<input value = yes FOO = BAR>`, - `<input value="yes" foo="BAR">`, - }, - { - "Unquoted attribute value, trailing space", - `<input value=yes FOO=BAR >`, - `<input value="yes" foo="BAR">`, - }, - { - "Single-quoted attribute value", - `<input value='yes' FOO='BAR'>`, - `<input value="yes" foo="BAR">`, - }, - { - "Single-quoted attribute value, trailing space", - `<input value='yes' FOO='BAR' >`, - `<input value="yes" foo="BAR">`, - }, - { - "Double-quoted attribute value", - `<input value="I'm an attribute" FOO="BAR">`, - `<input value="I'm an attribute" foo="BAR">`, - }, - { - "Attribute name characters", - `<meta http-equiv="content-type">`, - `<meta http-equiv="content-type">`, - }, - { - "Mixed attributes", - `a<P V="0 1" w='2' X=3 y>z`, - `a$<p v="0 1" w="2" x="3" y="">$z`, - }, - { - "Attributes with a solitary single quote", - `<p id=can't><p id=won't>`, - `<p id="can't">$<p id="won't">`, - }, -} - -func TestTokenizer(t *testing.T) { -loop: - for _, tt := range tokenTests { - z := NewTokenizer(strings.NewReader(tt.html)) - if tt.golden != "" { - for i, s := range strings.Split(tt.golden, "$") { - if z.Next() == ErrorToken { - t.Errorf("%s token %d: want %q got error %v", tt.desc, i, s, z.Err()) - continue loop - } - actual := z.Token().String() - if s != actual { - t.Errorf("%s token %d: want %q got %q", tt.desc, i, s, actual) - continue loop - } - } - } - z.Next() - if z.Err() != io.EOF { - t.Errorf("%s: want EOF got %q", tt.desc, z.Err()) - } - } -} - -type unescapeTest struct { - // A short description of the test case. - desc string - // The HTML text. - html string - // The unescaped text. - unescaped string -} - -var unescapeTests = []unescapeTest{ - // Handle no entities. - { - "copy", - "A\ttext\nstring", - "A\ttext\nstring", - }, - // Handle simple named entities. - { - "simple", - "& > <", - "& > <", - }, - // Handle hitting the end of the string. - { - "stringEnd", - "& &", - "& &", - }, - // Handle entities with two codepoints. - { - "multiCodepoint", - "text ⋛︀ blah", - "text \u22db\ufe00 blah", - }, - // Handle decimal numeric entities. - { - "decimalEntity", - "Delta = Δ ", - "Delta = Δ ", - }, - // Handle hexadecimal numeric entities. - { - "hexadecimalEntity", - "Lambda = λ = λ ", - "Lambda = λ = λ ", - }, - // Handle numeric early termination. - { - "numericEnds", - "&# &#x €43 © = ©f = ©", - "&# &#x €43 © = ©f = ©", - }, - // Handle numeric ISO-8859-1 entity replacements. - { - "numericReplacements", - "Footnote‡", - "Footnote‡", - }, -} - -func TestUnescape(t *testing.T) { - for _, tt := range unescapeTests { - unescaped := UnescapeString(tt.html) - if unescaped != tt.unescaped { - t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped) - } - } -} - -func TestUnescapeEscape(t *testing.T) { - ss := []string{ - ``, - `abc def`, - `a & b`, - `a&b`, - `a & b`, - `"`, - `"`, - `"<&>"`, - `"<&>"`, - `3&5==1 && 0<1, "0<1", a+acute=á`, - } - for _, s := range ss { - if s != UnescapeString(EscapeString(s)) { - t.Errorf("s != UnescapeString(EscapeString(s)), s=%q", s) - } - } -} - -func TestBufAPI(t *testing.T) { - s := "0<a>1</a>2<b>3<a>4<a>5</a>6</b>7</a>8<a/>9" - z := NewTokenizer(bytes.NewBufferString(s)) - var result bytes.Buffer - depth := 0 -loop: - for { - tt := z.Next() - switch tt { - case ErrorToken: - if z.Err() != io.EOF { - t.Error(z.Err()) - } - break loop - case TextToken: - if depth > 0 { - result.Write(z.Text()) - } - case StartTagToken, EndTagToken: - tn, _ := z.TagName() - if len(tn) == 1 && tn[0] == 'a' { - if tt == StartTagToken { - depth++ - } else { - depth-- - } - } - } - } - u := "14567" - v := string(result.Bytes()) - if u != v { - t.Errorf("TestBufAPI: want %q got %q", u, v) - } -} diff --git a/src/pkg/exp/inotify/inotify_linux.go b/src/pkg/exp/inotify/inotify_linux.go deleted file mode 100644 index 912cf5db82..0000000000 --- a/src/pkg/exp/inotify/inotify_linux.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package inotify implements a wrapper for the Linux inotify system. - -Example: - watcher, err := inotify.NewWatcher() - if err != nil { - log.Fatal(err) - } - err = watcher.Watch("/tmp") - if err != nil { - log.Fatal(err) - } - for { - select { - case ev := <-watcher.Event: - log.Println("event:", ev) - case err := <-watcher.Error: - log.Println("error:", err) - } - } - -*/ -package inotify - -import ( - "errors" - "fmt" - "os" - "strings" - "syscall" - "unsafe" -) - -type Event struct { - Mask uint32 // Mask of events - Cookie uint32 // Unique cookie associating related events (for rename(2)) - Name string // File name (optional) -} - -type watch struct { - wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) - flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) -} - -type Watcher struct { - fd int // File descriptor (as returned by the inotify_init() syscall) - watches map[string]*watch // Map of inotify watches (key: path) - paths map[int]string // Map of watched paths (key: watch descriptor) - Error chan error // Errors are sent on this channel - Event chan *Event // Events are returned on this channel - done chan bool // Channel for sending a "quit message" to the reader goroutine - isClosed bool // Set to true when Close() is first called -} - -// NewWatcher creates and returns a new inotify instance using inotify_init(2) -func NewWatcher() (*Watcher, error) { - fd, errno := syscall.InotifyInit() - if fd == -1 { - return nil, os.NewSyscallError("inotify_init", errno) - } - w := &Watcher{ - fd: fd, - watches: make(map[string]*watch), - paths: make(map[int]string), - Event: make(chan *Event), - Error: make(chan error), - done: make(chan bool, 1), - } - - go w.readEvents() - return w, nil -} - -// Close closes an inotify watcher instance -// It sends a message to the reader goroutine to quit and removes all watches -// associated with the inotify instance -func (w *Watcher) Close() error { - if w.isClosed { - return nil - } - w.isClosed = true - - // Send "quit" message to the reader goroutine - w.done <- true - for path := range w.watches { - w.RemoveWatch(path) - } - - return nil -} - -// AddWatch adds path to the watched file set. -// The flags are interpreted as described in inotify_add_watch(2). -func (w *Watcher) AddWatch(path string, flags uint32) error { - if w.isClosed { - return errors.New("inotify instance already closed") - } - - watchEntry, found := w.watches[path] - if found { - watchEntry.flags |= flags - flags |= syscall.IN_MASK_ADD - } - wd, err := syscall.InotifyAddWatch(w.fd, path, flags) - if err != nil { - return &os.PathError{ - Op: "inotify_add_watch", - Path: path, - Err: err, - } - } - - if !found { - w.watches[path] = &watch{wd: uint32(wd), flags: flags} - w.paths[wd] = path - } - return nil -} - -// Watch adds path to the watched file set, watching all events. -func (w *Watcher) Watch(path string) error { - return w.AddWatch(path, IN_ALL_EVENTS) -} - -// RemoveWatch removes path from the watched file set. -func (w *Watcher) RemoveWatch(path string) error { - watch, ok := w.watches[path] - if !ok { - return errors.New(fmt.Sprintf("can't remove non-existent inotify watch for: %s", path)) - } - success, errno := syscall.InotifyRmWatch(w.fd, watch.wd) - if success == -1 { - return os.NewSyscallError("inotify_rm_watch", errno) - } - delete(w.watches, path) - return nil -} - -// readEvents reads from the inotify file descriptor, converts the -// received events into Event objects and sends them via the Event channel -func (w *Watcher) readEvents() { - var buf [syscall.SizeofInotifyEvent * 4096]byte - - for { - n, err := syscall.Read(w.fd, buf[0:]) - // See if there is a message on the "done" channel - var done bool - select { - case done = <-w.done: - default: - } - - // If EOF or a "done" message is received - if n == 0 || done { - err := syscall.Close(w.fd) - if err != nil { - w.Error <- os.NewSyscallError("close", err) - } - close(w.Event) - close(w.Error) - return - } - if n < 0 { - w.Error <- os.NewSyscallError("read", err) - continue - } - if n < syscall.SizeofInotifyEvent { - w.Error <- errors.New("inotify: short read in readEvents()") - continue - } - - var offset uint32 = 0 - // We don't know how many events we just read into the buffer - // While the offset points to at least one whole event... - for offset <= uint32(n-syscall.SizeofInotifyEvent) { - // Point "raw" to the event in the buffer - raw := (*syscall.InotifyEvent)(unsafe.Pointer(&buf[offset])) - event := new(Event) - event.Mask = uint32(raw.Mask) - event.Cookie = uint32(raw.Cookie) - nameLen := uint32(raw.Len) - // If the event happened to the watched directory or the watched file, the kernel - // doesn't append the filename to the event, but we would like to always fill the - // the "Name" field with a valid filename. We retrieve the path of the watch from - // the "paths" map. - event.Name = w.paths[int(raw.Wd)] - if nameLen > 0 { - // Point "bytes" at the first byte of the filename - bytes := (*[syscall.PathMax]byte)(unsafe.Pointer(&buf[offset+syscall.SizeofInotifyEvent])) - // The filename is padded with NUL bytes. TrimRight() gets rid of those. - event.Name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") - } - // Send the event on the events channel - w.Event <- event - - // Move to the next event in the buffer - offset += syscall.SizeofInotifyEvent + nameLen - } - } -} - -// String formats the event e in the form -// "filename: 0xEventMask = IN_ACCESS|IN_ATTRIB_|..." -func (e *Event) String() string { - var events string = "" - - m := e.Mask - for _, b := range eventBits { - if m&b.Value != 0 { - m &^= b.Value - events += "|" + b.Name - } - } - - if m != 0 { - events += fmt.Sprintf("|%#x", m) - } - if len(events) > 0 { - events = " == " + events[1:] - } - - return fmt.Sprintf("%q: %#x%s", e.Name, e.Mask, events) -} - -const ( - // Options for inotify_init() are not exported - // IN_CLOEXEC uint32 = syscall.IN_CLOEXEC - // IN_NONBLOCK uint32 = syscall.IN_NONBLOCK - - // Options for AddWatch - IN_DONT_FOLLOW uint32 = syscall.IN_DONT_FOLLOW - IN_ONESHOT uint32 = syscall.IN_ONESHOT - IN_ONLYDIR uint32 = syscall.IN_ONLYDIR - - // The "IN_MASK_ADD" option is not exported, as AddWatch - // adds it automatically, if there is already a watch for the given path - // IN_MASK_ADD uint32 = syscall.IN_MASK_ADD - - // Events - IN_ACCESS uint32 = syscall.IN_ACCESS - IN_ALL_EVENTS uint32 = syscall.IN_ALL_EVENTS - IN_ATTRIB uint32 = syscall.IN_ATTRIB - IN_CLOSE uint32 = syscall.IN_CLOSE - IN_CLOSE_NOWRITE uint32 = syscall.IN_CLOSE_NOWRITE - IN_CLOSE_WRITE uint32 = syscall.IN_CLOSE_WRITE - IN_CREATE uint32 = syscall.IN_CREATE - IN_DELETE uint32 = syscall.IN_DELETE - IN_DELETE_SELF uint32 = syscall.IN_DELETE_SELF - IN_MODIFY uint32 = syscall.IN_MODIFY - IN_MOVE uint32 = syscall.IN_MOVE - IN_MOVED_FROM uint32 = syscall.IN_MOVED_FROM - IN_MOVED_TO uint32 = syscall.IN_MOVED_TO - IN_MOVE_SELF uint32 = syscall.IN_MOVE_SELF - IN_OPEN uint32 = syscall.IN_OPEN - - // Special events - IN_ISDIR uint32 = syscall.IN_ISDIR - IN_IGNORED uint32 = syscall.IN_IGNORED - IN_Q_OVERFLOW uint32 = syscall.IN_Q_OVERFLOW - IN_UNMOUNT uint32 = syscall.IN_UNMOUNT -) - -var eventBits = []struct { - Value uint32 - Name string -}{ - {IN_ACCESS, "IN_ACCESS"}, - {IN_ATTRIB, "IN_ATTRIB"}, - {IN_CLOSE, "IN_CLOSE"}, - {IN_CLOSE_NOWRITE, "IN_CLOSE_NOWRITE"}, - {IN_CLOSE_WRITE, "IN_CLOSE_WRITE"}, - {IN_CREATE, "IN_CREATE"}, - {IN_DELETE, "IN_DELETE"}, - {IN_DELETE_SELF, "IN_DELETE_SELF"}, - {IN_MODIFY, "IN_MODIFY"}, - {IN_MOVE, "IN_MOVE"}, - {IN_MOVED_FROM, "IN_MOVED_FROM"}, - {IN_MOVED_TO, "IN_MOVED_TO"}, - {IN_MOVE_SELF, "IN_MOVE_SELF"}, - {IN_OPEN, "IN_OPEN"}, - {IN_ISDIR, "IN_ISDIR"}, - {IN_IGNORED, "IN_IGNORED"}, - {IN_Q_OVERFLOW, "IN_Q_OVERFLOW"}, - {IN_UNMOUNT, "IN_UNMOUNT"}, -} diff --git a/src/pkg/exp/inotify/inotify_linux_test.go b/src/pkg/exp/inotify/inotify_linux_test.go deleted file mode 100644 index d41d66bfac..0000000000 --- a/src/pkg/exp/inotify/inotify_linux_test.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux - -package inotify - -import ( - "io/ioutil" - "os" - "testing" - "time" -) - -func TestInotifyEvents(t *testing.T) { - // Create an inotify watcher instance and initialize it - watcher, err := NewWatcher() - if err != nil { - t.Fatalf("NewWatcher failed: %s", err) - } - - dir, err := ioutil.TempDir("", "inotify") - if err != nil { - t.Fatalf("TempDir failed: %s", err) - } - defer os.RemoveAll(dir) - - // Add a watch for "_test" - err = watcher.Watch(dir) - if err != nil { - t.Fatalf("Watch failed: %s", err) - } - - // Receive errors on the error channel on a separate goroutine - go func() { - for err := range watcher.Error { - t.Fatalf("error received: %s", err) - } - }() - - testFile := dir + "/TestInotifyEvents.testfile" - - // Receive events on the event channel on a separate goroutine - eventstream := watcher.Event - var eventsReceived = 0 - done := make(chan bool) - go func() { - for event := range eventstream { - // Only count relevant events - if event.Name == testFile { - eventsReceived++ - t.Logf("event received: %s", event) - } else { - t.Logf("unexpected event received: %s", event) - } - } - done <- true - }() - - // Create a file - // This should add at least one event to the inotify event queue - _, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666) - if err != nil { - t.Fatalf("creating test file: %s", err) - } - - // We expect this event to be received almost immediately, but let's wait 1 s to be sure - time.Sleep(1 * time.Second) - if eventsReceived == 0 { - t.Fatal("inotify event hasn't been received after 1 second") - } - - // Try closing the inotify instance - t.Log("calling Close()") - watcher.Close() - t.Log("waiting for the event channel to become closed...") - select { - case <-done: - t.Log("event channel closed") - case <-time.After(1 * time.Second): - t.Fatal("event stream was not closed after 1 second") - } -} - -func TestInotifyClose(t *testing.T) { - watcher, _ := NewWatcher() - watcher.Close() - - done := make(chan bool) - go func() { - watcher.Close() - done <- true - }() - - select { - case <-done: - case <-time.After(50 * time.Millisecond): - t.Fatal("double Close() test failed: second Close() call didn't return") - } - - err := watcher.Watch(os.TempDir()) - if err == nil { - t.Fatal("expected error on Watch() after Close(), got nil") - } -} diff --git a/src/pkg/exp/norm/Makefile b/src/pkg/exp/norm/Makefile deleted file mode 100644 index f278eb02f9..0000000000 --- a/src/pkg/exp/norm/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2011 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -maketables: maketables.go triegen.go - go build $^ - -maketesttables: maketesttables.go triegen.go - go build $^ - -normregtest: normregtest.go - go build $^ - -tables: maketables - ./maketables > tables.go - gofmt -w tables.go - -trietesttables: maketesttables - ./maketesttables > triedata_test.go - gofmt -w triedata_test.go - -# Downloads from www.unicode.org, so not part -# of standard test scripts. -test: testtables regtest - -testtables: maketables - ./maketables -test -tables= - -regtest: normregtest - ./normregtest diff --git a/src/pkg/exp/norm/composition.go b/src/pkg/exp/norm/composition.go deleted file mode 100644 index 2cbe1ac730..0000000000 --- a/src/pkg/exp/norm/composition.go +++ /dev/null @@ -1,386 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import "unicode/utf8" - -const ( - maxCombiningChars = 30 - maxBufferSize = maxCombiningChars + 2 // +1 to hold starter +1 to hold CGJ - maxBackRunes = maxCombiningChars - 1 - maxNFCExpansion = 3 // NFC(0x1D160) - maxNFKCExpansion = 18 // NFKC(0xFDFA) - - maxByteBufferSize = utf8.UTFMax * maxBufferSize // 128 -) - -// reorderBuffer is used to normalize a single segment. Characters inserted with -// insert are decomposed and reordered based on CCC. The compose method can -// be used to recombine characters. Note that the byte buffer does not hold -// the UTF-8 characters in order. Only the rune array is maintained in sorted -// order. flush writes the resulting segment to a byte array. -type reorderBuffer struct { - rune [maxBufferSize]runeInfo // Per character info. - byte [maxByteBufferSize]byte // UTF-8 buffer. Referenced by runeInfo.pos. - nrune int // Number of runeInfos. - nbyte uint8 // Number or bytes. - f formInfo - - src input - nsrc int - srcBytes inputBytes - srcString inputString - tmpBytes inputBytes -} - -func (rb *reorderBuffer) init(f Form, src []byte) { - rb.f = *formTable[f] - rb.srcBytes = inputBytes(src) - rb.src = &rb.srcBytes - rb.nsrc = len(src) -} - -func (rb *reorderBuffer) initString(f Form, src string) { - rb.f = *formTable[f] - rb.srcString = inputString(src) - rb.src = &rb.srcString - rb.nsrc = len(src) -} - -// reset discards all characters from the buffer. -func (rb *reorderBuffer) reset() { - rb.nrune = 0 - rb.nbyte = 0 -} - -// flush appends the normalized segment to out and resets rb. -func (rb *reorderBuffer) flush(out []byte) []byte { - for i := 0; i < rb.nrune; i++ { - start := rb.rune[i].pos - end := start + rb.rune[i].size - out = append(out, rb.byte[start:end]...) - } - rb.reset() - return out -} - -// flushCopy copies the normalized segment to buf and resets rb. -// It returns the number of bytes written to buf. -func (rb *reorderBuffer) flushCopy(buf []byte) int { - p := 0 - for i := 0; i < rb.nrune; i++ { - runep := rb.rune[i] - p += copy(buf[p:], rb.byte[runep.pos:runep.pos+runep.size]) - } - rb.reset() - return p -} - -// insertOrdered inserts a rune in the buffer, ordered by Canonical Combining Class. -// It returns false if the buffer is not large enough to hold the rune. -// It is used internally by insert and insertString only. -func (rb *reorderBuffer) insertOrdered(info runeInfo) bool { - n := rb.nrune - if n >= maxCombiningChars+1 { - return false - } - b := rb.rune[:] - cc := info.ccc - if cc > 0 { - // Find insertion position + move elements to make room. - for ; n > 0; n-- { - if b[n-1].ccc <= cc { - break - } - b[n] = b[n-1] - } - } - rb.nrune += 1 - pos := uint8(rb.nbyte) - rb.nbyte += utf8.UTFMax - info.pos = pos - b[n] = info - return true -} - -// insert inserts the given rune in the buffer ordered by CCC. -// It returns true if the buffer was large enough to hold the decomposed rune. -func (rb *reorderBuffer) insert(src input, i int, info runeInfo) bool { - if rune := src.hangul(i); rune != 0 { - return rb.decomposeHangul(rune) - } - if info.hasDecomposition() { - return rb.insertDecomposed(info.decomposition()) - } - return rb.insertSingle(src, i, info) -} - -// insertDecomposed inserts an entry in to the reorderBuffer for each rune -// in dcomp. dcomp must be a sequence of decomposed UTF-8-encoded runes. -func (rb *reorderBuffer) insertDecomposed(dcomp []byte) bool { - saveNrune, saveNbyte := rb.nrune, rb.nbyte - rb.tmpBytes = inputBytes(dcomp) - for i := 0; i < len(dcomp); { - info := rb.f.info(&rb.tmpBytes, i) - pos := rb.nbyte - if !rb.insertOrdered(info) { - rb.nrune, rb.nbyte = saveNrune, saveNbyte - return false - } - i += copy(rb.byte[pos:], dcomp[i:i+int(info.size)]) - } - return true -} - -// insertSingle inserts an entry in the reorderBuffer for the rune at -// position i. info is the runeInfo for the rune at position i. -func (rb *reorderBuffer) insertSingle(src input, i int, info runeInfo) bool { - // insertOrder changes nbyte - pos := rb.nbyte - if !rb.insertOrdered(info) { - return false - } - src.copySlice(rb.byte[pos:], i, i+int(info.size)) - return true -} - -// appendRune inserts a rune at the end of the buffer. It is used for Hangul. -func (rb *reorderBuffer) appendRune(r rune) { - bn := rb.nbyte - sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) - rb.nbyte += utf8.UTFMax - rb.rune[rb.nrune] = runeInfo{pos: bn, size: uint8(sz)} - rb.nrune++ -} - -// assignRune sets a rune at position pos. It is used for Hangul and recomposition. -func (rb *reorderBuffer) assignRune(pos int, r rune) { - bn := rb.rune[pos].pos - sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) - rb.rune[pos] = runeInfo{pos: bn, size: uint8(sz)} -} - -// runeAt returns the rune at position n. It is used for Hangul and recomposition. -func (rb *reorderBuffer) runeAt(n int) rune { - inf := rb.rune[n] - r, _ := utf8.DecodeRune(rb.byte[inf.pos : inf.pos+inf.size]) - return r -} - -// bytesAt returns the UTF-8 encoding of the rune at position n. -// It is used for Hangul and recomposition. -func (rb *reorderBuffer) bytesAt(n int) []byte { - inf := rb.rune[n] - return rb.byte[inf.pos : int(inf.pos)+int(inf.size)] -} - -// For Hangul we combine algorithmically, instead of using tables. -const ( - hangulBase = 0xAC00 // UTF-8(hangulBase) -> EA B0 80 - hangulBase0 = 0xEA - hangulBase1 = 0xB0 - hangulBase2 = 0x80 - - hangulEnd = hangulBase + jamoLVTCount // UTF-8(0xD7A4) -> ED 9E A4 - hangulEnd0 = 0xED - hangulEnd1 = 0x9E - hangulEnd2 = 0xA4 - - jamoLBase = 0x1100 // UTF-8(jamoLBase) -> E1 84 00 - jamoLBase0 = 0xE1 - jamoLBase1 = 0x84 - jamoLEnd = 0x1113 - jamoVBase = 0x1161 - jamoVEnd = 0x1176 - jamoTBase = 0x11A7 - jamoTEnd = 0x11C3 - - jamoTCount = 28 - jamoVCount = 21 - jamoVTCount = 21 * 28 - jamoLVTCount = 19 * 21 * 28 -) - -const hangulUTF8Size = 3 - -func isHangul(b []byte) bool { - if len(b) < hangulUTF8Size { - return false - } - b0 := b[0] - if b0 < hangulBase0 { - return false - } - b1 := b[1] - switch { - case b0 == hangulBase0: - return b1 >= hangulBase1 - case b0 < hangulEnd0: - return true - case b0 > hangulEnd0: - return false - case b1 < hangulEnd1: - return true - } - return b1 == hangulEnd1 && b[2] < hangulEnd2 -} - -func isHangulString(b string) bool { - if len(b) < hangulUTF8Size { - return false - } - b0 := b[0] - if b0 < hangulBase0 { - return false - } - b1 := b[1] - switch { - case b0 == hangulBase0: - return b1 >= hangulBase1 - case b0 < hangulEnd0: - return true - case b0 > hangulEnd0: - return false - case b1 < hangulEnd1: - return true - } - return b1 == hangulEnd1 && b[2] < hangulEnd2 -} - -// Caller must ensure len(b) >= 2. -func isJamoVT(b []byte) bool { - // True if (rune & 0xff00) == jamoLBase - return b[0] == jamoLBase0 && (b[1]&0xFC) == jamoLBase1 -} - -func isHangulWithoutJamoT(b []byte) bool { - c, _ := utf8.DecodeRune(b) - c -= hangulBase - return c < jamoLVTCount && c%jamoTCount == 0 -} - -// decomposeHangul writes the decomposed Hangul to buf and returns the number -// of bytes written. len(buf) should be at least 9. -func decomposeHangul(buf []byte, r rune) int { - const JamoUTF8Len = 3 - r -= hangulBase - x := r % jamoTCount - r /= jamoTCount - utf8.EncodeRune(buf, jamoLBase+r/jamoVCount) - utf8.EncodeRune(buf[JamoUTF8Len:], jamoVBase+r%jamoVCount) - if x != 0 { - utf8.EncodeRune(buf[2*JamoUTF8Len:], jamoTBase+x) - return 3 * JamoUTF8Len - } - return 2 * JamoUTF8Len -} - -// decomposeHangul algorithmically decomposes a Hangul rune into -// its Jamo components. -// See http://unicode.org/reports/tr15/#Hangul for details on decomposing Hangul. -func (rb *reorderBuffer) decomposeHangul(r rune) bool { - b := rb.rune[:] - n := rb.nrune - if n+3 > len(b) { - return false - } - r -= hangulBase - x := r % jamoTCount - r /= jamoTCount - rb.appendRune(jamoLBase + r/jamoVCount) - rb.appendRune(jamoVBase + r%jamoVCount) - if x != 0 { - rb.appendRune(jamoTBase + x) - } - return true -} - -// combineHangul algorithmically combines Jamo character components into Hangul. -// See http://unicode.org/reports/tr15/#Hangul for details on combining Hangul. -func (rb *reorderBuffer) combineHangul(s, i, k int) { - b := rb.rune[:] - bn := rb.nrune - for ; i < bn; i++ { - cccB := b[k-1].ccc - cccC := b[i].ccc - if cccB == 0 { - s = k - 1 - } - if s != k-1 && cccB >= cccC { - // b[i] is blocked by greater-equal cccX below it - b[k] = b[i] - k++ - } else { - l := rb.runeAt(s) // also used to compare to hangulBase - v := rb.runeAt(i) // also used to compare to jamoT - switch { - case jamoLBase <= l && l < jamoLEnd && - jamoVBase <= v && v < jamoVEnd: - // 11xx plus 116x to LV - rb.assignRune(s, hangulBase+ - (l-jamoLBase)*jamoVTCount+(v-jamoVBase)*jamoTCount) - case hangulBase <= l && l < hangulEnd && - jamoTBase < v && v < jamoTEnd && - ((l-hangulBase)%jamoTCount) == 0: - // ACxx plus 11Ax to LVT - rb.assignRune(s, l+v-jamoTBase) - default: - b[k] = b[i] - k++ - } - } - } - rb.nrune = k -} - -// compose recombines the runes in the buffer. -// It should only be used to recompose a single segment, as it will not -// handle alternations between Hangul and non-Hangul characters correctly. -func (rb *reorderBuffer) compose() { - // UAX #15, section X5 , including Corrigendum #5 - // "In any character sequence beginning with starter S, a character C is - // blocked from S if and only if there is some character B between S - // and C, and either B is a starter or it has the same or higher - // combining class as C." - bn := rb.nrune - if bn == 0 { - return - } - k := 1 - b := rb.rune[:] - for s, i := 0, 1; i < bn; i++ { - if isJamoVT(rb.bytesAt(i)) { - // Redo from start in Hangul mode. Necessary to support - // U+320E..U+321E in NFKC mode. - rb.combineHangul(s, i, k) - return - } - ii := b[i] - // We can only use combineForward as a filter if we later - // get the info for the combined character. This is more - // expensive than using the filter. Using combinesBackward() - // is safe. - if ii.combinesBackward() { - cccB := b[k-1].ccc - cccC := ii.ccc - blocked := false // b[i] blocked by starter or greater or equal CCC? - if cccB == 0 { - s = k - 1 - } else { - blocked = s != k-1 && cccB >= cccC - } - if !blocked { - combined := combine(rb.runeAt(s), rb.runeAt(i)) - if combined != 0 { - rb.assignRune(s, combined) - continue - } - } - } - b[k] = b[i] - k++ - } - rb.nrune = k -} diff --git a/src/pkg/exp/norm/composition_test.go b/src/pkg/exp/norm/composition_test.go deleted file mode 100644 index 9de9eacfd6..0000000000 --- a/src/pkg/exp/norm/composition_test.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import "testing" - -// TestCase is used for most tests. -type TestCase struct { - in []rune - out []rune -} - -type insertFunc func(rb *reorderBuffer, r rune) bool - -func insert(rb *reorderBuffer, r rune) bool { - src := inputString(string(r)) - return rb.insert(src, 0, rb.f.info(src, 0)) -} - -func runTests(t *testing.T, name string, fm Form, f insertFunc, tests []TestCase) { - rb := reorderBuffer{} - rb.init(fm, nil) - for i, test := range tests { - rb.reset() - for j, rune := range test.in { - b := []byte(string(rune)) - src := inputBytes(b) - if !rb.insert(src, 0, rb.f.info(src, 0)) { - t.Errorf("%s:%d: insert failed for rune %d", name, i, j) - } - } - if rb.f.composing { - rb.compose() - } - if rb.nrune != len(test.out) { - t.Errorf("%s:%d: length = %d; want %d", name, i, rb.nrune, len(test.out)) - continue - } - for j, want := range test.out { - found := rune(rb.runeAt(j)) - if found != want { - t.Errorf("%s:%d: runeAt(%d) = %U; want %U", name, i, j, found, want) - } - } - } -} - -type flushFunc func(rb *reorderBuffer) []byte - -func testFlush(t *testing.T, name string, fn flushFunc) { - rb := reorderBuffer{} - rb.init(NFC, nil) - out := fn(&rb) - if len(out) != 0 { - t.Errorf("%s: wrote bytes on flush of empty buffer. (len(out) = %d)", name, len(out)) - } - - for _, r := range []rune("world!") { - insert(&rb, r) - } - - out = []byte("Hello ") - out = rb.flush(out) - want := "Hello world!" - if string(out) != want { - t.Errorf(`%s: output after flush was "%s"; want "%s"`, name, string(out), want) - } - if rb.nrune != 0 { - t.Errorf("%s: non-null size of info buffer (rb.nrune == %d)", name, rb.nrune) - } - if rb.nbyte != 0 { - t.Errorf("%s: non-null size of byte buffer (rb.nbyte == %d)", name, rb.nbyte) - } -} - -func flushF(rb *reorderBuffer) []byte { - out := make([]byte, 0) - return rb.flush(out) -} - -func flushCopyF(rb *reorderBuffer) []byte { - out := make([]byte, MaxSegmentSize) - n := rb.flushCopy(out) - return out[:n] -} - -func TestFlush(t *testing.T) { - testFlush(t, "flush", flushF) - testFlush(t, "flushCopy", flushCopyF) -} - -var insertTests = []TestCase{ - {[]rune{'a'}, []rune{'a'}}, - {[]rune{0x300}, []rune{0x300}}, - {[]rune{0x300, 0x316}, []rune{0x316, 0x300}}, // CCC(0x300)==230; CCC(0x316)==220 - {[]rune{0x316, 0x300}, []rune{0x316, 0x300}}, - {[]rune{0x41, 0x316, 0x300}, []rune{0x41, 0x316, 0x300}}, - {[]rune{0x41, 0x300, 0x316}, []rune{0x41, 0x316, 0x300}}, - {[]rune{0x300, 0x316, 0x41}, []rune{0x316, 0x300, 0x41}}, - {[]rune{0x41, 0x300, 0x40, 0x316}, []rune{0x41, 0x300, 0x40, 0x316}}, -} - -func TestInsert(t *testing.T) { - runTests(t, "TestInsert", NFD, insert, insertTests) -} - -var decompositionNFDTest = []TestCase{ - {[]rune{0xC0}, []rune{0x41, 0x300}}, - {[]rune{0xAC00}, []rune{0x1100, 0x1161}}, - {[]rune{0x01C4}, []rune{0x01C4}}, - {[]rune{0x320E}, []rune{0x320E}}, - {[]rune("음ẻ과"), []rune{0x110B, 0x1173, 0x11B7, 0x65, 0x309, 0x1100, 0x116A}}, -} - -var decompositionNFKDTest = []TestCase{ - {[]rune{0xC0}, []rune{0x41, 0x300}}, - {[]rune{0xAC00}, []rune{0x1100, 0x1161}}, - {[]rune{0x01C4}, []rune{0x44, 0x5A, 0x030C}}, - {[]rune{0x320E}, []rune{0x28, 0x1100, 0x1161, 0x29}}, -} - -func TestDecomposition(t *testing.T) { - runTests(t, "TestDecompositionNFD", NFD, insert, decompositionNFDTest) - runTests(t, "TestDecompositionNFKD", NFKD, insert, decompositionNFKDTest) -} - -var compositionTest = []TestCase{ - {[]rune{0x41, 0x300}, []rune{0xC0}}, - {[]rune{0x41, 0x316}, []rune{0x41, 0x316}}, - {[]rune{0x41, 0x300, 0x35D}, []rune{0xC0, 0x35D}}, - {[]rune{0x41, 0x316, 0x300}, []rune{0xC0, 0x316}}, - // blocking starter - {[]rune{0x41, 0x316, 0x40, 0x300}, []rune{0x41, 0x316, 0x40, 0x300}}, - {[]rune{0x1100, 0x1161}, []rune{0xAC00}}, - // parenthesized Hangul, alternate between ASCII and Hangul. - {[]rune{0x28, 0x1100, 0x1161, 0x29}, []rune{0x28, 0xAC00, 0x29}}, -} - -func TestComposition(t *testing.T) { - runTests(t, "TestComposition", NFC, insert, compositionTest) -} diff --git a/src/pkg/exp/norm/forminfo.go b/src/pkg/exp/norm/forminfo.go deleted file mode 100644 index c443b78d82..0000000000 --- a/src/pkg/exp/norm/forminfo.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -// This file contains Form-specific logic and wrappers for data in tables.go. - -// Rune info is stored in a separate trie per composing form. A composing form -// and its corresponding decomposing form share the same trie. Each trie maps -// a rune to a uint16. The values take two forms. For v >= 0x8000: -// bits -// 0..8: ccc -// 9..12: qcInfo (see below). isYesD is always true (no decompostion). -// 16: 1 -// For v < 0x8000, the respective rune has a decomposition and v is an index -// into a byte array of UTF-8 decomposition sequences and additional info and -// has the form: -// <header> <decomp_byte>* [<tccc> [<lccc>]] -// The header contains the number of bytes in the decomposition (excluding this -// length byte). The two most significant bits of this length byte correspond -// to bit 2 and 3 of qcIfo (see below). The byte sequence itself starts at v+1. -// The byte sequence is followed by a trailing and leading CCC if the values -// for these are not zero. The value of v determines which ccc are appended -// to the sequences. For v < firstCCC, there are none, for v >= firstCCC, -// the sequence is followed by a trailing ccc, and for v >= firstLeadingCC -// there is an additional leading ccc. - -const ( - qcInfoMask = 0xF // to clear all but the relevant bits in a qcInfo - headerLenMask = 0x3F // extract the length value from the header byte - headerFlagsMask = 0xC0 // extract the qcInfo bits from the header byte -) - -// runeInfo is a representation for the data stored in charinfoTrie. -type runeInfo struct { - pos uint8 // start position in reorderBuffer; used in composition.go - size uint8 // length of UTF-8 encoding of this rune - ccc uint8 // leading canonical combining class (ccc if not decomposition) - tccc uint8 // trailing canonical combining class (ccc if not decomposition) - flags qcInfo // quick check flags - index uint16 -} - -// functions dispatchable per form -type lookupFunc func(b input, i int) runeInfo - -// formInfo holds Form-specific functions and tables. -type formInfo struct { - form Form - composing, compatibility bool // form type - info lookupFunc -} - -var formTable []*formInfo - -func init() { - formTable = make([]*formInfo, 4) - - for i := range formTable { - f := &formInfo{} - formTable[i] = f - f.form = Form(i) - if Form(i) == NFKD || Form(i) == NFKC { - f.compatibility = true - f.info = lookupInfoNFKC - } else { - f.info = lookupInfoNFC - } - if Form(i) == NFC || Form(i) == NFKC { - f.composing = true - } - } -} - -// We do not distinguish between boundaries for NFC, NFD, etc. to avoid -// unexpected behavior for the user. For example, in NFD, there is a boundary -// after 'a'. However, a might combine with modifiers, so from the application's -// perspective it is not a good boundary. We will therefore always use the -// boundaries for the combining variants. -func (i runeInfo) boundaryBefore() bool { - if i.ccc == 0 && !i.combinesBackward() { - return true - } - // We assume that the CCC of the first character in a decomposition - // is always non-zero if different from info.ccc and that we can return - // false at this point. This is verified by maketables. - return false -} - -func (i runeInfo) boundaryAfter() bool { - return i.isInert() -} - -// We pack quick check data in 4 bits: -// 0: NFD_QC Yes (0) or No (1). No also means there is a decomposition. -// 1..2: NFC_QC Yes(00), No (10), or Maybe (11) -// 3: Combines forward (0 == false, 1 == true) -// -// When all 4 bits are zero, the character is inert, meaning it is never -// influenced by normalization. -type qcInfo uint8 - -func (i runeInfo) isYesC() bool { return i.flags&0x4 == 0 } -func (i runeInfo) isYesD() bool { return i.flags&0x1 == 0 } - -func (i runeInfo) combinesForward() bool { return i.flags&0x8 != 0 } -func (i runeInfo) combinesBackward() bool { return i.flags&0x2 != 0 } // == isMaybe -func (i runeInfo) hasDecomposition() bool { return i.flags&0x1 != 0 } // == isNoD - -func (r runeInfo) isInert() bool { - return r.flags&0xf == 0 && r.ccc == 0 -} - -func (r runeInfo) decomposition() []byte { - if r.index == 0 { - return nil - } - p := r.index - n := decomps[p] & 0x3F - p++ - return decomps[p : p+uint16(n)] -} - -// Recomposition -// We use 32-bit keys instead of 64-bit for the two codepoint keys. -// This clips off the bits of three entries, but we know this will not -// result in a collision. In the unlikely event that changes to -// UnicodeData.txt introduce collisions, the compiler will catch it. -// Note that the recomposition map for NFC and NFKC are identical. - -// combine returns the combined rune or 0 if it doesn't exist. -func combine(a, b rune) rune { - key := uint32(uint16(a))<<16 + uint32(uint16(b)) - return recompMap[key] -} - -func lookupInfoNFC(b input, i int) runeInfo { - v, sz := b.charinfoNFC(i) - return compInfo(v, sz) -} - -func lookupInfoNFKC(b input, i int) runeInfo { - v, sz := b.charinfoNFKC(i) - return compInfo(v, sz) -} - -// compInfo converts the information contained in v and sz -// to a runeInfo. See the comment at the top of the file -// for more information on the format. -func compInfo(v uint16, sz int) runeInfo { - if v == 0 { - return runeInfo{size: uint8(sz)} - } else if v >= 0x8000 { - return runeInfo{ - size: uint8(sz), - ccc: uint8(v), - tccc: uint8(v), - flags: qcInfo(v>>8) & qcInfoMask, - } - } - // has decomposition - h := decomps[v] - f := (qcInfo(h&headerFlagsMask) >> 4) | 0x1 - ri := runeInfo{size: uint8(sz), flags: f, index: v} - if v >= firstCCC { - v += uint16(h&headerLenMask) + 1 - ri.tccc = decomps[v] - if v >= firstLeadingCCC { - ri.ccc = decomps[v+1] - } - } - return ri -} diff --git a/src/pkg/exp/norm/input.go b/src/pkg/exp/norm/input.go deleted file mode 100644 index 9c564d6771..0000000000 --- a/src/pkg/exp/norm/input.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import "unicode/utf8" - -type input interface { - skipASCII(p, max int) int - skipNonStarter(p int) int - appendSlice(buf []byte, s, e int) []byte - copySlice(buf []byte, s, e int) - charinfoNFC(p int) (uint16, int) - charinfoNFKC(p int) (uint16, int) - hangul(p int) rune -} - -type inputString string - -func (s inputString) skipASCII(p, max int) int { - for ; p < max && s[p] < utf8.RuneSelf; p++ { - } - return p -} - -func (s inputString) skipNonStarter(p int) int { - for ; p < len(s) && !utf8.RuneStart(s[p]); p++ { - } - return p -} - -func (s inputString) appendSlice(buf []byte, b, e int) []byte { - for i := b; i < e; i++ { - buf = append(buf, s[i]) - } - return buf -} - -func (s inputString) copySlice(buf []byte, b, e int) { - copy(buf, s[b:e]) -} - -func (s inputString) charinfoNFC(p int) (uint16, int) { - return nfcTrie.lookupString(string(s[p:])) -} - -func (s inputString) charinfoNFKC(p int) (uint16, int) { - return nfkcTrie.lookupString(string(s[p:])) -} - -func (s inputString) hangul(p int) rune { - if !isHangulString(string(s[p:])) { - return 0 - } - rune, _ := utf8.DecodeRuneInString(string(s[p:])) - return rune -} - -type inputBytes []byte - -func (s inputBytes) skipASCII(p, max int) int { - for ; p < max && s[p] < utf8.RuneSelf; p++ { - } - return p -} - -func (s inputBytes) skipNonStarter(p int) int { - for ; p < len(s) && !utf8.RuneStart(s[p]); p++ { - } - return p -} - -func (s inputBytes) appendSlice(buf []byte, b, e int) []byte { - return append(buf, s[b:e]...) -} - -func (s inputBytes) copySlice(buf []byte, b, e int) { - copy(buf, s[b:e]) -} - -func (s inputBytes) charinfoNFC(p int) (uint16, int) { - return nfcTrie.lookup(s[p:]) -} - -func (s inputBytes) charinfoNFKC(p int) (uint16, int) { - return nfkcTrie.lookup(s[p:]) -} - -func (s inputBytes) hangul(p int) rune { - if !isHangul(s[p:]) { - return 0 - } - rune, _ := utf8.DecodeRune(s[p:]) - return rune -} diff --git a/src/pkg/exp/norm/iter.go b/src/pkg/exp/norm/iter.go deleted file mode 100644 index 761ba90cdd..0000000000 --- a/src/pkg/exp/norm/iter.go +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -const MaxSegmentSize = maxByteBufferSize - -// An Iter iterates over a string or byte slice, while normalizing it -// to a given Form. -type Iter struct { - rb reorderBuffer - info runeInfo // first character saved from previous iteration - next iterFunc // implementation of next depends on form - - p int // current position in input source - outStart int // start of current segment in output buffer - inStart int // start of current segment in input source - maxp int // position in output buffer after which not to start a new segment - maxseg int // for tracking an excess of combining characters - - tccc uint8 - done bool -} - -type iterFunc func(*Iter, []byte) int - -// SetInput initializes i to iterate over src after normalizing it to Form f. -func (i *Iter) SetInput(f Form, src []byte) { - i.rb.init(f, src) - if i.rb.f.composing { - i.next = nextComposed - } else { - i.next = nextDecomposed - } - i.p = 0 - if i.done = len(src) == 0; !i.done { - i.info = i.rb.f.info(i.rb.src, i.p) - } -} - -// SetInputString initializes i to iterate over src after normalizing it to Form f. -func (i *Iter) SetInputString(f Form, src string) { - i.rb.initString(f, src) - if i.rb.f.composing { - i.next = nextComposed - } else { - i.next = nextDecomposed - } - i.p = 0 - if i.done = len(src) == 0; !i.done { - i.info = i.rb.f.info(i.rb.src, i.p) - } -} - -// Pos returns the byte position at which the next call to Next will commence processing. -func (i *Iter) Pos() int { - return i.p -} - -// Done returns true if there is no more input to process. -func (i *Iter) Done() bool { - return i.done -} - -// Next writes f(i.input[i.Pos():n]...) to buffer buf, where n is the -// largest boundary of i.input such that the result fits in buf. -// It returns the number of bytes written to buf. -// len(buf) should be at least MaxSegmentSize. -// Done must be false before calling Next. -func (i *Iter) Next(buf []byte) int { - return i.next(i, buf) -} - -func (i *Iter) initNext(outn, inStart int) { - i.outStart = 0 - i.inStart = inStart - i.maxp = outn - MaxSegmentSize - i.maxseg = MaxSegmentSize -} - -// setStart resets the start of the new segment to the given position. -// It returns true if there is not enough room for the new segment. -func (i *Iter) setStart(outp, inp int) bool { - if outp > i.maxp { - return true - } - i.outStart = outp - i.inStart = inp - i.maxseg = outp + MaxSegmentSize - return false -} - -func min(a, b int) int { - if a < b { - return a - } - return b -} - -// nextDecomposed is the implementation of Next for forms NFD and NFKD. -func nextDecomposed(i *Iter, out []byte) int { - var outp int - i.initNext(len(out), i.p) -doFast: - inCopyStart, outCopyStart := i.p, outp // invariant xCopyStart <= i.xStart - for { - if sz := int(i.info.size); sz <= 1 { - // ASCII or illegal byte. Either way, advance by 1. - i.p++ - outp++ - max := min(i.rb.nsrc, len(out)-outp+i.p) - if np := i.rb.src.skipASCII(i.p, max); np > i.p { - outp += np - i.p - i.p = np - if i.p >= i.rb.nsrc { - break - } - // ASCII may combine with consecutive runes. - if i.setStart(outp-1, i.p-1) { - i.p-- - outp-- - i.info.size = 1 - break - } - } - } else if d := i.info.decomposition(); d != nil { - i.rb.src.copySlice(out[outCopyStart:], inCopyStart, i.p) - p := outp + len(d) - if p > i.maxseg && i.setStart(outp, i.p) { - return outp - } - copy(out[outp:], d) - outp = p - i.p += sz - inCopyStart, outCopyStart = i.p, outp - } else if r := i.rb.src.hangul(i.p); r != 0 { - i.rb.src.copySlice(out[outCopyStart:], inCopyStart, i.p) - for { - outp += decomposeHangul(out[outp:], r) - i.p += hangulUTF8Size - if r = i.rb.src.hangul(i.p); r == 0 { - break - } - if i.setStart(outp, i.p) { - return outp - } - } - inCopyStart, outCopyStart = i.p, outp - } else { - p := outp + sz - if p > i.maxseg && i.setStart(outp, i.p) { - break - } - outp = p - i.p += sz - } - if i.p >= i.rb.nsrc { - break - } - prevCC := i.info.tccc - i.info = i.rb.f.info(i.rb.src, i.p) - if cc := i.info.ccc; cc == 0 { - if i.setStart(outp, i.p) { - break - } - } else if cc < prevCC { - goto doNorm - } - } - if inCopyStart != i.p { - i.rb.src.copySlice(out[outCopyStart:], inCopyStart, i.p) - } - i.done = i.p >= i.rb.nsrc - return outp -doNorm: - // Insert what we have decomposed so far in the reorderBuffer. - // As we will only reorder, there will always be enough room. - i.rb.src.copySlice(out[outCopyStart:], inCopyStart, i.p) - if !i.rb.insertDecomposed(out[i.outStart:outp]) { - // Start over to prevent decompositions from crossing segment boundaries. - // This is a rare occurance. - i.p = i.inStart - i.info = i.rb.f.info(i.rb.src, i.p) - } - outp = i.outStart - for { - if !i.rb.insert(i.rb.src, i.p, i.info) { - break - } - if i.p += int(i.info.size); i.p >= i.rb.nsrc { - outp += i.rb.flushCopy(out[outp:]) - i.done = true - return outp - } - i.info = i.rb.f.info(i.rb.src, i.p) - if i.info.ccc == 0 { - break - } - } - // new segment or too many combining characters: exit normalization - if outp += i.rb.flushCopy(out[outp:]); i.setStart(outp, i.p) { - return outp - } - goto doFast -} - -// nextComposed is the implementation of Next for forms NFC and NFKC. -func nextComposed(i *Iter, out []byte) int { - var outp int - i.initNext(len(out), i.p) -doFast: - inCopyStart, outCopyStart := i.p, outp // invariant xCopyStart <= i.xStart - var prevCC uint8 - for { - if !i.info.isYesC() { - goto doNorm - } - if cc := i.info.ccc; cc == 0 { - if i.setStart(outp, i.p) { - break - } - } else if cc < prevCC { - goto doNorm - } - prevCC = i.info.tccc - sz := int(i.info.size) - if sz == 0 { - sz = 1 // illegal rune: copy byte-by-byte - } - p := outp + sz - if p > i.maxseg && i.setStart(outp, i.p) { - break - } - outp = p - i.p += sz - max := min(i.rb.nsrc, len(out)-outp+i.p) - if np := i.rb.src.skipASCII(i.p, max); np > i.p { - outp += np - i.p - i.p = np - if i.p >= i.rb.nsrc { - break - } - // ASCII may combine with consecutive runes. - if i.setStart(outp-1, i.p-1) { - i.p-- - outp-- - i.info = runeInfo{size: 1} - break - } - } - if i.p >= i.rb.nsrc { - break - } - i.info = i.rb.f.info(i.rb.src, i.p) - } - if inCopyStart != i.p { - i.rb.src.copySlice(out[outCopyStart:], inCopyStart, i.p) - } - i.done = i.p >= i.rb.nsrc - return outp -doNorm: - i.rb.src.copySlice(out[outCopyStart:], inCopyStart, i.inStart) - outp, i.p = i.outStart, i.inStart - i.info = i.rb.f.info(i.rb.src, i.p) - for { - if !i.rb.insert(i.rb.src, i.p, i.info) { - break - } - if i.p += int(i.info.size); i.p >= i.rb.nsrc { - i.rb.compose() - outp += i.rb.flushCopy(out[outp:]) - i.done = true - return outp - } - i.info = i.rb.f.info(i.rb.src, i.p) - if i.info.boundaryBefore() { - break - } - } - i.rb.compose() - if outp += i.rb.flushCopy(out[outp:]); i.setStart(outp, i.p) { - return outp - } - goto doFast -} diff --git a/src/pkg/exp/norm/iter_test.go b/src/pkg/exp/norm/iter_test.go deleted file mode 100644 index f6e8d81725..0000000000 --- a/src/pkg/exp/norm/iter_test.go +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import ( - "strings" - "testing" -) - -var iterBufSizes = []int{ - MaxSegmentSize, - 1.5 * MaxSegmentSize, - 2 * MaxSegmentSize, - 3 * MaxSegmentSize, - 100 * MaxSegmentSize, -} - -func doIterNorm(f Form, buf []byte, s string) []byte { - acc := []byte{} - i := Iter{} - i.SetInputString(f, s) - for !i.Done() { - n := i.Next(buf) - acc = append(acc, buf[:n]...) - } - return acc -} - -func runIterTests(t *testing.T, name string, f Form, tests []AppendTest, norm bool) { - for i, test := range tests { - in := test.left + test.right - gold := test.out - if norm { - gold = string(f.AppendString(nil, test.out)) - } - for _, sz := range iterBufSizes { - buf := make([]byte, sz) - out := string(doIterNorm(f, buf, in)) - if len(out) != len(gold) { - const msg = "%s:%d:%d: length is %d; want %d" - t.Errorf(msg, name, i, sz, len(out), len(gold)) - } - if out != gold { - // Find first rune that differs and show context. - ir := []rune(out) - ig := []rune(gold) - for j := 0; j < len(ir) && j < len(ig); j++ { - if ir[j] == ig[j] { - continue - } - if j -= 3; j < 0 { - j = 0 - } - for e := j + 7; j < e && j < len(ir) && j < len(ig); j++ { - const msg = "%s:%d:%d: runeAt(%d) = %U; want %U" - t.Errorf(msg, name, i, sz, j, ir[j], ig[j]) - } - break - } - } - } - } -} - -func rep(r rune, n int) string { - return strings.Repeat(string(r), n) -} - -var iterTests = []AppendTest{ - {"", ascii, ascii}, - {"", txt_all, txt_all}, - {"", "a" + rep(0x0300, MaxSegmentSize/2), "a" + rep(0x0300, MaxSegmentSize/2)}, -} - -var iterTestsD = []AppendTest{ - { // segment overflow on unchanged character - "", - "a" + rep(0x0300, MaxSegmentSize/2) + "\u0316", - "a" + rep(0x0300, MaxSegmentSize/2-1) + "\u0316\u0300", - }, - { // segment overflow on unchanged character + start value - "", - "a" + rep(0x0300, MaxSegmentSize/2+maxCombiningChars+4) + "\u0316", - "a" + rep(0x0300, MaxSegmentSize/2+maxCombiningChars) + "\u0316" + rep(0x300, 4), - }, - { // segment overflow on decomposition - "", - "a" + rep(0x0300, MaxSegmentSize/2-1) + "\u0340", - "a" + rep(0x0300, MaxSegmentSize/2), - }, - { // segment overflow on decomposition + start value - "", - "a" + rep(0x0300, MaxSegmentSize/2-1) + "\u0340" + rep(0x300, maxCombiningChars+4) + "\u0320", - "a" + rep(0x0300, MaxSegmentSize/2-1) + rep(0x300, maxCombiningChars+1) + "\u0320" + rep(0x300, 4), - }, - { // start value after ASCII overflow - "", - rep('a', MaxSegmentSize) + rep(0x300, maxCombiningChars+2) + "\u0320", - rep('a', MaxSegmentSize) + rep(0x300, maxCombiningChars) + "\u0320\u0300\u0300", - }, - { // start value after Hangul overflow - "", - rep(0xAC00, MaxSegmentSize/6) + rep(0x300, maxCombiningChars+2) + "\u0320", - strings.Repeat("\u1100\u1161", MaxSegmentSize/6) + rep(0x300, maxCombiningChars-1) + "\u0320" + rep(0x300, 3), - }, - { // start value after cc=0 - "", - "您您" + rep(0x300, maxCombiningChars+4) + "\u0320", - "您您" + rep(0x300, maxCombiningChars) + "\u0320" + rep(0x300, 4), - }, - { // start value after normalization - "", - "\u0300\u0320a" + rep(0x300, maxCombiningChars+4) + "\u0320", - "\u0320\u0300a" + rep(0x300, maxCombiningChars) + "\u0320" + rep(0x300, 4), - }, -} - -var iterTestsC = []AppendTest{ - { // ordering of non-composing combining characters - "", - "\u0305\u0316", - "\u0316\u0305", - }, - { // segment overflow - "", - "a" + rep(0x0305, MaxSegmentSize/2+4) + "\u0316", - "a" + rep(0x0305, MaxSegmentSize/2-1) + "\u0316" + rep(0x305, 5), - }, -} - -func TestIterNextD(t *testing.T) { - runIterTests(t, "IterNextD1", NFKD, appendTests, true) - runIterTests(t, "IterNextD2", NFKD, iterTests, true) - runIterTests(t, "IterNextD3", NFKD, iterTestsD, false) -} - -func TestIterNextC(t *testing.T) { - runIterTests(t, "IterNextC1", NFKC, appendTests, true) - runIterTests(t, "IterNextC2", NFKC, iterTests, true) - runIterTests(t, "IterNextC3", NFKC, iterTestsC, false) -} - -type SegmentTest struct { - in string - out []string -} - -var segmentTests = []SegmentTest{ - {rep('a', MaxSegmentSize), []string{rep('a', MaxSegmentSize), ""}}, - {rep('a', MaxSegmentSize+2), []string{rep('a', MaxSegmentSize-1), "aaa", ""}}, - {rep('a', MaxSegmentSize) + "\u0300aa", []string{rep('a', MaxSegmentSize-1), "a\u0300", "aa", ""}}, -} - -// Note that, by design, segmentation is equal for composing and decomposing forms. -func TestIterSegmentation(t *testing.T) { - segmentTest(t, "SegmentTestD", NFD, segmentTests) - segmentTest(t, "SegmentTestC", NFC, segmentTests) -} - -func segmentTest(t *testing.T, name string, f Form, tests []SegmentTest) { - iter := Iter{} - for i, tt := range segmentTests { - buf := make([]byte, MaxSegmentSize) - iter.SetInputString(f, tt.in) - for j, seg := range tt.out { - if seg == "" { - if !iter.Done() { - n := iter.Next(buf) - res := string(buf[:n]) - t.Errorf(`%s:%d:%d: expected Done()==true, found segment "%s"`, name, i, j, res) - } - continue - } - if iter.Done() { - t.Errorf("%s:%d:%d: Done()==true, want false", name, i, j) - } - n := iter.Next(buf) - seg = f.String(seg) - if res := string(buf[:n]); res != seg { - t.Errorf(`%s:%d:%d" segment was "%s" (%d); want "%s" (%d)`, name, i, j, res, len(res), seg, len(seg)) - } - } - } -} diff --git a/src/pkg/exp/norm/maketables.go b/src/pkg/exp/norm/maketables.go deleted file mode 100644 index 1deedc949c..0000000000 --- a/src/pkg/exp/norm/maketables.go +++ /dev/null @@ -1,902 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Normalization table generator. -// Data read from the web. -// See forminfo.go for a description of the trie values associated with each rune. - -package main - -import ( - "bufio" - "bytes" - "flag" - "fmt" - "io" - "log" - "net/http" - "os" - "regexp" - "sort" - "strconv" - "strings" -) - -func main() { - flag.Parse() - loadUnicodeData() - loadCompositionExclusions() - completeCharFields(FCanonical) - completeCharFields(FCompatibility) - verifyComputed() - printChars() - makeTables() - testDerived() -} - -var url = flag.String("url", - "http://www.unicode.org/Public/6.0.0/ucd/", - "URL of Unicode database directory") -var tablelist = flag.String("tables", - "all", - "comma-separated list of which tables to generate; "+ - "can be 'decomp', 'recomp', 'info' and 'all'") -var test = flag.Bool("test", - false, - "test existing tables; can be used to compare web data with package data") -var verbose = flag.Bool("verbose", - false, - "write data to stdout as it is parsed") -var localFiles = flag.Bool("local", - false, - "data files have been copied to the current directory; for debugging only") - -var logger = log.New(os.Stderr, "", log.Lshortfile) - -// UnicodeData.txt has form: -// 0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; -// 007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A -// See http://unicode.org/reports/tr44/ for full explanation -// The fields: -const ( - FCodePoint = iota - FName - FGeneralCategory - FCanonicalCombiningClass - FBidiClass - FDecompMapping - FDecimalValue - FDigitValue - FNumericValue - FBidiMirrored - FUnicode1Name - FISOComment - FSimpleUppercaseMapping - FSimpleLowercaseMapping - FSimpleTitlecaseMapping - NumField - - MaxChar = 0x10FFFF // anything above this shouldn't exist -) - -// Quick Check properties of runes allow us to quickly -// determine whether a rune may occur in a normal form. -// For a given normal form, a rune may be guaranteed to occur -// verbatim (QC=Yes), may or may not combine with another -// rune (QC=Maybe), or may not occur (QC=No). -type QCResult int - -const ( - QCUnknown QCResult = iota - QCYes - QCNo - QCMaybe -) - -func (r QCResult) String() string { - switch r { - case QCYes: - return "Yes" - case QCNo: - return "No" - case QCMaybe: - return "Maybe" - } - return "***UNKNOWN***" -} - -const ( - FCanonical = iota // NFC or NFD - FCompatibility // NFKC or NFKD - FNumberOfFormTypes -) - -const ( - MComposed = iota // NFC or NFKC - MDecomposed // NFD or NFKD - MNumberOfModes -) - -// This contains only the properties we're interested in. -type Char struct { - name string - codePoint rune // if zero, this index is not a valid code point. - ccc uint8 // canonical combining class - excludeInComp bool // from CompositionExclusions.txt - compatDecomp bool // it has a compatibility expansion - - forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility - - state State -} - -var chars = make([]Char, MaxChar+1) - -func (c Char) String() string { - buf := new(bytes.Buffer) - - fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name) - fmt.Fprintf(buf, " ccc: %v\n", c.ccc) - fmt.Fprintf(buf, " excludeInComp: %v\n", c.excludeInComp) - fmt.Fprintf(buf, " compatDecomp: %v\n", c.compatDecomp) - fmt.Fprintf(buf, " state: %v\n", c.state) - fmt.Fprintf(buf, " NFC:\n") - fmt.Fprint(buf, c.forms[FCanonical]) - fmt.Fprintf(buf, " NFKC:\n") - fmt.Fprint(buf, c.forms[FCompatibility]) - - return buf.String() -} - -// In UnicodeData.txt, some ranges are marked like this: -// 3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;; -// 4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;; -// parseCharacter keeps a state variable indicating the weirdness. -type State int - -const ( - SNormal State = iota // known to be zero for the type - SFirst - SLast - SMissing -) - -var lastChar = rune('\u0000') - -func (c Char) isValid() bool { - return c.codePoint != 0 && c.state != SMissing -} - -type FormInfo struct { - quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed - verified [MNumberOfModes]bool // index: MComposed or MDecomposed - - combinesForward bool // May combine with rune on the right - combinesBackward bool // May combine with rune on the left - isOneWay bool // Never appears in result - inDecomp bool // Some decompositions result in this char. - decomp Decomposition - expandedDecomp Decomposition -} - -func (f FormInfo) String() string { - buf := bytes.NewBuffer(make([]byte, 0)) - - fmt.Fprintf(buf, " quickCheck[C]: %v\n", f.quickCheck[MComposed]) - fmt.Fprintf(buf, " quickCheck[D]: %v\n", f.quickCheck[MDecomposed]) - fmt.Fprintf(buf, " cmbForward: %v\n", f.combinesForward) - fmt.Fprintf(buf, " cmbBackward: %v\n", f.combinesBackward) - fmt.Fprintf(buf, " isOneWay: %v\n", f.isOneWay) - fmt.Fprintf(buf, " inDecomp: %v\n", f.inDecomp) - fmt.Fprintf(buf, " decomposition: %X\n", f.decomp) - fmt.Fprintf(buf, " expandedDecomp: %X\n", f.expandedDecomp) - - return buf.String() -} - -type Decomposition []rune - -func openReader(file string) (input io.ReadCloser) { - if *localFiles { - f, err := os.Open(file) - if err != nil { - logger.Fatal(err) - } - input = f - } else { - path := *url + file - resp, err := http.Get(path) - if err != nil { - logger.Fatal(err) - } - if resp.StatusCode != 200 { - logger.Fatal("bad GET status for "+file, resp.Status) - } - input = resp.Body - } - return -} - -func parseDecomposition(s string, skipfirst bool) (a []rune, e error) { - decomp := strings.Split(s, " ") - if len(decomp) > 0 && skipfirst { - decomp = decomp[1:] - } - for _, d := range decomp { - point, err := strconv.ParseUint(d, 16, 64) - if err != nil { - return a, err - } - a = append(a, rune(point)) - } - return a, nil -} - -func parseCharacter(line string) { - field := strings.Split(line, ";") - if len(field) != NumField { - logger.Fatalf("%5s: %d fields (expected %d)\n", line, len(field), NumField) - } - x, err := strconv.ParseUint(field[FCodePoint], 16, 64) - point := int(x) - if err != nil { - logger.Fatalf("%.5s...: %s", line, err) - } - if point == 0 { - return // not interesting and we use 0 as unset - } - if point > MaxChar { - logger.Fatalf("%5s: Rune %X > MaxChar (%X)", line, point, MaxChar) - return - } - state := SNormal - switch { - case strings.Index(field[FName], ", First>") > 0: - state = SFirst - case strings.Index(field[FName], ", Last>") > 0: - state = SLast - } - firstChar := lastChar + 1 - lastChar = rune(point) - if state != SLast { - firstChar = lastChar - } - x, err = strconv.ParseUint(field[FCanonicalCombiningClass], 10, 64) - if err != nil { - logger.Fatalf("%U: bad ccc field: %s", int(x), err) - } - ccc := uint8(x) - decmap := field[FDecompMapping] - exp, e := parseDecomposition(decmap, false) - isCompat := false - if e != nil { - if len(decmap) > 0 { - exp, e = parseDecomposition(decmap, true) - if e != nil { - logger.Fatalf(`%U: bad decomp |%v|: "%s"`, int(x), decmap, e) - } - isCompat = true - } - } - for i := firstChar; i <= lastChar; i++ { - char := &chars[i] - char.name = field[FName] - char.codePoint = i - char.forms[FCompatibility].decomp = exp - if !isCompat { - char.forms[FCanonical].decomp = exp - } else { - char.compatDecomp = true - } - if len(decmap) > 0 { - char.forms[FCompatibility].decomp = exp - } - char.ccc = ccc - char.state = SMissing - if i == lastChar { - char.state = state - } - } - return -} - -func loadUnicodeData() { - f := openReader("UnicodeData.txt") - defer f.Close() - input := bufio.NewReader(f) - for { - line, err := input.ReadString('\n') - if err != nil { - if err == io.EOF { - break - } - logger.Fatal(err) - } - parseCharacter(line[0 : len(line)-1]) - } -} - -var singlePointRe = regexp.MustCompile(`^([0-9A-F]+) *$`) - -// CompositionExclusions.txt has form: -// 0958 # ... -// See http://unicode.org/reports/tr44/ for full explanation -func parseExclusion(line string) int { - comment := strings.Index(line, "#") - if comment >= 0 { - line = line[0:comment] - } - if len(line) == 0 { - return 0 - } - matches := singlePointRe.FindStringSubmatch(line) - if len(matches) != 2 { - logger.Fatalf("%s: %d matches (expected 1)\n", line, len(matches)) - } - point, err := strconv.ParseUint(matches[1], 16, 64) - if err != nil { - logger.Fatalf("%.5s...: %s", line, err) - } - return int(point) -} - -func loadCompositionExclusions() { - f := openReader("CompositionExclusions.txt") - defer f.Close() - input := bufio.NewReader(f) - for { - line, err := input.ReadString('\n') - if err != nil { - if err == io.EOF { - break - } - logger.Fatal(err) - } - point := parseExclusion(line[0 : len(line)-1]) - if point == 0 { - continue - } - c := &chars[point] - if c.excludeInComp { - logger.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint) - } - c.excludeInComp = true - } -} - -// hasCompatDecomp returns true if any of the recursive -// decompositions contains a compatibility expansion. -// In this case, the character may not occur in NFK*. -func hasCompatDecomp(r rune) bool { - c := &chars[r] - if c.compatDecomp { - return true - } - for _, d := range c.forms[FCompatibility].decomp { - if hasCompatDecomp(d) { - return true - } - } - return false -} - -// Hangul related constants. -const ( - HangulBase = 0xAC00 - HangulEnd = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28) - - JamoLBase = 0x1100 - JamoLEnd = 0x1113 - JamoVBase = 0x1161 - JamoVEnd = 0x1176 - JamoTBase = 0x11A8 - JamoTEnd = 0x11C3 -) - -func isHangul(r rune) bool { - return HangulBase <= r && r < HangulEnd -} - -func ccc(r rune) uint8 { - return chars[r].ccc -} - -// Insert a rune in a buffer, ordered by Canonical Combining Class. -func insertOrdered(b Decomposition, r rune) Decomposition { - n := len(b) - b = append(b, 0) - cc := ccc(r) - if cc > 0 { - // Use bubble sort. - for ; n > 0; n-- { - if ccc(b[n-1]) <= cc { - break - } - b[n] = b[n-1] - } - } - b[n] = r - return b -} - -// Recursively decompose. -func decomposeRecursive(form int, r rune, d Decomposition) Decomposition { - if isHangul(r) { - return d - } - dcomp := chars[r].forms[form].decomp - if len(dcomp) == 0 { - return insertOrdered(d, r) - } - for _, c := range dcomp { - d = decomposeRecursive(form, c, d) - } - return d -} - -func completeCharFields(form int) { - // Phase 0: pre-expand decomposition. - for i := range chars { - f := &chars[i].forms[form] - if len(f.decomp) == 0 { - continue - } - exp := make(Decomposition, 0) - for _, c := range f.decomp { - exp = decomposeRecursive(form, c, exp) - } - f.expandedDecomp = exp - } - - // Phase 1: composition exclusion, mark decomposition. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - // Marks script-specific exclusions and version restricted. - f.isOneWay = c.excludeInComp - - // Singletons - f.isOneWay = f.isOneWay || len(f.decomp) == 1 - - // Non-starter decompositions - if len(f.decomp) > 1 { - chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0 - f.isOneWay = f.isOneWay || chk - } - - // Runes that decompose into more than two runes. - f.isOneWay = f.isOneWay || len(f.decomp) > 2 - - if form == FCompatibility { - f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint) - } - - for _, r := range f.decomp { - chars[r].forms[form].inDecomp = true - } - } - - // Phase 2: forward and backward combining. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - if !f.isOneWay && len(f.decomp) == 2 { - f0 := &chars[f.decomp[0]].forms[form] - f1 := &chars[f.decomp[1]].forms[form] - if !f0.isOneWay { - f0.combinesForward = true - } - if !f1.isOneWay { - f1.combinesBackward = true - } - } - } - - // Phase 3: quick check values. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - switch { - case len(f.decomp) > 0: - f.quickCheck[MDecomposed] = QCNo - case isHangul(rune(i)): - f.quickCheck[MDecomposed] = QCNo - default: - f.quickCheck[MDecomposed] = QCYes - } - switch { - case f.isOneWay: - f.quickCheck[MComposed] = QCNo - case (i & 0xffff00) == JamoLBase: - f.quickCheck[MComposed] = QCYes - if JamoLBase <= i && i < JamoLEnd { - f.combinesForward = true - } - if JamoVBase <= i && i < JamoVEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - f.combinesForward = true - } - if JamoTBase <= i && i < JamoTEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - } - case !f.combinesBackward: - f.quickCheck[MComposed] = QCYes - default: - f.quickCheck[MComposed] = QCMaybe - } - } -} - -func printBytes(b []byte, name string) { - fmt.Printf("// %s: %d bytes\n", name, len(b)) - fmt.Printf("var %s = [...]byte {", name) - for i, c := range b { - switch { - case i%64 == 0: - fmt.Printf("\n// Bytes %x - %x\n", i, i+63) - case i%8 == 0: - fmt.Printf("\n") - } - fmt.Printf("0x%.2X, ", c) - } - fmt.Print("\n}\n\n") -} - -// See forminfo.go for format. -func makeEntry(f *FormInfo) uint16 { - e := uint16(0) - if f.combinesForward { - e |= 0x8 - } - if f.quickCheck[MDecomposed] == QCNo { - e |= 0x1 - } - switch f.quickCheck[MComposed] { - case QCYes: - case QCNo: - e |= 0x4 - case QCMaybe: - e |= 0x6 - default: - log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed]) - } - return e -} - -// decompSet keeps track of unique decompositions, grouped by whether -// the decomposition is followed by a trailing and/or leading CCC. -type decompSet [4]map[string]bool - -func makeDecompSet() decompSet { - m := decompSet{} - for i := range m { - m[i] = make(map[string]bool) - } - return m -} -func (m *decompSet) insert(key int, s string) { - m[key][s] = true -} - -func printCharInfoTables() int { - mkstr := func(r rune, f *FormInfo) (int, string) { - d := f.expandedDecomp - s := string([]rune(d)) - if max := 1 << 6; len(s) >= max { - const msg = "%U: too many bytes in decomposition: %d >= %d" - logger.Fatalf(msg, r, len(s), max) - } - head := uint8(len(s)) - if f.quickCheck[MComposed] != QCYes { - head |= 0x40 - } - if f.combinesForward { - head |= 0x80 - } - s = string([]byte{head}) + s - - lccc := ccc(d[0]) - tccc := ccc(d[len(d)-1]) - if tccc < lccc && lccc != 0 { - const msg = "%U: lccc (%d) must be <= tcc (%d)" - logger.Fatalf(msg, r, lccc, tccc) - } - index := 0 - if tccc > 0 || lccc > 0 { - s += string([]byte{tccc}) - index = 1 - if lccc > 0 { - s += string([]byte{lccc}) - index |= 2 - } - } - return index, s - } - - decompSet := makeDecompSet() - - // Store the uniqued decompositions in a byte buffer, - // preceded by their byte length. - for _, c := range chars { - for _, f := range c.forms { - if len(f.expandedDecomp) == 0 { - continue - } - if f.combinesBackward { - logger.Fatalf("%U: combinesBackward and decompose", c.codePoint) - } - index, s := mkstr(c.codePoint, &f) - decompSet.insert(index, s) - } - } - - decompositions := bytes.NewBuffer(make([]byte, 0, 10000)) - size := 0 - positionMap := make(map[string]uint16) - decompositions.WriteString("\000") - cname := []string{"firstCCC", "firstLeadingCCC", "", "lastDecomp"} - fmt.Println("const (") - for i, m := range decompSet { - sa := []string{} - for s := range m { - sa = append(sa, s) - } - sort.Strings(sa) - for _, s := range sa { - p := decompositions.Len() - decompositions.WriteString(s) - positionMap[s] = uint16(p) - } - if cname[i] != "" { - fmt.Printf("%s = 0x%X\n", cname[i], decompositions.Len()) - } - } - fmt.Println("maxDecomp = 0x8000") - fmt.Println(")") - b := decompositions.Bytes() - printBytes(b, "decomps") - size += len(b) - - varnames := []string{"nfc", "nfkc"} - for i := 0; i < FNumberOfFormTypes; i++ { - trie := newNode() - for r, c := range chars { - f := c.forms[i] - d := f.expandedDecomp - if len(d) != 0 { - _, key := mkstr(c.codePoint, &f) - trie.insert(rune(r), positionMap[key]) - if c.ccc != ccc(d[0]) { - // We assume the lead ccc of a decomposition !=0 in this case. - if ccc(d[0]) == 0 { - logger.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc) - } - } - } else if v := makeEntry(&f)<<8 | uint16(c.ccc); v != 0 { - trie.insert(c.codePoint, 0x8000|v) - } - } - size += trie.printTables(varnames[i]) - } - return size -} - -func contains(sa []string, s string) bool { - for _, a := range sa { - if a == s { - return true - } - } - return false -} - -// Extract the version number from the URL. -func version() string { - // From http://www.unicode.org/standard/versions/#Version_Numbering: - // for the later Unicode versions, data files are located in - // versioned directories. - fields := strings.Split(*url, "/") - for _, f := range fields { - if match, _ := regexp.MatchString(`[0-9]\.[0-9]\.[0-9]`, f); match { - return f - } - } - logger.Fatal("unknown version") - return "Unknown" -} - -const fileHeader = `// Generated by running -// maketables --tables=%s --url=%s -// DO NOT EDIT - -package norm - -` - -func makeTables() { - size := 0 - if *tablelist == "" { - return - } - list := strings.Split(*tablelist, ",") - if *tablelist == "all" { - list = []string{"recomp", "info"} - } - fmt.Printf(fileHeader, *tablelist, *url) - - fmt.Println("// Version is the Unicode edition from which the tables are derived.") - fmt.Printf("const Version = %q\n\n", version()) - - if contains(list, "info") { - size += printCharInfoTables() - } - - if contains(list, "recomp") { - // Note that we use 32 bit keys, instead of 64 bit. - // This clips the bits of three entries, but we know - // this won't cause a collision. The compiler will catch - // any changes made to UnicodeData.txt that introduces - // a collision. - // Note that the recomposition map for NFC and NFKC - // are identical. - - // Recomposition map - nrentries := 0 - for _, c := range chars { - f := c.forms[FCanonical] - if !f.isOneWay && len(f.decomp) > 0 { - nrentries++ - } - } - sz := nrentries * 8 - size += sz - fmt.Printf("// recompMap: %d bytes (entries only)\n", sz) - fmt.Println("var recompMap = map[uint32]rune{") - for i, c := range chars { - f := c.forms[FCanonical] - d := f.decomp - if !f.isOneWay && len(d) > 0 { - key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1])) - fmt.Printf("0x%.8X: 0x%.4X,\n", key, i) - } - } - fmt.Printf("}\n\n") - } - - fmt.Printf("// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size) -} - -func printChars() { - if *verbose { - for _, c := range chars { - if !c.isValid() || c.state == SMissing { - continue - } - fmt.Println(c) - } - } -} - -// verifyComputed does various consistency tests. -func verifyComputed() { - for i, c := range chars { - for _, f := range c.forms { - isNo := (f.quickCheck[MDecomposed] == QCNo) - if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) { - log.Fatalf("%U: NF*D must be no if rune decomposes", i) - } - - isMaybe := f.quickCheck[MComposed] == QCMaybe - if f.combinesBackward != isMaybe { - log.Fatalf("%U: NF*C must be maybe if combinesBackward", i) - } - } - nfc := c.forms[FCanonical] - nfkc := c.forms[FCompatibility] - if nfc.combinesBackward != nfkc.combinesBackward { - logger.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint) - } - } -} - -var qcRe = regexp.MustCompile(`([0-9A-F\.]+) *; (NF.*_QC); ([YNM]) #.*`) - -// Use values in DerivedNormalizationProps.txt to compare against the -// values we computed. -// DerivedNormalizationProps.txt has form: -// 00C0..00C5 ; NFD_QC; N # ... -// 0374 ; NFD_QC; N # ... -// See http://unicode.org/reports/tr44/ for full explanation -func testDerived() { - if !*test { - return - } - f := openReader("DerivedNormalizationProps.txt") - defer f.Close() - input := bufio.NewReader(f) - for { - line, err := input.ReadString('\n') - if err != nil { - if err == io.EOF { - break - } - logger.Fatal(err) - } - qc := qcRe.FindStringSubmatch(line) - if qc == nil { - continue - } - rng := strings.Split(qc[1], "..") - i, err := strconv.ParseUint(rng[0], 16, 64) - if err != nil { - log.Fatal(err) - } - j := i - if len(rng) > 1 { - j, err = strconv.ParseUint(rng[1], 16, 64) - if err != nil { - log.Fatal(err) - } - } - var ftype, mode int - qt := strings.TrimSpace(qc[2]) - switch qt { - case "NFC_QC": - ftype, mode = FCanonical, MComposed - case "NFD_QC": - ftype, mode = FCanonical, MDecomposed - case "NFKC_QC": - ftype, mode = FCompatibility, MComposed - case "NFKD_QC": - ftype, mode = FCompatibility, MDecomposed - default: - log.Fatalf(`Unexpected quick check type "%s"`, qt) - } - var qr QCResult - switch qc[3] { - case "Y": - qr = QCYes - case "N": - qr = QCNo - case "M": - qr = QCMaybe - default: - log.Fatalf(`Unexpected quick check value "%s"`, qc[3]) - } - var lastFailed bool - // Verify current - for ; i <= j; i++ { - c := &chars[int(i)] - c.forms[ftype].verified[mode] = true - curqr := c.forms[ftype].quickCheck[mode] - if curqr != qr { - if !lastFailed { - logger.Printf("%s: %.4X..%.4X -- %s\n", - qt, int(i), int(j), line[0:50]) - } - logger.Printf("%U: FAILED %s (was %v need %v)\n", - int(i), qt, curqr, qr) - lastFailed = true - } - } - } - // Any unspecified value must be QCYes. Verify this. - for i, c := range chars { - for j, fd := range c.forms { - for k, qr := range fd.quickCheck { - if !fd.verified[k] && qr != QCYes { - m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n" - logger.Printf(m, i, j, k, qr, c.name) - } - } - } - } -} diff --git a/src/pkg/exp/norm/maketesttables.go b/src/pkg/exp/norm/maketesttables.go deleted file mode 100644 index d3112b4041..0000000000 --- a/src/pkg/exp/norm/maketesttables.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Generate test data for trie code. - -package main - -import ( - "fmt" -) - -func main() { - printTestTables() -} - -// We take the smallest, largest and an arbitrary value for each -// of the UTF-8 sequence lengths. -var testRunes = []rune{ - 0x01, 0x0C, 0x7F, // 1-byte sequences - 0x80, 0x100, 0x7FF, // 2-byte sequences - 0x800, 0x999, 0xFFFF, // 3-byte sequences - 0x10000, 0x10101, 0x10FFFF, // 4-byte sequences - 0x200, 0x201, 0x202, 0x210, 0x215, // five entries in one sparse block -} - -const fileHeader = `// Generated by running -// maketesttables -// DO NOT EDIT - -package norm - -` - -func printTestTables() { - fmt.Print(fileHeader) - fmt.Printf("var testRunes = %#v\n\n", testRunes) - t := newNode() - for i, r := range testRunes { - t.insert(r, uint16(i)) - } - t.printTables("testdata") -} diff --git a/src/pkg/exp/norm/norm_test.go b/src/pkg/exp/norm/norm_test.go deleted file mode 100644 index 12dacfcf30..0000000000 --- a/src/pkg/exp/norm/norm_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm_test - -import ( - "testing" -) - -func TestPlaceHolder(t *testing.T) { - // Does nothing, just allows the Makefile to be canonical - // while waiting for the package itself to be written. -} diff --git a/src/pkg/exp/norm/normalize.go b/src/pkg/exp/norm/normalize.go deleted file mode 100644 index c1d74f89d0..0000000000 --- a/src/pkg/exp/norm/normalize.go +++ /dev/null @@ -1,478 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package norm contains types and functions for normalizing Unicode strings. -package norm - -import "unicode/utf8" - -// A Form denotes a canonical representation of Unicode code points. -// The Unicode-defined normalization and equivalence forms are: -// -// NFC Unicode Normalization Form C -// NFD Unicode Normalization Form D -// NFKC Unicode Normalization Form KC -// NFKD Unicode Normalization Form KD -// -// For a Form f, this documentation uses the notation f(x) to mean -// the bytes or string x converted to the given form. -// A position n in x is called a boundary if conversion to the form can -// proceed independently on both sides: -// f(x) == append(f(x[0:n]), f(x[n:])...) -// -// References: http://unicode.org/reports/tr15/ and -// http://unicode.org/notes/tn5/. -type Form int - -const ( - NFC Form = iota - NFD - NFKC - NFKD -) - -// Bytes returns f(b). May return b if f(b) = b. -func (f Form) Bytes(b []byte) []byte { - rb := reorderBuffer{} - rb.init(f, b) - n := quickSpan(&rb, 0) - if n == len(b) { - return b - } - out := make([]byte, n, len(b)) - copy(out, b[0:n]) - return doAppend(&rb, out, n) -} - -// String returns f(s). -func (f Form) String(s string) string { - rb := reorderBuffer{} - rb.initString(f, s) - n := quickSpan(&rb, 0) - if n == len(s) { - return s - } - out := make([]byte, n, len(s)) - copy(out, s[0:n]) - return string(doAppend(&rb, out, n)) -} - -// IsNormal returns true if b == f(b). -func (f Form) IsNormal(b []byte) bool { - rb := reorderBuffer{} - rb.init(f, b) - bp := quickSpan(&rb, 0) - if bp == len(b) { - return true - } - for bp < len(b) { - decomposeSegment(&rb, bp) - if rb.f.composing { - rb.compose() - } - for i := 0; i < rb.nrune; i++ { - info := rb.rune[i] - if bp+int(info.size) > len(b) { - return false - } - p := info.pos - pe := p + info.size - for ; p < pe; p++ { - if b[bp] != rb.byte[p] { - return false - } - bp++ - } - } - rb.reset() - bp = quickSpan(&rb, bp) - } - return true -} - -// IsNormalString returns true if s == f(s). -func (f Form) IsNormalString(s string) bool { - rb := reorderBuffer{} - rb.initString(f, s) - bp := quickSpan(&rb, 0) - if bp == len(s) { - return true - } - for bp < len(s) { - decomposeSegment(&rb, bp) - if rb.f.composing { - rb.compose() - } - for i := 0; i < rb.nrune; i++ { - info := rb.rune[i] - if bp+int(info.size) > len(s) { - return false - } - p := info.pos - pe := p + info.size - for ; p < pe; p++ { - if s[bp] != rb.byte[p] { - return false - } - bp++ - } - } - rb.reset() - bp = quickSpan(&rb, bp) - } - return true -} - -// patchTail fixes a case where a rune may be incorrectly normalized -// if it is followed by illegal continuation bytes. It returns the -// patched buffer and whether there were trailing continuation bytes. -func patchTail(rb *reorderBuffer, buf []byte) ([]byte, bool) { - info, p := lastRuneStart(&rb.f, buf) - if p == -1 || info.size == 0 { - return buf, false - } - end := p + int(info.size) - extra := len(buf) - end - if extra > 0 { - // Potentially allocating memory. However, this only - // happens with ill-formed UTF-8. - x := make([]byte, 0) - x = append(x, buf[len(buf)-extra:]...) - buf = decomposeToLastBoundary(rb, buf[:end]) - if rb.f.composing { - rb.compose() - } - buf = rb.flush(buf) - return append(buf, x...), true - } - return buf, false -} - -func appendQuick(rb *reorderBuffer, dst []byte, i int) ([]byte, int) { - if rb.nsrc == i { - return dst, i - } - end := quickSpan(rb, i) - return rb.src.appendSlice(dst, i, end), end -} - -// Append returns f(append(out, b...)). -// The buffer out must be nil, empty, or equal to f(out). -func (f Form) Append(out []byte, src ...byte) []byte { - if len(src) == 0 { - return out - } - rb := reorderBuffer{} - rb.init(f, src) - return doAppend(&rb, out, 0) -} - -func doAppend(rb *reorderBuffer, out []byte, p int) []byte { - src, n := rb.src, rb.nsrc - doMerge := len(out) > 0 - if q := src.skipNonStarter(p); q > p { - // Move leading non-starters to destination. - out = src.appendSlice(out, p, q) - buf, endsInError := patchTail(rb, out) - if endsInError { - out = buf - doMerge = false // no need to merge, ends with illegal UTF-8 - } else { - out = decomposeToLastBoundary(rb, buf) // force decomposition - } - p = q - } - fd := &rb.f - if doMerge { - var info runeInfo - if p < n { - info = fd.info(src, p) - if p == 0 && !info.boundaryBefore() { - out = decomposeToLastBoundary(rb, out) - } - } - if info.size == 0 || info.boundaryBefore() { - if fd.composing { - rb.compose() - } - out = rb.flush(out) - if info.size == 0 { - // Append incomplete UTF-8 encoding. - return src.appendSlice(out, p, n) - } - } - } - if rb.nrune == 0 { - out, p = appendQuick(rb, out, p) - } - for p < n { - p = decomposeSegment(rb, p) - if fd.composing { - rb.compose() - } - out = rb.flush(out) - out, p = appendQuick(rb, out, p) - } - return out -} - -// AppendString returns f(append(out, []byte(s))). -// The buffer out must be nil, empty, or equal to f(out). -func (f Form) AppendString(out []byte, src string) []byte { - if len(src) == 0 { - return out - } - rb := reorderBuffer{} - rb.initString(f, src) - return doAppend(&rb, out, 0) -} - -// QuickSpan returns a boundary n such that b[0:n] == f(b[0:n]). -// It is not guaranteed to return the largest such n. -func (f Form) QuickSpan(b []byte) int { - rb := reorderBuffer{} - rb.init(f, b) - n := quickSpan(&rb, 0) - return n -} - -func quickSpan(rb *reorderBuffer, i int) int { - var lastCC uint8 - var nc int - lastSegStart := i - src, n := rb.src, rb.nsrc - for i < n { - if j := src.skipASCII(i, n); i != j { - i = j - lastSegStart = i - 1 - lastCC = 0 - nc = 0 - continue - } - info := rb.f.info(src, i) - if info.size == 0 { - // include incomplete runes - return n - } - cc := info.ccc - if rb.f.composing { - if !info.isYesC() { - break - } - } else { - if !info.isYesD() { - break - } - } - if cc == 0 { - lastSegStart = i - nc = 0 - } else { - if nc >= maxCombiningChars { - lastSegStart = i - lastCC = cc - nc = 1 - } else { - if lastCC > cc { - return lastSegStart - } - nc++ - } - } - lastCC = cc - i += int(info.size) - } - if i == n { - return n - } - if rb.f.composing { - return lastSegStart - } - return i -} - -// QuickSpanString returns a boundary n such that b[0:n] == f(s[0:n]). -// It is not guaranteed to return the largest such n. -func (f Form) QuickSpanString(s string) int { - rb := reorderBuffer{} - rb.initString(f, s) - return quickSpan(&rb, 0) -} - -// FirstBoundary returns the position i of the first boundary in b -// or -1 if b contains no boundary. -func (f Form) FirstBoundary(b []byte) int { - rb := reorderBuffer{} - rb.init(f, b) - return firstBoundary(&rb) -} - -func firstBoundary(rb *reorderBuffer) int { - src, nsrc := rb.src, rb.nsrc - i := src.skipNonStarter(0) - if i >= nsrc { - return -1 - } - fd := &rb.f - info := fd.info(src, i) - for n := 0; info.size != 0 && !info.boundaryBefore(); { - i += int(info.size) - if n++; n >= maxCombiningChars { - return i - } - if i >= nsrc { - if !info.boundaryAfter() { - return -1 - } - return nsrc - } - info = fd.info(src, i) - } - if info.size == 0 { - return -1 - } - return i -} - -// FirstBoundaryInString returns the position i of the first boundary in s -// or -1 if s contains no boundary. -func (f Form) FirstBoundaryInString(s string) int { - rb := reorderBuffer{} - rb.initString(f, s) - return firstBoundary(&rb) -} - -// LastBoundary returns the position i of the last boundary in b -// or -1 if b contains no boundary. -func (f Form) LastBoundary(b []byte) int { - return lastBoundary(formTable[f], b) -} - -func lastBoundary(fd *formInfo, b []byte) int { - i := len(b) - info, p := lastRuneStart(fd, b) - if p == -1 { - return -1 - } - if info.size == 0 { // ends with incomplete rune - if p == 0 { // starts with incomplete rune - return -1 - } - i = p - info, p = lastRuneStart(fd, b[:i]) - if p == -1 { // incomplete UTF-8 encoding or non-starter bytes without a starter - return i - } - } - if p+int(info.size) != i { // trailing non-starter bytes: illegal UTF-8 - return i - } - if info.boundaryAfter() { - return i - } - i = p - for n := 0; i >= 0 && !info.boundaryBefore(); { - info, p = lastRuneStart(fd, b[:i]) - if n++; n >= maxCombiningChars { - return len(b) - } - if p+int(info.size) != i { - if p == -1 { // no boundary found - return -1 - } - return i // boundary after an illegal UTF-8 encoding - } - i = p - } - return i -} - -// decomposeSegment scans the first segment in src into rb. -// It returns the number of bytes consumed from src. -// TODO(mpvl): consider inserting U+034f (Combining Grapheme Joiner) -// when we detect a sequence of 30+ non-starter chars. -func decomposeSegment(rb *reorderBuffer, sp int) int { - // Force one character to be consumed. - info := rb.f.info(rb.src, sp) - if info.size == 0 { - return 0 - } - for rb.insert(rb.src, sp, info) { - sp += int(info.size) - if sp >= rb.nsrc { - break - } - info = rb.f.info(rb.src, sp) - bound := info.boundaryBefore() - if bound || info.size == 0 { - break - } - } - return sp -} - -// lastRuneStart returns the runeInfo and position of the last -// rune in buf or the zero runeInfo and -1 if no rune was found. -func lastRuneStart(fd *formInfo, buf []byte) (runeInfo, int) { - p := len(buf) - 1 - for ; p >= 0 && !utf8.RuneStart(buf[p]); p-- { - } - if p < 0 { - return runeInfo{}, -1 - } - return fd.info(inputBytes(buf), p), p -} - -// decomposeToLastBoundary finds an open segment at the end of the buffer -// and scans it into rb. Returns the buffer minus the last segment. -func decomposeToLastBoundary(rb *reorderBuffer, buf []byte) []byte { - fd := &rb.f - info, i := lastRuneStart(fd, buf) - if int(info.size) != len(buf)-i { - // illegal trailing continuation bytes - return buf - } - if info.boundaryAfter() { - return buf - } - var add [maxBackRunes]runeInfo // stores runeInfo in reverse order - add[0] = info - padd := 1 - n := 1 - p := len(buf) - int(info.size) - for ; p >= 0 && !info.boundaryBefore(); p -= int(info.size) { - info, i = lastRuneStart(fd, buf[:p]) - if int(info.size) != p-i { - break - } - // Check that decomposition doesn't result in overflow. - if info.hasDecomposition() { - if isHangul(buf) { - i += int(info.size) - n++ - } else { - dcomp := info.decomposition() - for i := 0; i < len(dcomp); { - inf := rb.f.info(inputBytes(dcomp), i) - i += int(inf.size) - n++ - } - } - } else { - n++ - } - if n > maxBackRunes { - break - } - add[padd] = info - padd++ - } - pp := p - for padd--; padd >= 0; padd-- { - info = add[padd] - rb.insert(inputBytes(buf), pp, info) - pp += int(info.size) - } - return buf[:p] -} diff --git a/src/pkg/exp/norm/normalize_test.go b/src/pkg/exp/norm/normalize_test.go deleted file mode 100644 index 8b970598b4..0000000000 --- a/src/pkg/exp/norm/normalize_test.go +++ /dev/null @@ -1,724 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import ( - "bytes" - "strings" - "testing" -) - -type PositionTest struct { - input string - pos int - buffer string // expected contents of reorderBuffer, if applicable -} - -type positionFunc func(rb *reorderBuffer, s string) int - -func runPosTests(t *testing.T, name string, f Form, fn positionFunc, tests []PositionTest) { - rb := reorderBuffer{} - rb.init(f, nil) - for i, test := range tests { - rb.reset() - rb.src = inputString(test.input) - rb.nsrc = len(test.input) - pos := fn(&rb, test.input) - if pos != test.pos { - t.Errorf("%s:%d: position is %d; want %d", name, i, pos, test.pos) - } - runes := []rune(test.buffer) - if rb.nrune != len(runes) { - t.Errorf("%s:%d: reorder buffer lenght is %d; want %d", name, i, rb.nrune, len(runes)) - continue - } - for j, want := range runes { - found := rune(rb.runeAt(j)) - if found != want { - t.Errorf("%s:%d: rune at %d is %U; want %U", name, i, j, found, want) - } - } - } -} - -var decomposeSegmentTests = []PositionTest{ - // illegal runes - {"\xC0", 0, ""}, - {"\u00E0\x80", 2, "\u0061\u0300"}, - // starter - {"a", 1, "a"}, - {"ab", 1, "a"}, - // starter + composing - {"a\u0300", 3, "a\u0300"}, - {"a\u0300b", 3, "a\u0300"}, - // with decomposition - {"\u00C0", 2, "A\u0300"}, - {"\u00C0b", 2, "A\u0300"}, - // long - {strings.Repeat("\u0300", 31), 62, strings.Repeat("\u0300", 31)}, - // ends with incomplete UTF-8 encoding - {"\xCC", 0, ""}, - {"\u0300\xCC", 2, "\u0300"}, -} - -func decomposeSegmentF(rb *reorderBuffer, s string) int { - rb.src = inputString(s) - rb.nsrc = len(s) - return decomposeSegment(rb, 0) -} - -func TestDecomposeSegment(t *testing.T) { - runPosTests(t, "TestDecomposeSegment", NFC, decomposeSegmentF, decomposeSegmentTests) -} - -var firstBoundaryTests = []PositionTest{ - // no boundary - {"", -1, ""}, - {"\u0300", -1, ""}, - {"\x80\x80", -1, ""}, - // illegal runes - {"\xff", 0, ""}, - {"\u0300\xff", 2, ""}, - {"\u0300\xc0\x80\x80", 2, ""}, - // boundaries - {"a", 0, ""}, - {"\u0300a", 2, ""}, - // Hangul - {"\u1103\u1161", 0, ""}, - {"\u110B\u1173\u11B7", 0, ""}, - {"\u1161\u110B\u1173\u11B7", 3, ""}, - {"\u1173\u11B7\u1103\u1161", 6, ""}, - // too many combining characters. - {strings.Repeat("\u0300", maxCombiningChars-1), -1, ""}, - {strings.Repeat("\u0300", maxCombiningChars), 60, ""}, - {strings.Repeat("\u0300", maxCombiningChars+1), 60, ""}, -} - -func firstBoundaryF(rb *reorderBuffer, s string) int { - return rb.f.form.FirstBoundary([]byte(s)) -} - -func firstBoundaryStringF(rb *reorderBuffer, s string) int { - return rb.f.form.FirstBoundaryInString(s) -} - -func TestFirstBoundary(t *testing.T) { - runPosTests(t, "TestFirstBoundary", NFC, firstBoundaryF, firstBoundaryTests) - runPosTests(t, "TestFirstBoundaryInString", NFC, firstBoundaryStringF, firstBoundaryTests) -} - -var decomposeToLastTests = []PositionTest{ - // ends with inert character - {"Hello!", 6, ""}, - {"\u0632", 2, ""}, - {"a\u0301\u0635", 5, ""}, - // ends with non-inert starter - {"a", 0, "a"}, - {"a\u0301a", 3, "a"}, - {"a\u0301\u03B9", 3, "\u03B9"}, - {"a\u0327", 0, "a\u0327"}, - // illegal runes - {"\xFF", 1, ""}, - {"aa\xFF", 3, ""}, - {"\xC0\x80\x80", 3, ""}, - {"\xCC\x80\x80", 3, ""}, - // ends with incomplete UTF-8 encoding - {"a\xCC", 2, ""}, - // ends with combining characters - {"\u0300\u0301", 0, "\u0300\u0301"}, - {"a\u0300\u0301", 0, "a\u0300\u0301"}, - {"a\u0301\u0308", 0, "a\u0301\u0308"}, - {"a\u0308\u0301", 0, "a\u0308\u0301"}, - {"aaaa\u0300\u0301", 3, "a\u0300\u0301"}, - {"\u0300a\u0300\u0301", 2, "a\u0300\u0301"}, - {"\u00C0", 0, "A\u0300"}, - {"a\u00C0", 1, "A\u0300"}, - // decomposing - {"a\u0300\uFDC0", 3, "\u0645\u062C\u064A"}, - {"\uFDC0" + strings.Repeat("\u0300", 26), 0, "\u0645\u062C\u064A" + strings.Repeat("\u0300", 26)}, - // Hangul - {"a\u1103", 1, "\u1103"}, - {"a\u110B", 1, "\u110B"}, - {"a\u110B\u1173", 1, "\u110B\u1173"}, - // See comment in composition.go:compBoundaryAfter. - {"a\u110B\u1173\u11B7", 1, "\u110B\u1173\u11B7"}, - {"a\uC73C", 1, "\u110B\u1173"}, - {"다음", 3, "\u110B\u1173\u11B7"}, - {"다", 0, "\u1103\u1161"}, - {"\u1103\u1161\u110B\u1173\u11B7", 6, "\u110B\u1173\u11B7"}, - {"\u110B\u1173\u11B7\u1103\u1161", 9, "\u1103\u1161"}, - {"다음음", 6, "\u110B\u1173\u11B7"}, - {"음다다", 6, "\u1103\u1161"}, - // buffer overflow - {"a" + strings.Repeat("\u0300", 30), 3, strings.Repeat("\u0300", 29)}, - {"\uFDFA" + strings.Repeat("\u0300", 14), 3, strings.Repeat("\u0300", 14)}, - // weird UTF-8 - {"a\u0300\u11B7", 0, "a\u0300\u11B7"}, -} - -func decomposeToLast(rb *reorderBuffer, s string) int { - buf := decomposeToLastBoundary(rb, []byte(s)) - return len(buf) -} - -func TestDecomposeToLastBoundary(t *testing.T) { - runPosTests(t, "TestDecomposeToLastBoundary", NFKC, decomposeToLast, decomposeToLastTests) -} - -var lastBoundaryTests = []PositionTest{ - // ends with inert character - {"Hello!", 6, ""}, - {"\u0632", 2, ""}, - // ends with non-inert starter - {"a", 0, ""}, - // illegal runes - {"\xff", 1, ""}, - {"aa\xff", 3, ""}, - {"a\xff\u0300", 1, ""}, - {"\xc0\x80\x80", 3, ""}, - {"\xc0\x80\x80\u0300", 3, ""}, - // ends with incomplete UTF-8 encoding - {"\xCC", -1, ""}, - {"\xE0\x80", -1, ""}, - {"\xF0\x80\x80", -1, ""}, - {"a\xCC", 0, ""}, - {"\x80\xCC", 1, ""}, - {"\xCC\xCC", 1, ""}, - // ends with combining characters - {"a\u0300\u0301", 0, ""}, - {"aaaa\u0300\u0301", 3, ""}, - {"\u0300a\u0300\u0301", 2, ""}, - {"\u00C0", 0, ""}, - {"a\u00C0", 1, ""}, - // decomposition may recombine - {"\u0226", 0, ""}, - // no boundary - {"", -1, ""}, - {"\u0300\u0301", -1, ""}, - {"\u0300", -1, ""}, - {"\x80\x80", -1, ""}, - {"\x80\x80\u0301", -1, ""}, - // Hangul - {"다음", 3, ""}, - {"다", 0, ""}, - {"\u1103\u1161\u110B\u1173\u11B7", 6, ""}, - {"\u110B\u1173\u11B7\u1103\u1161", 9, ""}, - // too many combining characters. - {strings.Repeat("\u0300", maxCombiningChars-1), -1, ""}, - {strings.Repeat("\u0300", maxCombiningChars), 60, ""}, - {strings.Repeat("\u0300", maxCombiningChars+1), 62, ""}, -} - -func lastBoundaryF(rb *reorderBuffer, s string) int { - return rb.f.form.LastBoundary([]byte(s)) -} - -func TestLastBoundary(t *testing.T) { - runPosTests(t, "TestLastBoundary", NFC, lastBoundaryF, lastBoundaryTests) -} - -var quickSpanTests = []PositionTest{ - {"", 0, ""}, - // starters - {"a", 1, ""}, - {"abc", 3, ""}, - {"\u043Eb", 3, ""}, - // incomplete last rune. - {"\xCC", 1, ""}, - {"a\xCC", 2, ""}, - // incorrectly ordered combining characters - {"\u0300\u0316", 0, ""}, - {"\u0300\u0316cd", 0, ""}, - // have a maximum number of combining characters. - {strings.Repeat("\u035D", 30) + "\u035B", 62, ""}, - {"a" + strings.Repeat("\u035D", 30) + "\u035B", 63, ""}, - {"Ɵ" + strings.Repeat("\u035D", 30) + "\u035B", 64, ""}, - {"aa" + strings.Repeat("\u035D", 30) + "\u035B", 64, ""}, -} - -var quickSpanNFDTests = []PositionTest{ - // needs decomposing - {"\u00C0", 0, ""}, - {"abc\u00C0", 3, ""}, - // correctly ordered combining characters - {"\u0300", 2, ""}, - {"ab\u0300", 4, ""}, - {"ab\u0300cd", 6, ""}, - {"\u0300cd", 4, ""}, - {"\u0316\u0300", 4, ""}, - {"ab\u0316\u0300", 6, ""}, - {"ab\u0316\u0300cd", 8, ""}, - {"ab\u0316\u0300\u00C0", 6, ""}, - {"\u0316\u0300cd", 6, ""}, - {"\u043E\u0308b", 5, ""}, - // incorrectly ordered combining characters - {"ab\u0300\u0316", 1, ""}, // TODO: we could skip 'b' as well. - {"ab\u0300\u0316cd", 1, ""}, - // Hangul - {"같은", 0, ""}, -} - -var quickSpanNFCTests = []PositionTest{ - // okay composed - {"\u00C0", 2, ""}, - {"abc\u00C0", 5, ""}, - // correctly ordered combining characters - {"ab\u0300", 1, ""}, - {"ab\u0300cd", 1, ""}, - {"ab\u0316\u0300", 1, ""}, - {"ab\u0316\u0300cd", 1, ""}, - {"\u00C0\u035D", 4, ""}, - // we do not special case leading combining characters - {"\u0300cd", 0, ""}, - {"\u0300", 0, ""}, - {"\u0316\u0300", 0, ""}, - {"\u0316\u0300cd", 0, ""}, - // incorrectly ordered combining characters - {"ab\u0300\u0316", 1, ""}, - {"ab\u0300\u0316cd", 1, ""}, - // Hangul - {"같은", 6, ""}, -} - -func doQuickSpan(rb *reorderBuffer, s string) int { - return rb.f.form.QuickSpan([]byte(s)) -} - -func doQuickSpanString(rb *reorderBuffer, s string) int { - return rb.f.form.QuickSpanString(s) -} - -func TestQuickSpan(t *testing.T) { - runPosTests(t, "TestQuickSpanNFD1", NFD, doQuickSpan, quickSpanTests) - runPosTests(t, "TestQuickSpanNFD2", NFD, doQuickSpan, quickSpanNFDTests) - runPosTests(t, "TestQuickSpanNFC1", NFC, doQuickSpan, quickSpanTests) - runPosTests(t, "TestQuickSpanNFC2", NFC, doQuickSpan, quickSpanNFCTests) - - runPosTests(t, "TestQuickSpanStringNFD1", NFD, doQuickSpanString, quickSpanTests) - runPosTests(t, "TestQuickSpanStringNFD2", NFD, doQuickSpanString, quickSpanNFDTests) - runPosTests(t, "TestQuickSpanStringNFC1", NFC, doQuickSpanString, quickSpanTests) - runPosTests(t, "TestQuickSpanStringNFC2", NFC, doQuickSpanString, quickSpanNFCTests) -} - -var isNormalTests = []PositionTest{ - {"", 1, ""}, - // illegal runes - {"\xff", 1, ""}, - // starters - {"a", 1, ""}, - {"abc", 1, ""}, - {"\u043Eb", 1, ""}, - // incorrectly ordered combining characters - {"\u0300\u0316", 0, ""}, - {"ab\u0300\u0316", 0, ""}, - {"ab\u0300\u0316cd", 0, ""}, - {"\u0300\u0316cd", 0, ""}, -} -var isNormalNFDTests = []PositionTest{ - // needs decomposing - {"\u00C0", 0, ""}, - {"abc\u00C0", 0, ""}, - // correctly ordered combining characters - {"\u0300", 1, ""}, - {"ab\u0300", 1, ""}, - {"ab\u0300cd", 1, ""}, - {"\u0300cd", 1, ""}, - {"\u0316\u0300", 1, ""}, - {"ab\u0316\u0300", 1, ""}, - {"ab\u0316\u0300cd", 1, ""}, - {"\u0316\u0300cd", 1, ""}, - {"\u043E\u0308b", 1, ""}, - // Hangul - {"같은", 0, ""}, -} -var isNormalNFCTests = []PositionTest{ - // okay composed - {"\u00C0", 1, ""}, - {"abc\u00C0", 1, ""}, - // need reordering - {"a\u0300", 0, ""}, - {"a\u0300cd", 0, ""}, - {"a\u0316\u0300", 0, ""}, - {"a\u0316\u0300cd", 0, ""}, - // correctly ordered combining characters - {"ab\u0300", 1, ""}, - {"ab\u0300cd", 1, ""}, - {"ab\u0316\u0300", 1, ""}, - {"ab\u0316\u0300cd", 1, ""}, - {"\u00C0\u035D", 1, ""}, - {"\u0300", 1, ""}, - {"\u0316\u0300cd", 1, ""}, - // Hangul - {"같은", 1, ""}, -} - -func isNormalF(rb *reorderBuffer, s string) int { - if rb.f.form.IsNormal([]byte(s)) { - return 1 - } - return 0 -} - -func TestIsNormal(t *testing.T) { - runPosTests(t, "TestIsNormalNFD1", NFD, isNormalF, isNormalTests) - runPosTests(t, "TestIsNormalNFD2", NFD, isNormalF, isNormalNFDTests) - runPosTests(t, "TestIsNormalNFC1", NFC, isNormalF, isNormalTests) - runPosTests(t, "TestIsNormalNFC2", NFC, isNormalF, isNormalNFCTests) -} - -type AppendTest struct { - left string - right string - out string -} - -type appendFunc func(f Form, out []byte, s string) []byte - -func runAppendTests(t *testing.T, name string, f Form, fn appendFunc, tests []AppendTest) { - for i, test := range tests { - out := []byte(test.left) - out = fn(f, out, test.right) - outs := string(out) - if len(outs) != len(test.out) { - t.Errorf("%s:%d: length is %d; want %d", name, i, len(outs), len(test.out)) - } - if outs != test.out { - // Find first rune that differs and show context. - ir := []rune(outs) - ig := []rune(test.out) - for j := 0; j < len(ir) && j < len(ig); j++ { - if ir[j] == ig[j] { - continue - } - if j -= 3; j < 0 { - j = 0 - } - for e := j + 7; j < e && j < len(ir) && j < len(ig); j++ { - t.Errorf("%s:%d: runeAt(%d) = %U; want %U", name, i, j, ir[j], ig[j]) - } - break - } - } - } -} - -var appendTests = []AppendTest{ - // empty buffers - {"", "", ""}, - {"a", "", "a"}, - {"", "a", "a"}, - {"", "\u0041\u0307\u0304", "\u01E0"}, - // segment split across buffers - {"", "a\u0300b", "\u00E0b"}, - {"a", "\u0300b", "\u00E0b"}, - {"a", "\u0300\u0316", "\u00E0\u0316"}, - {"a", "\u0316\u0300", "\u00E0\u0316"}, - {"a", "\u0300a\u0300", "\u00E0\u00E0"}, - {"a", "\u0300a\u0300a\u0300", "\u00E0\u00E0\u00E0"}, - {"a", "\u0300aaa\u0300aaa\u0300", "\u00E0aa\u00E0aa\u00E0"}, - {"a\u0300", "\u0327", "\u00E0\u0327"}, - {"a\u0327", "\u0300", "\u00E0\u0327"}, - {"a\u0316", "\u0300", "\u00E0\u0316"}, - {"\u0041\u0307", "\u0304", "\u01E0"}, - // Hangul - {"", "\u110B\u1173", "\uC73C"}, - {"", "\u1103\u1161", "\uB2E4"}, - {"", "\u110B\u1173\u11B7", "\uC74C"}, - {"", "\u320E", "\x28\uAC00\x29"}, - {"", "\x28\u1100\u1161\x29", "\x28\uAC00\x29"}, - {"\u1103", "\u1161", "\uB2E4"}, - {"\u110B", "\u1173\u11B7", "\uC74C"}, - {"\u110B\u1173", "\u11B7", "\uC74C"}, - {"\uC73C", "\u11B7", "\uC74C"}, - // UTF-8 encoding split across buffers - {"a\xCC", "\x80", "\u00E0"}, - {"a\xCC", "\x80b", "\u00E0b"}, - {"a\xCC", "\x80a\u0300", "\u00E0\u00E0"}, - {"a\xCC", "\x80\x80", "\u00E0\x80"}, - {"a\xCC", "\x80\xCC", "\u00E0\xCC"}, - {"a\u0316\xCC", "\x80a\u0316\u0300", "\u00E0\u0316\u00E0\u0316"}, - // ending in incomplete UTF-8 encoding - {"", "\xCC", "\xCC"}, - {"a", "\xCC", "a\xCC"}, - {"a", "b\xCC", "ab\xCC"}, - {"\u0226", "\xCC", "\u0226\xCC"}, - // illegal runes - {"", "\x80", "\x80"}, - {"", "\x80\x80\x80", "\x80\x80\x80"}, - {"", "\xCC\x80\x80\x80", "\xCC\x80\x80\x80"}, - {"", "a\x80", "a\x80"}, - {"", "a\x80\x80\x80", "a\x80\x80\x80"}, - {"", "a\x80\x80\x80\x80\x80\x80", "a\x80\x80\x80\x80\x80\x80"}, - {"a", "\x80\x80\x80", "a\x80\x80\x80"}, - // overflow - {"", strings.Repeat("\x80", 33), strings.Repeat("\x80", 33)}, - {strings.Repeat("\x80", 33), "", strings.Repeat("\x80", 33)}, - {strings.Repeat("\x80", 33), strings.Repeat("\x80", 33), strings.Repeat("\x80", 66)}, - // overflow of combining characters - {strings.Repeat("\u0300", 33), "", strings.Repeat("\u0300", 33)}, - // weird UTF-8 - {"\u00E0\xE1", "\x86", "\u00E0\xE1\x86"}, - {"a\u0300\u11B7", "\u0300", "\u00E0\u11B7\u0300"}, - {"a\u0300\u11B7\u0300", "\u0300", "\u00E0\u11B7\u0300\u0300"}, - {"\u0300", "\xF8\x80\x80\x80\x80\u0300", "\u0300\xF8\x80\x80\x80\x80\u0300"}, - {"\u0300", "\xFC\x80\x80\x80\x80\x80\u0300", "\u0300\xFC\x80\x80\x80\x80\x80\u0300"}, - {"\xF8\x80\x80\x80\x80\u0300", "\u0300", "\xF8\x80\x80\x80\x80\u0300\u0300"}, - {"\xFC\x80\x80\x80\x80\x80\u0300", "\u0300", "\xFC\x80\x80\x80\x80\x80\u0300\u0300"}, - {"\xF8\x80\x80\x80", "\x80\u0300\u0300", "\xF8\x80\x80\x80\x80\u0300\u0300"}, -} - -func appendF(f Form, out []byte, s string) []byte { - return f.Append(out, []byte(s)...) -} - -func appendStringF(f Form, out []byte, s string) []byte { - return f.AppendString(out, s) -} - -func bytesF(f Form, out []byte, s string) []byte { - buf := []byte{} - buf = append(buf, out...) - buf = append(buf, s...) - return f.Bytes(buf) -} - -func stringF(f Form, out []byte, s string) []byte { - outs := string(out) + s - return []byte(f.String(outs)) -} - -func TestAppend(t *testing.T) { - runAppendTests(t, "TestAppend", NFKC, appendF, appendTests) - runAppendTests(t, "TestAppendString", NFKC, appendStringF, appendTests) - runAppendTests(t, "TestBytes", NFKC, bytesF, appendTests) - runAppendTests(t, "TestString", NFKC, stringF, appendTests) -} - -func appendBench(f Form, in []byte) func() { - buf := make([]byte, 0, 4*len(in)) - return func() { - f.Append(buf, in...) - } -} - -func iterBench(f Form, in []byte) func() { - buf := make([]byte, 4*len(in)) - iter := Iter{} - return func() { - iter.SetInput(f, in) - for !iter.Done() { - iter.Next(buf) - } - } -} - -func appendBenchmarks(bm []func(), f Form, in []byte) []func() { - //bm = append(bm, appendBench(f, in)) - bm = append(bm, iterBench(f, in)) - return bm -} - -func doFormBenchmark(b *testing.B, inf, f Form, s string) { - b.StopTimer() - in := inf.Bytes([]byte(s)) - bm := appendBenchmarks(nil, f, in) - b.SetBytes(int64(len(in) * len(bm))) - b.StartTimer() - for i := 0; i < b.N; i++ { - for _, fn := range bm { - fn() - } - } -} - -var ascii = strings.Repeat("There is nothing to change here! ", 500) - -func BenchmarkNormalizeAsciiNFC(b *testing.B) { - doFormBenchmark(b, NFC, NFC, ascii) -} -func BenchmarkNormalizeAsciiNFD(b *testing.B) { - doFormBenchmark(b, NFC, NFD, ascii) -} -func BenchmarkNormalizeAsciiNFKC(b *testing.B) { - doFormBenchmark(b, NFC, NFKC, ascii) -} -func BenchmarkNormalizeAsciiNFKD(b *testing.B) { - doFormBenchmark(b, NFC, NFKD, ascii) -} - -func BenchmarkNormalizeNFC2NFC(b *testing.B) { - doFormBenchmark(b, NFC, NFC, txt_all) -} -func BenchmarkNormalizeNFC2NFD(b *testing.B) { - doFormBenchmark(b, NFC, NFD, txt_all) -} -func BenchmarkNormalizeNFD2NFC(b *testing.B) { - doFormBenchmark(b, NFD, NFC, txt_all) -} -func BenchmarkNormalizeNFD2NFD(b *testing.B) { - doFormBenchmark(b, NFD, NFD, txt_all) -} - -// Hangul is often special-cased, so we test it separately. -func BenchmarkNormalizeHangulNFC2NFC(b *testing.B) { - doFormBenchmark(b, NFC, NFC, txt_kr) -} -func BenchmarkNormalizeHangulNFC2NFD(b *testing.B) { - doFormBenchmark(b, NFC, NFD, txt_kr) -} -func BenchmarkNormalizeHangulNFD2NFC(b *testing.B) { - doFormBenchmark(b, NFD, NFC, txt_kr) -} -func BenchmarkNormalizeHangulNFD2NFD(b *testing.B) { - doFormBenchmark(b, NFD, NFD, txt_kr) -} - -var forms = []Form{NFC, NFD, NFKC, NFKD} - -func doTextBenchmark(b *testing.B, s string) { - b.StopTimer() - in := []byte(s) - bm := []func(){} - for _, f := range forms { - bm = appendBenchmarks(bm, f, in) - } - b.SetBytes(int64(len(s) * len(bm))) - b.StartTimer() - for i := 0; i < b.N; i++ { - for _, f := range bm { - f() - } - } -} - -func BenchmarkCanonicalOrdering(b *testing.B) { - doTextBenchmark(b, txt_canon) -} -func BenchmarkExtendedLatin(b *testing.B) { - doTextBenchmark(b, txt_vn) -} -func BenchmarkMiscTwoByteUtf8(b *testing.B) { - doTextBenchmark(b, twoByteUtf8) -} -func BenchmarkMiscThreeByteUtf8(b *testing.B) { - doTextBenchmark(b, threeByteUtf8) -} -func BenchmarkHangul(b *testing.B) { - doTextBenchmark(b, txt_kr) -} -func BenchmarkJapanese(b *testing.B) { - doTextBenchmark(b, txt_jp) -} -func BenchmarkChinese(b *testing.B) { - doTextBenchmark(b, txt_cn) -} -func BenchmarkOverflow(b *testing.B) { - doTextBenchmark(b, overflow) -} - -var overflow = string(bytes.Repeat([]byte("\u035D"), 4096)) + "\u035B" - -// Tests sampled from the Canonical ordering tests (Part 2) of -// http://unicode.org/Public/UNIDATA/NormalizationTest.txt -const txt_canon = `\u0061\u0315\u0300\u05AE\u0300\u0062 \u0061\u0300\u0315\u0300\u05AE\u0062 -\u0061\u0302\u0315\u0300\u05AE\u0062 \u0061\u0307\u0315\u0300\u05AE\u0062 -\u0061\u0315\u0300\u05AE\u030A\u0062 \u0061\u059A\u0316\u302A\u031C\u0062 -\u0061\u032E\u059A\u0316\u302A\u0062 \u0061\u0338\u093C\u0334\u0062 -\u0061\u059A\u0316\u302A\u0339 \u0061\u0341\u0315\u0300\u05AE\u0062 -\u0061\u0348\u059A\u0316\u302A\u0062 \u0061\u0361\u0345\u035D\u035C\u0062 -\u0061\u0366\u0315\u0300\u05AE\u0062 \u0061\u0315\u0300\u05AE\u0486\u0062 -\u0061\u05A4\u059A\u0316\u302A\u0062 \u0061\u0315\u0300\u05AE\u0613\u0062 -\u0061\u0315\u0300\u05AE\u0615\u0062 \u0061\u0617\u0315\u0300\u05AE\u0062 -\u0061\u0619\u0618\u064D\u064E\u0062 \u0061\u0315\u0300\u05AE\u0654\u0062 -\u0061\u0315\u0300\u05AE\u06DC\u0062 \u0061\u0733\u0315\u0300\u05AE\u0062 -\u0061\u0744\u059A\u0316\u302A\u0062 \u0061\u0315\u0300\u05AE\u0745\u0062 -\u0061\u09CD\u05B0\u094D\u3099\u0062 \u0061\u0E38\u0E48\u0E38\u0C56\u0062 -\u0061\u0EB8\u0E48\u0E38\u0E49\u0062 \u0061\u0F72\u0F71\u0EC8\u0F71\u0062 -\u0061\u1039\u05B0\u094D\u3099\u0062 \u0061\u05B0\u094D\u3099\u1A60\u0062 -\u0061\u3099\u093C\u0334\u1BE6\u0062 \u0061\u3099\u093C\u0334\u1C37\u0062 -\u0061\u1CD9\u059A\u0316\u302A\u0062 \u0061\u2DED\u0315\u0300\u05AE\u0062 -\u0061\u2DEF\u0315\u0300\u05AE\u0062 \u0061\u302D\u302E\u059A\u0316\u0062` - -// Taken from http://creativecommons.org/licenses/by-sa/3.0/vn/ -const txt_vn = `Với các điều kiện sau: Ghi nhận công của tác giả. -Nếu bạn sử dụng, chuyển đổi, hoặc xây dựng dự án từ -nội dung được chia sẻ này, bạn phải áp dụng giấy phép này hoặc -một giấy phép khác có các điều khoản tương tự như giấy phép này -cho dự án của bạn. Hiểu rằng: Miễn — Bất kỳ các điều kiện nào -trên đây cũng có thể được miễn bỏ nếu bạn được sự cho phép của -người sở hữu bản quyền. Phạm vi công chúng — Khi tác phẩm hoặc -bất kỳ chương nào của tác phẩm đã trong vùng dành cho công -chúng theo quy định của pháp luật thì tình trạng của nó không -bị ảnh hưởng bởi giấy phép trong bất kỳ trường hợp nào.` - -// Taken from http://creativecommons.org/licenses/by-sa/1.0/deed.ru -const txt_ru = `При обязательном соблюдении следующих условий: -Attribution — Вы должны атрибутировать произведение (указывать -автора и источник) в порядке, предусмотренном автором или -лицензиаром (но только так, чтобы никоим образом не подразумевалось, -что они поддерживают вас или использование вами данного произведения). -Υπό τις ακόλουθες προϋποθέσεις:` - -// Taken from http://creativecommons.org/licenses/by-sa/3.0/gr/ -const txt_gr = `Αναφορά Δημιουργού — Θα πρέπει να κάνετε την αναφορά στο έργο με τον -τρόπο που έχει οριστεί από το δημιουργό ή το χορηγούντο την άδεια -(χωρίς όμως να εννοείται με οποιονδήποτε τρόπο ότι εγκρίνουν εσάς ή -τη χρήση του έργου από εσάς). Παρόμοια Διανομή — Εάν αλλοιώσετε, -τροποποιήσετε ή δημιουργήσετε περαιτέρω βασισμένοι στο έργο θα -μπορείτε να διανέμετε το έργο που θα προκύψει μόνο με την ίδια ή -παρόμοια άδεια.` - -// Taken from http://creativecommons.org/licenses/by-sa/3.0/deed.ar -const txt_ar = `بموجب الشروط التالية نسب المصنف — يجب عليك أن -تنسب العمل بالطريقة التي تحددها المؤلف أو المرخص (ولكن ليس بأي حال من -الأحوال أن توحي وتقترح بتحول أو استخدامك للعمل). -المشاركة على قدم المساواة — إذا كنت يعدل ، والتغيير ، أو الاستفادة -من هذا العمل ، قد ينتج عن توزيع العمل إلا في ظل تشابه او تطابق فى واحد -لهذا الترخيص.` - -// Taken from http://creativecommons.org/licenses/by-sa/1.0/il/ -const txt_il = `בכפוף לתנאים הבאים: ייחוס — עליך לייחס את היצירה (לתת קרדיט) באופן -המצויין על-ידי היוצר או מעניק הרישיון (אך לא בשום אופן המרמז על כך -שהם תומכים בך או בשימוש שלך ביצירה). שיתוף זהה — אם תחליט/י לשנות, -לעבד או ליצור יצירה נגזרת בהסתמך על יצירה זו, תוכל/י להפיץ את יצירתך -החדשה רק תחת אותו הרישיון או רישיון דומה לרישיון זה.` - -const twoByteUtf8 = txt_ru + txt_gr + txt_ar + txt_il - -// Taken from http://creativecommons.org/licenses/by-sa/2.0/kr/ -const txt_kr = `다음과 같은 조건을 따라야 합니다: 저작자표시 -(Attribution) — 저작자나 이용허락자가 정한 방법으로 저작물의 -원저작자를 표시하여야 합니다(그러나 원저작자가 이용자나 이용자의 -이용을 보증하거나 추천한다는 의미로 표시해서는 안됩니다). -동일조건변경허락 — 이 저작물을 이용하여 만든 이차적 저작물에는 본 -라이선스와 동일한 라이선스를 적용해야 합니다.` - -// Taken from http://creativecommons.org/licenses/by-sa/3.0/th/ -const txt_th = `ภายใต้เงื่อนไข ดังต่อไปนี้ : แสดงที่มา — คุณต้องแสดงที่ -มาของงานดังกล่าว ตามรูปแบบที่ผู้สร้างสรรค์หรือผู้อนุญาตกำหนด (แต่ -ไม่ใช่ในลักษณะที่ว่า พวกเขาสนับสนุนคุณหรือสนับสนุนการที่ -คุณนำงานไปใช้) อนุญาตแบบเดียวกัน — หากคุณดัดแปลง เปลี่ยนรูป หรื -อต่อเติมงานนี้ คุณต้องใช้สัญญาอนุญาตแบบเดียวกันหรือแบบที่เหมื -อนกับสัญญาอนุญาตที่ใช้กับงานนี้เท่านั้น` - -const threeByteUtf8 = txt_th - -// Taken from http://creativecommons.org/licenses/by-sa/2.0/jp/ -const txt_jp = `あなたの従うべき条件は以下の通りです。 -表示 — あなたは原著作者のクレジットを表示しなければなりません。 -継承 — もしあなたがこの作品を改変、変形または加工した場合、 -あなたはその結果生じた作品をこの作品と同一の許諾条件の下でのみ -頒布することができます。` - -// http://creativecommons.org/licenses/by-sa/2.5/cn/ -const txt_cn = `您可以自由: 复制、发行、展览、表演、放映、 -广播或通过信息网络传播本作品 创作演绎作品 -对本作品进行商业性使用 惟须遵守下列条件: -署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。 -相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作, -您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。` - -const txt_cjk = txt_cn + txt_jp + txt_kr -const txt_all = txt_vn + twoByteUtf8 + threeByteUtf8 + txt_cjk diff --git a/src/pkg/exp/norm/normregtest.go b/src/pkg/exp/norm/normregtest.go deleted file mode 100644 index 507de1ae83..0000000000 --- a/src/pkg/exp/norm/normregtest.go +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "bufio" - "bytes" - "exp/norm" - "flag" - "fmt" - "io" - "log" - "net/http" - "os" - "path" - "regexp" - "runtime" - "strconv" - "strings" - "time" - "unicode/utf8" -) - -func main() { - flag.Parse() - loadTestData() - CharacterByCharacterTests() - StandardTests() - PerformanceTest() - if errorCount == 0 { - fmt.Println("PASS") - } -} - -const file = "NormalizationTest.txt" - -var url = flag.String("url", - "http://www.unicode.org/Public/6.0.0/ucd/"+file, - "URL of Unicode database directory") -var localFiles = flag.Bool("local", - false, - "data files have been copied to the current directory; for debugging only") - -var logger = log.New(os.Stderr, "", log.Lshortfile) - -// This regression test runs the test set in NormalizationTest.txt -// (taken from http://www.unicode.org/Public/6.0.0/ucd/). -// -// NormalizationTest.txt has form: -// @Part0 # Specific cases -// # -// 1E0A;1E0A;0044 0307;1E0A;0044 0307; # (Ḋ; Ḋ; D◌̇; Ḋ; D◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE -// 1E0C;1E0C;0044 0323;1E0C;0044 0323; # (Ḍ; Ḍ; D◌̣; Ḍ; D◌̣; ) LATIN CAPITAL LETTER D WITH DOT BELOW -// -// Each test has 5 columns (c1, c2, c3, c4, c5), where -// (c1, c2, c3, c4, c5) == (c1, NFC(c1), NFD(c1), NFKC(c1), NFKD(c1)) -// -// CONFORMANCE: -// 1. The following invariants must be true for all conformant implementations -// -// NFC -// c2 == NFC(c1) == NFC(c2) == NFC(c3) -// c4 == NFC(c4) == NFC(c5) -// -// NFD -// c3 == NFD(c1) == NFD(c2) == NFD(c3) -// c5 == NFD(c4) == NFD(c5) -// -// NFKC -// c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5) -// -// NFKD -// c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5) -// -// 2. For every code point X assigned in this version of Unicode that is not -// specifically listed in Part 1, the following invariants must be true -// for all conformant implementations: -// -// X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X) -// - -// Column types. -const ( - cRaw = iota - cNFC - cNFD - cNFKC - cNFKD - cMaxColumns -) - -// Holds data from NormalizationTest.txt -var part []Part - -type Part struct { - name string - number int - tests []Test -} - -type Test struct { - name string - partnr int - number int - r rune // used for character by character test - cols [cMaxColumns]string // Each has 5 entries, see below. -} - -func (t Test) Name() string { - if t.number < 0 { - return part[t.partnr].name - } - return fmt.Sprintf("%s:%d", part[t.partnr].name, t.number) -} - -var partRe = regexp.MustCompile(`@Part(\d) # (.*)\n$`) -var testRe = regexp.MustCompile(`^` + strings.Repeat(`([\dA-F ]+);`, 5) + ` # (.*)\n?$`) - -var counter int - -// Load the data form NormalizationTest.txt -func loadTestData() { - if *localFiles { - pwd, _ := os.Getwd() - *url = "file://" + path.Join(pwd, file) - } - t := &http.Transport{} - t.RegisterProtocol("file", http.NewFileTransport(http.Dir("/"))) - c := &http.Client{Transport: t} - resp, err := c.Get(*url) - if err != nil { - logger.Fatal(err) - } - if resp.StatusCode != 200 { - logger.Fatal("bad GET status for "+file, resp.Status) - } - f := resp.Body - defer f.Close() - input := bufio.NewReader(f) - for { - line, err := input.ReadString('\n') - if err != nil { - if err == io.EOF { - break - } - logger.Fatal(err) - } - if len(line) == 0 || line[0] == '#' { - continue - } - m := partRe.FindStringSubmatch(line) - if m != nil { - if len(m) < 3 { - logger.Fatal("Failed to parse Part: ", line) - } - i, err := strconv.Atoi(m[1]) - if err != nil { - logger.Fatal(err) - } - name := m[2] - part = append(part, Part{name: name[:len(name)-1], number: i}) - continue - } - m = testRe.FindStringSubmatch(line) - if m == nil || len(m) < 7 { - logger.Fatalf(`Failed to parse: "%s" result: %#v`, line, m) - } - test := Test{name: m[6], partnr: len(part) - 1, number: counter} - counter++ - for j := 1; j < len(m)-1; j++ { - for _, split := range strings.Split(m[j], " ") { - r, err := strconv.ParseUint(split, 16, 64) - if err != nil { - logger.Fatal(err) - } - if test.r == 0 { - // save for CharacterByCharacterTests - test.r = rune(r) - } - var buf [utf8.UTFMax]byte - sz := utf8.EncodeRune(buf[:], rune(r)) - test.cols[j-1] += string(buf[:sz]) - } - } - part := &part[len(part)-1] - part.tests = append(part.tests, test) - } -} - -var fstr = []string{"NFC", "NFD", "NFKC", "NFKD"} - -var errorCount int - -func cmpResult(t *Test, name string, f norm.Form, gold, test, result string) { - if gold != result { - errorCount++ - if errorCount > 20 { - return - } - st, sr, sg := []rune(test), []rune(result), []rune(gold) - logger.Printf("%s:%s: %s(%X)=%X; want:%X: %s", - t.Name(), name, fstr[f], st, sr, sg, t.name) - } -} - -func cmpIsNormal(t *Test, name string, f norm.Form, test string, result, want bool) { - if result != want { - errorCount++ - if errorCount > 20 { - return - } - logger.Printf("%s:%s: %s(%X)=%v; want: %v", t.Name(), name, fstr[f], []rune(test), result, want) - } -} - -func doTest(t *Test, f norm.Form, gold, test string) { - result := f.Bytes([]byte(test)) - cmpResult(t, "Bytes", f, gold, test, string(result)) - sresult := f.String(test) - cmpResult(t, "String", f, gold, test, sresult) - buf := make([]byte, norm.MaxSegmentSize) - acc := []byte{} - i := norm.Iter{} - i.SetInputString(f, test) - for !i.Done() { - n := i.Next(buf) - acc = append(acc, buf[:n]...) - } - cmpResult(t, "Iter.Next", f, gold, test, string(acc)) - for i := range test { - out := f.Append(f.Bytes([]byte(test[:i])), []byte(test[i:])...) - cmpResult(t, fmt.Sprintf(":Append:%d", i), f, gold, test, string(out)) - } - cmpIsNormal(t, "IsNormal", f, test, f.IsNormal([]byte(test)), test == gold) -} - -func doConformanceTests(t *Test, partn int) { - for i := 0; i <= 2; i++ { - doTest(t, norm.NFC, t.cols[1], t.cols[i]) - doTest(t, norm.NFD, t.cols[2], t.cols[i]) - doTest(t, norm.NFKC, t.cols[3], t.cols[i]) - doTest(t, norm.NFKD, t.cols[4], t.cols[i]) - } - for i := 3; i <= 4; i++ { - doTest(t, norm.NFC, t.cols[3], t.cols[i]) - doTest(t, norm.NFD, t.cols[4], t.cols[i]) - doTest(t, norm.NFKC, t.cols[3], t.cols[i]) - doTest(t, norm.NFKD, t.cols[4], t.cols[i]) - } -} - -func CharacterByCharacterTests() { - tests := part[1].tests - var last rune = 0 - for i := 0; i <= len(tests); i++ { // last one is special case - var r rune - if i == len(tests) { - r = 0x2FA1E // Don't have to go to 0x10FFFF - } else { - r = tests[i].r - } - for last++; last < r; last++ { - // Check all characters that were not explicitly listed in the test. - t := &Test{partnr: 1, number: -1} - char := string(last) - doTest(t, norm.NFC, char, char) - doTest(t, norm.NFD, char, char) - doTest(t, norm.NFKC, char, char) - doTest(t, norm.NFKD, char, char) - } - if i < len(tests) { - doConformanceTests(&tests[i], 1) - } - } -} - -func StandardTests() { - for _, j := range []int{0, 2, 3} { - for _, test := range part[j].tests { - doConformanceTests(&test, j) - } - } -} - -// PerformanceTest verifies that normalization is O(n). If any of the -// code does not properly check for maxCombiningChars, normalization -// may exhibit O(n**2) behavior. -func PerformanceTest() { - runtime.GOMAXPROCS(2) - success := make(chan bool, 1) - go func() { - buf := bytes.Repeat([]byte("\u035D"), 1024*1024) - buf = append(buf, "\u035B"...) - norm.NFC.Append(nil, buf...) - success <- true - }() - timeout := time.After(1 * time.Second) - select { - case <-success: - // test completed before the timeout - case <-timeout: - errorCount++ - logger.Printf(`unexpectedly long time to complete PerformanceTest`) - } -} diff --git a/src/pkg/exp/norm/readwriter.go b/src/pkg/exp/norm/readwriter.go deleted file mode 100644 index 2682894de0..0000000000 --- a/src/pkg/exp/norm/readwriter.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import "io" - -type normWriter struct { - rb reorderBuffer - w io.Writer - buf []byte -} - -// Write implements the standard write interface. If the last characters are -// not at a normalization boundary, the bytes will be buffered for the next -// write. The remaining bytes will be written on close. -func (w *normWriter) Write(data []byte) (n int, err error) { - // Process data in pieces to keep w.buf size bounded. - const chunk = 4000 - - for len(data) > 0 { - // Normalize into w.buf. - m := len(data) - if m > chunk { - m = chunk - } - w.rb.src = inputBytes(data[:m]) - w.rb.nsrc = m - w.buf = doAppend(&w.rb, w.buf, 0) - data = data[m:] - n += m - - // Write out complete prefix, save remainder. - // Note that lastBoundary looks back at most 30 runes. - i := lastBoundary(&w.rb.f, w.buf) - if i == -1 { - i = 0 - } - if i > 0 { - if _, err = w.w.Write(w.buf[:i]); err != nil { - break - } - bn := copy(w.buf, w.buf[i:]) - w.buf = w.buf[:bn] - } - } - return n, err -} - -// Close forces data that remains in the buffer to be written. -func (w *normWriter) Close() error { - if len(w.buf) > 0 { - _, err := w.w.Write(w.buf) - if err != nil { - return err - } - } - return nil -} - -// Writer returns a new writer that implements Write(b) -// by writing f(b) to w. The returned writer may use an -// an internal buffer to maintain state across Write calls. -// Calling its Close method writes any buffered data to w. -func (f Form) Writer(w io.Writer) io.WriteCloser { - wr := &normWriter{rb: reorderBuffer{}, w: w} - wr.rb.init(f, nil) - return wr -} - -type normReader struct { - rb reorderBuffer - r io.Reader - inbuf []byte - outbuf []byte - bufStart int - lastBoundary int - err error -} - -// Read implements the standard read interface. -func (r *normReader) Read(p []byte) (int, error) { - for { - if r.lastBoundary-r.bufStart > 0 { - n := copy(p, r.outbuf[r.bufStart:r.lastBoundary]) - r.bufStart += n - if r.lastBoundary-r.bufStart > 0 { - return n, nil - } - return n, r.err - } - if r.err != nil { - return 0, r.err - } - outn := copy(r.outbuf, r.outbuf[r.lastBoundary:]) - r.outbuf = r.outbuf[0:outn] - r.bufStart = 0 - - n, err := r.r.Read(r.inbuf) - r.rb.src = inputBytes(r.inbuf[0:n]) - r.rb.nsrc, r.err = n, err - if n > 0 { - r.outbuf = doAppend(&r.rb, r.outbuf, 0) - } - if err == io.EOF { - r.lastBoundary = len(r.outbuf) - } else { - r.lastBoundary = lastBoundary(&r.rb.f, r.outbuf) - if r.lastBoundary == -1 { - r.lastBoundary = 0 - } - } - } - panic("should not reach here") -} - -// Reader returns a new reader that implements Read -// by reading data from r and returning f(data). -func (f Form) Reader(r io.Reader) io.Reader { - const chunk = 4000 - buf := make([]byte, chunk) - rr := &normReader{rb: reorderBuffer{}, r: r, inbuf: buf} - rr.rb.init(f, buf) - return rr -} diff --git a/src/pkg/exp/norm/readwriter_test.go b/src/pkg/exp/norm/readwriter_test.go deleted file mode 100644 index 3b49eb0a2f..0000000000 --- a/src/pkg/exp/norm/readwriter_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import ( - "bytes" - "fmt" - "strings" - "testing" -) - -var ioTests = []AppendTest{ - {"", strings.Repeat("a\u0316\u0300", 6), strings.Repeat("\u00E0\u0316", 6)}, - {"", strings.Repeat("a\u0300\u0316", 4000), strings.Repeat("\u00E0\u0316", 4000)}, - {"", strings.Repeat("\x80\x80", 4000), strings.Repeat("\x80\x80", 4000)}, - {"", "\u0041\u0307\u0304", "\u01E0"}, -} - -var bufSizes = []int{1, 2, 3, 4, 5, 6, 7, 8, 100, 101, 102, 103, 4000, 4001, 4002, 4003} - -func readFunc(size int) appendFunc { - return func(f Form, out []byte, s string) []byte { - out = append(out, s...) - r := f.Reader(bytes.NewBuffer(out)) - buf := make([]byte, size) - result := []byte{} - for n, err := 0, error(nil); err == nil; { - n, err = r.Read(buf) - result = append(result, buf[:n]...) - } - return result - } -} - -func TestReader(t *testing.T) { - for _, s := range bufSizes { - name := fmt.Sprintf("TestReader%da", s) - runAppendTests(t, name, NFKC, readFunc(s), appendTests) - name = fmt.Sprintf("TestReader%db", s) - runAppendTests(t, name, NFKC, readFunc(s), ioTests) - } -} - -func writeFunc(size int) appendFunc { - return func(f Form, out []byte, s string) []byte { - in := append(out, s...) - result := new(bytes.Buffer) - w := f.Writer(result) - buf := make([]byte, size) - for n := 0; len(in) > 0; in = in[n:] { - n = copy(buf, in) - _, _ = w.Write(buf[:n]) - } - w.Close() - return result.Bytes() - } -} - -func TestWriter(t *testing.T) { - for _, s := range bufSizes { - name := fmt.Sprintf("TestWriter%da", s) - runAppendTests(t, name, NFKC, writeFunc(s), appendTests) - name = fmt.Sprintf("TestWriter%db", s) - runAppendTests(t, name, NFKC, writeFunc(s), ioTests) - } -} diff --git a/src/pkg/exp/norm/tables.go b/src/pkg/exp/norm/tables.go deleted file mode 100644 index e97b171072..0000000000 --- a/src/pkg/exp/norm/tables.go +++ /dev/null @@ -1,6658 +0,0 @@ -// Generated by running -// maketables --tables=all --url=http://www.unicode.org/Public/6.0.0/ucd/ -// DO NOT EDIT - -package norm - -// Version is the Unicode edition from which the tables are derived. -const Version = "6.0.0" - -const ( - firstCCC = 0x2E45 - firstLeadingCCC = 0x4965 - lastDecomp = 0x49A2 - maxDecomp = 0x8000 -) - -// decomps: 18850 bytes -var decomps = [...]byte{ - // Bytes 0 - 3f - 0x00, 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA6, 0xBE, - 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x06, - 0xE0, 0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x06, 0xE0, - 0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x06, 0xE0, 0xAD, - 0x87, 0xE0, 0xAD, 0x97, 0x06, 0xE0, 0xAE, 0x92, - 0xE0, 0xAF, 0x97, 0x06, 0xE0, 0xAF, 0x86, 0xE0, - 0xAE, 0xBE, 0x06, 0xE0, 0xAF, 0x86, 0xE0, 0xAF, - 0x97, 0x06, 0xE0, 0xAF, 0x87, 0xE0, 0xAE, 0xBE, - // Bytes 40 - 7f - 0x06, 0xE0, 0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x06, - 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x06, 0xE0, - 0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x06, 0xE0, 0xB5, - 0x86, 0xE0, 0xB4, 0xBE, 0x06, 0xE0, 0xB5, 0x86, - 0xE0, 0xB5, 0x97, 0x06, 0xE0, 0xB5, 0x87, 0xE0, - 0xB4, 0xBE, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, - 0x9F, 0x06, 0xE1, 0x80, 0xA5, 0xE1, 0x80, 0xAE, - 0x06, 0xE1, 0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x06, - // Bytes 80 - bf - 0xE1, 0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x06, 0xE1, - 0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x06, 0xE1, 0xAC, - 0x8B, 0xE1, 0xAC, 0xB5, 0x06, 0xE1, 0xAC, 0x8D, - 0xE1, 0xAC, 0xB5, 0x06, 0xE1, 0xAC, 0x91, 0xE1, - 0xAC, 0xB5, 0x06, 0xE1, 0xAC, 0xBA, 0xE1, 0xAC, - 0xB5, 0x06, 0xE1, 0xAC, 0xBC, 0xE1, 0xAC, 0xB5, - 0x06, 0xE1, 0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x06, - 0xE1, 0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x06, 0xE1, - // Bytes c0 - ff - 0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x09, 0xE0, 0xB3, - 0x86, 0xE0, 0xB3, 0x82, 0xE0, 0xB3, 0x95, 0x41, - 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, 0x23, 0x41, - 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, 0x27, 0x41, - 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, 0x2B, 0x41, - 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, 0x2F, 0x41, - 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, 0x33, 0x41, - 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, 0x37, 0x41, - // Bytes 100 - 13f - 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, 0x3B, 0x41, - 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, 0x3F, 0x41, - 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, 0x43, 0x41, - 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, 0x47, 0x41, - 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, 0x4B, 0x41, - 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, 0x4F, 0x41, - 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, - 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x41, - // Bytes 140 - 17f - 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, 0x5B, 0x41, - 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, 0x5F, 0x41, - 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, 0x63, 0x41, - 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, 0x67, 0x41, - 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, 0x6B, 0x41, - 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, 0x6F, 0x41, - 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, 0x73, 0x41, - 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, 0x77, 0x41, - // Bytes 180 - 1bf - 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, 0x7B, 0x41, - 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, 0x21, 0x21, - 0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30, - 0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42, - 0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31, - 0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31, - 0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42, - 0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39, - // Bytes 1c0 - 1ff - 0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32, - 0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42, - 0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35, - 0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32, - 0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42, - 0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31, - 0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33, - 0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42, - // Bytes 200 - 23f - 0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39, - 0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34, - 0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42, - 0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35, - 0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34, - 0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42, - 0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C, - 0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37, - // Bytes 240 - 27f - 0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42, - 0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D, - 0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41, - 0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42, - 0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A, - 0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48, - 0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42, - 0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A, - // Bytes 280 - 2bf - 0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49, - 0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42, - 0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A, - 0x42, 0x4D, 0x42, 0x42, 0x4D, 0x56, 0x42, 0x4D, - 0x57, 0x42, 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, - 0x4E, 0x6F, 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, - 0x42, 0x50, 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, - 0x44, 0x42, 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, - // Bytes 2c0 - 2ff - 0x53, 0x76, 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, - 0x42, 0x57, 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, - 0x62, 0x42, 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, - 0x63, 0x64, 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, - 0x42, 0x64, 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, - 0x6D, 0x42, 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, - 0x66, 0x66, 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, - 0x42, 0x66, 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, - // Bytes 300 - 33f - 0x69, 0x42, 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, - 0x69, 0x76, 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, - 0x42, 0x6B, 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, - 0x67, 0x42, 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, - 0x6B, 0x74, 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, - 0x42, 0x6C, 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, - 0x32, 0x42, 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, - 0x6D, 0x56, 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, - // Bytes 340 - 37f - 0x42, 0x6D, 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, - 0x6D, 0x42, 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, - 0x6E, 0x46, 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, - 0x42, 0x6E, 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, - 0x73, 0x42, 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, - 0x70, 0x46, 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, - 0x42, 0x70, 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, - 0x72, 0x42, 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, - // Bytes 380 - 3bf - 0x78, 0x69, 0x42, 0xC2, 0xA2, 0x42, 0xC2, 0xA3, - 0x42, 0xC2, 0xA5, 0x42, 0xC2, 0xA6, 0x42, 0xC2, - 0xAC, 0x42, 0xC2, 0xB4, 0x42, 0xC2, 0xB7, 0x42, - 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42, 0xC4, 0xA7, - 0x42, 0xC4, 0xB1, 0x42, 0xC5, 0x8B, 0x42, 0xC6, - 0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, - 0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, - 0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, - // Bytes 3c0 - 3ff - 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42, - 0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F, - 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9, - 0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42, - 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAD, - 0x42, 0xC9, 0xAF, 0x42, 0xC9, 0xB0, 0x42, 0xC9, - 0xB1, 0x42, 0xC9, 0xB2, 0x42, 0xC9, 0xB3, 0x42, - 0xC9, 0xB4, 0x42, 0xC9, 0xB5, 0x42, 0xC9, 0xB8, - // Bytes 400 - 43f - 0x42, 0xC9, 0xB9, 0x42, 0xC9, 0xBB, 0x42, 0xCA, - 0x81, 0x42, 0xCA, 0x82, 0x42, 0xCA, 0x83, 0x42, - 0xCA, 0x89, 0x42, 0xCA, 0x8A, 0x42, 0xCA, 0x8B, - 0x42, 0xCA, 0x8C, 0x42, 0xCA, 0x90, 0x42, 0xCA, - 0x91, 0x42, 0xCA, 0x92, 0x42, 0xCA, 0x95, 0x42, - 0xCA, 0x9D, 0x42, 0xCA, 0x9F, 0x42, 0xCA, 0xB9, - 0x42, 0xCE, 0x91, 0x42, 0xCE, 0x92, 0x42, 0xCE, - 0x93, 0x42, 0xCE, 0x94, 0x42, 0xCE, 0x95, 0x42, - // Bytes 440 - 47f - 0xCE, 0x96, 0x42, 0xCE, 0x97, 0x42, 0xCE, 0x98, - 0x42, 0xCE, 0x99, 0x42, 0xCE, 0x9A, 0x42, 0xCE, - 0x9B, 0x42, 0xCE, 0x9C, 0x42, 0xCE, 0x9D, 0x42, - 0xCE, 0x9E, 0x42, 0xCE, 0x9F, 0x42, 0xCE, 0xA0, - 0x42, 0xCE, 0xA1, 0x42, 0xCE, 0xA3, 0x42, 0xCE, - 0xA4, 0x42, 0xCE, 0xA5, 0x42, 0xCE, 0xA6, 0x42, - 0xCE, 0xA7, 0x42, 0xCE, 0xA8, 0x42, 0xCE, 0xA9, - 0x42, 0xCE, 0xB1, 0x42, 0xCE, 0xB2, 0x42, 0xCE, - // Bytes 480 - 4bf - 0xB3, 0x42, 0xCE, 0xB4, 0x42, 0xCE, 0xB5, 0x42, - 0xCE, 0xB6, 0x42, 0xCE, 0xB7, 0x42, 0xCE, 0xB8, - 0x42, 0xCE, 0xB9, 0x42, 0xCE, 0xBA, 0x42, 0xCE, - 0xBB, 0x42, 0xCE, 0xBC, 0x42, 0xCE, 0xBD, 0x42, - 0xCE, 0xBE, 0x42, 0xCE, 0xBF, 0x42, 0xCF, 0x80, - 0x42, 0xCF, 0x81, 0x42, 0xCF, 0x82, 0x42, 0xCF, - 0x83, 0x42, 0xCF, 0x84, 0x42, 0xCF, 0x85, 0x42, - 0xCF, 0x86, 0x42, 0xCF, 0x87, 0x42, 0xCF, 0x88, - // Bytes 4c0 - 4ff - 0x42, 0xCF, 0x89, 0x42, 0xCF, 0x9C, 0x42, 0xCF, - 0x9D, 0x42, 0xD0, 0xBD, 0x42, 0xD7, 0x90, 0x42, - 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7, 0x93, - 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42, 0xD7, - 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2, 0x42, - 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8, 0xA1, - 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42, 0xD8, - 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB, 0x42, - // Bytes 500 - 53f - 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8, 0xAE, - 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42, 0xD8, - 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3, 0x42, - 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8, 0xB6, - 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42, 0xD8, - 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81, 0x42, - 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9, 0x84, - 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42, 0xD9, - // Bytes 540 - 57f - 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89, 0x42, - 0xD9, 0x8A, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, - 0x42, 0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, - 0xBE, 0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, - 0xDA, 0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, - 0x42, 0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, - 0x8C, 0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, - 0xDA, 0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA4, - // Bytes 580 - 5bf - 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9, 0x42, 0xDA, - 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA, 0xB1, 0x42, - 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42, 0xDA, 0xBB, - 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81, 0x42, 0xDB, - 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB, 0x87, 0x42, - 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42, 0xDB, 0x8B, - 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90, 0x42, 0xDB, - 0x92, 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, - // Bytes 5c0 - 5ff - 0x29, 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, - 0x29, 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, - 0x29, 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, - 0x29, 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, - 0x29, 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, - 0x29, 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, - 0x29, 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, - 0x29, 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, - // Bytes 600 - 63f - 0x29, 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, - 0x29, 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, - 0x29, 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, - 0x29, 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, - 0x29, 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, - 0x29, 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, - 0x29, 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, - 0x29, 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, - // Bytes 640 - 67f - 0x29, 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, - 0x29, 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, - 0x29, 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, - 0x29, 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, - 0x29, 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, - 0x29, 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, - 0x29, 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, - 0x29, 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, - // Bytes 680 - 6bf - 0x29, 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, - 0x29, 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, - 0x29, 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, - 0x29, 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, - 0x29, 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, - 0x29, 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, - 0x2E, 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, - 0x2E, 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, - // Bytes 6c0 - 6ff - 0x2E, 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, - 0x2E, 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, - 0x2E, 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, - 0x2E, 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, - 0x3D, 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, - 0x2E, 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, - 0x7A, 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, - 0x49, 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, - // Bytes 700 - 73f - 0xB7, 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, - 0x61, 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, - 0x4D, 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, - 0x45, 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, - 0x7A, 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, - 0x49, 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, - 0x73, 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, - 0x72, 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, - // Bytes 740 - 77f - 0x75, 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, - 0x32, 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, - 0x32, 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, - 0x67, 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, - 0x6C, 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, - 0x61, 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, - 0x7A, 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, - 0x32, 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, - // Bytes 780 - 7bf - 0xA9, 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, - 0xB7, 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, - 0x32, 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, - 0x6C, 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, - 0x69, 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, - 0x43, 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, - 0x6E, 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, - 0x46, 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, - // Bytes 7c0 - 7ff - 0x57, 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, - 0x6C, 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, - 0x73, 0x43, 0xE0, 0xBC, 0x8B, 0x43, 0xE1, 0x83, - 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43, 0xE1, 0x84, - 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43, 0xE1, 0x84, - 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43, 0xE1, 0x84, - 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43, 0xE1, 0x84, - 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43, 0xE1, 0x84, - // Bytes 800 - 83f - 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43, 0xE1, 0x84, - 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43, 0xE1, 0x84, - 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43, 0xE1, 0x84, - 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43, 0xE1, 0x84, - 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43, 0xE1, 0x84, - 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43, 0xE1, 0x84, - 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43, 0xE1, 0x84, - 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43, 0xE1, 0x84, - // Bytes 840 - 87f - 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43, 0xE1, 0x84, - 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43, 0xE1, 0x84, - 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43, 0xE1, 0x84, - 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43, 0xE1, 0x84, - 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43, 0xE1, 0x84, - 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43, 0xE1, 0x84, - 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43, 0xE1, 0x85, - 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43, 0xE1, 0x85, - // Bytes 880 - 8bf - 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43, 0xE1, 0x85, - 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43, 0xE1, 0x85, - 0xA1, 0x43, 0xE1, 0x85, 0xA2, 0x43, 0xE1, 0x85, - 0xA3, 0x43, 0xE1, 0x85, 0xA4, 0x43, 0xE1, 0x85, - 0xA5, 0x43, 0xE1, 0x85, 0xA6, 0x43, 0xE1, 0x85, - 0xA7, 0x43, 0xE1, 0x85, 0xA8, 0x43, 0xE1, 0x85, - 0xA9, 0x43, 0xE1, 0x85, 0xAA, 0x43, 0xE1, 0x85, - 0xAB, 0x43, 0xE1, 0x85, 0xAC, 0x43, 0xE1, 0x85, - // Bytes 8c0 - 8ff - 0xAD, 0x43, 0xE1, 0x85, 0xAE, 0x43, 0xE1, 0x85, - 0xAF, 0x43, 0xE1, 0x85, 0xB0, 0x43, 0xE1, 0x85, - 0xB1, 0x43, 0xE1, 0x85, 0xB2, 0x43, 0xE1, 0x85, - 0xB3, 0x43, 0xE1, 0x85, 0xB4, 0x43, 0xE1, 0x85, - 0xB5, 0x43, 0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, - 0x85, 0x43, 0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, - 0x91, 0x43, 0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, - 0x94, 0x43, 0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, - // Bytes 900 - 93f - 0xA1, 0x43, 0xE1, 0x86, 0xAA, 0x43, 0xE1, 0x86, - 0xAC, 0x43, 0xE1, 0x86, 0xAD, 0x43, 0xE1, 0x86, - 0xB0, 0x43, 0xE1, 0x86, 0xB1, 0x43, 0xE1, 0x86, - 0xB2, 0x43, 0xE1, 0x86, 0xB3, 0x43, 0xE1, 0x86, - 0xB4, 0x43, 0xE1, 0x86, 0xB5, 0x43, 0xE1, 0x87, - 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43, 0xE1, 0x87, - 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43, 0xE1, 0x87, - 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43, 0xE1, 0x87, - // Bytes 940 - 97f - 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43, 0xE1, 0x87, - 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43, 0xE1, 0x87, - 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43, 0xE1, 0xB4, - 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43, 0xE1, 0xB4, - 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43, 0xE1, 0xB4, - 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43, 0xE1, 0xB6, - 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43, 0xE2, 0x80, - 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, 0xE2, 0x80, - // Bytes 980 - 9bf - 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, 0xE2, 0x82, - 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, 0xE2, 0x86, - 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, 0xE2, 0x86, - 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, 0xE2, 0x88, - 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, 0xE2, 0x88, - 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, 0xE2, 0x96, - 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, 0xE2, 0xA6, - 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, 0xE2, 0xB5, - // Bytes 9c0 - 9ff - 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43, 0xE3, 0x80, - 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43, 0xE3, 0x80, - 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43, 0xE3, 0x80, - 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43, 0xE3, 0x80, - 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43, 0xE3, 0x80, - 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43, 0xE3, 0x80, - 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43, 0xE3, 0x80, - 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43, 0xE3, 0x80, - // Bytes a00 - a3f - 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43, 0xE3, 0x82, - 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43, 0xE3, 0x82, - 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43, 0xE3, 0x82, - 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43, 0xE3, 0x82, - 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43, 0xE3, 0x82, - 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43, 0xE3, 0x82, - 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43, 0xE3, 0x82, - 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43, 0xE3, 0x82, - // Bytes a40 - a7f - 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43, 0xE3, 0x82, - 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43, 0xE3, 0x82, - 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43, 0xE3, 0x82, - 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43, 0xE3, 0x83, - 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43, 0xE3, 0x83, - 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43, 0xE3, 0x83, - 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43, 0xE3, 0x83, - 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43, 0xE3, 0x83, - // Bytes a80 - abf - 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43, 0xE3, 0x83, - 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43, 0xE3, 0x83, - 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43, 0xE3, 0x83, - 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43, 0xE3, 0x83, - 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43, 0xE3, 0x83, - 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43, 0xE3, 0x83, - 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43, 0xE3, 0x83, - 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43, 0xE3, 0x83, - // Bytes ac0 - aff - 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43, 0xE3, 0x83, - 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43, 0xE3, 0x83, - 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43, 0xE3, 0x83, - 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43, 0xE3, 0x83, - 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43, 0xE3, 0x83, - 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43, 0xE3, 0x83, - 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43, 0xE3, 0x92, - 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43, 0xE3, 0x93, - // Bytes b00 - b3f - 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43, 0xE3, 0x9B, - 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43, 0xE3, 0x9E, - 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43, 0xE3, 0xA1, - 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43, 0xE3, 0xA3, - 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43, 0xE3, 0xA4, - 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43, 0xE3, 0xA8, - 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43, 0xE3, 0xAB, - 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43, 0xE3, 0xAC, - // Bytes b40 - b7f - 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43, 0xE3, 0xAE, - 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43, 0xE3, 0xB1, - 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43, 0xE3, 0xB6, - 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43, 0xE3, 0xBA, - 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43, 0xE3, 0xBF, - 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43, 0xE4, 0x80, - 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43, 0xE4, 0x81, - 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43, 0xE4, 0x83, - // Bytes b80 - bbf - 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43, 0xE4, 0x88, - 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43, 0xE4, 0x8A, - 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43, 0xE4, 0x8C, - 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43, 0xE4, 0x8F, - 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43, 0xE4, 0x90, - 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43, 0xE4, 0x94, - 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43, 0xE4, 0x95, - 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43, 0xE4, 0x97, - // Bytes bc0 - bff - 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43, 0xE4, 0x98, - 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43, 0xE4, 0x9B, - 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43, 0xE4, 0xA7, - 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43, 0xE4, 0xA9, - 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43, 0xE4, 0xAC, - 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43, 0xE4, 0xB3, - 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43, 0xE4, 0xB3, - 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43, 0xE4, 0xB8, - // Bytes c00 - c3f - 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43, 0xE4, 0xB8, - 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43, 0xE4, 0xB8, - 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43, 0xE4, 0xB8, - 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43, 0xE4, 0xB8, - 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43, 0xE4, 0xB8, - 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43, 0xE4, 0xB8, - 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43, 0xE4, 0xB8, - 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43, 0xE4, 0xB8, - // Bytes c40 - c7f - 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43, 0xE4, 0xB9, - 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43, 0xE4, 0xBA, - 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43, 0xE4, 0xBA, - 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43, 0xE4, 0xBA, - 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43, 0xE4, 0xBA, - 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43, 0xE4, 0xBA, - 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43, 0xE4, 0xBB, - 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43, 0xE4, 0xBC, - // Bytes c80 - cbf - 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43, 0xE4, 0xBD, - 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43, 0xE4, 0xBE, - 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43, 0xE4, 0xBE, - 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43, 0xE4, 0xBE, - 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43, 0xE5, 0x80, - 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43, 0xE5, 0x82, - 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43, 0xE5, 0x83, - 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43, 0xE5, 0x84, - // Bytes cc0 - cff - 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43, 0xE5, 0x85, - 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43, 0xE5, 0x85, - 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43, 0xE5, 0x85, - 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43, 0xE5, 0x85, - 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43, 0xE5, 0x85, - 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43, 0xE5, 0x85, - 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43, 0xE5, 0x86, - 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43, 0xE5, 0x86, - // Bytes d00 - d3f - 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43, 0xE5, 0x86, - 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43, 0xE5, 0x86, - 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43, 0xE5, 0x86, - 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43, 0xE5, 0x86, - 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43, 0xE5, 0x86, - 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43, 0xE5, 0x87, - 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43, 0xE5, 0x87, - 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43, 0xE5, 0x87, - // Bytes d40 - d7f - 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43, 0xE5, 0x88, - 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43, 0xE5, 0x88, - 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43, 0xE5, 0x88, - 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43, 0xE5, 0x88, - 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43, 0xE5, 0x89, - 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43, 0xE5, 0x89, - 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43, 0xE5, 0x8A, - 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43, 0xE5, 0x8A, - // Bytes d80 - dbf - 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43, 0xE5, 0x8B, - 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43, 0xE5, 0x8B, - 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43, 0xE5, 0x8B, - 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43, 0xE5, 0x8B, - 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43, 0xE5, 0x8C, - 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43, 0xE5, 0x8C, - 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43, 0xE5, 0x8C, - 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43, 0xE5, 0x8C, - // Bytes dc0 - dff - 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43, 0xE5, 0x8D, - 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43, 0xE5, 0x8D, - 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43, 0xE5, 0x8D, - 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43, 0xE5, 0x8D, - 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43, 0xE5, 0x8D, - 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43, 0xE5, 0x8D, - 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43, 0xE5, 0x8D, - 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43, 0xE5, 0x8E, - // Bytes e00 - e3f - 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43, 0xE5, 0x8F, - 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43, 0xE5, 0x8F, - 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43, 0xE5, 0x8F, - 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43, 0xE5, 0x8F, - 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43, 0xE5, 0x8F, - 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43, 0xE5, 0x8F, - 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43, 0xE5, 0x90, - 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43, 0xE5, 0x90, - // Bytes e40 - e7f - 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43, 0xE5, 0x90, - 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43, 0xE5, 0x91, - 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43, 0xE5, 0x91, - 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43, 0xE5, 0x92, - 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43, 0xE5, 0x93, - 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43, 0xE5, 0x95, - 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43, 0xE5, 0x95, - 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43, 0xE5, 0x96, - // Bytes e80 - ebf - 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43, 0xE5, 0x96, - 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43, 0xE5, 0x96, - 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43, 0xE5, 0x96, - 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43, 0xE5, 0x97, - 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43, 0xE5, 0x98, - 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43, 0xE5, 0x99, - 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43, 0xE5, 0x9B, - 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43, 0xE5, 0x9B, - // Bytes ec0 - eff - 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43, 0xE5, 0x9C, - 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43, 0xE5, 0x9C, - 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43, 0xE5, 0x9F, - 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43, 0xE5, 0xA0, - 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43, 0xE5, 0xA0, - 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43, 0xE5, 0xA1, - 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43, 0xE5, 0xA2, - 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43, 0xE5, 0xA2, - // Bytes f00 - f3f - 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43, 0xE5, 0xA3, - 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43, 0xE5, 0xA3, - 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43, 0xE5, 0xA3, - 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43, 0xE5, 0xA4, - 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43, 0xE5, 0xA4, - 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43, 0xE5, 0xA4, - 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43, 0xE5, 0xA4, - 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43, 0xE5, 0xA4, - // Bytes f40 - f7f - 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43, 0xE5, 0xA5, - 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43, 0xE5, 0xA5, - 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43, 0xE5, 0xA5, - 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43, 0xE5, 0xA7, - 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43, 0xE5, 0xA8, - 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43, 0xE5, 0xA9, - 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43, 0xE5, 0xAC, - 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43, 0xE5, 0xAC, - // Bytes f80 - fbf - 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43, 0xE5, 0xAD, - 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43, 0xE5, 0xAE, - 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43, 0xE5, 0xAE, - 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43, 0xE5, 0xAF, - 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43, 0xE5, 0xAF, - 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43, 0xE5, 0xAF, - 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43, 0xE5, 0xB0, - 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43, 0xE5, 0xB0, - // Bytes fc0 - fff - 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43, 0xE5, 0xB0, - 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43, 0xE5, 0xB1, - 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43, 0xE5, 0xB1, - 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43, 0xE5, 0xB1, - 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43, 0xE5, 0xB3, - 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43, 0xE5, 0xB5, - 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43, 0xE5, 0xB5, - 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43, 0xE5, 0xB5, - // Bytes 1000 - 103f - 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43, 0xE5, 0xB6, - 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43, 0xE5, 0xB7, - 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43, 0xE5, 0xB7, - 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43, 0xE5, 0xB7, - 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43, 0xE5, 0xB7, - 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43, 0xE5, 0xB8, - 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43, 0xE5, 0xB9, - 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43, 0xE5, 0xB9, - // Bytes 1040 - 107f - 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43, 0xE5, 0xB9, - 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43, 0xE5, 0xBA, - 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43, 0xE5, 0xBA, - 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43, 0xE5, 0xBB, - 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43, 0xE5, 0xBB, - 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43, 0xE5, 0xBB, - 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43, 0xE5, 0xBB, - 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43, 0xE5, 0xBC, - // Bytes 1080 - 10bf - 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43, 0xE5, 0xBC, - 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43, 0xE5, 0xBD, - 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43, 0xE5, 0xBD, - 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43, 0xE5, 0xBD, - 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43, 0xE5, 0xBE, - 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43, 0xE5, 0xBE, - 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43, 0xE5, 0xBE, - 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43, 0xE5, 0xBF, - // Bytes 10c0 - 10ff - 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43, 0xE5, 0xBF, - 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43, 0xE5, 0xBF, - 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43, 0xE6, 0x80, - 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43, 0xE6, 0x82, - 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43, 0xE6, 0x83, - 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43, 0xE6, 0x83, - 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43, 0xE6, 0x85, - 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43, 0xE6, 0x85, - // Bytes 1100 - 113f - 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43, 0xE6, 0x85, - 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43, 0xE6, 0x85, - 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43, 0xE6, 0x86, - 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43, 0xE6, 0x86, - 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43, 0xE6, 0x87, - 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43, 0xE6, 0x87, - 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43, 0xE6, 0x88, - 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43, 0xE6, 0x88, - // Bytes 1140 - 117f - 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43, 0xE6, 0x88, - 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43, 0xE6, 0x89, - 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43, 0xE6, 0x89, - 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43, 0xE6, 0x8A, - 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43, 0xE6, 0x8B, - 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43, 0xE6, 0x8B, - 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43, 0xE6, 0x8B, - 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43, 0xE6, 0x8C, - // Bytes 1180 - 11bf - 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43, 0xE6, 0x8D, - 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43, 0xE6, 0x8D, - 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43, 0xE6, 0x8E, - 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43, 0xE6, 0x8F, - 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43, 0xE6, 0x8F, - 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43, 0xE6, 0x90, - 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43, 0xE6, 0x91, - 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43, 0xE6, 0x91, - // Bytes 11c0 - 11ff - 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43, 0xE6, 0x92, - 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43, 0xE6, 0x94, - 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43, 0xE6, 0x95, - 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43, 0xE6, 0x95, - 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43, 0xE6, 0x96, - 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43, 0xE6, 0x96, - 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43, 0xE6, 0x96, - 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43, 0xE6, 0x97, - // Bytes 1200 - 123f - 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43, 0xE6, 0x97, - 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43, 0xE6, 0x97, - 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43, 0xE6, 0x98, - 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43, 0xE6, 0x99, - 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43, 0xE6, 0x9A, - 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43, 0xE6, 0x9A, - 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43, 0xE6, 0x9B, - 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43, 0xE6, 0x9B, - // Bytes 1240 - 127f - 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43, 0xE6, 0x9C, - 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43, 0xE6, 0x9C, - 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43, 0xE6, 0x9C, - 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43, 0xE6, 0x9D, - 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43, 0xE6, 0x9D, - 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43, 0xE6, 0x9D, - 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43, 0xE6, 0x9E, - 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43, 0xE6, 0x9F, - // Bytes 1280 - 12bf - 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43, 0xE6, 0xA0, - 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43, 0xE6, 0xA1, - 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43, 0xE6, 0xA2, - 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43, 0xE6, 0xA2, - 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43, 0xE6, 0xA5, - 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43, 0xE6, 0xA7, - 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43, 0xE6, 0xA8, - 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43, 0xE6, 0xAB, - // Bytes 12c0 - 12ff - 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43, 0xE6, 0xAC, - 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43, 0xE6, 0xAC, - 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43, 0xE6, 0xAD, - 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43, 0xE6, 0xAD, - 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43, 0xE6, 0xAD, - 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43, 0xE6, 0xAE, - 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43, 0xE6, 0xAE, - 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43, 0xE6, 0xAF, - // Bytes 1300 - 133f - 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43, 0xE6, 0xAF, - 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43, 0xE6, 0xB0, - 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43, 0xE6, 0xB0, - 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43, 0xE6, 0xB1, - 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43, 0xE6, 0xB2, - 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43, 0xE6, 0xB3, - 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43, 0xE6, 0xB3, - 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43, 0xE6, 0xB4, - // Bytes 1340 - 137f - 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43, 0xE6, 0xB4, - 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43, 0xE6, 0xB5, - 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43, 0xE6, 0xB5, - 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43, 0xE6, 0xB5, - 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43, 0xE6, 0xB7, - 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43, 0xE6, 0xB7, - 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43, 0xE6, 0xB8, - 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43, 0xE6, 0xB9, - // Bytes 1380 - 13bf - 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43, 0xE6, 0xBA, - 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43, 0xE6, 0xBB, - 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43, 0xE6, 0xBB, - 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43, 0xE6, 0xBC, - 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43, 0xE6, 0xBC, - 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43, 0xE6, 0xBD, - 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43, 0xE6, 0xBF, - 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43, 0xE7, 0x80, - // Bytes 13c0 - 13ff - 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43, 0xE7, 0x80, - 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43, 0xE7, 0x81, - 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43, 0xE7, 0x81, - 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43, 0xE7, 0x82, - 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43, 0xE7, 0x83, - 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43, 0xE7, 0x84, - 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43, 0xE7, 0x85, - 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43, 0xE7, 0x86, - // Bytes 1400 - 143f - 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43, 0xE7, 0x87, - 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43, 0xE7, 0x88, - 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43, 0xE7, 0x88, - 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43, 0xE7, 0x88, - 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43, 0xE7, 0x88, - 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43, 0xE7, 0x89, - 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43, 0xE7, 0x89, - 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43, 0xE7, 0x89, - // Bytes 1440 - 147f - 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43, 0xE7, 0x8A, - 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43, 0xE7, 0x8A, - 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43, 0xE7, 0x8B, - 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43, 0xE7, 0x8C, - 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43, 0xE7, 0x8D, - 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43, 0xE7, 0x8E, - 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43, 0xE7, 0x8E, - 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43, 0xE7, 0x8E, - // Bytes 1480 - 14bf - 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43, 0xE7, 0x90, - 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43, 0xE7, 0x90, - 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43, 0xE7, 0x91, - 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43, 0xE7, 0x91, - 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43, 0xE7, 0x92, - 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43, 0xE7, 0x93, - 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43, 0xE7, 0x93, - 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43, 0xE7, 0x94, - // Bytes 14c0 - 14ff - 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43, 0xE7, 0x94, - 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43, 0xE7, 0x94, - 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43, 0xE7, 0x94, - 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43, 0xE7, 0x94, - 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43, 0xE7, 0x95, - 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43, 0xE7, 0x95, - 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43, 0xE7, 0x96, - 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43, 0xE7, 0x98, - // Bytes 1500 - 153f - 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43, 0xE7, 0x98, - 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43, 0xE7, 0x99, - 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43, 0xE7, 0x99, - 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43, 0xE7, 0x9A, - 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43, 0xE7, 0x9B, - 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43, 0xE7, 0x9B, - 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43, 0xE7, 0x9B, - 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43, 0xE7, 0x9C, - // Bytes 1540 - 157f - 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43, 0xE7, 0x9D, - 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43, 0xE7, 0x9E, - 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43, 0xE7, 0x9F, - 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43, 0xE7, 0x9F, - 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43, 0xE7, 0xA1, - 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43, 0xE7, 0xA2, - 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43, 0xE7, 0xA3, - 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43, 0xE7, 0xA4, - // Bytes 1580 - 15bf - 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43, 0xE7, 0xA4, - 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43, 0xE7, 0xA5, - 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43, 0xE7, 0xA5, - 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43, 0xE7, 0xA5, - 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43, 0xE7, 0xA5, - 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43, 0xE7, 0xA6, - 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43, 0xE7, 0xA6, - 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43, 0xE7, 0xA6, - // Bytes 15c0 - 15ff - 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43, 0xE7, 0xA6, - 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43, 0xE7, 0xA7, - 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43, 0xE7, 0xA8, - 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43, 0xE7, 0xA9, - 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43, 0xE7, 0xA9, - 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43, 0xE7, 0xAA, - 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43, 0xE7, 0xAB, - 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43, 0xE7, 0xAB, - // Bytes 1600 - 163f - 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43, 0xE7, 0xAE, - 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43, 0xE7, 0xAF, - 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43, 0xE7, 0xB0, - 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43, 0xE7, 0xB1, - 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43, 0xE7, 0xB2, - 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43, 0xE7, 0xB3, - 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43, 0xE7, 0xB3, - 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43, 0xE7, 0xB3, - // Bytes 1640 - 167f - 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43, 0xE7, 0xB4, - 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43, 0xE7, 0xB4, - 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43, 0xE7, 0xB5, - 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43, 0xE7, 0xB5, - 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43, 0xE7, 0xB6, - 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43, 0xE7, 0xB7, - 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43, 0xE7, 0xB8, - 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43, 0xE7, 0xB9, - // Bytes 1680 - 16bf - 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43, 0xE7, 0xBC, - 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43, 0xE7, 0xBD, - 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43, 0xE7, 0xBD, - 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43, 0xE7, 0xBE, - 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43, 0xE7, 0xBE, - 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43, 0xE7, 0xBE, - 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43, 0xE8, 0x80, - 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43, 0xE8, 0x80, - // Bytes 16c0 - 16ff - 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43, 0xE8, 0x80, - 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43, 0xE8, 0x81, - 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43, 0xE8, 0x81, - 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43, 0xE8, 0x81, - 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43, 0xE8, 0x82, - 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43, 0xE8, 0x82, - 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43, 0xE8, 0x84, - 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43, 0xE8, 0x87, - // Bytes 1700 - 173f - 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43, 0xE8, 0x87, - 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43, 0xE8, 0x87, - 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43, 0xE8, 0x88, - 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43, 0xE8, 0x88, - 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43, 0xE8, 0x88, - 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43, 0xE8, 0x89, - 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43, 0xE8, 0x89, - 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43, 0xE8, 0x89, - // Bytes 1740 - 177f - 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43, 0xE8, 0x8A, - 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43, 0xE8, 0x8A, - 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43, 0xE8, 0x8A, - 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43, 0xE8, 0x8B, - 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43, 0xE8, 0x8C, - 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43, 0xE8, 0x8D, - 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43, 0xE8, 0x8D, - 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43, 0xE8, 0x8E, - // Bytes 1780 - 17bf - 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43, 0xE8, 0x8F, - 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43, 0xE8, 0x8F, - 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43, 0xE8, 0x8F, - 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43, 0xE8, 0x90, - 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43, 0xE8, 0x91, - 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43, 0xE8, 0x93, - 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43, 0xE8, 0x93, - 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43, 0xE8, 0x95, - // Bytes 17c0 - 17ff - 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43, 0xE8, 0x97, - 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43, 0xE8, 0x98, - 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43, 0xE8, 0x98, - 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43, 0xE8, 0x99, - 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43, 0xE8, 0x99, - 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43, 0xE8, 0x99, - 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43, 0xE8, 0x9A, - 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43, 0xE8, 0x9C, - // Bytes 1800 - 183f - 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43, 0xE8, 0x9D, - 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43, 0xE8, 0x9E, - 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43, 0xE8, 0x9F, - 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43, 0xE8, 0xA0, - 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43, 0xE8, 0xA1, - 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43, 0xE8, 0xA1, - 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43, 0xE8, 0xA3, - 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43, 0xE8, 0xA3, - // Bytes 1840 - 187f - 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43, 0xE8, 0xA3, - 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43, 0xE8, 0xA4, - 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43, 0xE8, 0xA5, - 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43, 0xE8, 0xA6, - 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43, 0xE8, 0xA6, - 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43, 0xE8, 0xA7, - 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43, 0xE8, 0xAA, - 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43, 0xE8, 0xAA, - // Bytes 1880 - 18bf - 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43, 0xE8, 0xAB, - 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43, 0xE8, 0xAB, - 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43, 0xE8, 0xAB, - 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43, 0xE8, 0xAC, - 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43, 0xE8, 0xAE, - 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43, 0xE8, 0xB0, - 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43, 0xE8, 0xB1, - 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43, 0xE8, 0xB1, - // Bytes 18c0 - 18ff - 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43, 0xE8, 0xB2, - 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43, 0xE8, 0xB2, - 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43, 0xE8, 0xB3, - 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43, 0xE8, 0xB3, - 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43, 0xE8, 0xB4, - 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43, 0xE8, 0xB5, - 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43, 0xE8, 0xB5, - 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43, 0xE8, 0xB6, - // Bytes 1900 - 193f - 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43, 0xE8, 0xB7, - 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43, 0xE8, 0xBA, - 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43, 0xE8, 0xBB, - 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43, 0xE8, 0xBC, - 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43, 0xE8, 0xBC, - 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43, 0xE8, 0xBE, - 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43, 0xE8, 0xBE, - 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43, 0xE8, 0xBE, - // Bytes 1940 - 197f - 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43, 0xE9, 0x80, - 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43, 0xE9, 0x81, - 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43, 0xE9, 0x81, - 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43, 0xE9, 0x82, - 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43, 0xE9, 0x83, - 0x8E, 0x43, 0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, - 0xBD, 0x43, 0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, - 0x9B, 0x43, 0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, - // Bytes 1980 - 19bf - 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43, 0xE9, 0x86, - 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43, 0xE9, 0x87, - 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43, 0xE9, 0x87, - 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43, 0xE9, 0x88, - 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43, 0xE9, 0x89, - 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43, 0xE9, 0x8B, - 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43, 0xE9, 0x8D, - 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43, 0xE9, 0x90, - // Bytes 19c0 - 19ff - 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43, 0xE9, 0x96, - 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43, 0xE9, 0x96, - 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43, 0xE9, 0x98, - 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43, 0xE9, 0x99, - 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43, 0xE9, 0x99, - 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43, 0xE9, 0x99, - 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43, 0xE9, 0x9A, - 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43, 0xE9, 0x9A, - // Bytes 1a00 - 1a3f - 0xB8, 0x43, 0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, - 0x83, 0x43, 0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, - 0xA3, 0x43, 0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, - 0xB6, 0x43, 0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, - 0xA3, 0x43, 0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, - 0x88, 0x43, 0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, - 0x96, 0x43, 0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, - 0xA2, 0x43, 0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, - // Bytes 1a40 - 1a7f - 0x8B, 0x43, 0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, - 0xA0, 0x43, 0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, - 0xB3, 0x43, 0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, - 0x81, 0x43, 0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, - 0x8B, 0x43, 0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, - 0xA9, 0x43, 0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, - 0x9E, 0x43, 0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, - 0x9B, 0x43, 0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, - // Bytes 1a80 - 1abf - 0xA2, 0x43, 0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, - 0xBC, 0x43, 0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, - 0xA9, 0x43, 0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, - 0x99, 0x43, 0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, - 0xAC, 0x43, 0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, - 0xB1, 0x43, 0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, - 0xAA, 0x43, 0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, - 0x98, 0x43, 0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, - // Bytes 1ac0 - 1aff - 0x92, 0x43, 0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, - 0xAF, 0x43, 0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, - 0xBC, 0x43, 0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, - 0xAF, 0x43, 0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, - 0x97, 0x43, 0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, - 0xBD, 0x43, 0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, - 0xB4, 0x43, 0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, - 0x9E, 0x43, 0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, - // Bytes 1b00 - 1b3f - 0xBF, 0x43, 0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, - 0x9F, 0x43, 0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, - 0xBB, 0x43, 0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, - 0x8D, 0x43, 0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, - 0x91, 0x43, 0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, - 0xBD, 0x43, 0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, - 0x85, 0x43, 0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, - 0x8F, 0x43, 0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, - // Bytes 1b40 - 1b7f - 0x96, 0x43, 0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, - 0xBB, 0x43, 0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, - 0x8A, 0x43, 0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, - 0x8D, 0x43, 0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, - 0x9C, 0x43, 0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, - 0xA0, 0x43, 0xEA, 0x9D, 0xAF, 0x44, 0x28, 0x31, - 0x30, 0x29, 0x44, 0x28, 0x31, 0x31, 0x29, 0x44, - 0x28, 0x31, 0x32, 0x29, 0x44, 0x28, 0x31, 0x33, - // Bytes 1b80 - 1bbf - 0x29, 0x44, 0x28, 0x31, 0x34, 0x29, 0x44, 0x28, - 0x31, 0x35, 0x29, 0x44, 0x28, 0x31, 0x36, 0x29, - 0x44, 0x28, 0x31, 0x37, 0x29, 0x44, 0x28, 0x31, - 0x38, 0x29, 0x44, 0x28, 0x31, 0x39, 0x29, 0x44, - 0x28, 0x32, 0x30, 0x29, 0x44, 0x30, 0xE7, 0x82, - 0xB9, 0x44, 0x31, 0xE2, 0x81, 0x84, 0x44, 0x31, - 0xE6, 0x97, 0xA5, 0x44, 0x31, 0xE6, 0x9C, 0x88, - 0x44, 0x31, 0xE7, 0x82, 0xB9, 0x44, 0x32, 0xE6, - // Bytes 1bc0 - 1bff - 0x97, 0xA5, 0x44, 0x32, 0xE6, 0x9C, 0x88, 0x44, - 0x32, 0xE7, 0x82, 0xB9, 0x44, 0x33, 0xE6, 0x97, - 0xA5, 0x44, 0x33, 0xE6, 0x9C, 0x88, 0x44, 0x33, - 0xE7, 0x82, 0xB9, 0x44, 0x34, 0xE6, 0x97, 0xA5, - 0x44, 0x34, 0xE6, 0x9C, 0x88, 0x44, 0x34, 0xE7, - 0x82, 0xB9, 0x44, 0x35, 0xE6, 0x97, 0xA5, 0x44, - 0x35, 0xE6, 0x9C, 0x88, 0x44, 0x35, 0xE7, 0x82, - 0xB9, 0x44, 0x36, 0xE6, 0x97, 0xA5, 0x44, 0x36, - // Bytes 1c00 - 1c3f - 0xE6, 0x9C, 0x88, 0x44, 0x36, 0xE7, 0x82, 0xB9, - 0x44, 0x37, 0xE6, 0x97, 0xA5, 0x44, 0x37, 0xE6, - 0x9C, 0x88, 0x44, 0x37, 0xE7, 0x82, 0xB9, 0x44, - 0x38, 0xE6, 0x97, 0xA5, 0x44, 0x38, 0xE6, 0x9C, - 0x88, 0x44, 0x38, 0xE7, 0x82, 0xB9, 0x44, 0x39, - 0xE6, 0x97, 0xA5, 0x44, 0x39, 0xE6, 0x9C, 0x88, - 0x44, 0x39, 0xE7, 0x82, 0xB9, 0x44, 0x56, 0x49, - 0x49, 0x49, 0x44, 0x61, 0x2E, 0x6D, 0x2E, 0x44, - // Bytes 1c40 - 1c7f - 0x6B, 0x63, 0x61, 0x6C, 0x44, 0x70, 0x2E, 0x6D, - 0x2E, 0x44, 0x76, 0x69, 0x69, 0x69, 0x44, 0xD5, - 0xA5, 0xD6, 0x82, 0x44, 0xD5, 0xB4, 0xD5, 0xA5, - 0x44, 0xD5, 0xB4, 0xD5, 0xAB, 0x44, 0xD5, 0xB4, - 0xD5, 0xAD, 0x44, 0xD5, 0xB4, 0xD5, 0xB6, 0x44, - 0xD5, 0xBE, 0xD5, 0xB6, 0x44, 0xD7, 0x90, 0xD7, - 0x9C, 0x44, 0xD8, 0xA7, 0xD9, 0xB4, 0x44, 0xD8, - 0xA8, 0xD8, 0xAC, 0x44, 0xD8, 0xA8, 0xD8, 0xAD, - // Bytes 1c80 - 1cbf - 0x44, 0xD8, 0xA8, 0xD8, 0xAE, 0x44, 0xD8, 0xA8, - 0xD8, 0xB1, 0x44, 0xD8, 0xA8, 0xD8, 0xB2, 0x44, - 0xD8, 0xA8, 0xD9, 0x85, 0x44, 0xD8, 0xA8, 0xD9, - 0x86, 0x44, 0xD8, 0xA8, 0xD9, 0x87, 0x44, 0xD8, - 0xA8, 0xD9, 0x89, 0x44, 0xD8, 0xA8, 0xD9, 0x8A, - 0x44, 0xD8, 0xAA, 0xD8, 0xAC, 0x44, 0xD8, 0xAA, - 0xD8, 0xAD, 0x44, 0xD8, 0xAA, 0xD8, 0xAE, 0x44, - 0xD8, 0xAA, 0xD8, 0xB1, 0x44, 0xD8, 0xAA, 0xD8, - // Bytes 1cc0 - 1cff - 0xB2, 0x44, 0xD8, 0xAA, 0xD9, 0x85, 0x44, 0xD8, - 0xAA, 0xD9, 0x86, 0x44, 0xD8, 0xAA, 0xD9, 0x87, - 0x44, 0xD8, 0xAA, 0xD9, 0x89, 0x44, 0xD8, 0xAA, - 0xD9, 0x8A, 0x44, 0xD8, 0xAB, 0xD8, 0xAC, 0x44, - 0xD8, 0xAB, 0xD8, 0xB1, 0x44, 0xD8, 0xAB, 0xD8, - 0xB2, 0x44, 0xD8, 0xAB, 0xD9, 0x85, 0x44, 0xD8, - 0xAB, 0xD9, 0x86, 0x44, 0xD8, 0xAB, 0xD9, 0x87, - 0x44, 0xD8, 0xAB, 0xD9, 0x89, 0x44, 0xD8, 0xAB, - // Bytes 1d00 - 1d3f - 0xD9, 0x8A, 0x44, 0xD8, 0xAC, 0xD8, 0xAD, 0x44, - 0xD8, 0xAC, 0xD9, 0x85, 0x44, 0xD8, 0xAC, 0xD9, - 0x89, 0x44, 0xD8, 0xAC, 0xD9, 0x8A, 0x44, 0xD8, - 0xAD, 0xD8, 0xAC, 0x44, 0xD8, 0xAD, 0xD9, 0x85, - 0x44, 0xD8, 0xAD, 0xD9, 0x89, 0x44, 0xD8, 0xAD, - 0xD9, 0x8A, 0x44, 0xD8, 0xAE, 0xD8, 0xAC, 0x44, - 0xD8, 0xAE, 0xD8, 0xAD, 0x44, 0xD8, 0xAE, 0xD9, - 0x85, 0x44, 0xD8, 0xAE, 0xD9, 0x89, 0x44, 0xD8, - // Bytes 1d40 - 1d7f - 0xAE, 0xD9, 0x8A, 0x44, 0xD8, 0xB3, 0xD8, 0xAC, - 0x44, 0xD8, 0xB3, 0xD8, 0xAD, 0x44, 0xD8, 0xB3, - 0xD8, 0xAE, 0x44, 0xD8, 0xB3, 0xD8, 0xB1, 0x44, - 0xD8, 0xB3, 0xD9, 0x85, 0x44, 0xD8, 0xB3, 0xD9, - 0x87, 0x44, 0xD8, 0xB3, 0xD9, 0x89, 0x44, 0xD8, - 0xB3, 0xD9, 0x8A, 0x44, 0xD8, 0xB4, 0xD8, 0xAC, - 0x44, 0xD8, 0xB4, 0xD8, 0xAD, 0x44, 0xD8, 0xB4, - 0xD8, 0xAE, 0x44, 0xD8, 0xB4, 0xD8, 0xB1, 0x44, - // Bytes 1d80 - 1dbf - 0xD8, 0xB4, 0xD9, 0x85, 0x44, 0xD8, 0xB4, 0xD9, - 0x87, 0x44, 0xD8, 0xB4, 0xD9, 0x89, 0x44, 0xD8, - 0xB4, 0xD9, 0x8A, 0x44, 0xD8, 0xB5, 0xD8, 0xAD, - 0x44, 0xD8, 0xB5, 0xD8, 0xAE, 0x44, 0xD8, 0xB5, - 0xD8, 0xB1, 0x44, 0xD8, 0xB5, 0xD9, 0x85, 0x44, - 0xD8, 0xB5, 0xD9, 0x89, 0x44, 0xD8, 0xB5, 0xD9, - 0x8A, 0x44, 0xD8, 0xB6, 0xD8, 0xAC, 0x44, 0xD8, - 0xB6, 0xD8, 0xAD, 0x44, 0xD8, 0xB6, 0xD8, 0xAE, - // Bytes 1dc0 - 1dff - 0x44, 0xD8, 0xB6, 0xD8, 0xB1, 0x44, 0xD8, 0xB6, - 0xD9, 0x85, 0x44, 0xD8, 0xB6, 0xD9, 0x89, 0x44, - 0xD8, 0xB6, 0xD9, 0x8A, 0x44, 0xD8, 0xB7, 0xD8, - 0xAD, 0x44, 0xD8, 0xB7, 0xD9, 0x85, 0x44, 0xD8, - 0xB7, 0xD9, 0x89, 0x44, 0xD8, 0xB7, 0xD9, 0x8A, - 0x44, 0xD8, 0xB8, 0xD9, 0x85, 0x44, 0xD8, 0xB9, - 0xD8, 0xAC, 0x44, 0xD8, 0xB9, 0xD9, 0x85, 0x44, - 0xD8, 0xB9, 0xD9, 0x89, 0x44, 0xD8, 0xB9, 0xD9, - // Bytes 1e00 - 1e3f - 0x8A, 0x44, 0xD8, 0xBA, 0xD8, 0xAC, 0x44, 0xD8, - 0xBA, 0xD9, 0x85, 0x44, 0xD8, 0xBA, 0xD9, 0x89, - 0x44, 0xD8, 0xBA, 0xD9, 0x8A, 0x44, 0xD9, 0x81, - 0xD8, 0xAC, 0x44, 0xD9, 0x81, 0xD8, 0xAD, 0x44, - 0xD9, 0x81, 0xD8, 0xAE, 0x44, 0xD9, 0x81, 0xD9, - 0x85, 0x44, 0xD9, 0x81, 0xD9, 0x89, 0x44, 0xD9, - 0x81, 0xD9, 0x8A, 0x44, 0xD9, 0x82, 0xD8, 0xAD, - 0x44, 0xD9, 0x82, 0xD9, 0x85, 0x44, 0xD9, 0x82, - // Bytes 1e40 - 1e7f - 0xD9, 0x89, 0x44, 0xD9, 0x82, 0xD9, 0x8A, 0x44, - 0xD9, 0x83, 0xD8, 0xA7, 0x44, 0xD9, 0x83, 0xD8, - 0xAC, 0x44, 0xD9, 0x83, 0xD8, 0xAD, 0x44, 0xD9, - 0x83, 0xD8, 0xAE, 0x44, 0xD9, 0x83, 0xD9, 0x84, - 0x44, 0xD9, 0x83, 0xD9, 0x85, 0x44, 0xD9, 0x83, - 0xD9, 0x89, 0x44, 0xD9, 0x83, 0xD9, 0x8A, 0x44, - 0xD9, 0x84, 0xD8, 0xA7, 0x44, 0xD9, 0x84, 0xD8, - 0xAC, 0x44, 0xD9, 0x84, 0xD8, 0xAD, 0x44, 0xD9, - // Bytes 1e80 - 1ebf - 0x84, 0xD8, 0xAE, 0x44, 0xD9, 0x84, 0xD9, 0x85, - 0x44, 0xD9, 0x84, 0xD9, 0x87, 0x44, 0xD9, 0x84, - 0xD9, 0x89, 0x44, 0xD9, 0x84, 0xD9, 0x8A, 0x44, - 0xD9, 0x85, 0xD8, 0xA7, 0x44, 0xD9, 0x85, 0xD8, - 0xAC, 0x44, 0xD9, 0x85, 0xD8, 0xAD, 0x44, 0xD9, - 0x85, 0xD8, 0xAE, 0x44, 0xD9, 0x85, 0xD9, 0x85, - 0x44, 0xD9, 0x85, 0xD9, 0x89, 0x44, 0xD9, 0x85, - 0xD9, 0x8A, 0x44, 0xD9, 0x86, 0xD8, 0xAC, 0x44, - // Bytes 1ec0 - 1eff - 0xD9, 0x86, 0xD8, 0xAD, 0x44, 0xD9, 0x86, 0xD8, - 0xAE, 0x44, 0xD9, 0x86, 0xD8, 0xB1, 0x44, 0xD9, - 0x86, 0xD8, 0xB2, 0x44, 0xD9, 0x86, 0xD9, 0x85, - 0x44, 0xD9, 0x86, 0xD9, 0x86, 0x44, 0xD9, 0x86, - 0xD9, 0x87, 0x44, 0xD9, 0x86, 0xD9, 0x89, 0x44, - 0xD9, 0x86, 0xD9, 0x8A, 0x44, 0xD9, 0x87, 0xD8, - 0xAC, 0x44, 0xD9, 0x87, 0xD9, 0x85, 0x44, 0xD9, - 0x87, 0xD9, 0x89, 0x44, 0xD9, 0x87, 0xD9, 0x8A, - // Bytes 1f00 - 1f3f - 0x44, 0xD9, 0x88, 0xD9, 0xB4, 0x44, 0xD9, 0x8A, - 0xD8, 0xAC, 0x44, 0xD9, 0x8A, 0xD8, 0xAD, 0x44, - 0xD9, 0x8A, 0xD8, 0xAE, 0x44, 0xD9, 0x8A, 0xD8, - 0xB1, 0x44, 0xD9, 0x8A, 0xD8, 0xB2, 0x44, 0xD9, - 0x8A, 0xD9, 0x85, 0x44, 0xD9, 0x8A, 0xD9, 0x86, - 0x44, 0xD9, 0x8A, 0xD9, 0x87, 0x44, 0xD9, 0x8A, - 0xD9, 0x89, 0x44, 0xD9, 0x8A, 0xD9, 0x8A, 0x44, - 0xD9, 0x8A, 0xD9, 0xB4, 0x44, 0xDB, 0x87, 0xD9, - // Bytes 1f40 - 1f7f - 0xB4, 0x44, 0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, - 0xA0, 0x94, 0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, - 0x44, 0xF0, 0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, - 0x98, 0xBA, 0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, - 0xF0, 0xA0, 0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, - 0xAC, 0x44, 0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, - 0xA1, 0x93, 0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, - 0x44, 0xF0, 0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, - // Bytes 1f80 - 1fbf - 0xA7, 0x88, 0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, - 0xF0, 0xA1, 0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, - 0xA4, 0x44, 0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, - 0xA2, 0x86, 0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, - 0x44, 0xF0, 0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, - 0x9B, 0x94, 0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, - 0xF0, 0xA2, 0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, - 0x8C, 0x44, 0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, - // Bytes 1fc0 - 1fff - 0xA3, 0x80, 0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, - 0x44, 0xF0, 0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, - 0x8E, 0x93, 0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, - 0xF0, 0xA3, 0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, - 0x95, 0x44, 0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, - 0xA3, 0x9A, 0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, - 0x44, 0xF0, 0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, - 0xAB, 0xBA, 0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, - // Bytes 2000 - 203f - 0xF0, 0xA3, 0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, - 0x91, 0x44, 0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, - 0xA3, 0xBE, 0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, - 0x44, 0xF0, 0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, - 0x8E, 0xAB, 0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, - 0xF0, 0xA4, 0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, - 0x94, 0x44, 0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, - 0xA4, 0xB2, 0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, - // Bytes 2040 - 207f - 0x44, 0xF0, 0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, - 0x81, 0x84, 0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, - 0xF0, 0xA5, 0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, - 0x99, 0x44, 0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, - 0xA5, 0x89, 0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, - 0x44, 0xF0, 0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, - 0x9A, 0x9A, 0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, - 0xF0, 0xA5, 0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, - // Bytes 2080 - 20bf - 0xA7, 0x44, 0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, - 0xA5, 0xB2, 0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, - 0x44, 0xF0, 0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, - 0x87, 0x9A, 0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, - 0xF0, 0xA6, 0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, - 0x99, 0x44, 0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, - 0xA6, 0x93, 0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, - 0x44, 0xF0, 0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, - // Bytes 20c0 - 20ff - 0x9E, 0xA7, 0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, - 0xF0, 0xA6, 0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, - 0xB6, 0x44, 0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, - 0xA6, 0xB5, 0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, - 0x44, 0xF0, 0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, - 0x83, 0x92, 0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, - 0xF0, 0xA7, 0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, - 0xAE, 0x44, 0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, - // Bytes 2100 - 213f - 0xA7, 0xB2, 0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, - 0x44, 0xF0, 0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, - 0x97, 0x92, 0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, - 0xF0, 0xA8, 0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, - 0xBA, 0x44, 0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, - 0xA9, 0x85, 0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, - 0x44, 0xF0, 0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, - 0x90, 0x8A, 0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, - // Bytes 2140 - 217f - 0xF0, 0xA9, 0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, - 0xB0, 0x44, 0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, - 0xAA, 0x84, 0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, - 0x44, 0xF0, 0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, - 0x8E, 0x92, 0x44, 0xF0, 0xAA, 0x98, 0x80, 0x45, - 0x28, 0xE1, 0x84, 0x80, 0x29, 0x45, 0x28, 0xE1, - 0x84, 0x82, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x83, - 0x29, 0x45, 0x28, 0xE1, 0x84, 0x85, 0x29, 0x45, - // Bytes 2180 - 21bf - 0x28, 0xE1, 0x84, 0x86, 0x29, 0x45, 0x28, 0xE1, - 0x84, 0x87, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x89, - 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8B, 0x29, 0x45, - 0x28, 0xE1, 0x84, 0x8C, 0x29, 0x45, 0x28, 0xE1, - 0x84, 0x8E, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8F, - 0x29, 0x45, 0x28, 0xE1, 0x84, 0x90, 0x29, 0x45, - 0x28, 0xE1, 0x84, 0x91, 0x29, 0x45, 0x28, 0xE1, - 0x84, 0x92, 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x80, - // Bytes 21c0 - 21ff - 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x83, 0x29, 0x45, - 0x28, 0xE4, 0xB8, 0x89, 0x29, 0x45, 0x28, 0xE4, - 0xB9, 0x9D, 0x29, 0x45, 0x28, 0xE4, 0xBA, 0x8C, - 0x29, 0x45, 0x28, 0xE4, 0xBA, 0x94, 0x29, 0x45, - 0x28, 0xE4, 0xBB, 0xA3, 0x29, 0x45, 0x28, 0xE4, - 0xBC, 0x81, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x91, - 0x29, 0x45, 0x28, 0xE5, 0x85, 0xAB, 0x29, 0x45, - 0x28, 0xE5, 0x85, 0xAD, 0x29, 0x45, 0x28, 0xE5, - // Bytes 2200 - 223f - 0x8A, 0xB4, 0x29, 0x45, 0x28, 0xE5, 0x8D, 0x81, - 0x29, 0x45, 0x28, 0xE5, 0x8D, 0x94, 0x29, 0x45, - 0x28, 0xE5, 0x90, 0x8D, 0x29, 0x45, 0x28, 0xE5, - 0x91, 0xBC, 0x29, 0x45, 0x28, 0xE5, 0x9B, 0x9B, - 0x29, 0x45, 0x28, 0xE5, 0x9C, 0x9F, 0x29, 0x45, - 0x28, 0xE5, 0xAD, 0xA6, 0x29, 0x45, 0x28, 0xE6, - 0x97, 0xA5, 0x29, 0x45, 0x28, 0xE6, 0x9C, 0x88, - 0x29, 0x45, 0x28, 0xE6, 0x9C, 0x89, 0x29, 0x45, - // Bytes 2240 - 227f - 0x28, 0xE6, 0x9C, 0xA8, 0x29, 0x45, 0x28, 0xE6, - 0xA0, 0xAA, 0x29, 0x45, 0x28, 0xE6, 0xB0, 0xB4, - 0x29, 0x45, 0x28, 0xE7, 0x81, 0xAB, 0x29, 0x45, - 0x28, 0xE7, 0x89, 0xB9, 0x29, 0x45, 0x28, 0xE7, - 0x9B, 0xA3, 0x29, 0x45, 0x28, 0xE7, 0xA4, 0xBE, - 0x29, 0x45, 0x28, 0xE7, 0xA5, 0x9D, 0x29, 0x45, - 0x28, 0xE7, 0xA5, 0xAD, 0x29, 0x45, 0x28, 0xE8, - 0x87, 0xAA, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xB3, - // Bytes 2280 - 22bf - 0x29, 0x45, 0x28, 0xE8, 0xB2, 0xA1, 0x29, 0x45, - 0x28, 0xE8, 0xB3, 0x87, 0x29, 0x45, 0x28, 0xE9, - 0x87, 0x91, 0x29, 0x45, 0x30, 0xE2, 0x81, 0x84, - 0x33, 0x45, 0x31, 0x30, 0xE6, 0x97, 0xA5, 0x45, - 0x31, 0x30, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x30, - 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x31, 0xE6, 0x97, - 0xA5, 0x45, 0x31, 0x31, 0xE6, 0x9C, 0x88, 0x45, - 0x31, 0x31, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x32, - // Bytes 22c0 - 22ff - 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x32, 0xE6, 0x9C, - 0x88, 0x45, 0x31, 0x32, 0xE7, 0x82, 0xB9, 0x45, - 0x31, 0x33, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x33, - 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x34, 0xE6, 0x97, - 0xA5, 0x45, 0x31, 0x34, 0xE7, 0x82, 0xB9, 0x45, - 0x31, 0x35, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x35, - 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x36, 0xE6, 0x97, - 0xA5, 0x45, 0x31, 0x36, 0xE7, 0x82, 0xB9, 0x45, - // Bytes 2300 - 233f - 0x31, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x37, - 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x38, 0xE6, 0x97, - 0xA5, 0x45, 0x31, 0x38, 0xE7, 0x82, 0xB9, 0x45, - 0x31, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x39, - 0xE7, 0x82, 0xB9, 0x45, 0x31, 0xE2, 0x81, 0x84, - 0x32, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x33, 0x45, - 0x31, 0xE2, 0x81, 0x84, 0x34, 0x45, 0x31, 0xE2, - 0x81, 0x84, 0x35, 0x45, 0x31, 0xE2, 0x81, 0x84, - // Bytes 2340 - 237f - 0x36, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x37, 0x45, - 0x31, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x31, 0xE2, - 0x81, 0x84, 0x39, 0x45, 0x32, 0x30, 0xE6, 0x97, - 0xA5, 0x45, 0x32, 0x30, 0xE7, 0x82, 0xB9, 0x45, - 0x32, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x31, - 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x32, 0xE6, 0x97, - 0xA5, 0x45, 0x32, 0x32, 0xE7, 0x82, 0xB9, 0x45, - 0x32, 0x33, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x33, - // Bytes 2380 - 23bf - 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x34, 0xE6, 0x97, - 0xA5, 0x45, 0x32, 0x34, 0xE7, 0x82, 0xB9, 0x45, - 0x32, 0x35, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x36, - 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x37, 0xE6, 0x97, - 0xA5, 0x45, 0x32, 0x38, 0xE6, 0x97, 0xA5, 0x45, - 0x32, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0xE2, - 0x81, 0x84, 0x33, 0x45, 0x32, 0xE2, 0x81, 0x84, - 0x35, 0x45, 0x33, 0x30, 0xE6, 0x97, 0xA5, 0x45, - // Bytes 23c0 - 23ff - 0x33, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0xE2, - 0x81, 0x84, 0x34, 0x45, 0x33, 0xE2, 0x81, 0x84, - 0x35, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x38, 0x45, - 0x34, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x35, 0xE2, - 0x81, 0x84, 0x36, 0x45, 0x35, 0xE2, 0x81, 0x84, - 0x38, 0x45, 0x37, 0xE2, 0x81, 0x84, 0x38, 0x45, - 0x41, 0xE2, 0x88, 0x95, 0x6D, 0x45, 0x56, 0xE2, - 0x88, 0x95, 0x6D, 0x45, 0x6D, 0xE2, 0x88, 0x95, - // Bytes 2400 - 243f - 0x73, 0x46, 0x31, 0xE2, 0x81, 0x84, 0x31, 0x30, - 0x46, 0x43, 0xE2, 0x88, 0x95, 0x6B, 0x67, 0x46, - 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x46, 0xD8, - 0xA8, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xA8, - 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD8, - 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, - 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, - 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, - // Bytes 2440 - 247f - 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD9, 0x85, 0x46, - 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD8, - 0xAA, 0xD8, 0xAE, 0xD9, 0x89, 0x46, 0xD8, 0xAA, - 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD9, - 0x85, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, 0xD9, 0x85, - 0xD8, 0xAD, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, - 0xAE, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x89, - 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, - // Bytes 2480 - 24bf - 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD8, - 0xAC, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, - 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xAC, 0xD9, - 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD9, 0x85, - 0xD9, 0x8A, 0x46, 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, - 0x8A, 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x89, - 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x8A, 0x46, - 0xD8, 0xB3, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD8, - // Bytes 24c0 - 24ff - 0xB3, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD8, 0xB3, - 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xB3, 0xD8, - 0xAE, 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, - 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, - 0xAC, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAD, - 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD9, 0x85, 0x46, - 0xD8, 0xB4, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, - 0xB4, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xB4, - // Bytes 2500 - 253f - 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD9, - 0x85, 0xD8, 0xAE, 0x46, 0xD8, 0xB4, 0xD9, 0x85, - 0xD9, 0x85, 0x46, 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, - 0xAD, 0x46, 0xD8, 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, - 0x46, 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x46, - 0xD8, 0xB5, 0xD9, 0x84, 0xDB, 0x92, 0x46, 0xD8, - 0xB5, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB6, - 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xB6, 0xD8, - // Bytes 2540 - 257f - 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB6, 0xD8, 0xAE, - 0xD9, 0x85, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD8, - 0xAD, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x85, - 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x8A, 0x46, - 0xD8, 0xB9, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD8, - 0xB9, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB9, - 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xB9, 0xD9, - 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xBA, 0xD9, 0x85, - // Bytes 2580 - 25bf - 0xD9, 0x85, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, - 0x89, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x8A, - 0x46, 0xD9, 0x81, 0xD8, 0xAE, 0xD9, 0x85, 0x46, - 0xD9, 0x81, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, - 0x82, 0xD9, 0x84, 0xDB, 0x92, 0x46, 0xD9, 0x82, - 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x82, 0xD9, - 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x82, 0xD9, 0x85, - 0xD9, 0x8A, 0x46, 0xD9, 0x83, 0xD9, 0x85, 0xD9, - // Bytes 25c0 - 25ff - 0x85, 0x46, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x8A, - 0x46, 0xD9, 0x84, 0xD8, 0xAC, 0xD8, 0xAC, 0x46, - 0xD9, 0x84, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD9, - 0x84, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x84, - 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, - 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x84, 0xD8, 0xAD, - 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAE, 0xD9, - 0x85, 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD8, 0xAD, - // Bytes 2600 - 263f - 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD9, 0x8A, 0x46, - 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD9, - 0x85, 0xD8, 0xAC, 0xD8, 0xAE, 0x46, 0xD9, 0x85, - 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, - 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, 0xAD, - 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, - 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x8A, - 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD8, 0xAC, 0x46, - // Bytes 2640 - 267f - 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, - 0x85, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD9, 0x85, - 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD8, - 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x86, 0xD8, 0xAC, - 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, - 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x8A, - 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x85, 0x46, - 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD9, - // Bytes 2680 - 26bf - 0x86, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x86, - 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD9, - 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x87, 0xD9, 0x85, - 0xD8, 0xAC, 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD9, - 0x85, 0x46, 0xD9, 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, - 0x46, 0xD9, 0x8A, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, - 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, - 0x8A, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, - // Bytes 26c0 - 26ff - 0xD9, 0x94, 0xD8, 0xA7, 0x46, 0xD9, 0x8A, 0xD9, - 0x94, 0xD8, 0xAC, 0x46, 0xD9, 0x8A, 0xD9, 0x94, - 0xD8, 0xAD, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, - 0xAE, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB1, - 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB2, 0x46, - 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x85, 0x46, 0xD9, - 0x8A, 0xD9, 0x94, 0xD9, 0x86, 0x46, 0xD9, 0x8A, - 0xD9, 0x94, 0xD9, 0x87, 0x46, 0xD9, 0x8A, 0xD9, - // Bytes 2700 - 273f - 0x94, 0xD9, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, - 0xD9, 0x89, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, - 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x86, - 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x87, 0x46, - 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x88, 0x46, 0xD9, - 0x8A, 0xD9, 0x94, 0xDB, 0x90, 0x46, 0xD9, 0x8A, - 0xD9, 0x94, 0xDB, 0x95, 0x46, 0xE0, 0xB9, 0x8D, - 0xE0, 0xB8, 0xB2, 0x46, 0xE0, 0xBA, 0xAB, 0xE0, - // Bytes 2740 - 277f - 0xBA, 0x99, 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, - 0xA1, 0x46, 0xE0, 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, - 0x46, 0xE0, 0xBD, 0x80, 0xE0, 0xBE, 0xB5, 0x46, - 0xE0, 0xBD, 0x82, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, - 0xBD, 0x8C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, - 0x91, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x96, - 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x9B, 0xE0, - 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0x90, 0xE0, 0xBE, - // Bytes 2780 - 27bf - 0xB5, 0x46, 0xE0, 0xBE, 0x92, 0xE0, 0xBE, 0xB7, - 0x46, 0xE0, 0xBE, 0x9C, 0xE0, 0xBE, 0xB7, 0x46, - 0xE0, 0xBE, 0xA1, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, - 0xBE, 0xA6, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, - 0xAB, 0xE0, 0xBE, 0xB7, 0x46, 0xE1, 0x84, 0x80, - 0xE1, 0x85, 0xA1, 0x46, 0xE1, 0x84, 0x82, 0xE1, - 0x85, 0xA1, 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, - 0xA1, 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, - // Bytes 27c0 - 27ff - 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x46, - 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x46, 0xE1, - 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x46, 0xE1, 0x84, - 0x8B, 0xE1, 0x85, 0xA1, 0x46, 0xE1, 0x84, 0x8B, - 0xE1, 0x85, 0xAE, 0x46, 0xE1, 0x84, 0x8C, 0xE1, - 0x85, 0xA1, 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, - 0xA1, 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, - 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x46, - // Bytes 2800 - 283f - 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x46, 0xE1, - 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x46, 0xE2, 0x80, - 0xB2, 0xE2, 0x80, 0xB2, 0x46, 0xE2, 0x80, 0xB5, - 0xE2, 0x80, 0xB5, 0x46, 0xE2, 0x88, 0xAB, 0xE2, - 0x88, 0xAB, 0x46, 0xE2, 0x88, 0xAE, 0xE2, 0x88, - 0xAE, 0x46, 0xE3, 0x81, 0xBB, 0xE3, 0x81, 0x8B, - 0x46, 0xE3, 0x82, 0x88, 0xE3, 0x82, 0x8A, 0x46, - 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0x46, 0xE3, - // Bytes 2840 - 287f - 0x82, 0xB3, 0xE3, 0x82, 0xB3, 0x46, 0xE3, 0x82, - 0xB3, 0xE3, 0x83, 0x88, 0x46, 0xE3, 0x83, 0x88, - 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, 0x8A, 0xE3, - 0x83, 0x8E, 0x46, 0xE3, 0x83, 0x9B, 0xE3, 0x83, - 0xB3, 0x46, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, - 0x46, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xA9, 0x46, - 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xA0, 0x46, 0xE5, - 0xA4, 0xA7, 0xE6, 0xAD, 0xA3, 0x46, 0xE5, 0xB9, - // Bytes 2880 - 28bf - 0xB3, 0xE6, 0x88, 0x90, 0x46, 0xE6, 0x98, 0x8E, - 0xE6, 0xB2, 0xBB, 0x46, 0xE6, 0x98, 0xAD, 0xE5, - 0x92, 0x8C, 0x47, 0x72, 0x61, 0x64, 0xE2, 0x88, - 0x95, 0x73, 0x47, 0xE3, 0x80, 0x94, 0x53, 0xE3, - 0x80, 0x95, 0x48, 0x28, 0xE1, 0x84, 0x80, 0xE1, - 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x82, - 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, - 0x83, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, - // Bytes 28c0 - 28ff - 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, - 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x29, 0x48, - 0x28, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x29, - 0x48, 0x28, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, - 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, - 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, 0xE1, - 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, - 0xE1, 0x85, 0xAE, 0x29, 0x48, 0x28, 0xE1, 0x84, - // Bytes 2900 - 293f - 0x8E, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, - 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, - 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x29, 0x48, - 0x28, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x29, - 0x48, 0x28, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, - 0x29, 0x48, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, - 0x73, 0x32, 0x48, 0xD8, 0xA7, 0xD9, 0x83, 0xD8, - 0xA8, 0xD8, 0xB1, 0x48, 0xD8, 0xA7, 0xD9, 0x84, - // Bytes 2940 - 297f - 0xD9, 0x84, 0xD9, 0x87, 0x48, 0xD8, 0xB1, 0xD8, - 0xB3, 0xD9, 0x88, 0xD9, 0x84, 0x48, 0xD8, 0xB1, - 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, 0x84, 0x48, 0xD8, - 0xB5, 0xD9, 0x84, 0xD8, 0xB9, 0xD9, 0x85, 0x48, - 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, - 0x48, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0xD8, - 0xAF, 0x48, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, - 0xD9, 0x85, 0x49, 0xE2, 0x80, 0xB2, 0xE2, 0x80, - // Bytes 2980 - 29bf - 0xB2, 0xE2, 0x80, 0xB2, 0x49, 0xE2, 0x80, 0xB5, - 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x49, 0xE2, - 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, - 0x49, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0xE2, - 0x88, 0xAE, 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xB8, - 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, - 0xE4, 0xBA, 0x8C, 0xE3, 0x80, 0x95, 0x49, 0xE3, - 0x80, 0x94, 0xE5, 0x8B, 0x9D, 0xE3, 0x80, 0x95, - // Bytes 29c0 - 29ff - 0x49, 0xE3, 0x80, 0x94, 0xE5, 0xAE, 0x89, 0xE3, - 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x89, - 0x93, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, - 0xE6, 0x95, 0x97, 0xE3, 0x80, 0x95, 0x49, 0xE3, - 0x80, 0x94, 0xE6, 0x9C, 0xAC, 0xE3, 0x80, 0x95, - 0x49, 0xE3, 0x80, 0x94, 0xE7, 0x82, 0xB9, 0xE3, - 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, 0x9B, - 0x97, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x82, 0xA2, - // Bytes 2a00 - 2a3f - 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, - 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, - 0x49, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0xA9, 0xE3, - 0x83, 0xB3, 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, - 0xB3, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, 0xAA, - 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x49, 0xE3, - 0x82, 0xAB, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAA, - 0x49, 0xE3, 0x82, 0xB1, 0xE3, 0x83, 0xBC, 0xE3, - // Bytes 2a40 - 2a7f - 0x82, 0xB9, 0x49, 0xE3, 0x82, 0xB3, 0xE3, 0x83, - 0xAB, 0xE3, 0x83, 0x8A, 0x49, 0xE3, 0x82, 0xBB, - 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, - 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, - 0x49, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0xE3, - 0x82, 0xB7, 0x49, 0xE3, 0x83, 0x88, 0xE3, 0x82, - 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x8E, - 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x49, 0xE3, - // Bytes 2a80 - 2abf - 0x83, 0x8F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x84, - 0x49, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0xE3, - 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x92, 0xE3, 0x82, - 0x9A, 0xE3, 0x82, 0xB3, 0x49, 0xE3, 0x83, 0x95, - 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, - 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xBD, - 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x83, 0xAB, 0xE3, - 0x83, 0x84, 0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, - // Bytes 2ac0 - 2aff - 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9B, - 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xB3, 0x49, 0xE3, - 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAB, - 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0x83, 0xE3, - 0x83, 0x8F, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x83, - 0xAB, 0xE3, 0x82, 0xAF, 0x49, 0xE3, 0x83, 0xA4, - 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, - 0x83, 0xA6, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, - // Bytes 2b00 - 2b3f - 0x49, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, - 0x83, 0x88, 0x4C, 0xE1, 0x84, 0x8C, 0xE1, 0x85, - 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4, 0x4C, - 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, - 0xB2, 0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, - 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, - 0xAB, 0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, - 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, - // Bytes 2b40 - 2b7f - 0x82, 0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, - 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, - 0x82, 0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, - 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, - 0x83, 0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, - 0xAB, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, - 0x83, 0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, - 0xAD, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, - // Bytes 2b80 - 2bbf - 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, - 0x8B, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, - 0xE3, 0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, - 0xBC, 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, - 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, - 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, - 0xE3, 0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, - 0x82, 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, - // Bytes 2bc0 - 2bff - 0x4C, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, - 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, - 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, - 0x83, 0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, - 0x9A, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, - 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, - 0xBC, 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, - 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, - // Bytes 2c00 - 2c3f - 0xBF, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, - 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, - 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, - 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, - 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, - 0x4C, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, - 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, - 0x9F, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, - // Bytes 2c40 - 2c7f - 0x83, 0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, - 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, - 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, - 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, - 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, - 0xBC, 0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, - 0xE4, 0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, - 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, - // Bytes 2c80 - 2cbf - 0x92, 0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, - 0xD9, 0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, - 0xA7, 0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE1, 0x84, - 0x8E, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, - 0x84, 0x80, 0xE1, 0x85, 0xA9, 0x4F, 0xE3, 0x82, - 0xA2, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, - 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, - 0xA2, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, - // Bytes 2cc0 - 2cff - 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, - 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, - 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, - 0xB5, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, - 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, - 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, - 0x83, 0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, - 0x98, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, - // Bytes 2d00 - 2d3f - 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, - 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, - 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, - 0x9E, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, - 0x83, 0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, - 0xA1, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, - 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, - 0xAB, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, - // Bytes 2d40 - 2d7f - 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, - 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, - 0xE1, 0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, - 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, - 0xAB, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, - 0x83, 0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, - 0xAD, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, - 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, - // Bytes 2d80 - 2dbf - 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, - 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, - 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, - 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, - 0xE3, 0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, - 0x83, 0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, - 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, - 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, - // Bytes 2dc0 - 2dff - 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, - 0x88, 0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, - 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, - 0x88, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, - 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, - 0xB7, 0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, - 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, - 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, - // Bytes 2e00 - 2e3f - 0x83, 0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, - 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, - 0x82, 0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, - 0xD9, 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, - 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, - 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, - 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x86, - 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x86, 0xE0, - // Bytes 2e40 - 2e7f - 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x03, 0x3C, 0xCC, - 0xB8, 0x01, 0x03, 0x3D, 0xCC, 0xB8, 0x01, 0x03, - 0x3E, 0xCC, 0xB8, 0x01, 0x03, 0x41, 0xCC, 0x80, - 0xE6, 0x03, 0x41, 0xCC, 0x81, 0xE6, 0x03, 0x41, - 0xCC, 0x83, 0xE6, 0x03, 0x41, 0xCC, 0x84, 0xE6, - 0x03, 0x41, 0xCC, 0x89, 0xE6, 0x03, 0x41, 0xCC, - 0x8C, 0xE6, 0x03, 0x41, 0xCC, 0x8F, 0xE6, 0x03, - 0x41, 0xCC, 0x91, 0xE6, 0x03, 0x41, 0xCC, 0xA5, - // Bytes 2e80 - 2ebf - 0xDC, 0x03, 0x41, 0xCC, 0xA8, 0xCA, 0x03, 0x42, - 0xCC, 0x87, 0xE6, 0x03, 0x42, 0xCC, 0xA3, 0xDC, - 0x03, 0x42, 0xCC, 0xB1, 0xDC, 0x03, 0x43, 0xCC, - 0x81, 0xE6, 0x03, 0x43, 0xCC, 0x82, 0xE6, 0x03, - 0x43, 0xCC, 0x87, 0xE6, 0x03, 0x43, 0xCC, 0x8C, - 0xE6, 0x03, 0x44, 0xCC, 0x87, 0xE6, 0x03, 0x44, - 0xCC, 0x8C, 0xE6, 0x03, 0x44, 0xCC, 0xA3, 0xDC, - 0x03, 0x44, 0xCC, 0xA7, 0xCA, 0x03, 0x44, 0xCC, - // Bytes 2ec0 - 2eff - 0xAD, 0xDC, 0x03, 0x44, 0xCC, 0xB1, 0xDC, 0x03, - 0x45, 0xCC, 0x80, 0xE6, 0x03, 0x45, 0xCC, 0x81, - 0xE6, 0x03, 0x45, 0xCC, 0x83, 0xE6, 0x03, 0x45, - 0xCC, 0x86, 0xE6, 0x03, 0x45, 0xCC, 0x87, 0xE6, - 0x03, 0x45, 0xCC, 0x88, 0xE6, 0x03, 0x45, 0xCC, - 0x89, 0xE6, 0x03, 0x45, 0xCC, 0x8C, 0xE6, 0x03, - 0x45, 0xCC, 0x8F, 0xE6, 0x03, 0x45, 0xCC, 0x91, - 0xE6, 0x03, 0x45, 0xCC, 0xA8, 0xCA, 0x03, 0x45, - // Bytes 2f00 - 2f3f - 0xCC, 0xAD, 0xDC, 0x03, 0x45, 0xCC, 0xB0, 0xDC, - 0x03, 0x46, 0xCC, 0x87, 0xE6, 0x03, 0x47, 0xCC, - 0x81, 0xE6, 0x03, 0x47, 0xCC, 0x82, 0xE6, 0x03, - 0x47, 0xCC, 0x84, 0xE6, 0x03, 0x47, 0xCC, 0x86, - 0xE6, 0x03, 0x47, 0xCC, 0x87, 0xE6, 0x03, 0x47, - 0xCC, 0x8C, 0xE6, 0x03, 0x47, 0xCC, 0xA7, 0xCA, - 0x03, 0x48, 0xCC, 0x82, 0xE6, 0x03, 0x48, 0xCC, - 0x87, 0xE6, 0x03, 0x48, 0xCC, 0x88, 0xE6, 0x03, - // Bytes 2f40 - 2f7f - 0x48, 0xCC, 0x8C, 0xE6, 0x03, 0x48, 0xCC, 0xA3, - 0xDC, 0x03, 0x48, 0xCC, 0xA7, 0xCA, 0x03, 0x48, - 0xCC, 0xAE, 0xDC, 0x03, 0x49, 0xCC, 0x80, 0xE6, - 0x03, 0x49, 0xCC, 0x81, 0xE6, 0x03, 0x49, 0xCC, - 0x82, 0xE6, 0x03, 0x49, 0xCC, 0x83, 0xE6, 0x03, - 0x49, 0xCC, 0x84, 0xE6, 0x03, 0x49, 0xCC, 0x86, - 0xE6, 0x03, 0x49, 0xCC, 0x87, 0xE6, 0x03, 0x49, - 0xCC, 0x89, 0xE6, 0x03, 0x49, 0xCC, 0x8C, 0xE6, - // Bytes 2f80 - 2fbf - 0x03, 0x49, 0xCC, 0x8F, 0xE6, 0x03, 0x49, 0xCC, - 0x91, 0xE6, 0x03, 0x49, 0xCC, 0xA3, 0xDC, 0x03, - 0x49, 0xCC, 0xA8, 0xCA, 0x03, 0x49, 0xCC, 0xB0, - 0xDC, 0x03, 0x4A, 0xCC, 0x82, 0xE6, 0x03, 0x4B, - 0xCC, 0x81, 0xE6, 0x03, 0x4B, 0xCC, 0x8C, 0xE6, - 0x03, 0x4B, 0xCC, 0xA3, 0xDC, 0x03, 0x4B, 0xCC, - 0xA7, 0xCA, 0x03, 0x4B, 0xCC, 0xB1, 0xDC, 0x03, - 0x4C, 0xCC, 0x81, 0xE6, 0x03, 0x4C, 0xCC, 0x8C, - // Bytes 2fc0 - 2fff - 0xE6, 0x03, 0x4C, 0xCC, 0xA7, 0xCA, 0x03, 0x4C, - 0xCC, 0xAD, 0xDC, 0x03, 0x4C, 0xCC, 0xB1, 0xDC, - 0x03, 0x4D, 0xCC, 0x81, 0xE6, 0x03, 0x4D, 0xCC, - 0x87, 0xE6, 0x03, 0x4D, 0xCC, 0xA3, 0xDC, 0x03, - 0x4E, 0xCC, 0x80, 0xE6, 0x03, 0x4E, 0xCC, 0x81, - 0xE6, 0x03, 0x4E, 0xCC, 0x83, 0xE6, 0x03, 0x4E, - 0xCC, 0x87, 0xE6, 0x03, 0x4E, 0xCC, 0x8C, 0xE6, - 0x03, 0x4E, 0xCC, 0xA3, 0xDC, 0x03, 0x4E, 0xCC, - // Bytes 3000 - 303f - 0xA7, 0xCA, 0x03, 0x4E, 0xCC, 0xAD, 0xDC, 0x03, - 0x4E, 0xCC, 0xB1, 0xDC, 0x03, 0x4F, 0xCC, 0x80, - 0xE6, 0x03, 0x4F, 0xCC, 0x81, 0xE6, 0x03, 0x4F, - 0xCC, 0x86, 0xE6, 0x03, 0x4F, 0xCC, 0x89, 0xE6, - 0x03, 0x4F, 0xCC, 0x8B, 0xE6, 0x03, 0x4F, 0xCC, - 0x8C, 0xE6, 0x03, 0x4F, 0xCC, 0x8F, 0xE6, 0x03, - 0x4F, 0xCC, 0x91, 0xE6, 0x03, 0x50, 0xCC, 0x81, - 0xE6, 0x03, 0x50, 0xCC, 0x87, 0xE6, 0x03, 0x52, - // Bytes 3040 - 307f - 0xCC, 0x81, 0xE6, 0x03, 0x52, 0xCC, 0x87, 0xE6, - 0x03, 0x52, 0xCC, 0x8C, 0xE6, 0x03, 0x52, 0xCC, - 0x8F, 0xE6, 0x03, 0x52, 0xCC, 0x91, 0xE6, 0x03, - 0x52, 0xCC, 0xA7, 0xCA, 0x03, 0x52, 0xCC, 0xB1, - 0xDC, 0x03, 0x53, 0xCC, 0x82, 0xE6, 0x03, 0x53, - 0xCC, 0x87, 0xE6, 0x03, 0x53, 0xCC, 0xA6, 0xDC, - 0x03, 0x53, 0xCC, 0xA7, 0xCA, 0x03, 0x54, 0xCC, - 0x87, 0xE6, 0x03, 0x54, 0xCC, 0x8C, 0xE6, 0x03, - // Bytes 3080 - 30bf - 0x54, 0xCC, 0xA3, 0xDC, 0x03, 0x54, 0xCC, 0xA6, - 0xDC, 0x03, 0x54, 0xCC, 0xA7, 0xCA, 0x03, 0x54, - 0xCC, 0xAD, 0xDC, 0x03, 0x54, 0xCC, 0xB1, 0xDC, - 0x03, 0x55, 0xCC, 0x80, 0xE6, 0x03, 0x55, 0xCC, - 0x81, 0xE6, 0x03, 0x55, 0xCC, 0x82, 0xE6, 0x03, - 0x55, 0xCC, 0x86, 0xE6, 0x03, 0x55, 0xCC, 0x89, - 0xE6, 0x03, 0x55, 0xCC, 0x8A, 0xE6, 0x03, 0x55, - 0xCC, 0x8B, 0xE6, 0x03, 0x55, 0xCC, 0x8C, 0xE6, - // Bytes 30c0 - 30ff - 0x03, 0x55, 0xCC, 0x8F, 0xE6, 0x03, 0x55, 0xCC, - 0x91, 0xE6, 0x03, 0x55, 0xCC, 0xA3, 0xDC, 0x03, - 0x55, 0xCC, 0xA4, 0xDC, 0x03, 0x55, 0xCC, 0xA8, - 0xCA, 0x03, 0x55, 0xCC, 0xAD, 0xDC, 0x03, 0x55, - 0xCC, 0xB0, 0xDC, 0x03, 0x56, 0xCC, 0x83, 0xE6, - 0x03, 0x56, 0xCC, 0xA3, 0xDC, 0x03, 0x57, 0xCC, - 0x80, 0xE6, 0x03, 0x57, 0xCC, 0x81, 0xE6, 0x03, - 0x57, 0xCC, 0x82, 0xE6, 0x03, 0x57, 0xCC, 0x87, - // Bytes 3100 - 313f - 0xE6, 0x03, 0x57, 0xCC, 0x88, 0xE6, 0x03, 0x57, - 0xCC, 0xA3, 0xDC, 0x03, 0x58, 0xCC, 0x87, 0xE6, - 0x03, 0x58, 0xCC, 0x88, 0xE6, 0x03, 0x59, 0xCC, - 0x80, 0xE6, 0x03, 0x59, 0xCC, 0x81, 0xE6, 0x03, - 0x59, 0xCC, 0x82, 0xE6, 0x03, 0x59, 0xCC, 0x83, - 0xE6, 0x03, 0x59, 0xCC, 0x84, 0xE6, 0x03, 0x59, - 0xCC, 0x87, 0xE6, 0x03, 0x59, 0xCC, 0x88, 0xE6, - 0x03, 0x59, 0xCC, 0x89, 0xE6, 0x03, 0x59, 0xCC, - // Bytes 3140 - 317f - 0xA3, 0xDC, 0x03, 0x5A, 0xCC, 0x81, 0xE6, 0x03, - 0x5A, 0xCC, 0x82, 0xE6, 0x03, 0x5A, 0xCC, 0x87, - 0xE6, 0x03, 0x5A, 0xCC, 0x8C, 0xE6, 0x03, 0x5A, - 0xCC, 0xA3, 0xDC, 0x03, 0x5A, 0xCC, 0xB1, 0xDC, - 0x03, 0x61, 0xCC, 0x80, 0xE6, 0x03, 0x61, 0xCC, - 0x81, 0xE6, 0x03, 0x61, 0xCC, 0x83, 0xE6, 0x03, - 0x61, 0xCC, 0x84, 0xE6, 0x03, 0x61, 0xCC, 0x89, - 0xE6, 0x03, 0x61, 0xCC, 0x8C, 0xE6, 0x03, 0x61, - // Bytes 3180 - 31bf - 0xCC, 0x8F, 0xE6, 0x03, 0x61, 0xCC, 0x91, 0xE6, - 0x03, 0x61, 0xCC, 0xA5, 0xDC, 0x03, 0x61, 0xCC, - 0xA8, 0xCA, 0x03, 0x62, 0xCC, 0x87, 0xE6, 0x03, - 0x62, 0xCC, 0xA3, 0xDC, 0x03, 0x62, 0xCC, 0xB1, - 0xDC, 0x03, 0x63, 0xCC, 0x81, 0xE6, 0x03, 0x63, - 0xCC, 0x82, 0xE6, 0x03, 0x63, 0xCC, 0x87, 0xE6, - 0x03, 0x63, 0xCC, 0x8C, 0xE6, 0x03, 0x64, 0xCC, - 0x87, 0xE6, 0x03, 0x64, 0xCC, 0x8C, 0xE6, 0x03, - // Bytes 31c0 - 31ff - 0x64, 0xCC, 0xA3, 0xDC, 0x03, 0x64, 0xCC, 0xA7, - 0xCA, 0x03, 0x64, 0xCC, 0xAD, 0xDC, 0x03, 0x64, - 0xCC, 0xB1, 0xDC, 0x03, 0x65, 0xCC, 0x80, 0xE6, - 0x03, 0x65, 0xCC, 0x81, 0xE6, 0x03, 0x65, 0xCC, - 0x83, 0xE6, 0x03, 0x65, 0xCC, 0x86, 0xE6, 0x03, - 0x65, 0xCC, 0x87, 0xE6, 0x03, 0x65, 0xCC, 0x88, - 0xE6, 0x03, 0x65, 0xCC, 0x89, 0xE6, 0x03, 0x65, - 0xCC, 0x8C, 0xE6, 0x03, 0x65, 0xCC, 0x8F, 0xE6, - // Bytes 3200 - 323f - 0x03, 0x65, 0xCC, 0x91, 0xE6, 0x03, 0x65, 0xCC, - 0xA8, 0xCA, 0x03, 0x65, 0xCC, 0xAD, 0xDC, 0x03, - 0x65, 0xCC, 0xB0, 0xDC, 0x03, 0x66, 0xCC, 0x87, - 0xE6, 0x03, 0x67, 0xCC, 0x81, 0xE6, 0x03, 0x67, - 0xCC, 0x82, 0xE6, 0x03, 0x67, 0xCC, 0x84, 0xE6, - 0x03, 0x67, 0xCC, 0x86, 0xE6, 0x03, 0x67, 0xCC, - 0x87, 0xE6, 0x03, 0x67, 0xCC, 0x8C, 0xE6, 0x03, - 0x67, 0xCC, 0xA7, 0xCA, 0x03, 0x68, 0xCC, 0x82, - // Bytes 3240 - 327f - 0xE6, 0x03, 0x68, 0xCC, 0x87, 0xE6, 0x03, 0x68, - 0xCC, 0x88, 0xE6, 0x03, 0x68, 0xCC, 0x8C, 0xE6, - 0x03, 0x68, 0xCC, 0xA3, 0xDC, 0x03, 0x68, 0xCC, - 0xA7, 0xCA, 0x03, 0x68, 0xCC, 0xAE, 0xDC, 0x03, - 0x68, 0xCC, 0xB1, 0xDC, 0x03, 0x69, 0xCC, 0x80, - 0xE6, 0x03, 0x69, 0xCC, 0x81, 0xE6, 0x03, 0x69, - 0xCC, 0x82, 0xE6, 0x03, 0x69, 0xCC, 0x83, 0xE6, - 0x03, 0x69, 0xCC, 0x84, 0xE6, 0x03, 0x69, 0xCC, - // Bytes 3280 - 32bf - 0x86, 0xE6, 0x03, 0x69, 0xCC, 0x89, 0xE6, 0x03, - 0x69, 0xCC, 0x8C, 0xE6, 0x03, 0x69, 0xCC, 0x8F, - 0xE6, 0x03, 0x69, 0xCC, 0x91, 0xE6, 0x03, 0x69, - 0xCC, 0xA3, 0xDC, 0x03, 0x69, 0xCC, 0xA8, 0xCA, - 0x03, 0x69, 0xCC, 0xB0, 0xDC, 0x03, 0x6A, 0xCC, - 0x82, 0xE6, 0x03, 0x6A, 0xCC, 0x8C, 0xE6, 0x03, - 0x6B, 0xCC, 0x81, 0xE6, 0x03, 0x6B, 0xCC, 0x8C, - 0xE6, 0x03, 0x6B, 0xCC, 0xA3, 0xDC, 0x03, 0x6B, - // Bytes 32c0 - 32ff - 0xCC, 0xA7, 0xCA, 0x03, 0x6B, 0xCC, 0xB1, 0xDC, - 0x03, 0x6C, 0xCC, 0x81, 0xE6, 0x03, 0x6C, 0xCC, - 0x8C, 0xE6, 0x03, 0x6C, 0xCC, 0xA7, 0xCA, 0x03, - 0x6C, 0xCC, 0xAD, 0xDC, 0x03, 0x6C, 0xCC, 0xB1, - 0xDC, 0x03, 0x6D, 0xCC, 0x81, 0xE6, 0x03, 0x6D, - 0xCC, 0x87, 0xE6, 0x03, 0x6D, 0xCC, 0xA3, 0xDC, - 0x03, 0x6E, 0xCC, 0x80, 0xE6, 0x03, 0x6E, 0xCC, - 0x81, 0xE6, 0x03, 0x6E, 0xCC, 0x83, 0xE6, 0x03, - // Bytes 3300 - 333f - 0x6E, 0xCC, 0x87, 0xE6, 0x03, 0x6E, 0xCC, 0x8C, - 0xE6, 0x03, 0x6E, 0xCC, 0xA3, 0xDC, 0x03, 0x6E, - 0xCC, 0xA7, 0xCA, 0x03, 0x6E, 0xCC, 0xAD, 0xDC, - 0x03, 0x6E, 0xCC, 0xB1, 0xDC, 0x03, 0x6F, 0xCC, - 0x80, 0xE6, 0x03, 0x6F, 0xCC, 0x81, 0xE6, 0x03, - 0x6F, 0xCC, 0x86, 0xE6, 0x03, 0x6F, 0xCC, 0x89, - 0xE6, 0x03, 0x6F, 0xCC, 0x8B, 0xE6, 0x03, 0x6F, - 0xCC, 0x8C, 0xE6, 0x03, 0x6F, 0xCC, 0x8F, 0xE6, - // Bytes 3340 - 337f - 0x03, 0x6F, 0xCC, 0x91, 0xE6, 0x03, 0x70, 0xCC, - 0x81, 0xE6, 0x03, 0x70, 0xCC, 0x87, 0xE6, 0x03, - 0x72, 0xCC, 0x81, 0xE6, 0x03, 0x72, 0xCC, 0x87, - 0xE6, 0x03, 0x72, 0xCC, 0x8C, 0xE6, 0x03, 0x72, - 0xCC, 0x8F, 0xE6, 0x03, 0x72, 0xCC, 0x91, 0xE6, - 0x03, 0x72, 0xCC, 0xA7, 0xCA, 0x03, 0x72, 0xCC, - 0xB1, 0xDC, 0x03, 0x73, 0xCC, 0x82, 0xE6, 0x03, - 0x73, 0xCC, 0x87, 0xE6, 0x03, 0x73, 0xCC, 0xA6, - // Bytes 3380 - 33bf - 0xDC, 0x03, 0x73, 0xCC, 0xA7, 0xCA, 0x03, 0x74, - 0xCC, 0x87, 0xE6, 0x03, 0x74, 0xCC, 0x88, 0xE6, - 0x03, 0x74, 0xCC, 0x8C, 0xE6, 0x03, 0x74, 0xCC, - 0xA3, 0xDC, 0x03, 0x74, 0xCC, 0xA6, 0xDC, 0x03, - 0x74, 0xCC, 0xA7, 0xCA, 0x03, 0x74, 0xCC, 0xAD, - 0xDC, 0x03, 0x74, 0xCC, 0xB1, 0xDC, 0x03, 0x75, - 0xCC, 0x80, 0xE6, 0x03, 0x75, 0xCC, 0x81, 0xE6, - 0x03, 0x75, 0xCC, 0x82, 0xE6, 0x03, 0x75, 0xCC, - // Bytes 33c0 - 33ff - 0x86, 0xE6, 0x03, 0x75, 0xCC, 0x89, 0xE6, 0x03, - 0x75, 0xCC, 0x8A, 0xE6, 0x03, 0x75, 0xCC, 0x8B, - 0xE6, 0x03, 0x75, 0xCC, 0x8C, 0xE6, 0x03, 0x75, - 0xCC, 0x8F, 0xE6, 0x03, 0x75, 0xCC, 0x91, 0xE6, - 0x03, 0x75, 0xCC, 0xA3, 0xDC, 0x03, 0x75, 0xCC, - 0xA4, 0xDC, 0x03, 0x75, 0xCC, 0xA8, 0xCA, 0x03, - 0x75, 0xCC, 0xAD, 0xDC, 0x03, 0x75, 0xCC, 0xB0, - 0xDC, 0x03, 0x76, 0xCC, 0x83, 0xE6, 0x03, 0x76, - // Bytes 3400 - 343f - 0xCC, 0xA3, 0xDC, 0x03, 0x77, 0xCC, 0x80, 0xE6, - 0x03, 0x77, 0xCC, 0x81, 0xE6, 0x03, 0x77, 0xCC, - 0x82, 0xE6, 0x03, 0x77, 0xCC, 0x87, 0xE6, 0x03, - 0x77, 0xCC, 0x88, 0xE6, 0x03, 0x77, 0xCC, 0x8A, - 0xE6, 0x03, 0x77, 0xCC, 0xA3, 0xDC, 0x03, 0x78, - 0xCC, 0x87, 0xE6, 0x03, 0x78, 0xCC, 0x88, 0xE6, - 0x03, 0x79, 0xCC, 0x80, 0xE6, 0x03, 0x79, 0xCC, - 0x81, 0xE6, 0x03, 0x79, 0xCC, 0x82, 0xE6, 0x03, - // Bytes 3440 - 347f - 0x79, 0xCC, 0x83, 0xE6, 0x03, 0x79, 0xCC, 0x84, - 0xE6, 0x03, 0x79, 0xCC, 0x87, 0xE6, 0x03, 0x79, - 0xCC, 0x88, 0xE6, 0x03, 0x79, 0xCC, 0x89, 0xE6, - 0x03, 0x79, 0xCC, 0x8A, 0xE6, 0x03, 0x79, 0xCC, - 0xA3, 0xDC, 0x03, 0x7A, 0xCC, 0x81, 0xE6, 0x03, - 0x7A, 0xCC, 0x82, 0xE6, 0x03, 0x7A, 0xCC, 0x87, - 0xE6, 0x03, 0x7A, 0xCC, 0x8C, 0xE6, 0x03, 0x7A, - 0xCC, 0xA3, 0xDC, 0x03, 0x7A, 0xCC, 0xB1, 0xDC, - // Bytes 3480 - 34bf - 0x04, 0xC2, 0xA8, 0xCC, 0x80, 0xE6, 0x04, 0xC2, - 0xA8, 0xCC, 0x81, 0xE6, 0x04, 0xC2, 0xA8, 0xCD, - 0x82, 0xE6, 0x04, 0xC3, 0x86, 0xCC, 0x81, 0xE6, - 0x04, 0xC3, 0x86, 0xCC, 0x84, 0xE6, 0x04, 0xC3, - 0x98, 0xCC, 0x81, 0xE6, 0x04, 0xC3, 0xA6, 0xCC, - 0x81, 0xE6, 0x04, 0xC3, 0xA6, 0xCC, 0x84, 0xE6, - 0x04, 0xC3, 0xB8, 0xCC, 0x81, 0xE6, 0x04, 0xC5, - 0xBF, 0xCC, 0x87, 0xE6, 0x04, 0xC6, 0xB7, 0xCC, - // Bytes 34c0 - 34ff - 0x8C, 0xE6, 0x04, 0xCA, 0x92, 0xCC, 0x8C, 0xE6, - 0x04, 0xCE, 0x91, 0xCC, 0x80, 0xE6, 0x04, 0xCE, - 0x91, 0xCC, 0x81, 0xE6, 0x04, 0xCE, 0x91, 0xCC, - 0x84, 0xE6, 0x04, 0xCE, 0x91, 0xCC, 0x86, 0xE6, - 0x04, 0xCE, 0x91, 0xCD, 0x85, 0xF0, 0x04, 0xCE, - 0x95, 0xCC, 0x80, 0xE6, 0x04, 0xCE, 0x95, 0xCC, - 0x81, 0xE6, 0x04, 0xCE, 0x97, 0xCC, 0x80, 0xE6, - 0x04, 0xCE, 0x97, 0xCC, 0x81, 0xE6, 0x04, 0xCE, - // Bytes 3500 - 353f - 0x97, 0xCD, 0x85, 0xF0, 0x04, 0xCE, 0x99, 0xCC, - 0x80, 0xE6, 0x04, 0xCE, 0x99, 0xCC, 0x81, 0xE6, - 0x04, 0xCE, 0x99, 0xCC, 0x84, 0xE6, 0x04, 0xCE, - 0x99, 0xCC, 0x86, 0xE6, 0x04, 0xCE, 0x99, 0xCC, - 0x88, 0xE6, 0x04, 0xCE, 0x9F, 0xCC, 0x80, 0xE6, - 0x04, 0xCE, 0x9F, 0xCC, 0x81, 0xE6, 0x04, 0xCE, - 0xA1, 0xCC, 0x94, 0xE6, 0x04, 0xCE, 0xA5, 0xCC, - 0x80, 0xE6, 0x04, 0xCE, 0xA5, 0xCC, 0x81, 0xE6, - // Bytes 3540 - 357f - 0x04, 0xCE, 0xA5, 0xCC, 0x84, 0xE6, 0x04, 0xCE, - 0xA5, 0xCC, 0x86, 0xE6, 0x04, 0xCE, 0xA5, 0xCC, - 0x88, 0xE6, 0x04, 0xCE, 0xA9, 0xCC, 0x80, 0xE6, - 0x04, 0xCE, 0xA9, 0xCC, 0x81, 0xE6, 0x04, 0xCE, - 0xA9, 0xCD, 0x85, 0xF0, 0x04, 0xCE, 0xB1, 0xCC, - 0x84, 0xE6, 0x04, 0xCE, 0xB1, 0xCC, 0x86, 0xE6, - 0x04, 0xCE, 0xB1, 0xCD, 0x85, 0xF0, 0x04, 0xCE, - 0xB5, 0xCC, 0x80, 0xE6, 0x04, 0xCE, 0xB5, 0xCC, - // Bytes 3580 - 35bf - 0x81, 0xE6, 0x04, 0xCE, 0xB7, 0xCD, 0x85, 0xF0, - 0x04, 0xCE, 0xB9, 0xCC, 0x80, 0xE6, 0x04, 0xCE, - 0xB9, 0xCC, 0x81, 0xE6, 0x04, 0xCE, 0xB9, 0xCC, - 0x84, 0xE6, 0x04, 0xCE, 0xB9, 0xCC, 0x86, 0xE6, - 0x04, 0xCE, 0xB9, 0xCD, 0x82, 0xE6, 0x04, 0xCE, - 0xBF, 0xCC, 0x80, 0xE6, 0x04, 0xCE, 0xBF, 0xCC, - 0x81, 0xE6, 0x04, 0xCF, 0x81, 0xCC, 0x93, 0xE6, - 0x04, 0xCF, 0x81, 0xCC, 0x94, 0xE6, 0x04, 0xCF, - // Bytes 35c0 - 35ff - 0x85, 0xCC, 0x80, 0xE6, 0x04, 0xCF, 0x85, 0xCC, - 0x81, 0xE6, 0x04, 0xCF, 0x85, 0xCC, 0x84, 0xE6, - 0x04, 0xCF, 0x85, 0xCC, 0x86, 0xE6, 0x04, 0xCF, - 0x85, 0xCD, 0x82, 0xE6, 0x04, 0xCF, 0x89, 0xCD, - 0x85, 0xF0, 0x04, 0xCF, 0x92, 0xCC, 0x81, 0xE6, - 0x04, 0xCF, 0x92, 0xCC, 0x88, 0xE6, 0x04, 0xD0, - 0x86, 0xCC, 0x88, 0xE6, 0x04, 0xD0, 0x90, 0xCC, - 0x86, 0xE6, 0x04, 0xD0, 0x90, 0xCC, 0x88, 0xE6, - // Bytes 3600 - 363f - 0x04, 0xD0, 0x93, 0xCC, 0x81, 0xE6, 0x04, 0xD0, - 0x95, 0xCC, 0x80, 0xE6, 0x04, 0xD0, 0x95, 0xCC, - 0x86, 0xE6, 0x04, 0xD0, 0x95, 0xCC, 0x88, 0xE6, - 0x04, 0xD0, 0x96, 0xCC, 0x86, 0xE6, 0x04, 0xD0, - 0x96, 0xCC, 0x88, 0xE6, 0x04, 0xD0, 0x97, 0xCC, - 0x88, 0xE6, 0x04, 0xD0, 0x98, 0xCC, 0x80, 0xE6, - 0x04, 0xD0, 0x98, 0xCC, 0x84, 0xE6, 0x04, 0xD0, - 0x98, 0xCC, 0x86, 0xE6, 0x04, 0xD0, 0x98, 0xCC, - // Bytes 3640 - 367f - 0x88, 0xE6, 0x04, 0xD0, 0x9A, 0xCC, 0x81, 0xE6, - 0x04, 0xD0, 0x9E, 0xCC, 0x88, 0xE6, 0x04, 0xD0, - 0xA3, 0xCC, 0x84, 0xE6, 0x04, 0xD0, 0xA3, 0xCC, - 0x86, 0xE6, 0x04, 0xD0, 0xA3, 0xCC, 0x88, 0xE6, - 0x04, 0xD0, 0xA3, 0xCC, 0x8B, 0xE6, 0x04, 0xD0, - 0xA7, 0xCC, 0x88, 0xE6, 0x04, 0xD0, 0xAB, 0xCC, - 0x88, 0xE6, 0x04, 0xD0, 0xAD, 0xCC, 0x88, 0xE6, - 0x04, 0xD0, 0xB0, 0xCC, 0x86, 0xE6, 0x04, 0xD0, - // Bytes 3680 - 36bf - 0xB0, 0xCC, 0x88, 0xE6, 0x04, 0xD0, 0xB3, 0xCC, - 0x81, 0xE6, 0x04, 0xD0, 0xB5, 0xCC, 0x80, 0xE6, - 0x04, 0xD0, 0xB5, 0xCC, 0x86, 0xE6, 0x04, 0xD0, - 0xB5, 0xCC, 0x88, 0xE6, 0x04, 0xD0, 0xB6, 0xCC, - 0x86, 0xE6, 0x04, 0xD0, 0xB6, 0xCC, 0x88, 0xE6, - 0x04, 0xD0, 0xB7, 0xCC, 0x88, 0xE6, 0x04, 0xD0, - 0xB8, 0xCC, 0x80, 0xE6, 0x04, 0xD0, 0xB8, 0xCC, - 0x84, 0xE6, 0x04, 0xD0, 0xB8, 0xCC, 0x86, 0xE6, - // Bytes 36c0 - 36ff - 0x04, 0xD0, 0xB8, 0xCC, 0x88, 0xE6, 0x04, 0xD0, - 0xBA, 0xCC, 0x81, 0xE6, 0x04, 0xD0, 0xBE, 0xCC, - 0x88, 0xE6, 0x04, 0xD1, 0x83, 0xCC, 0x84, 0xE6, - 0x04, 0xD1, 0x83, 0xCC, 0x86, 0xE6, 0x04, 0xD1, - 0x83, 0xCC, 0x88, 0xE6, 0x04, 0xD1, 0x83, 0xCC, - 0x8B, 0xE6, 0x04, 0xD1, 0x87, 0xCC, 0x88, 0xE6, - 0x04, 0xD1, 0x8B, 0xCC, 0x88, 0xE6, 0x04, 0xD1, - 0x8D, 0xCC, 0x88, 0xE6, 0x04, 0xD1, 0x96, 0xCC, - // Bytes 3700 - 373f - 0x88, 0xE6, 0x04, 0xD1, 0xB4, 0xCC, 0x8F, 0xE6, - 0x04, 0xD1, 0xB5, 0xCC, 0x8F, 0xE6, 0x04, 0xD3, - 0x98, 0xCC, 0x88, 0xE6, 0x04, 0xD3, 0x99, 0xCC, - 0x88, 0xE6, 0x04, 0xD3, 0xA8, 0xCC, 0x88, 0xE6, - 0x04, 0xD3, 0xA9, 0xCC, 0x88, 0xE6, 0x04, 0xD8, - 0xA7, 0xD9, 0x93, 0xE6, 0x04, 0xD8, 0xA7, 0xD9, - 0x94, 0xE6, 0x04, 0xD8, 0xA7, 0xD9, 0x95, 0xDC, - 0x04, 0xD9, 0x88, 0xD9, 0x94, 0xE6, 0x04, 0xD9, - // Bytes 3740 - 377f - 0x8A, 0xD9, 0x94, 0xE6, 0x04, 0xDB, 0x81, 0xD9, - 0x94, 0xE6, 0x04, 0xDB, 0x92, 0xD9, 0x94, 0xE6, - 0x04, 0xDB, 0x95, 0xD9, 0x94, 0xE6, 0x05, 0x41, - 0xCC, 0x82, 0xCC, 0x80, 0xE6, 0x05, 0x41, 0xCC, - 0x82, 0xCC, 0x81, 0xE6, 0x05, 0x41, 0xCC, 0x82, - 0xCC, 0x83, 0xE6, 0x05, 0x41, 0xCC, 0x82, 0xCC, - 0x89, 0xE6, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x80, - 0xE6, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x81, 0xE6, - // Bytes 3780 - 37bf - 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x83, 0xE6, 0x05, - 0x41, 0xCC, 0x86, 0xCC, 0x89, 0xE6, 0x05, 0x41, - 0xCC, 0x87, 0xCC, 0x84, 0xE6, 0x05, 0x41, 0xCC, - 0x88, 0xCC, 0x84, 0xE6, 0x05, 0x41, 0xCC, 0x8A, - 0xCC, 0x81, 0xE6, 0x05, 0x41, 0xCC, 0xA3, 0xCC, - 0x82, 0xE6, 0x05, 0x41, 0xCC, 0xA3, 0xCC, 0x86, - 0xE6, 0x05, 0x43, 0xCC, 0xA7, 0xCC, 0x81, 0xE6, - 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x80, 0xE6, 0x05, - // Bytes 37c0 - 37ff - 0x45, 0xCC, 0x82, 0xCC, 0x81, 0xE6, 0x05, 0x45, - 0xCC, 0x82, 0xCC, 0x83, 0xE6, 0x05, 0x45, 0xCC, - 0x82, 0xCC, 0x89, 0xE6, 0x05, 0x45, 0xCC, 0x84, - 0xCC, 0x80, 0xE6, 0x05, 0x45, 0xCC, 0x84, 0xCC, - 0x81, 0xE6, 0x05, 0x45, 0xCC, 0xA3, 0xCC, 0x82, - 0xE6, 0x05, 0x45, 0xCC, 0xA7, 0xCC, 0x86, 0xE6, - 0x05, 0x49, 0xCC, 0x88, 0xCC, 0x81, 0xE6, 0x05, - 0x4C, 0xCC, 0xA3, 0xCC, 0x84, 0xE6, 0x05, 0x4F, - // Bytes 3800 - 383f - 0xCC, 0x82, 0xCC, 0x80, 0xE6, 0x05, 0x4F, 0xCC, - 0x82, 0xCC, 0x81, 0xE6, 0x05, 0x4F, 0xCC, 0x82, - 0xCC, 0x83, 0xE6, 0x05, 0x4F, 0xCC, 0x82, 0xCC, - 0x89, 0xE6, 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x81, - 0xE6, 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x84, 0xE6, - 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x88, 0xE6, 0x05, - 0x4F, 0xCC, 0x84, 0xCC, 0x80, 0xE6, 0x05, 0x4F, - 0xCC, 0x84, 0xCC, 0x81, 0xE6, 0x05, 0x4F, 0xCC, - // Bytes 3840 - 387f - 0x87, 0xCC, 0x84, 0xE6, 0x05, 0x4F, 0xCC, 0x88, - 0xCC, 0x84, 0xE6, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, - 0x80, 0xE6, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x81, - 0xE6, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x83, 0xE6, - 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x89, 0xE6, 0x05, - 0x4F, 0xCC, 0x9B, 0xCC, 0xA3, 0xDC, 0x05, 0x4F, - 0xCC, 0xA3, 0xCC, 0x82, 0xE6, 0x05, 0x4F, 0xCC, - 0xA8, 0xCC, 0x84, 0xE6, 0x05, 0x52, 0xCC, 0xA3, - // Bytes 3880 - 38bf - 0xCC, 0x84, 0xE6, 0x05, 0x53, 0xCC, 0x81, 0xCC, - 0x87, 0xE6, 0x05, 0x53, 0xCC, 0x8C, 0xCC, 0x87, - 0xE6, 0x05, 0x53, 0xCC, 0xA3, 0xCC, 0x87, 0xE6, - 0x05, 0x55, 0xCC, 0x83, 0xCC, 0x81, 0xE6, 0x05, - 0x55, 0xCC, 0x84, 0xCC, 0x88, 0xE6, 0x05, 0x55, - 0xCC, 0x88, 0xCC, 0x80, 0xE6, 0x05, 0x55, 0xCC, - 0x88, 0xCC, 0x81, 0xE6, 0x05, 0x55, 0xCC, 0x88, - 0xCC, 0x84, 0xE6, 0x05, 0x55, 0xCC, 0x88, 0xCC, - // Bytes 38c0 - 38ff - 0x8C, 0xE6, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x80, - 0xE6, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x81, 0xE6, - 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x83, 0xE6, 0x05, - 0x55, 0xCC, 0x9B, 0xCC, 0x89, 0xE6, 0x05, 0x55, - 0xCC, 0x9B, 0xCC, 0xA3, 0xDC, 0x05, 0x61, 0xCC, - 0x82, 0xCC, 0x80, 0xE6, 0x05, 0x61, 0xCC, 0x82, - 0xCC, 0x81, 0xE6, 0x05, 0x61, 0xCC, 0x82, 0xCC, - 0x83, 0xE6, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x89, - // Bytes 3900 - 393f - 0xE6, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x80, 0xE6, - 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x81, 0xE6, 0x05, - 0x61, 0xCC, 0x86, 0xCC, 0x83, 0xE6, 0x05, 0x61, - 0xCC, 0x86, 0xCC, 0x89, 0xE6, 0x05, 0x61, 0xCC, - 0x87, 0xCC, 0x84, 0xE6, 0x05, 0x61, 0xCC, 0x88, - 0xCC, 0x84, 0xE6, 0x05, 0x61, 0xCC, 0x8A, 0xCC, - 0x81, 0xE6, 0x05, 0x61, 0xCC, 0xA3, 0xCC, 0x82, - 0xE6, 0x05, 0x61, 0xCC, 0xA3, 0xCC, 0x86, 0xE6, - // Bytes 3940 - 397f - 0x05, 0x63, 0xCC, 0xA7, 0xCC, 0x81, 0xE6, 0x05, - 0x65, 0xCC, 0x82, 0xCC, 0x80, 0xE6, 0x05, 0x65, - 0xCC, 0x82, 0xCC, 0x81, 0xE6, 0x05, 0x65, 0xCC, - 0x82, 0xCC, 0x83, 0xE6, 0x05, 0x65, 0xCC, 0x82, - 0xCC, 0x89, 0xE6, 0x05, 0x65, 0xCC, 0x84, 0xCC, - 0x80, 0xE6, 0x05, 0x65, 0xCC, 0x84, 0xCC, 0x81, - 0xE6, 0x05, 0x65, 0xCC, 0xA3, 0xCC, 0x82, 0xE6, - 0x05, 0x65, 0xCC, 0xA7, 0xCC, 0x86, 0xE6, 0x05, - // Bytes 3980 - 39bf - 0x69, 0xCC, 0x88, 0xCC, 0x81, 0xE6, 0x05, 0x6C, - 0xCC, 0xA3, 0xCC, 0x84, 0xE6, 0x05, 0x6F, 0xCC, - 0x82, 0xCC, 0x80, 0xE6, 0x05, 0x6F, 0xCC, 0x82, - 0xCC, 0x81, 0xE6, 0x05, 0x6F, 0xCC, 0x82, 0xCC, - 0x83, 0xE6, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x89, - 0xE6, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x81, 0xE6, - 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x84, 0xE6, 0x05, - 0x6F, 0xCC, 0x83, 0xCC, 0x88, 0xE6, 0x05, 0x6F, - // Bytes 39c0 - 39ff - 0xCC, 0x84, 0xCC, 0x80, 0xE6, 0x05, 0x6F, 0xCC, - 0x84, 0xCC, 0x81, 0xE6, 0x05, 0x6F, 0xCC, 0x87, - 0xCC, 0x84, 0xE6, 0x05, 0x6F, 0xCC, 0x88, 0xCC, - 0x84, 0xE6, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x80, - 0xE6, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x81, 0xE6, - 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x83, 0xE6, 0x05, - 0x6F, 0xCC, 0x9B, 0xCC, 0x89, 0xE6, 0x05, 0x6F, - 0xCC, 0x9B, 0xCC, 0xA3, 0xDC, 0x05, 0x6F, 0xCC, - // Bytes 3a00 - 3a3f - 0xA3, 0xCC, 0x82, 0xE6, 0x05, 0x6F, 0xCC, 0xA8, - 0xCC, 0x84, 0xE6, 0x05, 0x72, 0xCC, 0xA3, 0xCC, - 0x84, 0xE6, 0x05, 0x73, 0xCC, 0x81, 0xCC, 0x87, - 0xE6, 0x05, 0x73, 0xCC, 0x8C, 0xCC, 0x87, 0xE6, - 0x05, 0x73, 0xCC, 0xA3, 0xCC, 0x87, 0xE6, 0x05, - 0x75, 0xCC, 0x83, 0xCC, 0x81, 0xE6, 0x05, 0x75, - 0xCC, 0x84, 0xCC, 0x88, 0xE6, 0x05, 0x75, 0xCC, - 0x88, 0xCC, 0x80, 0xE6, 0x05, 0x75, 0xCC, 0x88, - // Bytes 3a40 - 3a7f - 0xCC, 0x81, 0xE6, 0x05, 0x75, 0xCC, 0x88, 0xCC, - 0x84, 0xE6, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x8C, - 0xE6, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x80, 0xE6, - 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x81, 0xE6, 0x05, - 0x75, 0xCC, 0x9B, 0xCC, 0x83, 0xE6, 0x05, 0x75, - 0xCC, 0x9B, 0xCC, 0x89, 0xE6, 0x05, 0x75, 0xCC, - 0x9B, 0xCC, 0xA3, 0xDC, 0x05, 0xE1, 0xBE, 0xBF, - 0xCC, 0x80, 0xE6, 0x05, 0xE1, 0xBE, 0xBF, 0xCC, - // Bytes 3a80 - 3abf - 0x81, 0xE6, 0x05, 0xE1, 0xBE, 0xBF, 0xCD, 0x82, - 0xE6, 0x05, 0xE1, 0xBF, 0xBE, 0xCC, 0x80, 0xE6, - 0x05, 0xE1, 0xBF, 0xBE, 0xCC, 0x81, 0xE6, 0x05, - 0xE1, 0xBF, 0xBE, 0xCD, 0x82, 0xE6, 0x05, 0xE2, - 0x86, 0x90, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x86, - 0x92, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x86, 0x94, - 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x87, 0x90, 0xCC, - 0xB8, 0x01, 0x05, 0xE2, 0x87, 0x92, 0xCC, 0xB8, - // Bytes 3ac0 - 3aff - 0x01, 0x05, 0xE2, 0x87, 0x94, 0xCC, 0xB8, 0x01, - 0x05, 0xE2, 0x88, 0x83, 0xCC, 0xB8, 0x01, 0x05, - 0xE2, 0x88, 0x88, 0xCC, 0xB8, 0x01, 0x05, 0xE2, - 0x88, 0x8B, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x88, - 0xA3, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x88, 0xA5, - 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x88, 0xBC, 0xCC, - 0xB8, 0x01, 0x05, 0xE2, 0x89, 0x83, 0xCC, 0xB8, - 0x01, 0x05, 0xE2, 0x89, 0x85, 0xCC, 0xB8, 0x01, - // Bytes 3b00 - 3b3f - 0x05, 0xE2, 0x89, 0x88, 0xCC, 0xB8, 0x01, 0x05, - 0xE2, 0x89, 0x8D, 0xCC, 0xB8, 0x01, 0x05, 0xE2, - 0x89, 0xA1, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x89, - 0xA4, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x89, 0xA5, - 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x89, 0xB2, 0xCC, - 0xB8, 0x01, 0x05, 0xE2, 0x89, 0xB3, 0xCC, 0xB8, - 0x01, 0x05, 0xE2, 0x89, 0xB6, 0xCC, 0xB8, 0x01, - 0x05, 0xE2, 0x89, 0xB7, 0xCC, 0xB8, 0x01, 0x05, - // Bytes 3b40 - 3b7f - 0xE2, 0x89, 0xBA, 0xCC, 0xB8, 0x01, 0x05, 0xE2, - 0x89, 0xBB, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x89, - 0xBC, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x89, 0xBD, - 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x8A, 0x82, 0xCC, - 0xB8, 0x01, 0x05, 0xE2, 0x8A, 0x83, 0xCC, 0xB8, - 0x01, 0x05, 0xE2, 0x8A, 0x86, 0xCC, 0xB8, 0x01, - 0x05, 0xE2, 0x8A, 0x87, 0xCC, 0xB8, 0x01, 0x05, - 0xE2, 0x8A, 0x91, 0xCC, 0xB8, 0x01, 0x05, 0xE2, - // Bytes 3b80 - 3bbf - 0x8A, 0x92, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x8A, - 0xA2, 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x8A, 0xA8, - 0xCC, 0xB8, 0x01, 0x05, 0xE2, 0x8A, 0xA9, 0xCC, - 0xB8, 0x01, 0x05, 0xE2, 0x8A, 0xAB, 0xCC, 0xB8, - 0x01, 0x05, 0xE2, 0x8A, 0xB2, 0xCC, 0xB8, 0x01, - 0x05, 0xE2, 0x8A, 0xB3, 0xCC, 0xB8, 0x01, 0x05, - 0xE2, 0x8A, 0xB4, 0xCC, 0xB8, 0x01, 0x05, 0xE2, - 0x8A, 0xB5, 0xCC, 0xB8, 0x01, 0x06, 0xCE, 0x91, - // Bytes 3bc0 - 3bff - 0xCC, 0x93, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0x91, - 0xCC, 0x94, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0x95, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0x95, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0x95, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0x95, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0x97, - 0xCC, 0x93, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0x97, - 0xCC, 0x94, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0x99, - // Bytes 3c00 - 3c3f - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0x99, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0x99, - 0xCC, 0x93, 0xCD, 0x82, 0xE6, 0x06, 0xCE, 0x99, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0x99, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0x99, - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x06, 0xCE, 0x9F, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0x9F, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0x9F, - // Bytes 3c40 - 3c7f - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0x9F, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0xA5, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0xA5, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0xA5, - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x06, 0xCE, 0xA9, - 0xCC, 0x93, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xA9, - 0xCC, 0x94, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB1, - 0xCC, 0x80, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB1, - // Bytes 3c80 - 3cbf - 0xCC, 0x81, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB1, - 0xCC, 0x93, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB1, - 0xCC, 0x94, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB1, - 0xCD, 0x82, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB5, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0xB5, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0xB5, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0xB5, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0xB7, - // Bytes 3cc0 - 3cff - 0xCC, 0x80, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB7, - 0xCC, 0x81, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB7, - 0xCC, 0x93, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB7, - 0xCC, 0x94, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB7, - 0xCD, 0x82, 0xCD, 0x85, 0xF0, 0x06, 0xCE, 0xB9, - 0xCC, 0x88, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0xB9, - 0xCC, 0x88, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0xB9, - 0xCC, 0x88, 0xCD, 0x82, 0xE6, 0x06, 0xCE, 0xB9, - // Bytes 3d00 - 3d3f - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0xB9, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0xB9, - 0xCC, 0x93, 0xCD, 0x82, 0xE6, 0x06, 0xCE, 0xB9, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0xB9, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0xB9, - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x06, 0xCE, 0xBF, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0xBF, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x06, 0xCE, 0xBF, - // Bytes 3d40 - 3d7f - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x06, 0xCE, 0xBF, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x06, 0xCF, 0x85, - 0xCC, 0x88, 0xCC, 0x80, 0xE6, 0x06, 0xCF, 0x85, - 0xCC, 0x88, 0xCC, 0x81, 0xE6, 0x06, 0xCF, 0x85, - 0xCC, 0x88, 0xCD, 0x82, 0xE6, 0x06, 0xCF, 0x85, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x06, 0xCF, 0x85, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x06, 0xCF, 0x85, - 0xCC, 0x93, 0xCD, 0x82, 0xE6, 0x06, 0xCF, 0x85, - // Bytes 3d80 - 3dbf - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x06, 0xCF, 0x85, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x06, 0xCF, 0x85, - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x06, 0xCF, 0x89, - 0xCC, 0x80, 0xCD, 0x85, 0xF0, 0x06, 0xCF, 0x89, - 0xCC, 0x81, 0xCD, 0x85, 0xF0, 0x06, 0xCF, 0x89, - 0xCC, 0x93, 0xCD, 0x85, 0xF0, 0x06, 0xCF, 0x89, - 0xCC, 0x94, 0xCD, 0x85, 0xF0, 0x06, 0xCF, 0x89, - 0xCD, 0x82, 0xCD, 0x85, 0xF0, 0x06, 0xE0, 0xA4, - // Bytes 3dc0 - 3dff - 0xA8, 0xE0, 0xA4, 0xBC, 0x07, 0x06, 0xE0, 0xA4, - 0xB0, 0xE0, 0xA4, 0xBC, 0x07, 0x06, 0xE0, 0xA4, - 0xB3, 0xE0, 0xA4, 0xBC, 0x07, 0x06, 0xE0, 0xB1, - 0x86, 0xE0, 0xB1, 0x96, 0x5B, 0x06, 0xE0, 0xB7, - 0x99, 0xE0, 0xB7, 0x8A, 0x09, 0x06, 0xE3, 0x81, - 0x86, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0x8B, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0x8D, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - // Bytes 3e00 - 3e3f - 0x8F, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0x91, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0x93, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0x95, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0x97, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0x99, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0x9B, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0x9D, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - // Bytes 3e40 - 3e7f - 0x9F, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0xA1, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0xA4, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0xA6, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0xA8, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0xAF, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0xAF, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x81, - 0xB2, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - // Bytes 3e80 - 3ebf - 0xB2, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x81, - 0xB5, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0xB5, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x81, - 0xB8, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0xB8, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x81, - 0xBB, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x81, - 0xBB, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x82, - 0x9D, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - // Bytes 3ec0 - 3eff - 0xA6, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xAB, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xAD, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xAF, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xB1, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xB3, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xB5, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xB7, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - // Bytes 3f00 - 3f3f - 0xB9, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xBB, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xBD, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x82, - 0xBF, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0x81, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0x84, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0x86, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0x88, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - // Bytes 3f40 - 3f7f - 0x8F, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0x8F, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x83, - 0x92, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0x92, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x83, - 0x95, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0x95, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x83, - 0x98, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0x98, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x83, - // Bytes 3f80 - 3fbf - 0x9B, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0x9B, 0xE3, 0x82, 0x9A, 0x08, 0x06, 0xE3, 0x83, - 0xAF, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0xB0, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0xB1, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0xB2, 0xE3, 0x82, 0x99, 0x08, 0x06, 0xE3, 0x83, - 0xBD, 0xE3, 0x82, 0x99, 0x08, 0x08, 0xCE, 0x91, - 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xF0, 0x08, - // Bytes 3fc0 - 3fff - 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, - 0xF0, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, - 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0x91, 0xCC, 0x94, - 0xCC, 0x80, 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0x91, - 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xF0, 0x08, - 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, - 0xF0, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, - 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0x97, 0xCC, 0x93, - // Bytes 4000 - 403f - 0xCC, 0x81, 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0x97, - 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xF0, 0x08, - 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, - 0xF0, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, - 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0x97, 0xCC, 0x94, - 0xCD, 0x82, 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0xA9, - 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xF0, 0x08, - 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, - // Bytes 4040 - 407f - 0xF0, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, - 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0xA9, 0xCC, 0x94, - 0xCC, 0x80, 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0xA9, - 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xF0, 0x08, - 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, - 0xF0, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, - 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0xB1, 0xCC, 0x93, - 0xCC, 0x81, 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0xB1, - // Bytes 4080 - 40bf - 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xF0, 0x08, - 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, - 0xF0, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, - 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0xB1, 0xCC, 0x94, - 0xCD, 0x82, 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0xB7, - 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xF0, 0x08, - 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, - 0xF0, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, - // Bytes 40c0 - 40ff - 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0xB7, 0xCC, 0x94, - 0xCC, 0x80, 0xCD, 0x85, 0xF0, 0x08, 0xCE, 0xB7, - 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xF0, 0x08, - 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, - 0xF0, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, - 0xCD, 0x85, 0xF0, 0x08, 0xCF, 0x89, 0xCC, 0x93, - 0xCC, 0x81, 0xCD, 0x85, 0xF0, 0x08, 0xCF, 0x89, - 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xF0, 0x08, - // Bytes 4100 - 413f - 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, - 0xF0, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, - 0xCD, 0x85, 0xF0, 0x08, 0xCF, 0x89, 0xCC, 0x94, - 0xCD, 0x82, 0xCD, 0x85, 0xF0, 0x08, 0xF0, 0x91, - 0x82, 0x99, 0xF0, 0x91, 0x82, 0xBA, 0x07, 0x08, - 0xF0, 0x91, 0x82, 0x9B, 0xF0, 0x91, 0x82, 0xBA, - 0x07, 0x08, 0xF0, 0x91, 0x82, 0xA5, 0xF0, 0x91, - 0x82, 0xBA, 0x07, 0x09, 0xE0, 0xB7, 0x99, 0xE0, - // Bytes 4140 - 417f - 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x09, 0x43, 0x20, - 0xCC, 0x81, 0xE6, 0x43, 0x20, 0xCC, 0x83, 0xE6, - 0x43, 0x20, 0xCC, 0x84, 0xE6, 0x43, 0x20, 0xCC, - 0x85, 0xE6, 0x43, 0x20, 0xCC, 0x86, 0xE6, 0x43, - 0x20, 0xCC, 0x87, 0xE6, 0x43, 0x20, 0xCC, 0x88, - 0xE6, 0x43, 0x20, 0xCC, 0x8A, 0xE6, 0x43, 0x20, - 0xCC, 0x8B, 0xE6, 0x43, 0x20, 0xCC, 0x93, 0xE6, - 0x43, 0x20, 0xCC, 0x94, 0xE6, 0x43, 0x20, 0xCC, - // Bytes 4180 - 41bf - 0xA7, 0xCA, 0x43, 0x20, 0xCC, 0xA8, 0xCA, 0x43, - 0x20, 0xCC, 0xB3, 0xDC, 0x43, 0x20, 0xCD, 0x82, - 0xE6, 0x43, 0x20, 0xCD, 0x85, 0xF0, 0x43, 0x20, - 0xD9, 0x8B, 0x1B, 0x43, 0x20, 0xD9, 0x8C, 0x1C, - 0x43, 0x20, 0xD9, 0x8D, 0x1D, 0x43, 0x20, 0xD9, - 0x8E, 0x1E, 0x43, 0x20, 0xD9, 0x8F, 0x1F, 0x43, - 0x20, 0xD9, 0x90, 0x20, 0x43, 0x20, 0xD9, 0x91, - 0x21, 0x43, 0x20, 0xD9, 0x92, 0x22, 0x43, 0x41, - // Bytes 41c0 - 41ff - 0xCC, 0x8A, 0xE6, 0x43, 0x73, 0xCC, 0x87, 0xE6, - 0x44, 0x20, 0xE3, 0x82, 0x99, 0x08, 0x44, 0x20, - 0xE3, 0x82, 0x9A, 0x08, 0x44, 0x44, 0x5A, 0xCC, - 0x8C, 0xE6, 0x44, 0x44, 0x7A, 0xCC, 0x8C, 0xE6, - 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xE6, 0x44, 0xC2, - 0xA8, 0xCC, 0x81, 0xE6, 0x44, 0xCE, 0x91, 0xCC, - 0x81, 0xE6, 0x44, 0xCE, 0x95, 0xCC, 0x81, 0xE6, - 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xE6, 0x44, 0xCE, - // Bytes 4200 - 423f - 0x99, 0xCC, 0x81, 0xE6, 0x44, 0xCE, 0x9F, 0xCC, - 0x81, 0xE6, 0x44, 0xCE, 0xA5, 0xCC, 0x81, 0xE6, - 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xE6, 0x44, 0xCE, - 0xA9, 0xCC, 0x81, 0xE6, 0x44, 0xCE, 0xB1, 0xCC, - 0x81, 0xE6, 0x44, 0xCE, 0xB5, 0xCC, 0x81, 0xE6, - 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xE6, 0x44, 0xCE, - 0xB9, 0xCC, 0x81, 0xE6, 0x44, 0xCE, 0xBF, 0xCC, - 0x81, 0xE6, 0x44, 0xCF, 0x85, 0xCC, 0x81, 0xE6, - // Bytes 4240 - 427f - 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xE6, 0x44, 0xD7, - 0x90, 0xD6, 0xB7, 0x11, 0x44, 0xD7, 0x90, 0xD6, - 0xB8, 0x12, 0x44, 0xD7, 0x90, 0xD6, 0xBC, 0x15, - 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x15, 0x44, 0xD7, - 0x91, 0xD6, 0xBF, 0x17, 0x44, 0xD7, 0x92, 0xD6, - 0xBC, 0x15, 0x44, 0xD7, 0x93, 0xD6, 0xBC, 0x15, - 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x15, 0x44, 0xD7, - 0x95, 0xD6, 0xB9, 0x13, 0x44, 0xD7, 0x95, 0xD6, - // Bytes 4280 - 42bf - 0xBC, 0x15, 0x44, 0xD7, 0x96, 0xD6, 0xBC, 0x15, - 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x15, 0x44, 0xD7, - 0x99, 0xD6, 0xB4, 0x0E, 0x44, 0xD7, 0x99, 0xD6, - 0xBC, 0x15, 0x44, 0xD7, 0x9A, 0xD6, 0xBC, 0x15, - 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x15, 0x44, 0xD7, - 0x9B, 0xD6, 0xBF, 0x17, 0x44, 0xD7, 0x9C, 0xD6, - 0xBC, 0x15, 0x44, 0xD7, 0x9E, 0xD6, 0xBC, 0x15, - 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x15, 0x44, 0xD7, - // Bytes 42c0 - 42ff - 0xA1, 0xD6, 0xBC, 0x15, 0x44, 0xD7, 0xA3, 0xD6, - 0xBC, 0x15, 0x44, 0xD7, 0xA4, 0xD6, 0xBC, 0x15, - 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x17, 0x44, 0xD7, - 0xA6, 0xD6, 0xBC, 0x15, 0x44, 0xD7, 0xA7, 0xD6, - 0xBC, 0x15, 0x44, 0xD7, 0xA8, 0xD6, 0xBC, 0x15, - 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x15, 0x44, 0xD7, - 0xA9, 0xD7, 0x81, 0x18, 0x44, 0xD7, 0xA9, 0xD7, - 0x82, 0x19, 0x44, 0xD7, 0xAA, 0xD6, 0xBC, 0x15, - // Bytes 4300 - 433f - 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x11, 0x44, 0xD8, - 0xA7, 0xD9, 0x8B, 0x1B, 0x44, 0xD8, 0xA7, 0xD9, - 0x93, 0xE6, 0x44, 0xD8, 0xA7, 0xD9, 0x94, 0xE6, - 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xDC, 0x44, 0xD8, - 0xB0, 0xD9, 0xB0, 0x23, 0x44, 0xD8, 0xB1, 0xD9, - 0xB0, 0x23, 0x44, 0xD9, 0x80, 0xD9, 0x8B, 0x1B, - 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x1E, 0x44, 0xD9, - 0x80, 0xD9, 0x8F, 0x1F, 0x44, 0xD9, 0x80, 0xD9, - // Bytes 4340 - 437f - 0x90, 0x20, 0x44, 0xD9, 0x80, 0xD9, 0x91, 0x21, - 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x22, 0x44, 0xD9, - 0x87, 0xD9, 0xB0, 0x23, 0x44, 0xD9, 0x88, 0xD9, - 0x94, 0xE6, 0x44, 0xD9, 0x89, 0xD9, 0xB0, 0x23, - 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xE6, 0x44, 0xDB, - 0x92, 0xD9, 0x94, 0xE6, 0x44, 0xDB, 0x95, 0xD9, - 0x94, 0xE6, 0x45, 0x20, 0xCC, 0x88, 0xCC, 0x80, - 0xE6, 0x45, 0x20, 0xCC, 0x88, 0xCC, 0x81, 0xE6, - // Bytes 4380 - 43bf - 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82, 0xE6, 0x45, - 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x45, 0x20, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x45, 0x20, 0xCC, - 0x93, 0xCD, 0x82, 0xE6, 0x45, 0x20, 0xCC, 0x94, - 0xCC, 0x80, 0xE6, 0x45, 0x20, 0xCC, 0x94, 0xCC, - 0x81, 0xE6, 0x45, 0x20, 0xCC, 0x94, 0xCD, 0x82, - 0xE6, 0x45, 0x20, 0xD9, 0x8C, 0xD9, 0x91, 0x21, - 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91, 0x21, 0x45, - // Bytes 43c0 - 43ff - 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x21, 0x45, 0x20, - 0xD9, 0x8F, 0xD9, 0x91, 0x21, 0x45, 0x20, 0xD9, - 0x90, 0xD9, 0x91, 0x21, 0x45, 0x20, 0xD9, 0x91, - 0xD9, 0xB0, 0x23, 0x45, 0xE2, 0xAB, 0x9D, 0xCC, - 0xB8, 0x01, 0x46, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, - 0x81, 0xE6, 0x46, 0xCF, 0x85, 0xCC, 0x88, 0xCC, - 0x81, 0xE6, 0x46, 0xD7, 0xA9, 0xD6, 0xBC, 0xD7, - 0x81, 0x18, 0x46, 0xD7, 0xA9, 0xD6, 0xBC, 0xD7, - // Bytes 4400 - 443f - 0x82, 0x19, 0x46, 0xD9, 0x80, 0xD9, 0x8E, 0xD9, - 0x91, 0x21, 0x46, 0xD9, 0x80, 0xD9, 0x8F, 0xD9, - 0x91, 0x21, 0x46, 0xD9, 0x80, 0xD9, 0x90, 0xD9, - 0x91, 0x21, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, - 0x93, 0xE6, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, - 0x94, 0xE6, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, - 0x95, 0xDC, 0x46, 0xE0, 0xA4, 0x95, 0xE0, 0xA4, - 0xBC, 0x07, 0x46, 0xE0, 0xA4, 0x96, 0xE0, 0xA4, - // Bytes 4440 - 447f - 0xBC, 0x07, 0x46, 0xE0, 0xA4, 0x97, 0xE0, 0xA4, - 0xBC, 0x07, 0x46, 0xE0, 0xA4, 0x9C, 0xE0, 0xA4, - 0xBC, 0x07, 0x46, 0xE0, 0xA4, 0xA1, 0xE0, 0xA4, - 0xBC, 0x07, 0x46, 0xE0, 0xA4, 0xA2, 0xE0, 0xA4, - 0xBC, 0x07, 0x46, 0xE0, 0xA4, 0xAB, 0xE0, 0xA4, - 0xBC, 0x07, 0x46, 0xE0, 0xA4, 0xAF, 0xE0, 0xA4, - 0xBC, 0x07, 0x46, 0xE0, 0xA6, 0xA1, 0xE0, 0xA6, - 0xBC, 0x07, 0x46, 0xE0, 0xA6, 0xA2, 0xE0, 0xA6, - // Bytes 4480 - 44bf - 0xBC, 0x07, 0x46, 0xE0, 0xA6, 0xAF, 0xE0, 0xA6, - 0xBC, 0x07, 0x46, 0xE0, 0xA8, 0x96, 0xE0, 0xA8, - 0xBC, 0x07, 0x46, 0xE0, 0xA8, 0x97, 0xE0, 0xA8, - 0xBC, 0x07, 0x46, 0xE0, 0xA8, 0x9C, 0xE0, 0xA8, - 0xBC, 0x07, 0x46, 0xE0, 0xA8, 0xAB, 0xE0, 0xA8, - 0xBC, 0x07, 0x46, 0xE0, 0xA8, 0xB2, 0xE0, 0xA8, - 0xBC, 0x07, 0x46, 0xE0, 0xA8, 0xB8, 0xE0, 0xA8, - 0xBC, 0x07, 0x46, 0xE0, 0xAC, 0xA1, 0xE0, 0xAC, - // Bytes 44c0 - 44ff - 0xBC, 0x07, 0x46, 0xE0, 0xAC, 0xA2, 0xE0, 0xAC, - 0xBC, 0x07, 0x46, 0xE0, 0xBE, 0xB2, 0xE0, 0xBE, - 0x80, 0x82, 0x46, 0xE0, 0xBE, 0xB3, 0xE0, 0xBE, - 0x80, 0x82, 0x46, 0xE3, 0x83, 0x86, 0xE3, 0x82, - 0x99, 0x08, 0x48, 0xF0, 0x9D, 0x85, 0x97, 0xF0, - 0x9D, 0x85, 0xA5, 0xD8, 0x48, 0xF0, 0x9D, 0x85, - 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xD8, 0x48, 0xF0, - 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xD8, - // Bytes 4500 - 453f - 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, - 0xA5, 0xD8, 0x49, 0xE0, 0xBE, 0xB2, 0xE0, 0xBD, - 0xB1, 0xE0, 0xBE, 0x80, 0x82, 0x49, 0xE0, 0xBE, - 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x82, - 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, - 0x82, 0x99, 0x08, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, - 0x82, 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, - 0x08, 0x4C, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, - // Bytes 4540 - 457f - 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x08, 0x4C, - 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, - 0x88, 0xE3, 0x82, 0x99, 0x08, 0x4C, 0xF0, 0x9D, - 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, - 0x85, 0xAE, 0xD8, 0x4C, 0xF0, 0x9D, 0x85, 0x98, - 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, - 0xD8, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, - 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB0, 0xD8, 0x4C, - // Bytes 4580 - 45bf - 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, - 0xF0, 0x9D, 0x85, 0xB1, 0xD8, 0x4C, 0xF0, 0x9D, - 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, - 0x85, 0xB2, 0xD8, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, - 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, - 0xD8, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, - 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xD8, 0x4C, - 0xF0, 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, - // Bytes 45c0 - 45ff - 0xF0, 0x9D, 0x85, 0xAE, 0xD8, 0x4C, 0xF0, 0x9D, - 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, - 0x85, 0xAF, 0xD8, 0x4F, 0xE3, 0x82, 0xA4, 0xE3, - 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xAF, - 0xE3, 0x82, 0x99, 0x08, 0x4F, 0xE3, 0x82, 0xB7, - 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, - 0xAF, 0xE3, 0x82, 0x99, 0x08, 0x4F, 0xE3, 0x83, - 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, - // Bytes 4600 - 463f - 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x08, 0x4F, 0xE3, - 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, - 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x08, 0x52, - 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3, 0x82, - 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, - 0x82, 0x99, 0x08, 0x52, 0xE3, 0x83, 0x95, 0xE3, - 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, - 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x08, 0x83, - // Bytes 4640 - 467f - 0x41, 0xCC, 0x82, 0xE6, 0x83, 0x41, 0xCC, 0x86, - 0xE6, 0x83, 0x41, 0xCC, 0x87, 0xE6, 0x83, 0x41, - 0xCC, 0x88, 0xE6, 0x83, 0x41, 0xCC, 0x8A, 0xE6, - 0x83, 0x41, 0xCC, 0xA3, 0xDC, 0x83, 0x43, 0xCC, - 0xA7, 0xCA, 0x83, 0x45, 0xCC, 0x82, 0xE6, 0x83, - 0x45, 0xCC, 0x84, 0xE6, 0x83, 0x45, 0xCC, 0xA3, - 0xDC, 0x83, 0x45, 0xCC, 0xA7, 0xCA, 0x83, 0x49, - 0xCC, 0x88, 0xE6, 0x83, 0x4C, 0xCC, 0xA3, 0xDC, - // Bytes 4680 - 46bf - 0x83, 0x4F, 0xCC, 0x82, 0xE6, 0x83, 0x4F, 0xCC, - 0x83, 0xE6, 0x83, 0x4F, 0xCC, 0x84, 0xE6, 0x83, - 0x4F, 0xCC, 0x87, 0xE6, 0x83, 0x4F, 0xCC, 0x88, - 0xE6, 0x83, 0x4F, 0xCC, 0x9B, 0xD8, 0x83, 0x4F, - 0xCC, 0xA3, 0xDC, 0x83, 0x4F, 0xCC, 0xA8, 0xCA, - 0x83, 0x52, 0xCC, 0xA3, 0xDC, 0x83, 0x53, 0xCC, - 0x81, 0xE6, 0x83, 0x53, 0xCC, 0x8C, 0xE6, 0x83, - 0x53, 0xCC, 0xA3, 0xDC, 0x83, 0x55, 0xCC, 0x83, - // Bytes 46c0 - 46ff - 0xE6, 0x83, 0x55, 0xCC, 0x84, 0xE6, 0x83, 0x55, - 0xCC, 0x88, 0xE6, 0x83, 0x55, 0xCC, 0x9B, 0xD8, - 0x83, 0x61, 0xCC, 0x82, 0xE6, 0x83, 0x61, 0xCC, - 0x86, 0xE6, 0x83, 0x61, 0xCC, 0x87, 0xE6, 0x83, - 0x61, 0xCC, 0x88, 0xE6, 0x83, 0x61, 0xCC, 0x8A, - 0xE6, 0x83, 0x61, 0xCC, 0xA3, 0xDC, 0x83, 0x63, - 0xCC, 0xA7, 0xCA, 0x83, 0x65, 0xCC, 0x82, 0xE6, - 0x83, 0x65, 0xCC, 0x84, 0xE6, 0x83, 0x65, 0xCC, - // Bytes 4700 - 473f - 0xA3, 0xDC, 0x83, 0x65, 0xCC, 0xA7, 0xCA, 0x83, - 0x69, 0xCC, 0x88, 0xE6, 0x83, 0x6C, 0xCC, 0xA3, - 0xDC, 0x83, 0x6F, 0xCC, 0x82, 0xE6, 0x83, 0x6F, - 0xCC, 0x83, 0xE6, 0x83, 0x6F, 0xCC, 0x84, 0xE6, - 0x83, 0x6F, 0xCC, 0x87, 0xE6, 0x83, 0x6F, 0xCC, - 0x88, 0xE6, 0x83, 0x6F, 0xCC, 0x9B, 0xD8, 0x83, - 0x6F, 0xCC, 0xA3, 0xDC, 0x83, 0x6F, 0xCC, 0xA8, - 0xCA, 0x83, 0x72, 0xCC, 0xA3, 0xDC, 0x83, 0x73, - // Bytes 4740 - 477f - 0xCC, 0x81, 0xE6, 0x83, 0x73, 0xCC, 0x8C, 0xE6, - 0x83, 0x73, 0xCC, 0xA3, 0xDC, 0x83, 0x75, 0xCC, - 0x83, 0xE6, 0x83, 0x75, 0xCC, 0x84, 0xE6, 0x83, - 0x75, 0xCC, 0x88, 0xE6, 0x83, 0x75, 0xCC, 0x9B, - 0xD8, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xE6, 0x84, - 0xCE, 0x91, 0xCC, 0x94, 0xE6, 0x84, 0xCE, 0x95, - 0xCC, 0x93, 0xE6, 0x84, 0xCE, 0x95, 0xCC, 0x94, - 0xE6, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xE6, 0x84, - // Bytes 4780 - 47bf - 0xCE, 0x97, 0xCC, 0x94, 0xE6, 0x84, 0xCE, 0x99, - 0xCC, 0x93, 0xE6, 0x84, 0xCE, 0x99, 0xCC, 0x94, - 0xE6, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xE6, 0x84, - 0xCE, 0x9F, 0xCC, 0x94, 0xE6, 0x84, 0xCE, 0xA5, - 0xCC, 0x94, 0xE6, 0x84, 0xCE, 0xA9, 0xCC, 0x93, - 0xE6, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xE6, 0x84, - 0xCE, 0xB1, 0xCC, 0x80, 0xE6, 0x84, 0xCE, 0xB1, - 0xCC, 0x81, 0xE6, 0x84, 0xCE, 0xB1, 0xCC, 0x93, - // Bytes 47c0 - 47ff - 0xE6, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xE6, 0x84, - 0xCE, 0xB1, 0xCD, 0x82, 0xE6, 0x84, 0xCE, 0xB5, - 0xCC, 0x93, 0xE6, 0x84, 0xCE, 0xB5, 0xCC, 0x94, - 0xE6, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xE6, 0x84, - 0xCE, 0xB7, 0xCC, 0x81, 0xE6, 0x84, 0xCE, 0xB7, - 0xCC, 0x93, 0xE6, 0x84, 0xCE, 0xB7, 0xCC, 0x94, - 0xE6, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xE6, 0x84, - 0xCE, 0xB9, 0xCC, 0x88, 0xE6, 0x84, 0xCE, 0xB9, - // Bytes 4800 - 483f - 0xCC, 0x93, 0xE6, 0x84, 0xCE, 0xB9, 0xCC, 0x94, - 0xE6, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xE6, 0x84, - 0xCE, 0xBF, 0xCC, 0x94, 0xE6, 0x84, 0xCF, 0x85, - 0xCC, 0x88, 0xE6, 0x84, 0xCF, 0x85, 0xCC, 0x93, - 0xE6, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xE6, 0x84, - 0xCF, 0x89, 0xCC, 0x80, 0xE6, 0x84, 0xCF, 0x89, - 0xCC, 0x81, 0xE6, 0x84, 0xCF, 0x89, 0xCC, 0x93, - 0xE6, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xE6, 0x84, - // Bytes 4840 - 487f - 0xCF, 0x89, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0x91, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0x91, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0x91, - 0xCC, 0x93, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0x91, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0x91, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0x91, - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0x97, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0x97, - // Bytes 4880 - 48bf - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0x97, - 0xCC, 0x93, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0x97, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0x97, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0x97, - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0xA9, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0xA9, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0xA9, - 0xCC, 0x93, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0xA9, - // Bytes 48c0 - 48ff - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0xA9, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0xA9, - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0xB1, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0xB1, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0xB1, - 0xCC, 0x93, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0xB1, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0xB1, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0xB1, - // Bytes 4900 - 493f - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0xB7, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0xB7, - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0xB7, - 0xCC, 0x93, 0xCD, 0x82, 0xE6, 0x86, 0xCE, 0xB7, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x86, 0xCE, 0xB7, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x86, 0xCE, 0xB7, - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x86, 0xCF, 0x89, - 0xCC, 0x93, 0xCC, 0x80, 0xE6, 0x86, 0xCF, 0x89, - // Bytes 4940 - 497f - 0xCC, 0x93, 0xCC, 0x81, 0xE6, 0x86, 0xCF, 0x89, - 0xCC, 0x93, 0xCD, 0x82, 0xE6, 0x86, 0xCF, 0x89, - 0xCC, 0x94, 0xCC, 0x80, 0xE6, 0x86, 0xCF, 0x89, - 0xCC, 0x94, 0xCC, 0x81, 0xE6, 0x86, 0xCF, 0x89, - 0xCC, 0x94, 0xCD, 0x82, 0xE6, 0x42, 0xCC, 0x80, - 0xE6, 0xE6, 0x42, 0xCC, 0x81, 0xE6, 0xE6, 0x42, - 0xCC, 0x93, 0xE6, 0xE6, 0x43, 0xE3, 0x82, 0x99, - 0x08, 0x08, 0x43, 0xE3, 0x82, 0x9A, 0x08, 0x08, - // Bytes 4980 - 49bf - 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xE6, 0xE6, 0x46, - 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, 0xB2, 0x82, 0x81, - 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0x84, - 0x81, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, - 0x82, 0x81, -} - -// nfcValues: 2944 entries, 5888 bytes -// Block 2 is the null block. -var nfcValues = [2944]uint16{ - // Block 0x0, offset 0x0 - 0x003c: 0x8800, 0x003d: 0x8800, 0x003e: 0x8800, - // Block 0x1, offset 0x40 - 0x0041: 0x8800, 0x0042: 0x8800, 0x0043: 0x8800, 0x0044: 0x8800, 0x0045: 0x8800, - 0x0046: 0x8800, 0x0047: 0x8800, 0x0048: 0x8800, 0x0049: 0x8800, 0x004a: 0x8800, 0x004b: 0x8800, - 0x004c: 0x8800, 0x004d: 0x8800, 0x004e: 0x8800, 0x004f: 0x8800, 0x0050: 0x8800, - 0x0052: 0x8800, 0x0053: 0x8800, 0x0054: 0x8800, 0x0055: 0x8800, 0x0056: 0x8800, 0x0057: 0x8800, - 0x0058: 0x8800, 0x0059: 0x8800, 0x005a: 0x8800, - 0x0061: 0x8800, 0x0062: 0x8800, 0x0063: 0x8800, - 0x0064: 0x8800, 0x0065: 0x8800, 0x0066: 0x8800, 0x0067: 0x8800, 0x0068: 0x8800, 0x0069: 0x8800, - 0x006a: 0x8800, 0x006b: 0x8800, 0x006c: 0x8800, 0x006d: 0x8800, 0x006e: 0x8800, 0x006f: 0x8800, - 0x0070: 0x8800, 0x0072: 0x8800, 0x0073: 0x8800, 0x0074: 0x8800, 0x0075: 0x8800, - 0x0076: 0x8800, 0x0077: 0x8800, 0x0078: 0x8800, 0x0079: 0x8800, 0x007a: 0x8800, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x00c0: 0x2e54, 0x00c1: 0x2e59, 0x00c2: 0x463f, 0x00c3: 0x2e5e, 0x00c4: 0x464e, 0x00c5: 0x4653, - 0x00c6: 0x8800, 0x00c7: 0x465d, 0x00c8: 0x2ec7, 0x00c9: 0x2ecc, 0x00ca: 0x4662, 0x00cb: 0x2ee0, - 0x00cc: 0x2f53, 0x00cd: 0x2f58, 0x00ce: 0x2f5d, 0x00cf: 0x4676, 0x00d1: 0x2fe9, - 0x00d2: 0x300c, 0x00d3: 0x3011, 0x00d4: 0x4680, 0x00d5: 0x4685, 0x00d6: 0x4694, - 0x00d8: 0x8800, 0x00d9: 0x3098, 0x00da: 0x309d, 0x00db: 0x30a2, 0x00dc: 0x46c6, 0x00dd: 0x311a, - 0x00e0: 0x3160, 0x00e1: 0x3165, 0x00e2: 0x46d0, 0x00e3: 0x316a, - 0x00e4: 0x46df, 0x00e5: 0x46e4, 0x00e6: 0x8800, 0x00e7: 0x46ee, 0x00e8: 0x31d3, 0x00e9: 0x31d8, - 0x00ea: 0x46f3, 0x00eb: 0x31ec, 0x00ec: 0x3264, 0x00ed: 0x3269, 0x00ee: 0x326e, 0x00ef: 0x4707, - 0x00f1: 0x32fa, 0x00f2: 0x331d, 0x00f3: 0x3322, 0x00f4: 0x4711, 0x00f5: 0x4716, - 0x00f6: 0x4725, 0x00f8: 0x8800, 0x00f9: 0x33ae, 0x00fa: 0x33b3, 0x00fb: 0x33b8, - 0x00fc: 0x4757, 0x00fd: 0x3435, 0x00ff: 0x344e, - // Block 0x4, offset 0x100 - 0x0100: 0x2e63, 0x0101: 0x316f, 0x0102: 0x4644, 0x0103: 0x46d5, 0x0104: 0x2e81, 0x0105: 0x318d, - 0x0106: 0x2e95, 0x0107: 0x31a1, 0x0108: 0x2e9a, 0x0109: 0x31a6, 0x010a: 0x2e9f, 0x010b: 0x31ab, - 0x010c: 0x2ea4, 0x010d: 0x31b0, 0x010e: 0x2eae, 0x010f: 0x31ba, - 0x0112: 0x4667, 0x0113: 0x46f8, 0x0114: 0x2ed6, 0x0115: 0x31e2, 0x0116: 0x2edb, 0x0117: 0x31e7, - 0x0118: 0x2ef9, 0x0119: 0x3205, 0x011a: 0x2eea, 0x011b: 0x31f6, 0x011c: 0x2f12, 0x011d: 0x321e, - 0x011e: 0x2f1c, 0x011f: 0x3228, 0x0120: 0x2f21, 0x0121: 0x322d, 0x0122: 0x2f2b, 0x0123: 0x3237, - 0x0124: 0x2f30, 0x0125: 0x323c, 0x0128: 0x2f62, 0x0129: 0x3273, - 0x012a: 0x2f67, 0x012b: 0x3278, 0x012c: 0x2f6c, 0x012d: 0x327d, 0x012e: 0x2f8f, 0x012f: 0x329b, - 0x0130: 0x2f71, 0x0134: 0x2f99, 0x0135: 0x32a5, - 0x0136: 0x2fad, 0x0137: 0x32be, 0x0139: 0x2fb7, 0x013a: 0x32c8, 0x013b: 0x2fc1, - 0x013c: 0x32d2, 0x013d: 0x2fbc, 0x013e: 0x32cd, - // Block 0x5, offset 0x140 - 0x0143: 0x2fe4, 0x0144: 0x32f5, 0x0145: 0x2ffd, - 0x0146: 0x330e, 0x0147: 0x2ff3, 0x0148: 0x3304, - 0x014c: 0x468a, 0x014d: 0x471b, 0x014e: 0x3016, 0x014f: 0x3327, 0x0150: 0x3020, 0x0151: 0x3331, - 0x0154: 0x303e, 0x0155: 0x334f, 0x0156: 0x3057, 0x0157: 0x3368, - 0x0158: 0x3048, 0x0159: 0x3359, 0x015a: 0x46ad, 0x015b: 0x473e, 0x015c: 0x3061, 0x015d: 0x3372, - 0x015e: 0x3070, 0x015f: 0x3381, 0x0160: 0x46b2, 0x0161: 0x4743, 0x0162: 0x3089, 0x0163: 0x339f, - 0x0164: 0x307a, 0x0165: 0x3390, 0x0168: 0x46bc, 0x0169: 0x474d, - 0x016a: 0x46c1, 0x016b: 0x4752, 0x016c: 0x30a7, 0x016d: 0x33bd, 0x016e: 0x30b1, 0x016f: 0x33c7, - 0x0170: 0x30b6, 0x0171: 0x33cc, 0x0172: 0x30d4, 0x0173: 0x33ea, 0x0174: 0x30f7, 0x0175: 0x340d, - 0x0176: 0x311f, 0x0177: 0x343a, 0x0178: 0x3133, 0x0179: 0x3142, 0x017a: 0x3462, 0x017b: 0x314c, - 0x017c: 0x346c, 0x017d: 0x3151, 0x017e: 0x3471, 0x017f: 0x8800, - // Block 0x6, offset 0x180 - 0x018d: 0x2e6d, 0x018e: 0x3179, 0x018f: 0x2f7b, 0x0190: 0x3287, 0x0191: 0x3025, - 0x0192: 0x3336, 0x0193: 0x30bb, 0x0194: 0x33d1, 0x0195: 0x38b4, 0x0196: 0x3a43, 0x0197: 0x38ad, - 0x0198: 0x3a3c, 0x0199: 0x38bb, 0x019a: 0x3a4a, 0x019b: 0x38a6, 0x019c: 0x3a35, - 0x019e: 0x3795, 0x019f: 0x3924, 0x01a0: 0x378e, 0x01a1: 0x391d, 0x01a2: 0x3498, 0x01a3: 0x34aa, - 0x01a6: 0x2f26, 0x01a7: 0x3232, 0x01a8: 0x2fa3, 0x01a9: 0x32b4, - 0x01aa: 0x46a3, 0x01ab: 0x4734, 0x01ac: 0x3875, 0x01ad: 0x3a04, 0x01ae: 0x34bc, 0x01af: 0x34c2, - 0x01b0: 0x32aa, 0x01b4: 0x2f0d, 0x01b5: 0x3219, - 0x01b8: 0x2fdf, 0x01b9: 0x32f0, 0x01ba: 0x379c, 0x01bb: 0x392b, - 0x01bc: 0x3492, 0x01bd: 0x34a4, 0x01be: 0x349e, 0x01bf: 0x34b0, - // Block 0x7, offset 0x1c0 - 0x01c0: 0x2e72, 0x01c1: 0x317e, 0x01c2: 0x2e77, 0x01c3: 0x3183, 0x01c4: 0x2eef, 0x01c5: 0x31fb, - 0x01c6: 0x2ef4, 0x01c7: 0x3200, 0x01c8: 0x2f80, 0x01c9: 0x328c, 0x01ca: 0x2f85, 0x01cb: 0x3291, - 0x01cc: 0x302a, 0x01cd: 0x333b, 0x01ce: 0x302f, 0x01cf: 0x3340, 0x01d0: 0x304d, 0x01d1: 0x335e, - 0x01d2: 0x3052, 0x01d3: 0x3363, 0x01d4: 0x30c0, 0x01d5: 0x33d6, 0x01d6: 0x30c5, 0x01d7: 0x33db, - 0x01d8: 0x306b, 0x01d9: 0x337c, 0x01da: 0x3084, 0x01db: 0x339a, - 0x01de: 0x2f3f, 0x01df: 0x324b, - 0x01e6: 0x4649, 0x01e7: 0x46da, 0x01e8: 0x4671, 0x01e9: 0x4702, - 0x01ea: 0x3844, 0x01eb: 0x39d3, 0x01ec: 0x3821, 0x01ed: 0x39b0, 0x01ee: 0x468f, 0x01ef: 0x4720, - 0x01f0: 0x383d, 0x01f1: 0x39cc, 0x01f2: 0x3129, 0x01f3: 0x3444, - // Block 0x8, offset 0x200 - 0x0200: 0x86e6, 0x0201: 0x86e6, 0x0202: 0x86e6, 0x0203: 0x86e6, 0x0204: 0x86e6, 0x0205: 0x80e6, - 0x0206: 0x86e6, 0x0207: 0x86e6, 0x0208: 0x86e6, 0x0209: 0x86e6, 0x020a: 0x86e6, 0x020b: 0x86e6, - 0x020c: 0x86e6, 0x020d: 0x80e6, 0x020e: 0x80e6, 0x020f: 0x86e6, 0x0210: 0x80e6, 0x0211: 0x86e6, - 0x0212: 0x80e6, 0x0213: 0x86e6, 0x0214: 0x86e6, 0x0215: 0x80e8, 0x0216: 0x80dc, 0x0217: 0x80dc, - 0x0218: 0x80dc, 0x0219: 0x80dc, 0x021a: 0x80e8, 0x021b: 0x86d8, 0x021c: 0x80dc, 0x021d: 0x80dc, - 0x021e: 0x80dc, 0x021f: 0x80dc, 0x0220: 0x80dc, 0x0221: 0x80ca, 0x0222: 0x80ca, 0x0223: 0x86dc, - 0x0224: 0x86dc, 0x0225: 0x86dc, 0x0226: 0x86dc, 0x0227: 0x86ca, 0x0228: 0x86ca, 0x0229: 0x80dc, - 0x022a: 0x80dc, 0x022b: 0x80dc, 0x022c: 0x80dc, 0x022d: 0x86dc, 0x022e: 0x86dc, 0x022f: 0x80dc, - 0x0230: 0x86dc, 0x0231: 0x86dc, 0x0232: 0x80dc, 0x0233: 0x80dc, 0x0234: 0x8001, 0x0235: 0x8001, - 0x0236: 0x8001, 0x0237: 0x8001, 0x0238: 0x8601, 0x0239: 0x80dc, 0x023a: 0x80dc, 0x023b: 0x80dc, - 0x023c: 0x80dc, 0x023d: 0x80e6, 0x023e: 0x80e6, 0x023f: 0x80e6, - // Block 0x9, offset 0x240 - 0x0240: 0x4965, 0x0241: 0x496a, 0x0242: 0x86e6, 0x0243: 0x496f, 0x0244: 0x4980, 0x0245: 0x86f0, - 0x0246: 0x80e6, 0x0247: 0x80dc, 0x0248: 0x80dc, 0x0249: 0x80dc, 0x024a: 0x80e6, 0x024b: 0x80e6, - 0x024c: 0x80e6, 0x024d: 0x80dc, 0x024e: 0x80dc, 0x0250: 0x80e6, 0x0251: 0x80e6, - 0x0252: 0x80e6, 0x0253: 0x80dc, 0x0254: 0x80dc, 0x0255: 0x80dc, 0x0256: 0x80dc, 0x0257: 0x80e6, - 0x0258: 0x80e8, 0x0259: 0x80dc, 0x025a: 0x80dc, 0x025b: 0x80e6, 0x025c: 0x80e9, 0x025d: 0x80ea, - 0x025e: 0x80ea, 0x025f: 0x80e9, 0x0260: 0x80ea, 0x0261: 0x80ea, 0x0262: 0x80e9, 0x0263: 0x80e6, - 0x0264: 0x80e6, 0x0265: 0x80e6, 0x0266: 0x80e6, 0x0267: 0x80e6, 0x0268: 0x80e6, 0x0269: 0x80e6, - 0x026a: 0x80e6, 0x026b: 0x80e6, 0x026c: 0x80e6, 0x026d: 0x80e6, 0x026e: 0x80e6, 0x026f: 0x80e6, - 0x0274: 0x042d, - 0x027e: 0x0105, - // Block 0xa, offset 0x280 - 0x0285: 0x3486, - 0x0286: 0x34ce, 0x0287: 0x0394, 0x0288: 0x34ec, 0x0289: 0x34f8, 0x028a: 0x350a, - 0x028c: 0x3528, 0x028e: 0x353a, 0x028f: 0x3558, 0x0290: 0x3ced, 0x0291: 0x8800, - 0x0295: 0x8800, 0x0297: 0x8800, - 0x0299: 0x8800, - 0x029f: 0x8800, 0x02a1: 0x8800, - 0x02a5: 0x8800, 0x02a9: 0x8800, - 0x02aa: 0x351c, 0x02ab: 0x354c, 0x02ac: 0x47b5, 0x02ad: 0x357c, 0x02ae: 0x47df, 0x02af: 0x358e, - 0x02b0: 0x3d55, 0x02b1: 0x8800, 0x02b5: 0x8800, - 0x02b7: 0x8800, 0x02b9: 0x8800, - 0x02bf: 0x8800, - // Block 0xb, offset 0x2c0 - 0x02c0: 0x3606, 0x02c1: 0x3612, 0x02c3: 0x3600, - 0x02c6: 0x8800, 0x02c7: 0x35ee, - 0x02cc: 0x3642, 0x02cd: 0x362a, 0x02ce: 0x3654, 0x02d0: 0x8800, - 0x02d3: 0x8800, 0x02d5: 0x8800, 0x02d6: 0x8800, 0x02d7: 0x8800, - 0x02d8: 0x8800, 0x02d9: 0x3636, 0x02da: 0x8800, - 0x02de: 0x8800, 0x02e3: 0x8800, - 0x02e7: 0x8800, - 0x02eb: 0x8800, 0x02ed: 0x8800, - 0x02f0: 0x8800, 0x02f3: 0x8800, 0x02f5: 0x8800, - 0x02f6: 0x8800, 0x02f7: 0x8800, 0x02f8: 0x8800, 0x02f9: 0x36ba, 0x02fa: 0x8800, - 0x02fe: 0x8800, - // Block 0xc, offset 0x300 - 0x0301: 0x3618, 0x0302: 0x369c, - 0x0310: 0x35f4, 0x0311: 0x3678, - 0x0312: 0x35fa, 0x0313: 0x367e, 0x0316: 0x360c, 0x0317: 0x3690, - 0x0318: 0x8800, 0x0319: 0x8800, 0x031a: 0x370e, 0x031b: 0x3714, 0x031c: 0x361e, 0x031d: 0x36a2, - 0x031e: 0x3624, 0x031f: 0x36a8, 0x0322: 0x3630, 0x0323: 0x36b4, - 0x0324: 0x363c, 0x0325: 0x36c0, 0x0326: 0x3648, 0x0327: 0x36cc, 0x0328: 0x8800, 0x0329: 0x8800, - 0x032a: 0x371a, 0x032b: 0x3720, 0x032c: 0x3672, 0x032d: 0x36f6, 0x032e: 0x364e, 0x032f: 0x36d2, - 0x0330: 0x365a, 0x0331: 0x36de, 0x0332: 0x3660, 0x0333: 0x36e4, 0x0334: 0x3666, 0x0335: 0x36ea, - 0x0338: 0x366c, 0x0339: 0x36f0, - // Block 0xd, offset 0x340 - 0x0351: 0x80dc, - 0x0352: 0x80e6, 0x0353: 0x80e6, 0x0354: 0x80e6, 0x0355: 0x80e6, 0x0356: 0x80dc, 0x0357: 0x80e6, - 0x0358: 0x80e6, 0x0359: 0x80e6, 0x035a: 0x80de, 0x035b: 0x80dc, 0x035c: 0x80e6, 0x035d: 0x80e6, - 0x035e: 0x80e6, 0x035f: 0x80e6, 0x0360: 0x80e6, 0x0361: 0x80e6, 0x0362: 0x80dc, 0x0363: 0x80dc, - 0x0364: 0x80dc, 0x0365: 0x80dc, 0x0366: 0x80dc, 0x0367: 0x80dc, 0x0368: 0x80e6, 0x0369: 0x80e6, - 0x036a: 0x80dc, 0x036b: 0x80e6, 0x036c: 0x80e6, 0x036d: 0x80de, 0x036e: 0x80e4, 0x036f: 0x80e6, - 0x0370: 0x800a, 0x0371: 0x800b, 0x0372: 0x800c, 0x0373: 0x800d, 0x0374: 0x800e, 0x0375: 0x800f, - 0x0376: 0x8010, 0x0377: 0x8011, 0x0378: 0x8012, 0x0379: 0x8013, 0x037a: 0x8013, 0x037b: 0x8014, - 0x037c: 0x8015, 0x037d: 0x8016, 0x037f: 0x8017, - // Block 0xe, offset 0x380 - 0x0388: 0x8800, 0x038a: 0x8800, 0x038b: 0x801b, - 0x038c: 0x801c, 0x038d: 0x801d, 0x038e: 0x801e, 0x038f: 0x801f, 0x0390: 0x8020, 0x0391: 0x8021, - 0x0392: 0x8022, 0x0393: 0x86e6, 0x0394: 0x86e6, 0x0395: 0x86dc, 0x0396: 0x80dc, 0x0397: 0x80e6, - 0x0398: 0x80e6, 0x0399: 0x80e6, 0x039a: 0x80e6, 0x039b: 0x80e6, 0x039c: 0x80dc, 0x039d: 0x80e6, - 0x039e: 0x80e6, 0x039f: 0x80dc, - 0x03b0: 0x8023, - // Block 0xf, offset 0x3c0 - 0x03c5: 0x8800, - 0x03c6: 0x0078, 0x03c7: 0x8800, 0x03c8: 0x007f, 0x03c9: 0x8800, 0x03ca: 0x0086, 0x03cb: 0x8800, - 0x03cc: 0x008d, 0x03cd: 0x8800, 0x03ce: 0x0094, 0x03d1: 0x8800, - 0x03d2: 0x009b, - 0x03f4: 0x8007, 0x03f5: 0x8600, - 0x03fa: 0x8800, 0x03fb: 0x00a2, - 0x03fc: 0x8800, 0x03fd: 0x00a9, 0x03fe: 0x8800, 0x03ff: 0x8800, - // Block 0x10, offset 0x400 - 0x0400: 0x2e7c, 0x0401: 0x3188, 0x0402: 0x2e86, 0x0403: 0x3192, 0x0404: 0x2e8b, 0x0405: 0x3197, - 0x0406: 0x2e90, 0x0407: 0x319c, 0x0408: 0x37b1, 0x0409: 0x3940, 0x040a: 0x2ea9, 0x040b: 0x31b5, - 0x040c: 0x2eb3, 0x040d: 0x31bf, 0x040e: 0x2ec2, 0x040f: 0x31ce, 0x0410: 0x2eb8, 0x0411: 0x31c4, - 0x0412: 0x2ebd, 0x0413: 0x31c9, 0x0414: 0x37d4, 0x0415: 0x3963, 0x0416: 0x37db, 0x0417: 0x396a, - 0x0418: 0x2efe, 0x0419: 0x320a, 0x041a: 0x2f03, 0x041b: 0x320f, 0x041c: 0x37e9, 0x041d: 0x3978, - 0x041e: 0x2f08, 0x041f: 0x3214, 0x0420: 0x2f17, 0x0421: 0x3223, 0x0422: 0x2f35, 0x0423: 0x3241, - 0x0424: 0x2f44, 0x0425: 0x3250, 0x0426: 0x2f3a, 0x0427: 0x3246, 0x0428: 0x2f49, 0x0429: 0x3255, - 0x042a: 0x2f4e, 0x042b: 0x325a, 0x042c: 0x2f94, 0x042d: 0x32a0, 0x042e: 0x37f0, 0x042f: 0x397f, - 0x0430: 0x2f9e, 0x0431: 0x32af, 0x0432: 0x2fa8, 0x0433: 0x32b9, 0x0434: 0x2fb2, 0x0435: 0x32c3, - 0x0436: 0x467b, 0x0437: 0x470c, 0x0438: 0x37f7, 0x0439: 0x3986, 0x043a: 0x2fcb, 0x043b: 0x32dc, - 0x043c: 0x2fc6, 0x043d: 0x32d7, 0x043e: 0x2fd0, 0x043f: 0x32e1, - // Block 0x11, offset 0x440 - 0x0440: 0x2fd5, 0x0441: 0x32e6, 0x0442: 0x2fda, 0x0443: 0x32eb, 0x0444: 0x2fee, 0x0445: 0x32ff, - 0x0446: 0x2ff8, 0x0447: 0x3309, 0x0448: 0x3007, 0x0449: 0x3318, 0x044a: 0x3002, 0x044b: 0x3313, - 0x044c: 0x381a, 0x044d: 0x39a9, 0x044e: 0x3828, 0x044f: 0x39b7, 0x0450: 0x382f, 0x0451: 0x39be, - 0x0452: 0x3836, 0x0453: 0x39c5, 0x0454: 0x3034, 0x0455: 0x3345, 0x0456: 0x3039, 0x0457: 0x334a, - 0x0458: 0x3043, 0x0459: 0x3354, 0x045a: 0x46a8, 0x045b: 0x4739, 0x045c: 0x387c, 0x045d: 0x3a0b, - 0x045e: 0x305c, 0x045f: 0x336d, 0x0460: 0x3066, 0x0461: 0x3377, 0x0462: 0x46b7, 0x0463: 0x4748, - 0x0464: 0x3883, 0x0465: 0x3a12, 0x0466: 0x388a, 0x0467: 0x3a19, 0x0468: 0x3891, 0x0469: 0x3a20, - 0x046a: 0x3075, 0x046b: 0x3386, 0x046c: 0x307f, 0x046d: 0x3395, 0x046e: 0x3093, 0x046f: 0x33a9, - 0x0470: 0x308e, 0x0471: 0x33a4, 0x0472: 0x30cf, 0x0473: 0x33e5, 0x0474: 0x30de, 0x0475: 0x33f4, - 0x0476: 0x30d9, 0x0477: 0x33ef, 0x0478: 0x3898, 0x0479: 0x3a27, 0x047a: 0x389f, 0x047b: 0x3a2e, - 0x047c: 0x30e3, 0x047d: 0x33f9, 0x047e: 0x30e8, 0x047f: 0x33fe, - // Block 0x12, offset 0x480 - 0x0480: 0x30ed, 0x0481: 0x3403, 0x0482: 0x30f2, 0x0483: 0x3408, 0x0484: 0x3101, 0x0485: 0x3417, - 0x0486: 0x30fc, 0x0487: 0x3412, 0x0488: 0x3106, 0x0489: 0x3421, 0x048a: 0x310b, 0x048b: 0x3426, - 0x048c: 0x3110, 0x048d: 0x342b, 0x048e: 0x312e, 0x048f: 0x3449, 0x0490: 0x3147, 0x0491: 0x3467, - 0x0492: 0x3156, 0x0493: 0x3476, 0x0494: 0x315b, 0x0495: 0x347b, 0x0496: 0x325f, 0x0497: 0x338b, - 0x0498: 0x341c, 0x0499: 0x3458, 0x049b: 0x34b6, - 0x04a0: 0x4658, 0x04a1: 0x46e9, 0x04a2: 0x2e68, 0x04a3: 0x3174, - 0x04a4: 0x375d, 0x04a5: 0x38ec, 0x04a6: 0x3756, 0x04a7: 0x38e5, 0x04a8: 0x376b, 0x04a9: 0x38fa, - 0x04aa: 0x3764, 0x04ab: 0x38f3, 0x04ac: 0x37a3, 0x04ad: 0x3932, 0x04ae: 0x3779, 0x04af: 0x3908, - 0x04b0: 0x3772, 0x04b1: 0x3901, 0x04b2: 0x3787, 0x04b3: 0x3916, 0x04b4: 0x3780, 0x04b5: 0x390f, - 0x04b6: 0x37aa, 0x04b7: 0x3939, 0x04b8: 0x466c, 0x04b9: 0x46fd, 0x04ba: 0x2ee5, 0x04bb: 0x31f1, - 0x04bc: 0x2ed1, 0x04bd: 0x31dd, 0x04be: 0x37bf, 0x04bf: 0x394e, - // Block 0x13, offset 0x4c0 - 0x04c0: 0x37b8, 0x04c1: 0x3947, 0x04c2: 0x37cd, 0x04c3: 0x395c, 0x04c4: 0x37c6, 0x04c5: 0x3955, - 0x04c6: 0x37e2, 0x04c7: 0x3971, 0x04c8: 0x2f76, 0x04c9: 0x3282, 0x04ca: 0x2f8a, 0x04cb: 0x3296, - 0x04cc: 0x469e, 0x04cd: 0x472f, 0x04ce: 0x301b, 0x04cf: 0x332c, 0x04d0: 0x3805, 0x04d1: 0x3994, - 0x04d2: 0x37fe, 0x04d3: 0x398d, 0x04d4: 0x3813, 0x04d5: 0x39a2, 0x04d6: 0x380c, 0x04d7: 0x399b, - 0x04d8: 0x386e, 0x04d9: 0x39fd, 0x04da: 0x3852, 0x04db: 0x39e1, 0x04dc: 0x384b, 0x04dd: 0x39da, - 0x04de: 0x3860, 0x04df: 0x39ef, 0x04e0: 0x3859, 0x04e1: 0x39e8, 0x04e2: 0x3867, 0x04e3: 0x39f6, - 0x04e4: 0x30ca, 0x04e5: 0x33e0, 0x04e6: 0x30ac, 0x04e7: 0x33c2, 0x04e8: 0x38c9, 0x04e9: 0x3a58, - 0x04ea: 0x38c2, 0x04eb: 0x3a51, 0x04ec: 0x38d7, 0x04ed: 0x3a66, 0x04ee: 0x38d0, 0x04ef: 0x3a5f, - 0x04f0: 0x38de, 0x04f1: 0x3a6d, 0x04f2: 0x3115, 0x04f3: 0x3430, 0x04f4: 0x313d, 0x04f5: 0x345d, - 0x04f6: 0x3138, 0x04f7: 0x3453, 0x04f8: 0x3124, 0x04f9: 0x343f, - // Block 0x14, offset 0x500 - 0x0500: 0x47bb, 0x0501: 0x47c1, 0x0502: 0x48d5, 0x0503: 0x48ed, 0x0504: 0x48dd, 0x0505: 0x48f5, - 0x0506: 0x48e5, 0x0507: 0x48fd, 0x0508: 0x4761, 0x0509: 0x4767, 0x050a: 0x4845, 0x050b: 0x485d, - 0x050c: 0x484d, 0x050d: 0x4865, 0x050e: 0x4855, 0x050f: 0x486d, 0x0510: 0x47cd, 0x0511: 0x47d3, - 0x0512: 0x3c9d, 0x0513: 0x3cad, 0x0514: 0x3ca5, 0x0515: 0x3cb5, - 0x0518: 0x476d, 0x0519: 0x4773, 0x051a: 0x3bcd, 0x051b: 0x3bdd, 0x051c: 0x3bd5, 0x051d: 0x3be5, - 0x0520: 0x47e5, 0x0521: 0x47eb, 0x0522: 0x4905, 0x0523: 0x491d, - 0x0524: 0x490d, 0x0525: 0x4925, 0x0526: 0x4915, 0x0527: 0x492d, 0x0528: 0x4779, 0x0529: 0x477f, - 0x052a: 0x4875, 0x052b: 0x488d, 0x052c: 0x487d, 0x052d: 0x4895, 0x052e: 0x4885, 0x052f: 0x489d, - 0x0530: 0x47fd, 0x0531: 0x4803, 0x0532: 0x3cfd, 0x0533: 0x3d15, 0x0534: 0x3d05, 0x0535: 0x3d1d, - 0x0536: 0x3d0d, 0x0537: 0x3d25, 0x0538: 0x4785, 0x0539: 0x478b, 0x053a: 0x3bfd, 0x053b: 0x3c15, - 0x053c: 0x3c05, 0x053d: 0x3c1d, 0x053e: 0x3c0d, 0x053f: 0x3c25, - // Block 0x15, offset 0x540 - 0x0540: 0x4809, 0x0541: 0x480f, 0x0542: 0x3d2d, 0x0543: 0x3d3d, 0x0544: 0x3d35, 0x0545: 0x3d45, - 0x0548: 0x4791, 0x0549: 0x4797, 0x054a: 0x3c2d, 0x054b: 0x3c3d, - 0x054c: 0x3c35, 0x054d: 0x3c45, 0x0550: 0x481b, 0x0551: 0x4821, - 0x0552: 0x3d65, 0x0553: 0x3d7d, 0x0554: 0x3d6d, 0x0555: 0x3d85, 0x0556: 0x3d75, 0x0557: 0x3d8d, - 0x0559: 0x479d, 0x055b: 0x3c4d, 0x055d: 0x3c55, - 0x055f: 0x3c5d, 0x0560: 0x4833, 0x0561: 0x4839, 0x0562: 0x4935, 0x0563: 0x494d, - 0x0564: 0x493d, 0x0565: 0x4955, 0x0566: 0x4945, 0x0567: 0x495d, 0x0568: 0x47a3, 0x0569: 0x47a9, - 0x056a: 0x48a5, 0x056b: 0x48bd, 0x056c: 0x48ad, 0x056d: 0x48c5, 0x056e: 0x48b5, 0x056f: 0x48cd, - 0x0570: 0x47af, 0x0571: 0x421c, 0x0572: 0x3576, 0x0573: 0x4222, 0x0574: 0x47d9, 0x0575: 0x4228, - 0x0576: 0x3588, 0x0577: 0x422e, 0x0578: 0x35a6, 0x0579: 0x4234, 0x057a: 0x35be, 0x057b: 0x423a, - 0x057c: 0x4827, 0x057d: 0x4240, - // Block 0x16, offset 0x580 - 0x0580: 0x3c85, 0x0581: 0x3c8d, 0x0582: 0x4069, 0x0583: 0x4087, 0x0584: 0x4073, 0x0585: 0x4091, - 0x0586: 0x407d, 0x0587: 0x409b, 0x0588: 0x3bbd, 0x0589: 0x3bc5, 0x058a: 0x3fb5, 0x058b: 0x3fd3, - 0x058c: 0x3fbf, 0x058d: 0x3fdd, 0x058e: 0x3fc9, 0x058f: 0x3fe7, 0x0590: 0x3ccd, 0x0591: 0x3cd5, - 0x0592: 0x40a5, 0x0593: 0x40c3, 0x0594: 0x40af, 0x0595: 0x40cd, 0x0596: 0x40b9, 0x0597: 0x40d7, - 0x0598: 0x3bed, 0x0599: 0x3bf5, 0x059a: 0x3ff1, 0x059b: 0x400f, 0x059c: 0x3ffb, 0x059d: 0x4019, - 0x059e: 0x4005, 0x059f: 0x4023, 0x05a0: 0x3da5, 0x05a1: 0x3dad, 0x05a2: 0x40e1, 0x05a3: 0x40ff, - 0x05a4: 0x40eb, 0x05a5: 0x4109, 0x05a6: 0x40f5, 0x05a7: 0x4113, 0x05a8: 0x3c65, 0x05a9: 0x3c6d, - 0x05aa: 0x402d, 0x05ab: 0x404b, 0x05ac: 0x4037, 0x05ad: 0x4055, 0x05ae: 0x4041, 0x05af: 0x405f, - 0x05b0: 0x356a, 0x05b1: 0x3564, 0x05b2: 0x3c75, 0x05b3: 0x3570, 0x05b4: 0x3c7d, - 0x05b6: 0x47c7, 0x05b7: 0x3c95, 0x05b8: 0x34da, 0x05b9: 0x34d4, 0x05ba: 0x34c8, 0x05bb: 0x41ec, - 0x05bc: 0x34e0, 0x05be: 0x0490, 0x05bf: 0x8800, - // Block 0x17, offset 0x5c0 - 0x05c1: 0x348c, 0x05c2: 0x3cbd, 0x05c3: 0x3582, 0x05c4: 0x3cc5, - 0x05c6: 0x47f1, 0x05c7: 0x3cdd, 0x05c8: 0x34e6, 0x05c9: 0x41f2, 0x05ca: 0x34f2, 0x05cb: 0x41f8, - 0x05cc: 0x34fe, 0x05cd: 0x3a74, 0x05ce: 0x3a7b, 0x05cf: 0x3a82, 0x05d0: 0x359a, 0x05d1: 0x3594, - 0x05d2: 0x3ce5, 0x05d3: 0x43e2, 0x05d6: 0x35a0, 0x05d7: 0x3cf5, - 0x05d8: 0x3516, 0x05d9: 0x3510, 0x05da: 0x3504, 0x05db: 0x41fe, 0x05dd: 0x3a89, - 0x05de: 0x3a90, 0x05df: 0x3a97, 0x05e0: 0x35d0, 0x05e1: 0x35ca, 0x05e2: 0x3d4d, 0x05e3: 0x43ea, - 0x05e4: 0x35b2, 0x05e5: 0x35b8, 0x05e6: 0x35d6, 0x05e7: 0x3d5d, 0x05e8: 0x3546, 0x05e9: 0x3540, - 0x05ea: 0x3534, 0x05eb: 0x420a, 0x05ec: 0x352e, 0x05ed: 0x3480, 0x05ee: 0x41e6, 0x05ef: 0x014f, - 0x05f2: 0x3d95, 0x05f3: 0x35dc, 0x05f4: 0x3d9d, - 0x05f6: 0x483f, 0x05f7: 0x3db5, 0x05f8: 0x3522, 0x05f9: 0x4204, 0x05fa: 0x3552, 0x05fb: 0x4216, - 0x05fc: 0x355e, 0x05fd: 0x0391, 0x05fe: 0x8800, - // Block 0x18, offset 0x600 - 0x0601: 0x3aeb, 0x0603: 0x8800, 0x0604: 0x3af2, 0x0605: 0x8800, - 0x0607: 0x3af9, 0x0608: 0x8800, 0x0609: 0x3b00, - 0x060d: 0x8800, - 0x0620: 0x2e4a, 0x0621: 0x8800, 0x0622: 0x3b0e, - 0x0624: 0x8800, 0x0625: 0x8800, - 0x062d: 0x3b07, 0x062e: 0x2e45, 0x062f: 0x2e4f, - 0x0630: 0x3b15, 0x0631: 0x3b1c, 0x0632: 0x8800, 0x0633: 0x8800, 0x0634: 0x3b23, 0x0635: 0x3b2a, - 0x0636: 0x8800, 0x0637: 0x8800, 0x0638: 0x3b31, 0x0639: 0x3b38, 0x063a: 0x8800, 0x063b: 0x8800, - 0x063c: 0x8800, 0x063d: 0x8800, - // Block 0x19, offset 0x640 - 0x0640: 0x3b3f, 0x0641: 0x3b46, 0x0642: 0x8800, 0x0643: 0x8800, 0x0644: 0x3b5b, 0x0645: 0x3b62, - 0x0646: 0x8800, 0x0647: 0x8800, 0x0648: 0x3b69, 0x0649: 0x3b70, - 0x0651: 0x8800, - 0x0652: 0x8800, - 0x0662: 0x8800, - 0x0668: 0x8800, 0x0669: 0x8800, - 0x066b: 0x8800, 0x066c: 0x3b85, 0x066d: 0x3b8c, 0x066e: 0x3b93, 0x066f: 0x3b9a, - 0x0672: 0x8800, 0x0673: 0x8800, 0x0674: 0x8800, 0x0675: 0x8800, - // Block 0x1a, offset 0x680 - 0x0686: 0x8800, 0x068b: 0x8800, - 0x068c: 0x3ded, 0x068d: 0x8800, 0x068e: 0x3df5, 0x068f: 0x8800, 0x0690: 0x3dfd, 0x0691: 0x8800, - 0x0692: 0x3e05, 0x0693: 0x8800, 0x0694: 0x3e0d, 0x0695: 0x8800, 0x0696: 0x3e15, 0x0697: 0x8800, - 0x0698: 0x3e1d, 0x0699: 0x8800, 0x069a: 0x3e25, 0x069b: 0x8800, 0x069c: 0x3e2d, 0x069d: 0x8800, - 0x069e: 0x3e35, 0x069f: 0x8800, 0x06a0: 0x3e3d, 0x06a1: 0x8800, 0x06a2: 0x3e45, - 0x06a4: 0x8800, 0x06a5: 0x3e4d, 0x06a6: 0x8800, 0x06a7: 0x3e55, 0x06a8: 0x8800, 0x06a9: 0x3e5d, - 0x06af: 0x8800, - 0x06b0: 0x3e65, 0x06b1: 0x3e6d, 0x06b2: 0x8800, 0x06b3: 0x3e75, 0x06b4: 0x3e7d, 0x06b5: 0x8800, - 0x06b6: 0x3e85, 0x06b7: 0x3e8d, 0x06b8: 0x8800, 0x06b9: 0x3e95, 0x06ba: 0x3e9d, 0x06bb: 0x8800, - 0x06bc: 0x3ea5, 0x06bd: 0x3ead, - // Block 0x1b, offset 0x6c0 - 0x06d4: 0x3de5, - 0x06d9: 0x8608, 0x06da: 0x8608, 0x06dd: 0x8800, - 0x06de: 0x3eb5, - 0x06e6: 0x8800, - 0x06eb: 0x8800, 0x06ec: 0x3ec5, 0x06ed: 0x8800, 0x06ee: 0x3ecd, 0x06ef: 0x8800, - 0x06f0: 0x3ed5, 0x06f1: 0x8800, 0x06f2: 0x3edd, 0x06f3: 0x8800, 0x06f4: 0x3ee5, 0x06f5: 0x8800, - 0x06f6: 0x3eed, 0x06f7: 0x8800, 0x06f8: 0x3ef5, 0x06f9: 0x8800, 0x06fa: 0x3efd, 0x06fb: 0x8800, - 0x06fc: 0x3f05, 0x06fd: 0x8800, 0x06fe: 0x3f0d, 0x06ff: 0x8800, - // Block 0x1c, offset 0x700 - 0x0700: 0x3f15, 0x0701: 0x8800, 0x0702: 0x3f1d, 0x0704: 0x8800, 0x0705: 0x3f25, - 0x0706: 0x8800, 0x0707: 0x3f2d, 0x0708: 0x8800, 0x0709: 0x3f35, - 0x070f: 0x8800, 0x0710: 0x3f3d, 0x0711: 0x3f45, - 0x0712: 0x8800, 0x0713: 0x3f4d, 0x0714: 0x3f55, 0x0715: 0x8800, 0x0716: 0x3f5d, 0x0717: 0x3f65, - 0x0718: 0x8800, 0x0719: 0x3f6d, 0x071a: 0x3f75, 0x071b: 0x8800, 0x071c: 0x3f7d, 0x071d: 0x3f85, - 0x072f: 0x8800, - 0x0730: 0x8800, 0x0731: 0x8800, 0x0732: 0x8800, 0x0734: 0x3ebd, - 0x0737: 0x3f8d, 0x0738: 0x3f95, 0x0739: 0x3f9d, 0x073a: 0x3fa5, - 0x073d: 0x8800, 0x073e: 0x3fad, - // Block 0x1d, offset 0x740 - 0x0740: 0x18b5, 0x0741: 0x1239, 0x0742: 0x1911, 0x0743: 0x18dd, 0x0744: 0x1395, 0x0745: 0x0c29, - 0x0746: 0x0e1d, 0x0747: 0x1b5d, 0x0748: 0x1b5d, 0x0749: 0x0f49, 0x074a: 0x1995, 0x074b: 0x0e81, - 0x074c: 0x0f45, 0x074d: 0x112d, 0x074e: 0x150d, 0x074f: 0x169d, 0x0750: 0x17d5, 0x0751: 0x1811, - 0x0752: 0x1845, 0x0753: 0x1959, 0x0754: 0x12b1, 0x0755: 0x133d, 0x0756: 0x13e9, 0x0757: 0x1481, - 0x0758: 0x179d, 0x0759: 0x197d, 0x075a: 0x1aa5, 0x075b: 0x0c4d, 0x075c: 0x0df1, 0x075d: 0x12c5, - 0x075e: 0x140d, 0x075f: 0x17d1, 0x0760: 0x1af5, 0x0761: 0x0ff1, 0x0762: 0x13b5, 0x0763: 0x17c1, - 0x0764: 0x1855, 0x0765: 0x1161, 0x0766: 0x16f9, 0x0767: 0x181d, 0x0768: 0x105d, 0x0769: 0x124d, - 0x076a: 0x1355, 0x076b: 0x1459, 0x076c: 0x1965, 0x076d: 0x0c8d, 0x076e: 0x0d25, 0x076f: 0x0d91, - 0x0770: 0x11c9, 0x0771: 0x12bd, 0x0772: 0x1409, 0x0773: 0x152d, 0x0774: 0x16b5, 0x0775: 0x17c9, - 0x0776: 0x17e1, 0x0777: 0x1905, 0x0778: 0x1a21, 0x0779: 0x1ad5, 0x077a: 0x1af1, 0x077b: 0x1569, - 0x077c: 0x15a9, 0x077d: 0x1661, 0x077e: 0x1781, 0x077f: 0x19b1, - // Block 0x1e, offset 0x780 - 0x0780: 0x1afd, 0x0781: 0x1889, 0x0782: 0x0f05, 0x0783: 0x1079, 0x0784: 0x1619, 0x0785: 0x16d9, - 0x0786: 0x143d, 0x0787: 0x1571, 0x0788: 0x18d5, 0x0789: 0x1a19, 0x078a: 0x0f01, 0x078b: 0x0fcd, - 0x078c: 0x12b5, 0x078d: 0x1369, 0x078e: 0x139d, 0x078f: 0x1651, 0x0790: 0x1679, 0x0791: 0x19dd, - 0x0792: 0x0d8d, 0x0793: 0x16e5, 0x0794: 0x0d31, 0x0795: 0x0d2d, 0x0796: 0x15d5, 0x0797: 0x1665, - 0x0798: 0x1799, 0x0799: 0x19e5, 0x079a: 0x18a5, 0x079b: 0x1165, 0x079c: 0x12b1, 0x079d: 0x1895, - 0x079e: 0x0c35, 0x079f: 0x0fa1, 0x07a0: 0x10d1, 0x07a1: 0x146d, 0x07a2: 0x14ed, 0x07a3: 0x0db1, - 0x07a4: 0x1579, 0x07a5: 0x0c9d, 0x07a6: 0x10b5, 0x07a7: 0x0c15, 0x07a8: 0x1329, 0x07a9: 0x11e1, - 0x07aa: 0x164d, 0x07ab: 0x0e05, 0x07ac: 0x0ef1, 0x07ad: 0x1539, 0x07ae: 0x17a1, 0x07af: 0x1879, - 0x07b0: 0x12f5, 0x07b1: 0x1935, 0x07b2: 0x1321, 0x07b3: 0x1175, 0x07b4: 0x1759, 0x07b5: 0x1195, - 0x07b6: 0x14e9, 0x07b7: 0x0c69, 0x07b8: 0x0ce5, 0x07b9: 0x0d29, 0x07ba: 0x1291, 0x07bb: 0x1639, - 0x07bc: 0x1731, 0x07bd: 0x1885, 0x07be: 0x1991, 0x07bf: 0x0d99, - // Block 0x1f, offset 0x7c0 - 0x07c0: 0x0e4d, 0x07c1: 0x0f55, 0x07c2: 0x106d, 0x07c3: 0x11fd, 0x07c4: 0x13b9, 0x07c5: 0x157d, - 0x07c6: 0x19cd, 0x07c7: 0x1aad, 0x07c8: 0x1b01, 0x07c9: 0x1b19, 0x07ca: 0x0d75, 0x07cb: 0x1231, - 0x07cc: 0x12e1, 0x07cd: 0x1929, 0x07ce: 0x1039, 0x07cf: 0x1115, 0x07d0: 0x1131, 0x07d1: 0x11c1, - 0x07d2: 0x13a9, 0x07d3: 0x13f5, 0x07d4: 0x14a5, 0x07d5: 0x15c9, 0x07d6: 0x166d, 0x07d7: 0x16d1, - 0x07d8: 0x1919, 0x07d9: 0x17a9, 0x07da: 0x1941, 0x07db: 0x19b5, 0x07dc: 0x0d4d, 0x07dd: 0x0d79, - 0x07de: 0x0e61, 0x07df: 0x13e5, 0x07e0: 0x1831, 0x07e1: 0x1879, 0x07e2: 0x1059, 0x07e3: 0x10c9, - 0x07e4: 0x118d, 0x07e5: 0x12ed, 0x07e6: 0x1615, 0x07e7: 0x1461, 0x07e8: 0x0c79, 0x07e9: 0x0ebd, - 0x07ea: 0x0fa1, 0x07eb: 0x1005, 0x07ec: 0x10d5, 0x07ed: 0x147d, 0x07ee: 0x1499, 0x07ef: 0x16a9, - 0x07f0: 0x16c9, 0x07f1: 0x1999, 0x07f2: 0x1a15, 0x07f3: 0x1a25, 0x07f4: 0x1a61, 0x07f5: 0x0c91, - 0x07f6: 0x15bd, 0x07f7: 0x1985, 0x07f8: 0x19fd, 0x07f9: 0x10ed, 0x07fa: 0x0c55, 0x07fb: 0x0cb5, - 0x07fc: 0x0fa5, 0x07fd: 0x0fc5, 0x07fe: 0x11ed, 0x07ff: 0x12b1, - // Block 0x20, offset 0x800 - 0x0800: 0x1401, 0x0801: 0x1509, 0x0802: 0x17b5, 0x0803: 0x1955, 0x0804: 0x1b55, 0x0805: 0x1221, - 0x0806: 0x19d9, 0x0807: 0x0d71, 0x0808: 0x126d, 0x0809: 0x1279, 0x080a: 0x134d, 0x080b: 0x1385, - 0x080c: 0x1489, 0x080d: 0x14e5, 0x080e: 0x1565, 0x080f: 0x1649, 0x0810: 0x1a6d, 0x0811: 0x0ced, - 0x0812: 0x1141, 0x0813: 0x19e9, 0x0814: 0x0ca5, 0x0815: 0x0fe9, 0x0816: 0x136d, 0x0817: 0x191d, - 0x0818: 0x10a5, 0x0819: 0x10f5, 0x081a: 0x1281, 0x081b: 0x146d, 0x081c: 0x19f1, 0x081d: 0x0d55, - 0x081e: 0x0e3d, 0x081f: 0x0fd5, 0x0820: 0x1211, 0x0821: 0x125d, 0x0822: 0x129d, 0x0823: 0x1331, - 0x0824: 0x1485, 0x0825: 0x14f9, 0x0826: 0x1695, 0x0827: 0x1835, 0x0828: 0x1841, 0x0829: 0x198d, - 0x082a: 0x1a09, 0x082b: 0x0dc1, 0x082c: 0x1389, 0x082d: 0x0e41, 0x082e: 0x1405, 0x082f: 0x14a9, - 0x0830: 0x17c5, 0x0831: 0x19f5, 0x0832: 0x1add, 0x0833: 0x1b05, 0x0834: 0x1275, 0x0835: 0x1365, - 0x0836: 0x1701, 0x0837: 0x15f5, 0x0838: 0x1601, 0x0839: 0x1625, 0x083a: 0x1455, 0x083b: 0x13dd, - 0x083c: 0x18a1, 0x083d: 0x0c71, 0x083e: 0x1769, 0x083f: 0x0d59, - // Block 0x21, offset 0x840 - 0x0840: 0x0d49, 0x0841: 0x1049, 0x0842: 0x1169, 0x0843: 0x1631, 0x0844: 0x0f91, 0x0845: 0x1341, - 0x0846: 0x122d, 0x0847: 0x1925, 0x0848: 0x1825, 0x0849: 0x19e1, 0x084a: 0x1861, 0x084b: 0x1065, - 0x084c: 0x0cc5, 0x084d: 0x0e99, 0x0850: 0x0eed, - 0x0852: 0x121d, 0x0855: 0x0d35, 0x0856: 0x145d, 0x0857: 0x1521, - 0x0858: 0x1585, 0x0859: 0x15a1, 0x085a: 0x15a5, 0x085b: 0x15b9, 0x085c: 0x1a2d, 0x085d: 0x1629, - 0x085e: 0x16ad, 0x0860: 0x17cd, 0x0862: 0x1891, - 0x0865: 0x1945, 0x0866: 0x196d, - 0x086a: 0x1a81, 0x086b: 0x1a85, 0x086c: 0x1a89, 0x086d: 0x1aed, - 0x0870: 0x0c95, 0x0871: 0x0cb9, 0x0872: 0x0ccd, 0x0873: 0x0d89, 0x0874: 0x0d95, 0x0875: 0x0dd5, - 0x0876: 0x0e89, 0x0877: 0x0ea5, 0x0878: 0x0ead, 0x0879: 0x0ee9, 0x087a: 0x0ef5, 0x087b: 0x0fd1, - 0x087c: 0x0fd9, 0x087d: 0x10e1, 0x087e: 0x1109, 0x087f: 0x1111, - // Block 0x22, offset 0x880 - 0x0880: 0x1129, 0x0881: 0x11d5, 0x0882: 0x1205, 0x0883: 0x1225, 0x0884: 0x1295, 0x0885: 0x1359, - 0x0886: 0x1375, 0x0887: 0x13a5, 0x0888: 0x13f9, 0x0889: 0x1419, 0x088a: 0x148d, 0x088b: 0x156d, - 0x088c: 0x1589, 0x088d: 0x1591, 0x088e: 0x158d, 0x088f: 0x1595, 0x0890: 0x1599, 0x0891: 0x159d, - 0x0892: 0x15b1, 0x0893: 0x15b5, 0x0894: 0x15d9, 0x0895: 0x15ed, 0x0896: 0x1609, 0x0897: 0x166d, - 0x0898: 0x1675, 0x0899: 0x167d, 0x089a: 0x1691, 0x089b: 0x16b9, 0x089c: 0x1709, 0x089d: 0x173d, - 0x089e: 0x173d, 0x089f: 0x17a5, 0x08a0: 0x184d, 0x08a1: 0x1865, 0x08a2: 0x1899, 0x08a3: 0x189d, - 0x08a4: 0x18e1, 0x08a5: 0x18e5, 0x08a6: 0x193d, 0x08a7: 0x1945, 0x08a8: 0x1a0d, 0x08a9: 0x1a51, - 0x08aa: 0x1a69, 0x08ab: 0x10d9, 0x08ac: 0x2018, 0x08ad: 0x1721, - 0x08b0: 0x0c1d, 0x08b1: 0x0d21, 0x08b2: 0x0ce1, 0x08b3: 0x0c89, 0x08b4: 0x0cc9, 0x08b5: 0x0cf5, - 0x08b6: 0x0d85, 0x08b7: 0x0da1, 0x08b8: 0x0e89, 0x08b9: 0x0e75, 0x08ba: 0x0e85, 0x08bb: 0x0ea1, - 0x08bc: 0x0eed, 0x08bd: 0x0efd, 0x08be: 0x0f41, 0x08bf: 0x0f4d, - // Block 0x23, offset 0x8c0 - 0x08c0: 0x0f69, 0x08c1: 0x0f79, 0x08c2: 0x1061, 0x08c3: 0x1069, 0x08c4: 0x1099, 0x08c5: 0x10b9, - 0x08c6: 0x10e9, 0x08c7: 0x1101, 0x08c8: 0x10f1, 0x08c9: 0x1111, 0x08ca: 0x1105, 0x08cb: 0x1129, - 0x08cc: 0x1145, 0x08cd: 0x119d, 0x08ce: 0x11a9, 0x08cf: 0x11b1, 0x08d0: 0x11d9, 0x08d1: 0x121d, - 0x08d2: 0x124d, 0x08d3: 0x1251, 0x08d4: 0x1265, 0x08d5: 0x12e5, 0x08d6: 0x12f5, 0x08d7: 0x134d, - 0x08d8: 0x1399, 0x08d9: 0x1391, 0x08da: 0x13a5, 0x08db: 0x13c1, 0x08dc: 0x13f9, 0x08dd: 0x1551, - 0x08de: 0x141d, 0x08df: 0x1451, 0x08e0: 0x145d, 0x08e1: 0x149d, 0x08e2: 0x14b9, 0x08e3: 0x14dd, - 0x08e4: 0x1501, 0x08e5: 0x1505, 0x08e6: 0x1521, 0x08e7: 0x1525, 0x08e8: 0x1535, 0x08e9: 0x1549, - 0x08ea: 0x1545, 0x08eb: 0x1575, 0x08ec: 0x15f1, 0x08ed: 0x1609, 0x08ee: 0x1621, 0x08ef: 0x1659, - 0x08f0: 0x166d, 0x08f1: 0x1689, 0x08f2: 0x16b9, 0x08f3: 0x176d, 0x08f4: 0x1795, 0x08f5: 0x1809, - 0x08f6: 0x1851, 0x08f7: 0x185d, 0x08f8: 0x1865, 0x08f9: 0x187d, 0x08fa: 0x1891, 0x08fb: 0x1881, - 0x08fc: 0x1899, 0x08fd: 0x1895, 0x08fe: 0x188d, 0x08ff: 0x189d, - // Block 0x24, offset 0x900 - 0x0900: 0x18a9, 0x0901: 0x18e5, 0x0902: 0x1921, 0x0903: 0x1951, 0x0904: 0x1981, 0x0905: 0x19a1, - 0x0906: 0x19ed, 0x0907: 0x1a0d, 0x0908: 0x1a2d, 0x0909: 0x1a41, 0x090a: 0x1a51, 0x090b: 0x1a5d, - 0x090c: 0x1a69, 0x090d: 0x1abd, 0x090e: 0x1b5d, 0x090f: 0x1faf, 0x0910: 0x1faa, 0x0911: 0x1fdc, - 0x0912: 0x0b45, 0x0913: 0x0b6d, 0x0914: 0x0b71, 0x0915: 0x205e, 0x0916: 0x208b, 0x0917: 0x2103, - 0x0918: 0x1b49, 0x0919: 0x1b59, - // Block 0x25, offset 0x940 - 0x0940: 0x0c39, 0x0941: 0x0c31, 0x0942: 0x0c41, 0x0943: 0x1f41, 0x0944: 0x0c85, 0x0945: 0x0c95, - 0x0946: 0x0c99, 0x0947: 0x0ca1, 0x0948: 0x0ca9, 0x0949: 0x0cad, 0x094a: 0x0cb9, 0x094b: 0x0cb1, - 0x094c: 0x0af1, 0x094d: 0x1f55, 0x094e: 0x0ccd, 0x094f: 0x0cd1, 0x0950: 0x0cd5, 0x0951: 0x0cf1, - 0x0952: 0x1f46, 0x0953: 0x0af5, 0x0954: 0x0cdd, 0x0955: 0x0cfd, 0x0956: 0x1f50, 0x0957: 0x0d0d, - 0x0958: 0x0d15, 0x0959: 0x0c75, 0x095a: 0x0d1d, 0x095b: 0x0d21, 0x095c: 0x212b, 0x095d: 0x0d3d, - 0x095e: 0x0d45, 0x095f: 0x0afd, 0x0960: 0x0d5d, 0x0961: 0x0d61, 0x0962: 0x0d69, 0x0963: 0x0d6d, - 0x0964: 0x0b01, 0x0965: 0x0d85, 0x0966: 0x0d89, 0x0967: 0x0d95, 0x0968: 0x0da1, 0x0969: 0x0da5, - 0x096a: 0x0da9, 0x096b: 0x0db1, 0x096c: 0x0dd1, 0x096d: 0x0dd5, 0x096e: 0x0ddd, 0x096f: 0x0ded, - 0x0970: 0x0df5, 0x0971: 0x0df9, 0x0972: 0x0df9, 0x0973: 0x0df9, 0x0974: 0x1f64, 0x0975: 0x13d1, - 0x0976: 0x0e0d, 0x0977: 0x0e15, 0x0978: 0x1f69, 0x0979: 0x0e21, 0x097a: 0x0e29, 0x097b: 0x0e31, - 0x097c: 0x0e59, 0x097d: 0x0e45, 0x097e: 0x0e51, 0x097f: 0x0e55, - // Block 0x26, offset 0x980 - 0x0980: 0x0e5d, 0x0981: 0x0e65, 0x0982: 0x0e69, 0x0983: 0x0e71, 0x0984: 0x0e79, 0x0985: 0x0e7d, - 0x0986: 0x0e7d, 0x0987: 0x0e85, 0x0988: 0x0e8d, 0x0989: 0x0e91, 0x098a: 0x0e9d, 0x098b: 0x0ec1, - 0x098c: 0x0ea5, 0x098d: 0x0ec5, 0x098e: 0x0ea9, 0x098f: 0x0eb1, 0x0990: 0x0d49, 0x0991: 0x0f0d, - 0x0992: 0x0ed5, 0x0993: 0x0ed9, 0x0994: 0x0edd, 0x0995: 0x0ed1, 0x0996: 0x0ee5, 0x0997: 0x0ee1, - 0x0998: 0x0ef9, 0x0999: 0x1f6e, 0x099a: 0x0f15, 0x099b: 0x0f19, 0x099c: 0x0f21, 0x099d: 0x0f2d, - 0x099e: 0x0f35, 0x099f: 0x0f51, 0x09a0: 0x1f73, 0x09a1: 0x1f78, 0x09a2: 0x0f5d, 0x09a3: 0x0f61, - 0x09a4: 0x0f65, 0x09a5: 0x0f59, 0x09a6: 0x0f6d, 0x09a7: 0x0b05, 0x09a8: 0x0b09, 0x09a9: 0x0f75, - 0x09aa: 0x0f7d, 0x09ab: 0x0f7d, 0x09ac: 0x1f7d, 0x09ad: 0x0f99, 0x09ae: 0x0f9d, 0x09af: 0x0fa1, - 0x09b0: 0x0fa9, 0x09b1: 0x1f82, 0x09b2: 0x0fb1, 0x09b3: 0x0fb5, 0x09b4: 0x108d, 0x09b5: 0x0fbd, - 0x09b6: 0x0b0d, 0x09b7: 0x0fc9, 0x09b8: 0x0fd9, 0x09b9: 0x0fe5, 0x09ba: 0x0fe1, 0x09bb: 0x1f8c, - 0x09bc: 0x0fed, 0x09bd: 0x1f91, 0x09be: 0x0ff9, 0x09bf: 0x0ff5, - // Block 0x27, offset 0x9c0 - 0x09c0: 0x0ffd, 0x09c1: 0x100d, 0x09c2: 0x1011, 0x09c3: 0x0b11, 0x09c4: 0x1021, 0x09c5: 0x1029, - 0x09c6: 0x102d, 0x09c7: 0x1031, 0x09c8: 0x0b15, 0x09c9: 0x1f96, 0x09ca: 0x0b19, 0x09cb: 0x104d, - 0x09cc: 0x1051, 0x09cd: 0x1055, 0x09ce: 0x105d, 0x09cf: 0x215d, 0x09d0: 0x1075, 0x09d1: 0x1fa0, - 0x09d2: 0x1fa0, 0x09d3: 0x1715, 0x09d4: 0x1085, 0x09d5: 0x1085, 0x09d6: 0x0b1d, 0x09d7: 0x1fc3, - 0x09d8: 0x2095, 0x09d9: 0x1095, 0x09da: 0x109d, 0x09db: 0x0b21, 0x09dc: 0x10b1, 0x09dd: 0x10c1, - 0x09de: 0x10c5, 0x09df: 0x10cd, 0x09e0: 0x10dd, 0x09e1: 0x0b29, 0x09e2: 0x0b25, 0x09e3: 0x10e1, - 0x09e4: 0x1fa5, 0x09e5: 0x10e5, 0x09e6: 0x10f9, 0x09e7: 0x10fd, 0x09e8: 0x1101, 0x09e9: 0x10fd, - 0x09ea: 0x110d, 0x09eb: 0x1111, 0x09ec: 0x1121, 0x09ed: 0x1119, 0x09ee: 0x111d, 0x09ef: 0x1125, - 0x09f0: 0x1129, 0x09f1: 0x112d, 0x09f2: 0x1139, 0x09f3: 0x113d, 0x09f4: 0x1155, 0x09f5: 0x115d, - 0x09f6: 0x116d, 0x09f7: 0x1181, 0x09f8: 0x1fb4, 0x09f9: 0x117d, 0x09fa: 0x1171, 0x09fb: 0x1189, - 0x09fc: 0x1191, 0x09fd: 0x11a5, 0x09fe: 0x1fb9, 0x09ff: 0x11ad, - // Block 0x28, offset 0xa00 - 0x0a00: 0x11a1, 0x0a01: 0x1199, 0x0a02: 0x0b2d, 0x0a03: 0x11b5, 0x0a04: 0x11bd, 0x0a05: 0x11c5, - 0x0a06: 0x11b9, 0x0a07: 0x0b31, 0x0a08: 0x11d5, 0x0a09: 0x11dd, 0x0a0a: 0x1fbe, 0x0a0b: 0x1209, - 0x0a0c: 0x123d, 0x0a0d: 0x1219, 0x0a0e: 0x0b3d, 0x0a0f: 0x1225, 0x0a10: 0x0b39, 0x0a11: 0x0b35, - 0x0a12: 0x0d01, 0x0a13: 0x0d05, 0x0a14: 0x1241, 0x0a15: 0x1229, 0x0a16: 0x16e9, 0x0a17: 0x0ba1, - 0x0a18: 0x124d, 0x0a19: 0x1251, 0x0a1a: 0x1255, 0x0a1b: 0x1269, 0x0a1c: 0x1261, 0x0a1d: 0x1fd7, - 0x0a1e: 0x0b41, 0x0a1f: 0x127d, 0x0a20: 0x1271, 0x0a21: 0x128d, 0x0a22: 0x1295, 0x0a23: 0x1fe1, - 0x0a24: 0x1299, 0x0a25: 0x1285, 0x0a26: 0x12a1, 0x0a27: 0x0b45, 0x0a28: 0x12a5, 0x0a29: 0x12a9, - 0x0a2a: 0x12ad, 0x0a2b: 0x12b9, 0x0a2c: 0x1fe6, 0x0a2d: 0x12c1, 0x0a2e: 0x0b49, 0x0a2f: 0x12cd, - 0x0a30: 0x1feb, 0x0a31: 0x12d1, 0x0a32: 0x0b4d, 0x0a33: 0x12dd, 0x0a34: 0x12e9, 0x0a35: 0x12f5, - 0x0a36: 0x12f9, 0x0a37: 0x1ff0, 0x0a38: 0x1f87, 0x0a39: 0x1ff5, 0x0a3a: 0x1319, 0x0a3b: 0x1ffa, - 0x0a3c: 0x1325, 0x0a3d: 0x132d, 0x0a3e: 0x131d, 0x0a3f: 0x1339, - // Block 0x29, offset 0xa40 - 0x0a40: 0x1349, 0x0a41: 0x1359, 0x0a42: 0x134d, 0x0a43: 0x1351, 0x0a44: 0x135d, 0x0a45: 0x1361, - 0x0a46: 0x1fff, 0x0a47: 0x1345, 0x0a48: 0x1379, 0x0a49: 0x137d, 0x0a4a: 0x0b51, 0x0a4b: 0x1391, - 0x0a4c: 0x138d, 0x0a4d: 0x2004, 0x0a4e: 0x1371, 0x0a4f: 0x13ad, 0x0a50: 0x2009, 0x0a51: 0x200e, - 0x0a52: 0x13b1, 0x0a53: 0x13c5, 0x0a54: 0x13c1, 0x0a55: 0x13bd, 0x0a56: 0x0b55, 0x0a57: 0x13c9, - 0x0a58: 0x13d9, 0x0a59: 0x13d5, 0x0a5a: 0x13e1, 0x0a5b: 0x1f4b, 0x0a5c: 0x13f1, 0x0a5d: 0x2013, - 0x0a5e: 0x13fd, 0x0a5f: 0x201d, 0x0a60: 0x1411, 0x0a61: 0x141d, 0x0a62: 0x1431, 0x0a63: 0x2022, - 0x0a64: 0x1445, 0x0a65: 0x1449, 0x0a66: 0x2027, 0x0a67: 0x202c, 0x0a68: 0x1465, 0x0a69: 0x1475, - 0x0a6a: 0x0b59, 0x0a6b: 0x1479, 0x0a6c: 0x0b5d, 0x0a6d: 0x0b5d, 0x0a6e: 0x1491, 0x0a6f: 0x1495, - 0x0a70: 0x149d, 0x0a71: 0x14a1, 0x0a72: 0x14ad, 0x0a73: 0x0b61, 0x0a74: 0x14c5, 0x0a75: 0x2031, - 0x0a76: 0x14e1, 0x0a77: 0x2036, 0x0a78: 0x14ed, 0x0a79: 0x1f9b, 0x0a7a: 0x14fd, 0x0a7b: 0x203b, - 0x0a7c: 0x2040, 0x0a7d: 0x2045, 0x0a7e: 0x0b65, 0x0a7f: 0x0b69, - // Block 0x2a, offset 0xa80 - 0x0a80: 0x1535, 0x0a81: 0x204f, 0x0a82: 0x204a, 0x0a83: 0x2054, 0x0a84: 0x2059, 0x0a85: 0x153d, - 0x0a86: 0x1541, 0x0a87: 0x1541, 0x0a88: 0x1549, 0x0a89: 0x0b71, 0x0a8a: 0x154d, 0x0a8b: 0x0b75, - 0x0a8c: 0x0b79, 0x0a8d: 0x2063, 0x0a8e: 0x1561, 0x0a8f: 0x1569, 0x0a90: 0x1575, 0x0a91: 0x0b7d, - 0x0a92: 0x2068, 0x0a93: 0x1599, 0x0a94: 0x206d, 0x0a95: 0x2072, 0x0a96: 0x15b9, 0x0a97: 0x15d1, - 0x0a98: 0x0b81, 0x0a99: 0x15d9, 0x0a9a: 0x15dd, 0x0a9b: 0x15e1, 0x0a9c: 0x2077, 0x0a9d: 0x207c, - 0x0a9e: 0x207c, 0x0a9f: 0x15f9, 0x0aa0: 0x0b85, 0x0aa1: 0x2081, 0x0aa2: 0x160d, 0x0aa3: 0x1611, - 0x0aa4: 0x0b89, 0x0aa5: 0x2086, 0x0aa6: 0x162d, 0x0aa7: 0x0b8d, 0x0aa8: 0x163d, 0x0aa9: 0x1635, - 0x0aaa: 0x1645, 0x0aab: 0x2090, 0x0aac: 0x165d, 0x0aad: 0x0b91, 0x0aae: 0x1669, 0x0aaf: 0x1671, - 0x0ab0: 0x1681, 0x0ab1: 0x0b95, 0x0ab2: 0x209a, 0x0ab3: 0x209f, 0x0ab4: 0x0b99, 0x0ab5: 0x20a4, - 0x0ab6: 0x1699, 0x0ab7: 0x20a9, 0x0ab8: 0x16a5, 0x0ab9: 0x16b1, 0x0aba: 0x16b9, 0x0abb: 0x20ae, - 0x0abc: 0x20b3, 0x0abd: 0x16cd, 0x0abe: 0x20b8, 0x0abf: 0x16d5, - // Block 0x2b, offset 0xac0 - 0x0ac0: 0x1fc8, 0x0ac1: 0x0b9d, 0x0ac2: 0x16ed, 0x0ac3: 0x16f1, 0x0ac4: 0x0ba5, 0x0ac5: 0x16f5, - 0x0ac6: 0x0f71, 0x0ac7: 0x20bd, 0x0ac8: 0x20c2, 0x0ac9: 0x1fcd, 0x0aca: 0x1fd2, 0x0acb: 0x1715, - 0x0acc: 0x1719, 0x0acd: 0x1931, 0x0ace: 0x0ba9, 0x0acf: 0x1745, 0x0ad0: 0x1741, 0x0ad1: 0x1749, - 0x0ad2: 0x0d7d, 0x0ad3: 0x174d, 0x0ad4: 0x1751, 0x0ad5: 0x1755, 0x0ad6: 0x175d, 0x0ad7: 0x20c7, - 0x0ad8: 0x1759, 0x0ad9: 0x1761, 0x0ada: 0x1775, 0x0adb: 0x1779, 0x0adc: 0x1765, 0x0add: 0x177d, - 0x0ade: 0x1791, 0x0adf: 0x17a5, 0x0ae0: 0x1771, 0x0ae1: 0x1785, 0x0ae2: 0x1789, 0x0ae3: 0x178d, - 0x0ae4: 0x20cc, 0x0ae5: 0x20d6, 0x0ae6: 0x20d1, 0x0ae7: 0x0bad, 0x0ae8: 0x17ad, 0x0ae9: 0x17b1, - 0x0aea: 0x17b9, 0x0aeb: 0x20ea, 0x0aec: 0x17bd, 0x0aed: 0x20db, 0x0aee: 0x0bb1, 0x0aef: 0x0bb5, - 0x0af0: 0x20e0, 0x0af1: 0x20e5, 0x0af2: 0x0bb9, 0x0af3: 0x17dd, 0x0af4: 0x17e1, 0x0af5: 0x17e5, - 0x0af6: 0x17e9, 0x0af7: 0x17f5, 0x0af8: 0x17f1, 0x0af9: 0x17fd, 0x0afa: 0x17f9, 0x0afb: 0x1809, - 0x0afc: 0x1801, 0x0afd: 0x1805, 0x0afe: 0x180d, 0x0aff: 0x0bbd, - // Block 0x2c, offset 0xb00 - 0x0b00: 0x1815, 0x0b01: 0x1819, 0x0b02: 0x0bc1, 0x0b03: 0x1829, 0x0b04: 0x182d, 0x0b05: 0x20ef, - 0x0b06: 0x1839, 0x0b07: 0x183d, 0x0b08: 0x0bc5, 0x0b09: 0x1849, 0x0b0a: 0x0af9, 0x0b0b: 0x20f4, - 0x0b0c: 0x20f9, 0x0b0d: 0x0bc9, 0x0b0e: 0x0bcd, 0x0b0f: 0x1875, 0x0b10: 0x188d, 0x0b11: 0x18a9, - 0x0b12: 0x18b9, 0x0b13: 0x20fe, 0x0b14: 0x18cd, 0x0b15: 0x18d1, 0x0b16: 0x18e9, 0x0b17: 0x18f5, - 0x0b18: 0x2108, 0x0b19: 0x1f5a, 0x0b1a: 0x1901, 0x0b1b: 0x18fd, 0x0b1c: 0x1909, 0x0b1d: 0x1f5f, - 0x0b1e: 0x1915, 0x0b1f: 0x1921, 0x0b20: 0x210d, 0x0b21: 0x2112, 0x0b22: 0x1961, 0x0b23: 0x1969, - 0x0b24: 0x1971, 0x0b25: 0x2117, 0x0b26: 0x1975, 0x0b27: 0x199d, 0x0b28: 0x19a9, 0x0b29: 0x19ad, - 0x0b2a: 0x19a5, 0x0b2b: 0x19b9, 0x0b2c: 0x19bd, 0x0b2d: 0x211c, 0x0b2e: 0x19c9, 0x0b2f: 0x0bd1, - 0x0b30: 0x19d1, 0x0b31: 0x2121, 0x0b32: 0x0bd5, 0x0b33: 0x1a05, 0x0b34: 0x1001, 0x0b35: 0x1a1d, - 0x0b36: 0x2126, 0x0b37: 0x2130, 0x0b38: 0x0bd9, 0x0b39: 0x0bdd, 0x0b3a: 0x1a45, 0x0b3b: 0x2135, - 0x0b3c: 0x0be1, 0x0b3d: 0x213a, 0x0b3e: 0x1a5d, 0x0b3f: 0x1a5d, - // Block 0x2d, offset 0xb40 - 0x0b40: 0x1a65, 0x0b41: 0x213f, 0x0b42: 0x1a7d, 0x0b43: 0x0be5, 0x0b44: 0x1a8d, 0x0b45: 0x1a99, - 0x0b46: 0x1aa1, 0x0b47: 0x1aa9, 0x0b48: 0x0be9, 0x0b49: 0x2144, 0x0b4a: 0x1abd, 0x0b4b: 0x1ad9, - 0x0b4c: 0x1ae5, 0x0b4d: 0x0bed, 0x0b4e: 0x0bf1, 0x0b4f: 0x1ae9, 0x0b50: 0x2149, 0x0b51: 0x0bf5, - 0x0b52: 0x214e, 0x0b53: 0x2153, 0x0b54: 0x2158, 0x0b55: 0x1b0d, 0x0b56: 0x0bf9, 0x0b57: 0x1b21, - 0x0b58: 0x1b29, 0x0b59: 0x1b2d, 0x0b5a: 0x1b35, 0x0b5b: 0x1b3d, 0x0b5c: 0x1b45, 0x0b5d: 0x2162, -} - -// nfcSparseOffset: 94 entries, 188 bytes -var nfcSparseOffset = []uint16{0x0, 0x2, 0x6, 0x8, 0x13, 0x23, 0x25, 0x2a, 0x35, 0x44, 0x51, 0x59, 0x5d, 0x62, 0x64, 0x6c, 0x73, 0x76, 0x7e, 0x82, 0x86, 0x88, 0x8a, 0x93, 0x97, 0x9e, 0xa3, 0xa6, 0xb0, 0xb2, 0xb9, 0xc1, 0xc4, 0xc6, 0xc8, 0xca, 0xcf, 0xde, 0xea, 0xec, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, 0x101, 0x104, 0x106, 0x109, 0x10c, 0x110, 0x119, 0x11b, 0x11e, 0x120, 0x129, 0x138, 0x13a, 0x148, 0x14b, 0x151, 0x157, 0x162, 0x166, 0x168, 0x16a, 0x16c, 0x16e, 0x170, 0x176, 0x179, 0x17b, 0x17d, 0x180, 0x182, 0x184, 0x186, 0x188, 0x18e, 0x190, 0x192, 0x194, 0x196, 0x1a4, 0x1ad, 0x1af, 0x1b1, 0x1b7, 0x1bf, 0x1cc, 0x1d6, 0x1d8} - -// nfcSparseValues: 474 entries, 1896 bytes -var nfcSparseValues = [474]valueRange{ - // Block 0x0, offset 0x1 - {value: 0x0000, lo: 0x01}, - {value: 0x8800, lo: 0xa8, hi: 0xa8}, - // Block 0x1, offset 0x2 - {value: 0x0091, lo: 0x03}, - {value: 0x4699, lo: 0xa0, hi: 0xa1}, - {value: 0x46cb, lo: 0xaf, hi: 0xb0}, - {value: 0x8800, lo: 0xb7, hi: 0xb7}, - // Block 0x2, offset 0x3 - {value: 0x0000, lo: 0x01}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - // Block 0x3, offset 0x4 - {value: 0x0006, lo: 0x0a}, - {value: 0x8800, lo: 0x81, hi: 0x81}, - {value: 0x8800, lo: 0x85, hi: 0x85}, - {value: 0x8800, lo: 0x89, hi: 0x89}, - {value: 0x47f7, lo: 0x8a, hi: 0x8a}, - {value: 0x4815, lo: 0x8b, hi: 0x8b}, - {value: 0x35ac, lo: 0x8c, hi: 0x8c}, - {value: 0x35c4, lo: 0x8d, hi: 0x8d}, - {value: 0x482d, lo: 0x8e, hi: 0x8e}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x35e2, lo: 0x93, hi: 0x94}, - // Block 0x4, offset 0x5 - {value: 0x0000, lo: 0x0f}, - {value: 0x8800, lo: 0x83, hi: 0x83}, - {value: 0x8800, lo: 0x87, hi: 0x87}, - {value: 0x8800, lo: 0x8b, hi: 0x8b}, - {value: 0x8800, lo: 0x8d, hi: 0x8d}, - {value: 0x368a, lo: 0x90, hi: 0x90}, - {value: 0x3696, lo: 0x91, hi: 0x91}, - {value: 0x3684, lo: 0x93, hi: 0x93}, - {value: 0x8800, lo: 0x96, hi: 0x96}, - {value: 0x36fc, lo: 0x97, hi: 0x97}, - {value: 0x36c6, lo: 0x9c, hi: 0x9c}, - {value: 0x36ae, lo: 0x9d, hi: 0x9d}, - {value: 0x36d8, lo: 0x9e, hi: 0x9e}, - {value: 0x8800, lo: 0xb4, hi: 0xb5}, - {value: 0x3702, lo: 0xb6, hi: 0xb6}, - {value: 0x3708, lo: 0xb7, hi: 0xb7}, - // Block 0x5, offset 0x6 - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0x83, hi: 0x87}, - // Block 0x6, offset 0x7 - {value: 0x0001, lo: 0x04}, - {value: 0x8018, lo: 0x81, hi: 0x82}, - {value: 0x80e6, lo: 0x84, hi: 0x84}, - {value: 0x80dc, lo: 0x85, hi: 0x85}, - {value: 0x8012, lo: 0x87, hi: 0x87}, - // Block 0x7, offset 0x8 - {value: 0x0000, lo: 0x0a}, - {value: 0x80e6, lo: 0x90, hi: 0x97}, - {value: 0x801e, lo: 0x98, hi: 0x98}, - {value: 0x801f, lo: 0x99, hi: 0x99}, - {value: 0x8020, lo: 0x9a, hi: 0x9a}, - {value: 0x3726, lo: 0xa2, hi: 0xa2}, - {value: 0x372c, lo: 0xa3, hi: 0xa3}, - {value: 0x3738, lo: 0xa4, hi: 0xa4}, - {value: 0x3732, lo: 0xa5, hi: 0xa5}, - {value: 0x373e, lo: 0xa6, hi: 0xa6}, - {value: 0x8800, lo: 0xa7, hi: 0xa7}, - // Block 0x8, offset 0x9 - {value: 0x0000, lo: 0x0e}, - {value: 0x3750, lo: 0x80, hi: 0x80}, - {value: 0x8800, lo: 0x81, hi: 0x81}, - {value: 0x3744, lo: 0x82, hi: 0x82}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x374a, lo: 0x93, hi: 0x93}, - {value: 0x8800, lo: 0x95, hi: 0x95}, - {value: 0x80e6, lo: 0x96, hi: 0x9c}, - {value: 0x80e6, lo: 0x9f, hi: 0xa2}, - {value: 0x80dc, lo: 0xa3, hi: 0xa3}, - {value: 0x80e6, lo: 0xa4, hi: 0xa4}, - {value: 0x80e6, lo: 0xa7, hi: 0xa8}, - {value: 0x80dc, lo: 0xaa, hi: 0xaa}, - {value: 0x80e6, lo: 0xab, hi: 0xac}, - {value: 0x80dc, lo: 0xad, hi: 0xad}, - // Block 0x9, offset 0xa - {value: 0x0000, lo: 0x0c}, - {value: 0x8024, lo: 0x91, hi: 0x91}, - {value: 0x80e6, lo: 0xb0, hi: 0xb0}, - {value: 0x80dc, lo: 0xb1, hi: 0xb1}, - {value: 0x80e6, lo: 0xb2, hi: 0xb3}, - {value: 0x80dc, lo: 0xb4, hi: 0xb4}, - {value: 0x80e6, lo: 0xb5, hi: 0xb6}, - {value: 0x80dc, lo: 0xb7, hi: 0xb9}, - {value: 0x80e6, lo: 0xba, hi: 0xba}, - {value: 0x80dc, lo: 0xbb, hi: 0xbc}, - {value: 0x80e6, lo: 0xbd, hi: 0xbd}, - {value: 0x80dc, lo: 0xbe, hi: 0xbe}, - {value: 0x80e6, lo: 0xbf, hi: 0xbf}, - // Block 0xa, offset 0xb - {value: 0x000a, lo: 0x07}, - {value: 0x80e6, lo: 0x80, hi: 0x80}, - {value: 0x80e6, lo: 0x81, hi: 0x81}, - {value: 0x80dc, lo: 0x82, hi: 0x83}, - {value: 0x80dc, lo: 0x84, hi: 0x85}, - {value: 0x80dc, lo: 0x86, hi: 0x87}, - {value: 0x80dc, lo: 0x88, hi: 0x89}, - {value: 0x80e6, lo: 0x8a, hi: 0x8a}, - // Block 0xb, offset 0xc - {value: 0x0000, lo: 0x03}, - {value: 0x80e6, lo: 0xab, hi: 0xb1}, - {value: 0x80dc, lo: 0xb2, hi: 0xb2}, - {value: 0x80e6, lo: 0xb3, hi: 0xb3}, - // Block 0xc, offset 0xd - {value: 0x0000, lo: 0x04}, - {value: 0x80e6, lo: 0x96, hi: 0x99}, - {value: 0x80e6, lo: 0x9b, hi: 0xa3}, - {value: 0x80e6, lo: 0xa5, hi: 0xa7}, - {value: 0x80e6, lo: 0xa9, hi: 0xad}, - // Block 0xd, offset 0xe - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0x99, hi: 0x9b}, - // Block 0xe, offset 0xf - {value: 0x0000, lo: 0x07}, - {value: 0x8800, lo: 0xa8, hi: 0xa8}, - {value: 0x3dbd, lo: 0xa9, hi: 0xa9}, - {value: 0x8800, lo: 0xb0, hi: 0xb0}, - {value: 0x3dc5, lo: 0xb1, hi: 0xb1}, - {value: 0x8800, lo: 0xb3, hi: 0xb3}, - {value: 0x3dcd, lo: 0xb4, hi: 0xb4}, - {value: 0x8607, lo: 0xbc, hi: 0xbc}, - // Block 0xf, offset 0x10 - {value: 0x0008, lo: 0x06}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x80e6, lo: 0x91, hi: 0x91}, - {value: 0x80dc, lo: 0x92, hi: 0x92}, - {value: 0x80e6, lo: 0x93, hi: 0x93}, - {value: 0x80e6, lo: 0x94, hi: 0x94}, - {value: 0x4432, lo: 0x98, hi: 0x9f}, - // Block 0x10, offset 0x11 - {value: 0x0000, lo: 0x02}, - {value: 0x8007, lo: 0xbc, hi: 0xbc}, - {value: 0x8600, lo: 0xbe, hi: 0xbe}, - // Block 0x11, offset 0x12 - {value: 0x0007, lo: 0x07}, - {value: 0x8800, lo: 0x87, hi: 0x87}, - {value: 0x0001, lo: 0x8b, hi: 0x8c}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x97, hi: 0x97}, - {value: 0x4472, lo: 0x9c, hi: 0x9c}, - {value: 0x447a, lo: 0x9d, hi: 0x9d}, - {value: 0x4482, lo: 0x9f, hi: 0x9f}, - // Block 0x12, offset 0x13 - {value: 0x0000, lo: 0x03}, - {value: 0x44aa, lo: 0xb3, hi: 0xb3}, - {value: 0x44b2, lo: 0xb6, hi: 0xb6}, - {value: 0x8007, lo: 0xbc, hi: 0xbc}, - // Block 0x13, offset 0x14 - {value: 0x0008, lo: 0x03}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x448a, lo: 0x99, hi: 0x9b}, - {value: 0x44a2, lo: 0x9e, hi: 0x9e}, - // Block 0x14, offset 0x15 - {value: 0x0000, lo: 0x01}, - {value: 0x8007, lo: 0xbc, hi: 0xbc}, - // Block 0x15, offset 0x16 - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - // Block 0x16, offset 0x17 - {value: 0x0000, lo: 0x08}, - {value: 0x8800, lo: 0x87, hi: 0x87}, - {value: 0x0016, lo: 0x88, hi: 0x88}, - {value: 0x000f, lo: 0x8b, hi: 0x8b}, - {value: 0x001d, lo: 0x8c, hi: 0x8c}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x96, hi: 0x97}, - {value: 0x44ba, lo: 0x9c, hi: 0x9c}, - {value: 0x44c2, lo: 0x9d, hi: 0x9d}, - // Block 0x17, offset 0x18 - {value: 0x0000, lo: 0x03}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x0024, lo: 0x94, hi: 0x94}, - {value: 0x8600, lo: 0xbe, hi: 0xbe}, - // Block 0x18, offset 0x19 - {value: 0x0000, lo: 0x06}, - {value: 0x8800, lo: 0x86, hi: 0x87}, - {value: 0x002b, lo: 0x8a, hi: 0x8a}, - {value: 0x0039, lo: 0x8b, hi: 0x8b}, - {value: 0x0032, lo: 0x8c, hi: 0x8c}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x97, hi: 0x97}, - // Block 0x19, offset 0x1a - {value: 0x0607, lo: 0x04}, - {value: 0x8800, lo: 0x86, hi: 0x86}, - {value: 0x3dd5, lo: 0x88, hi: 0x88}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8054, lo: 0x95, hi: 0x96}, - // Block 0x1a, offset 0x1b - {value: 0x0000, lo: 0x02}, - {value: 0x8007, lo: 0xbc, hi: 0xbc}, - {value: 0x8800, lo: 0xbf, hi: 0xbf}, - // Block 0x1b, offset 0x1c - {value: 0x0000, lo: 0x09}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x8600, lo: 0x82, hi: 0x82}, - {value: 0x8800, lo: 0x86, hi: 0x86}, - {value: 0x0047, lo: 0x87, hi: 0x87}, - {value: 0x004e, lo: 0x88, hi: 0x88}, - {value: 0x2e37, lo: 0x8a, hi: 0x8a}, - {value: 0x00c5, lo: 0x8b, hi: 0x8b}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x95, hi: 0x96}, - // Block 0x1c, offset 0x1d - {value: 0x0000, lo: 0x01}, - {value: 0x8600, lo: 0xbe, hi: 0xbe}, - // Block 0x1d, offset 0x1e - {value: 0x0000, lo: 0x06}, - {value: 0x8800, lo: 0x86, hi: 0x87}, - {value: 0x0055, lo: 0x8a, hi: 0x8a}, - {value: 0x0063, lo: 0x8b, hi: 0x8b}, - {value: 0x005c, lo: 0x8c, hi: 0x8c}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x97, hi: 0x97}, - // Block 0x1e, offset 0x1f - {value: 0x12fd, lo: 0x07}, - {value: 0x8609, lo: 0x8a, hi: 0x8a}, - {value: 0x8600, lo: 0x8f, hi: 0x8f}, - {value: 0x8800, lo: 0x99, hi: 0x99}, - {value: 0x3ddd, lo: 0x9a, hi: 0x9a}, - {value: 0x2e3e, lo: 0x9c, hi: 0x9d}, - {value: 0x006a, lo: 0x9e, hi: 0x9e}, - {value: 0x8600, lo: 0x9f, hi: 0x9f}, - // Block 0x1f, offset 0x20 - {value: 0x0000, lo: 0x02}, - {value: 0x8067, lo: 0xb8, hi: 0xb9}, - {value: 0x8009, lo: 0xba, hi: 0xba}, - // Block 0x20, offset 0x21 - {value: 0x0000, lo: 0x01}, - {value: 0x806b, lo: 0x88, hi: 0x8b}, - // Block 0x21, offset 0x22 - {value: 0x0000, lo: 0x01}, - {value: 0x8076, lo: 0xb8, hi: 0xb9}, - // Block 0x22, offset 0x23 - {value: 0x0000, lo: 0x01}, - {value: 0x807a, lo: 0x88, hi: 0x8b}, - // Block 0x23, offset 0x24 - {value: 0x0000, lo: 0x04}, - {value: 0x80dc, lo: 0x98, hi: 0x99}, - {value: 0x80dc, lo: 0xb5, hi: 0xb5}, - {value: 0x80dc, lo: 0xb7, hi: 0xb7}, - {value: 0x80d8, lo: 0xb9, hi: 0xb9}, - // Block 0x24, offset 0x25 - {value: 0x0000, lo: 0x0e}, - {value: 0x2757, lo: 0x83, hi: 0x83}, - {value: 0x275e, lo: 0x8d, hi: 0x8d}, - {value: 0x2765, lo: 0x92, hi: 0x92}, - {value: 0x276c, lo: 0x97, hi: 0x97}, - {value: 0x2773, lo: 0x9c, hi: 0x9c}, - {value: 0x2750, lo: 0xa9, hi: 0xa9}, - {value: 0x8081, lo: 0xb1, hi: 0xb1}, - {value: 0x8082, lo: 0xb2, hi: 0xb2}, - {value: 0x4987, lo: 0xb3, hi: 0xb3}, - {value: 0x8084, lo: 0xb4, hi: 0xb4}, - {value: 0x4990, lo: 0xb5, hi: 0xb5}, - {value: 0x44ca, lo: 0xb6, hi: 0xb6}, - {value: 0x44d2, lo: 0xb8, hi: 0xb8}, - {value: 0x8082, lo: 0xba, hi: 0xbd}, - // Block 0x25, offset 0x26 - {value: 0x0000, lo: 0x0b}, - {value: 0x8082, lo: 0x80, hi: 0x80}, - {value: 0x4999, lo: 0x81, hi: 0x81}, - {value: 0x80e6, lo: 0x82, hi: 0x83}, - {value: 0x8009, lo: 0x84, hi: 0x84}, - {value: 0x80e6, lo: 0x86, hi: 0x87}, - {value: 0x2781, lo: 0x93, hi: 0x93}, - {value: 0x2788, lo: 0x9d, hi: 0x9d}, - {value: 0x278f, lo: 0xa2, hi: 0xa2}, - {value: 0x2796, lo: 0xa7, hi: 0xa7}, - {value: 0x279d, lo: 0xac, hi: 0xac}, - {value: 0x277a, lo: 0xb9, hi: 0xb9}, - // Block 0x26, offset 0x27 - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0x86, hi: 0x86}, - // Block 0x27, offset 0x28 - {value: 0x0000, lo: 0x05}, - {value: 0x8800, lo: 0xa5, hi: 0xa5}, - {value: 0x0071, lo: 0xa6, hi: 0xa6}, - {value: 0x8600, lo: 0xae, hi: 0xae}, - {value: 0x8007, lo: 0xb7, hi: 0xb7}, - {value: 0x8009, lo: 0xb9, hi: 0xba}, - // Block 0x28, offset 0x29 - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0x8d, hi: 0x8d}, - // Block 0x29, offset 0x2a - {value: 0x0000, lo: 0x01}, - {value: 0x8800, lo: 0x80, hi: 0x92}, - // Block 0x2a, offset 0x2b - {value: 0x0000, lo: 0x01}, - {value: 0x8e00, lo: 0xa1, hi: 0xb5}, - // Block 0x2b, offset 0x2c - {value: 0x0000, lo: 0x01}, - {value: 0x8600, lo: 0xa8, hi: 0xbf}, - // Block 0x2c, offset 0x2d - {value: 0x0000, lo: 0x01}, - {value: 0x8600, lo: 0x80, hi: 0x82}, - // Block 0x2d, offset 0x2e - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0x9d, hi: 0x9f}, - // Block 0x2e, offset 0x2f - {value: 0x0000, lo: 0x02}, - {value: 0x8009, lo: 0x94, hi: 0x94}, - {value: 0x8009, lo: 0xb4, hi: 0xb4}, - // Block 0x2f, offset 0x30 - {value: 0x0000, lo: 0x02}, - {value: 0x8009, lo: 0x92, hi: 0x92}, - {value: 0x80e6, lo: 0x9d, hi: 0x9d}, - // Block 0x30, offset 0x31 - {value: 0x0000, lo: 0x01}, - {value: 0x80e4, lo: 0xa9, hi: 0xa9}, - // Block 0x31, offset 0x32 - {value: 0x0008, lo: 0x02}, - {value: 0x80de, lo: 0xb9, hi: 0xba}, - {value: 0x80dc, lo: 0xbb, hi: 0xbb}, - // Block 0x32, offset 0x33 - {value: 0x0000, lo: 0x02}, - {value: 0x80e6, lo: 0x97, hi: 0x97}, - {value: 0x80dc, lo: 0x98, hi: 0x98}, - // Block 0x33, offset 0x34 - {value: 0x0000, lo: 0x03}, - {value: 0x8009, lo: 0xa0, hi: 0xa0}, - {value: 0x80e6, lo: 0xb5, hi: 0xbc}, - {value: 0x80dc, lo: 0xbf, hi: 0xbf}, - // Block 0x34, offset 0x35 - {value: 0x0000, lo: 0x08}, - {value: 0x00b0, lo: 0x80, hi: 0x80}, - {value: 0x00b7, lo: 0x81, hi: 0x81}, - {value: 0x8800, lo: 0x82, hi: 0x82}, - {value: 0x00be, lo: 0x83, hi: 0x83}, - {value: 0x8009, lo: 0x84, hi: 0x84}, - {value: 0x80e6, lo: 0xab, hi: 0xab}, - {value: 0x80dc, lo: 0xac, hi: 0xac}, - {value: 0x80e6, lo: 0xad, hi: 0xb3}, - // Block 0x35, offset 0x36 - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0xaa, hi: 0xaa}, - // Block 0x36, offset 0x37 - {value: 0x0000, lo: 0x02}, - {value: 0x8007, lo: 0xa6, hi: 0xa6}, - {value: 0x8009, lo: 0xb2, hi: 0xb3}, - // Block 0x37, offset 0x38 - {value: 0x0000, lo: 0x01}, - {value: 0x8007, lo: 0xb7, hi: 0xb7}, - // Block 0x38, offset 0x39 - {value: 0x0000, lo: 0x08}, - {value: 0x80e6, lo: 0x90, hi: 0x92}, - {value: 0x8001, lo: 0x94, hi: 0x94}, - {value: 0x80dc, lo: 0x95, hi: 0x99}, - {value: 0x80e6, lo: 0x9a, hi: 0x9b}, - {value: 0x80dc, lo: 0x9c, hi: 0x9f}, - {value: 0x80e6, lo: 0xa0, hi: 0xa0}, - {value: 0x8001, lo: 0xa2, hi: 0xa8}, - {value: 0x80dc, lo: 0xad, hi: 0xad}, - // Block 0x39, offset 0x3a - {value: 0x0000, lo: 0x0e}, - {value: 0x80e6, lo: 0x80, hi: 0x81}, - {value: 0x80dc, lo: 0x82, hi: 0x82}, - {value: 0x80e6, lo: 0x83, hi: 0x89}, - {value: 0x80dc, lo: 0x8a, hi: 0x8a}, - {value: 0x80e6, lo: 0x8b, hi: 0x8c}, - {value: 0x80ea, lo: 0x8d, hi: 0x8d}, - {value: 0x80d6, lo: 0x8e, hi: 0x8e}, - {value: 0x80dc, lo: 0x8f, hi: 0x8f}, - {value: 0x80ca, lo: 0x90, hi: 0x90}, - {value: 0x80e6, lo: 0x91, hi: 0xa6}, - {value: 0x80e9, lo: 0xbc, hi: 0xbc}, - {value: 0x80dc, lo: 0xbd, hi: 0xbd}, - {value: 0x80e6, lo: 0xbe, hi: 0xbe}, - {value: 0x80dc, lo: 0xbf, hi: 0xbf}, - // Block 0x3a, offset 0x3b - {value: 0x0004, lo: 0x01}, - {value: 0x0971, lo: 0x80, hi: 0x81}, - // Block 0x3b, offset 0x3c - {value: 0x0000, lo: 0x0d}, - {value: 0x80e6, lo: 0x90, hi: 0x91}, - {value: 0x8001, lo: 0x92, hi: 0x93}, - {value: 0x80e6, lo: 0x94, hi: 0x97}, - {value: 0x8001, lo: 0x98, hi: 0x9a}, - {value: 0x80e6, lo: 0x9b, hi: 0x9c}, - {value: 0x80e6, lo: 0xa1, hi: 0xa1}, - {value: 0x8001, lo: 0xa5, hi: 0xa6}, - {value: 0x80e6, lo: 0xa7, hi: 0xa7}, - {value: 0x80dc, lo: 0xa8, hi: 0xa8}, - {value: 0x80e6, lo: 0xa9, hi: 0xa9}, - {value: 0x8001, lo: 0xaa, hi: 0xab}, - {value: 0x80dc, lo: 0xac, hi: 0xaf}, - {value: 0x80e6, lo: 0xb0, hi: 0xb0}, - // Block 0x3c, offset 0x3d - {value: 0x4099, lo: 0x02}, - {value: 0x0475, lo: 0xa6, hi: 0xa6}, - {value: 0x0125, lo: 0xaa, hi: 0xab}, - // Block 0x3d, offset 0x3e - {value: 0x0007, lo: 0x05}, - {value: 0x8800, lo: 0x90, hi: 0x90}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x8800, lo: 0x94, hi: 0x94}, - {value: 0x3a9e, lo: 0x9a, hi: 0x9b}, - {value: 0x3aac, lo: 0xae, hi: 0xae}, - // Block 0x3e, offset 0x3f - {value: 0x000e, lo: 0x05}, - {value: 0x3ab3, lo: 0x8d, hi: 0x8e}, - {value: 0x3aba, lo: 0x8f, hi: 0x8f}, - {value: 0x8800, lo: 0x90, hi: 0x90}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x8800, lo: 0x94, hi: 0x94}, - // Block 0x3f, offset 0x40 - {value: 0x4d23, lo: 0x0a}, - {value: 0x8800, lo: 0x83, hi: 0x83}, - {value: 0x3ac8, lo: 0x84, hi: 0x84}, - {value: 0x8800, lo: 0x88, hi: 0x88}, - {value: 0x3acf, lo: 0x89, hi: 0x89}, - {value: 0x8800, lo: 0x8b, hi: 0x8b}, - {value: 0x3ad6, lo: 0x8c, hi: 0x8c}, - {value: 0x8800, lo: 0xa3, hi: 0xa3}, - {value: 0x3add, lo: 0xa4, hi: 0xa5}, - {value: 0x3ae4, lo: 0xa6, hi: 0xa6}, - {value: 0x8800, lo: 0xbc, hi: 0xbc}, - // Block 0x40, offset 0x41 - {value: 0x0007, lo: 0x03}, - {value: 0x3b4d, lo: 0xa0, hi: 0xa1}, - {value: 0x3b77, lo: 0xa2, hi: 0xa3}, - {value: 0x3ba1, lo: 0xaa, hi: 0xad}, - // Block 0x41, offset 0x42 - {value: 0x0004, lo: 0x01}, - {value: 0x09c9, lo: 0xa9, hi: 0xaa}, - // Block 0x42, offset 0x43 - {value: 0x0000, lo: 0x01}, - {value: 0x43db, lo: 0x9c, hi: 0x9c}, - // Block 0x43, offset 0x44 - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0xaf, hi: 0xb1}, - // Block 0x44, offset 0x45 - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0xbf, hi: 0xbf}, - // Block 0x45, offset 0x46 - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0xa0, hi: 0xbf}, - // Block 0x46, offset 0x47 - {value: 0x0000, lo: 0x05}, - {value: 0x80da, lo: 0xaa, hi: 0xaa}, - {value: 0x80e4, lo: 0xab, hi: 0xab}, - {value: 0x80e8, lo: 0xac, hi: 0xac}, - {value: 0x80de, lo: 0xad, hi: 0xad}, - {value: 0x80e0, lo: 0xae, hi: 0xaf}, - // Block 0x47, offset 0x48 - {value: 0x0000, lo: 0x02}, - {value: 0x80e6, lo: 0xaf, hi: 0xaf}, - {value: 0x80e6, lo: 0xbc, hi: 0xbd}, - // Block 0x48, offset 0x49 - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0xb0, hi: 0xb1}, - // Block 0x49, offset 0x4a - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0x86, hi: 0x86}, - // Block 0x4a, offset 0x4b - {value: 0x0000, lo: 0x02}, - {value: 0x8009, lo: 0x84, hi: 0x84}, - {value: 0x80e6, lo: 0xa0, hi: 0xb1}, - // Block 0x4b, offset 0x4c - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0xab, hi: 0xad}, - // Block 0x4c, offset 0x4d - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0x93, hi: 0x93}, - // Block 0x4d, offset 0x4e - {value: 0x0000, lo: 0x01}, - {value: 0x8007, lo: 0xb3, hi: 0xb3}, - // Block 0x4e, offset 0x4f - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0x80, hi: 0x80}, - // Block 0x4f, offset 0x50 - {value: 0x0000, lo: 0x05}, - {value: 0x80e6, lo: 0xb0, hi: 0xb0}, - {value: 0x80e6, lo: 0xb2, hi: 0xb3}, - {value: 0x80dc, lo: 0xb4, hi: 0xb4}, - {value: 0x80e6, lo: 0xb7, hi: 0xb8}, - {value: 0x80e6, lo: 0xbe, hi: 0xbf}, - // Block 0x50, offset 0x51 - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0x81, hi: 0x81}, - // Block 0x51, offset 0x52 - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0xad, hi: 0xad}, - // Block 0x52, offset 0x53 - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0x80, hi: 0xbf}, - // Block 0x53, offset 0x54 - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0x80, hi: 0xa3}, - // Block 0x54, offset 0x55 - {value: 0x0006, lo: 0x0d}, - {value: 0x428e, lo: 0x9d, hi: 0x9d}, - {value: 0x801a, lo: 0x9e, hi: 0x9e}, - {value: 0x4300, lo: 0x9f, hi: 0x9f}, - {value: 0x42ee, lo: 0xaa, hi: 0xab}, - {value: 0x43f2, lo: 0xac, hi: 0xac}, - {value: 0x43fa, lo: 0xad, hi: 0xad}, - {value: 0x4246, lo: 0xae, hi: 0xb1}, - {value: 0x4264, lo: 0xb2, hi: 0xb4}, - {value: 0x427c, lo: 0xb5, hi: 0xb6}, - {value: 0x4288, lo: 0xb8, hi: 0xb8}, - {value: 0x4294, lo: 0xb9, hi: 0xbb}, - {value: 0x42ac, lo: 0xbc, hi: 0xbc}, - {value: 0x42b2, lo: 0xbe, hi: 0xbe}, - // Block 0x55, offset 0x56 - {value: 0x0006, lo: 0x08}, - {value: 0x42b8, lo: 0x80, hi: 0x81}, - {value: 0x42c4, lo: 0x83, hi: 0x84}, - {value: 0x42d6, lo: 0x86, hi: 0x89}, - {value: 0x42fa, lo: 0x8a, hi: 0x8a}, - {value: 0x4276, lo: 0x8b, hi: 0x8b}, - {value: 0x425e, lo: 0x8c, hi: 0x8c}, - {value: 0x42a6, lo: 0x8d, hi: 0x8d}, - {value: 0x42d0, lo: 0x8e, hi: 0x8e}, - // Block 0x56, offset 0x57 - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0xa0, hi: 0xa6}, - // Block 0x57, offset 0x58 - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0xbd, hi: 0xbd}, - // Block 0x58, offset 0x59 - {value: 0x00db, lo: 0x05}, - {value: 0x80dc, lo: 0x8d, hi: 0x8d}, - {value: 0x80e6, lo: 0x8f, hi: 0x8f}, - {value: 0x80e6, lo: 0xb8, hi: 0xb8}, - {value: 0x8001, lo: 0xb9, hi: 0xba}, - {value: 0x8009, lo: 0xbf, hi: 0xbf}, - // Block 0x59, offset 0x5a - {value: 0x05fe, lo: 0x07}, - {value: 0x8800, lo: 0x99, hi: 0x99}, - {value: 0x411d, lo: 0x9a, hi: 0x9a}, - {value: 0x8800, lo: 0x9b, hi: 0x9b}, - {value: 0x4127, lo: 0x9c, hi: 0x9c}, - {value: 0x8800, lo: 0xa5, hi: 0xa5}, - {value: 0x4131, lo: 0xab, hi: 0xab}, - {value: 0x8009, lo: 0xb9, hi: 0xba}, - // Block 0x5a, offset 0x5b - {value: 0x0000, lo: 0x0c}, - {value: 0x44e2, lo: 0x9e, hi: 0x9e}, - {value: 0x44ec, lo: 0x9f, hi: 0x9f}, - {value: 0x4555, lo: 0xa0, hi: 0xa0}, - {value: 0x4563, lo: 0xa1, hi: 0xa1}, - {value: 0x4571, lo: 0xa2, hi: 0xa2}, - {value: 0x457f, lo: 0xa3, hi: 0xa3}, - {value: 0x458d, lo: 0xa4, hi: 0xa4}, - {value: 0x80d8, lo: 0xa5, hi: 0xa6}, - {value: 0x8001, lo: 0xa7, hi: 0xa9}, - {value: 0x80e2, lo: 0xad, hi: 0xad}, - {value: 0x80d8, lo: 0xae, hi: 0xb2}, - {value: 0x80dc, lo: 0xbb, hi: 0xbf}, - // Block 0x5b, offset 0x5c - {value: 0x0000, lo: 0x09}, - {value: 0x80dc, lo: 0x80, hi: 0x82}, - {value: 0x80e6, lo: 0x85, hi: 0x89}, - {value: 0x80dc, lo: 0x8a, hi: 0x8b}, - {value: 0x80e6, lo: 0xaa, hi: 0xad}, - {value: 0x44f6, lo: 0xbb, hi: 0xbb}, - {value: 0x4500, lo: 0xbc, hi: 0xbc}, - {value: 0x459b, lo: 0xbd, hi: 0xbd}, - {value: 0x45b7, lo: 0xbe, hi: 0xbe}, - {value: 0x45a9, lo: 0xbf, hi: 0xbf}, - // Block 0x5c, offset 0x5d - {value: 0x0000, lo: 0x01}, - {value: 0x45c5, lo: 0x80, hi: 0x80}, - // Block 0x5d, offset 0x5e - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0x82, hi: 0x84}, -} - -// nfcLookup: 1088 bytes -// Block 0 is the null block. -var nfcLookup = [1088]uint8{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x0c2: 0x2e, 0x0c3: 0x03, 0x0c4: 0x04, 0x0c5: 0x05, 0x0c6: 0x2f, 0x0c7: 0x06, - 0x0c8: 0x07, 0x0ca: 0x30, 0x0cc: 0x08, 0x0cd: 0x09, 0x0ce: 0x0a, 0x0cf: 0x31, - 0x0d0: 0x0b, 0x0d1: 0x32, 0x0d2: 0x33, 0x0d3: 0x0c, 0x0d6: 0x0d, 0x0d7: 0x34, - 0x0d8: 0x35, 0x0d9: 0x0e, 0x0db: 0x36, 0x0dc: 0x37, 0x0dd: 0x38, 0x0df: 0x39, - 0x0e0: 0x04, 0x0e1: 0x05, 0x0e2: 0x06, 0x0e3: 0x07, - 0x0ea: 0x08, 0x0eb: 0x09, 0x0ec: 0x09, 0x0ed: 0x0a, 0x0ef: 0x0b, - 0x0f0: 0x10, - // Block 0x4, offset 0x100 - 0x120: 0x3a, 0x121: 0x3b, 0x124: 0x3c, 0x125: 0x3d, 0x126: 0x3e, 0x127: 0x3f, - 0x128: 0x40, 0x129: 0x41, 0x12a: 0x42, 0x12b: 0x43, 0x12c: 0x3e, 0x12d: 0x44, 0x12e: 0x45, 0x12f: 0x46, - 0x131: 0x47, 0x132: 0x48, 0x133: 0x49, 0x134: 0x4a, 0x135: 0x4b, 0x137: 0x4c, - 0x138: 0x4d, 0x139: 0x4e, 0x13a: 0x4f, 0x13b: 0x50, 0x13c: 0x51, 0x13d: 0x52, 0x13e: 0x53, 0x13f: 0x54, - // Block 0x5, offset 0x140 - 0x140: 0x55, 0x142: 0x56, 0x144: 0x57, 0x145: 0x58, 0x146: 0x59, 0x147: 0x5a, - 0x14d: 0x5b, - 0x15c: 0x5c, 0x15f: 0x5d, - 0x162: 0x5e, 0x164: 0x5f, - 0x168: 0x60, 0x169: 0x61, 0x16c: 0x0f, 0x16d: 0x62, 0x16e: 0x63, 0x16f: 0x64, - 0x170: 0x65, 0x173: 0x66, 0x177: 0x67, - 0x178: 0x10, 0x179: 0x11, 0x17a: 0x12, 0x17b: 0x13, 0x17c: 0x14, 0x17d: 0x15, 0x17e: 0x16, 0x17f: 0x17, - // Block 0x6, offset 0x180 - 0x180: 0x68, 0x183: 0x69, 0x184: 0x6a, 0x186: 0x6b, 0x187: 0x6c, - 0x188: 0x6d, 0x189: 0x18, 0x18a: 0x19, 0x18b: 0x6e, 0x18c: 0x6f, - 0x1ab: 0x70, - 0x1b3: 0x71, 0x1b5: 0x72, 0x1b7: 0x73, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x74, 0x1c1: 0x1a, 0x1c2: 0x1b, 0x1c3: 0x1c, - // Block 0x8, offset 0x200 - 0x219: 0x75, 0x21b: 0x76, - 0x220: 0x77, 0x223: 0x78, 0x224: 0x79, 0x225: 0x7a, 0x226: 0x7b, 0x227: 0x7c, - 0x22a: 0x7d, 0x22b: 0x7e, 0x22f: 0x7f, - 0x230: 0x80, 0x231: 0x80, 0x232: 0x80, 0x233: 0x80, 0x234: 0x80, 0x235: 0x80, 0x236: 0x80, 0x237: 0x80, - 0x238: 0x80, 0x239: 0x80, 0x23a: 0x80, 0x23b: 0x80, 0x23c: 0x80, 0x23d: 0x80, 0x23e: 0x80, 0x23f: 0x80, - // Block 0x9, offset 0x240 - 0x240: 0x80, 0x241: 0x80, 0x242: 0x80, 0x243: 0x80, 0x244: 0x80, 0x245: 0x80, 0x246: 0x80, 0x247: 0x80, - 0x248: 0x80, 0x249: 0x80, 0x24a: 0x80, 0x24b: 0x80, 0x24c: 0x80, 0x24d: 0x80, 0x24e: 0x80, 0x24f: 0x80, - 0x250: 0x80, 0x251: 0x80, 0x252: 0x80, 0x253: 0x80, 0x254: 0x80, 0x255: 0x80, 0x256: 0x80, 0x257: 0x80, - 0x258: 0x80, 0x259: 0x80, 0x25a: 0x80, 0x25b: 0x80, 0x25c: 0x80, 0x25d: 0x80, 0x25e: 0x80, 0x25f: 0x80, - 0x260: 0x80, 0x261: 0x80, 0x262: 0x80, 0x263: 0x80, 0x264: 0x80, 0x265: 0x80, 0x266: 0x80, 0x267: 0x80, - 0x268: 0x80, 0x269: 0x80, 0x26a: 0x80, 0x26b: 0x80, 0x26c: 0x80, 0x26d: 0x80, 0x26e: 0x80, 0x26f: 0x80, - 0x270: 0x80, 0x271: 0x80, 0x272: 0x80, 0x273: 0x80, 0x274: 0x80, 0x275: 0x80, 0x276: 0x80, 0x277: 0x80, - 0x278: 0x80, 0x279: 0x80, 0x27a: 0x80, 0x27b: 0x80, 0x27c: 0x80, 0x27d: 0x80, 0x27e: 0x80, 0x27f: 0x80, - // Block 0xa, offset 0x280 - 0x280: 0x80, 0x281: 0x80, 0x282: 0x80, 0x283: 0x80, 0x284: 0x80, 0x285: 0x80, 0x286: 0x80, 0x287: 0x80, - 0x288: 0x80, 0x289: 0x80, 0x28a: 0x80, 0x28b: 0x80, 0x28c: 0x80, 0x28d: 0x80, 0x28e: 0x80, 0x28f: 0x80, - 0x290: 0x80, 0x291: 0x80, 0x292: 0x80, 0x293: 0x80, 0x294: 0x80, 0x295: 0x80, 0x296: 0x80, 0x297: 0x80, - 0x298: 0x80, 0x299: 0x80, 0x29a: 0x80, 0x29b: 0x80, 0x29c: 0x80, 0x29d: 0x80, 0x29e: 0x81, - // Block 0xb, offset 0x2c0 - 0x2e4: 0x1d, 0x2e5: 0x1e, 0x2e6: 0x1f, 0x2e7: 0x20, - 0x2e8: 0x21, 0x2e9: 0x22, 0x2ea: 0x23, 0x2eb: 0x24, 0x2ec: 0x82, 0x2ed: 0x83, - 0x2f8: 0x84, - // Block 0xc, offset 0x300 - 0x307: 0x85, - 0x328: 0x86, - // Block 0xd, offset 0x340 - 0x341: 0x77, 0x342: 0x87, - // Block 0xe, offset 0x380 - 0x385: 0x88, 0x386: 0x89, 0x387: 0x8a, - 0x389: 0x8b, - // Block 0xf, offset 0x3c0 - 0x3e0: 0x25, 0x3e1: 0x26, 0x3e2: 0x27, 0x3e3: 0x28, 0x3e4: 0x29, 0x3e5: 0x2a, 0x3e6: 0x2b, 0x3e7: 0x2c, - 0x3e8: 0x2d, - // Block 0x10, offset 0x400 - 0x410: 0x0c, 0x411: 0x0d, - 0x41d: 0x0e, - 0x42f: 0x0f, -} - -var nfcTrie = trie{nfcLookup[:], nfcValues[:], nfcSparseValues[:], nfcSparseOffset[:], 46} - -// nfkcValues: 5568 entries, 11136 bytes -// Block 2 is the null block. -var nfkcValues = [5568]uint16{ - // Block 0x0, offset 0x0 - 0x003c: 0x8800, 0x003d: 0x8800, 0x003e: 0x8800, - // Block 0x1, offset 0x40 - 0x0041: 0x8800, 0x0042: 0x8800, 0x0043: 0x8800, 0x0044: 0x8800, 0x0045: 0x8800, - 0x0046: 0x8800, 0x0047: 0x8800, 0x0048: 0x8800, 0x0049: 0x8800, 0x004a: 0x8800, 0x004b: 0x8800, - 0x004c: 0x8800, 0x004d: 0x8800, 0x004e: 0x8800, 0x004f: 0x8800, 0x0050: 0x8800, - 0x0052: 0x8800, 0x0053: 0x8800, 0x0054: 0x8800, 0x0055: 0x8800, 0x0056: 0x8800, 0x0057: 0x8800, - 0x0058: 0x8800, 0x0059: 0x8800, 0x005a: 0x8800, - 0x0061: 0x8800, 0x0062: 0x8800, 0x0063: 0x8800, - 0x0064: 0x8800, 0x0065: 0x8800, 0x0066: 0x8800, 0x0067: 0x8800, 0x0068: 0x8800, 0x0069: 0x8800, - 0x006a: 0x8800, 0x006b: 0x8800, 0x006c: 0x8800, 0x006d: 0x8800, 0x006e: 0x8800, 0x006f: 0x8800, - 0x0070: 0x8800, 0x0072: 0x8800, 0x0073: 0x8800, 0x0074: 0x8800, 0x0075: 0x8800, - 0x0076: 0x8800, 0x0077: 0x8800, 0x0078: 0x8800, 0x0079: 0x8800, 0x007a: 0x8800, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x00c0: 0x2e54, 0x00c1: 0x2e59, 0x00c2: 0x463f, 0x00c3: 0x2e5e, 0x00c4: 0x464e, 0x00c5: 0x4653, - 0x00c6: 0x8800, 0x00c7: 0x465d, 0x00c8: 0x2ec7, 0x00c9: 0x2ecc, 0x00ca: 0x4662, 0x00cb: 0x2ee0, - 0x00cc: 0x2f53, 0x00cd: 0x2f58, 0x00ce: 0x2f5d, 0x00cf: 0x4676, 0x00d1: 0x2fe9, - 0x00d2: 0x300c, 0x00d3: 0x3011, 0x00d4: 0x4680, 0x00d5: 0x4685, 0x00d6: 0x4694, - 0x00d8: 0x8800, 0x00d9: 0x3098, 0x00da: 0x309d, 0x00db: 0x30a2, 0x00dc: 0x46c6, 0x00dd: 0x311a, - 0x00e0: 0x3160, 0x00e1: 0x3165, 0x00e2: 0x46d0, 0x00e3: 0x316a, - 0x00e4: 0x46df, 0x00e5: 0x46e4, 0x00e6: 0x8800, 0x00e7: 0x46ee, 0x00e8: 0x31d3, 0x00e9: 0x31d8, - 0x00ea: 0x46f3, 0x00eb: 0x31ec, 0x00ec: 0x3264, 0x00ed: 0x3269, 0x00ee: 0x326e, 0x00ef: 0x4707, - 0x00f1: 0x32fa, 0x00f2: 0x331d, 0x00f3: 0x3322, 0x00f4: 0x4711, 0x00f5: 0x4716, - 0x00f6: 0x4725, 0x00f8: 0x8800, 0x00f9: 0x33ae, 0x00fa: 0x33b3, 0x00fb: 0x33b8, - 0x00fc: 0x4757, 0x00fd: 0x3435, 0x00ff: 0x344e, - // Block 0x4, offset 0x100 - 0x0100: 0x2e63, 0x0101: 0x316f, 0x0102: 0x4644, 0x0103: 0x46d5, 0x0104: 0x2e81, 0x0105: 0x318d, - 0x0106: 0x2e95, 0x0107: 0x31a1, 0x0108: 0x2e9a, 0x0109: 0x31a6, 0x010a: 0x2e9f, 0x010b: 0x31ab, - 0x010c: 0x2ea4, 0x010d: 0x31b0, 0x010e: 0x2eae, 0x010f: 0x31ba, - 0x0112: 0x4667, 0x0113: 0x46f8, 0x0114: 0x2ed6, 0x0115: 0x31e2, 0x0116: 0x2edb, 0x0117: 0x31e7, - 0x0118: 0x2ef9, 0x0119: 0x3205, 0x011a: 0x2eea, 0x011b: 0x31f6, 0x011c: 0x2f12, 0x011d: 0x321e, - 0x011e: 0x2f1c, 0x011f: 0x3228, 0x0120: 0x2f21, 0x0121: 0x322d, 0x0122: 0x2f2b, 0x0123: 0x3237, - 0x0124: 0x2f30, 0x0125: 0x323c, 0x0128: 0x2f62, 0x0129: 0x3273, - 0x012a: 0x2f67, 0x012b: 0x3278, 0x012c: 0x2f6c, 0x012d: 0x327d, 0x012e: 0x2f8f, 0x012f: 0x329b, - 0x0130: 0x2f71, 0x0132: 0x027d, 0x0133: 0x0301, 0x0134: 0x2f99, 0x0135: 0x32a5, - 0x0136: 0x2fad, 0x0137: 0x32be, 0x0139: 0x2fb7, 0x013a: 0x32c8, 0x013b: 0x2fc1, - 0x013c: 0x32d2, 0x013d: 0x2fbc, 0x013e: 0x32cd, 0x013f: 0x06fd, - // Block 0x5, offset 0x140 - 0x0140: 0x0785, 0x0143: 0x2fe4, 0x0144: 0x32f5, 0x0145: 0x2ffd, - 0x0146: 0x330e, 0x0147: 0x2ff3, 0x0148: 0x3304, 0x0149: 0x07ad, - 0x014c: 0x468a, 0x014d: 0x471b, 0x014e: 0x3016, 0x014f: 0x3327, 0x0150: 0x3020, 0x0151: 0x3331, - 0x0154: 0x303e, 0x0155: 0x334f, 0x0156: 0x3057, 0x0157: 0x3368, - 0x0158: 0x3048, 0x0159: 0x3359, 0x015a: 0x46ad, 0x015b: 0x473e, 0x015c: 0x3061, 0x015d: 0x3372, - 0x015e: 0x3070, 0x015f: 0x3381, 0x0160: 0x46b2, 0x0161: 0x4743, 0x0162: 0x3089, 0x0163: 0x339f, - 0x0164: 0x307a, 0x0165: 0x3390, 0x0168: 0x46bc, 0x0169: 0x474d, - 0x016a: 0x46c1, 0x016b: 0x4752, 0x016c: 0x30a7, 0x016d: 0x33bd, 0x016e: 0x30b1, 0x016f: 0x33c7, - 0x0170: 0x30b6, 0x0171: 0x33cc, 0x0172: 0x30d4, 0x0173: 0x33ea, 0x0174: 0x30f7, 0x0175: 0x340d, - 0x0176: 0x311f, 0x0177: 0x343a, 0x0178: 0x3133, 0x0179: 0x3142, 0x017a: 0x3462, 0x017b: 0x314c, - 0x017c: 0x346c, 0x017d: 0x3151, 0x017e: 0x3471, 0x017f: 0x0175, - // Block 0x6, offset 0x180 - 0x0184: 0x41d4, 0x0185: 0x41da, - 0x0186: 0x41e0, 0x0187: 0x0292, 0x0188: 0x0295, 0x0189: 0x0322, 0x018a: 0x02a1, 0x018b: 0x02a4, - 0x018c: 0x0358, 0x018d: 0x2e6d, 0x018e: 0x3179, 0x018f: 0x2f7b, 0x0190: 0x3287, 0x0191: 0x3025, - 0x0192: 0x3336, 0x0193: 0x30bb, 0x0194: 0x33d1, 0x0195: 0x38b4, 0x0196: 0x3a43, 0x0197: 0x38ad, - 0x0198: 0x3a3c, 0x0199: 0x38bb, 0x019a: 0x3a4a, 0x019b: 0x38a6, 0x019c: 0x3a35, - 0x019e: 0x3795, 0x019f: 0x3924, 0x01a0: 0x378e, 0x01a1: 0x391d, 0x01a2: 0x3498, 0x01a3: 0x34aa, - 0x01a6: 0x2f26, 0x01a7: 0x3232, 0x01a8: 0x2fa3, 0x01a9: 0x32b4, - 0x01aa: 0x46a3, 0x01ab: 0x4734, 0x01ac: 0x3875, 0x01ad: 0x3a04, 0x01ae: 0x34bc, 0x01af: 0x34c2, - 0x01b0: 0x32aa, 0x01b1: 0x0262, 0x01b2: 0x0265, 0x01b3: 0x02e9, 0x01b4: 0x2f0d, 0x01b5: 0x3219, - 0x01b8: 0x2fdf, 0x01b9: 0x32f0, 0x01ba: 0x379c, 0x01bb: 0x392b, - 0x01bc: 0x3492, 0x01bd: 0x34a4, 0x01be: 0x349e, 0x01bf: 0x34b0, - // Block 0x7, offset 0x1c0 - 0x01c0: 0x2e72, 0x01c1: 0x317e, 0x01c2: 0x2e77, 0x01c3: 0x3183, 0x01c4: 0x2eef, 0x01c5: 0x31fb, - 0x01c6: 0x2ef4, 0x01c7: 0x3200, 0x01c8: 0x2f80, 0x01c9: 0x328c, 0x01ca: 0x2f85, 0x01cb: 0x3291, - 0x01cc: 0x302a, 0x01cd: 0x333b, 0x01ce: 0x302f, 0x01cf: 0x3340, 0x01d0: 0x304d, 0x01d1: 0x335e, - 0x01d2: 0x3052, 0x01d3: 0x3363, 0x01d4: 0x30c0, 0x01d5: 0x33d6, 0x01d6: 0x30c5, 0x01d7: 0x33db, - 0x01d8: 0x306b, 0x01d9: 0x337c, 0x01da: 0x3084, 0x01db: 0x339a, - 0x01de: 0x2f3f, 0x01df: 0x324b, - 0x01e6: 0x4649, 0x01e7: 0x46da, 0x01e8: 0x4671, 0x01e9: 0x4702, - 0x01ea: 0x3844, 0x01eb: 0x39d3, 0x01ec: 0x3821, 0x01ed: 0x39b0, 0x01ee: 0x468f, 0x01ef: 0x4720, - 0x01f0: 0x383d, 0x01f1: 0x39cc, 0x01f2: 0x3129, 0x01f3: 0x3444, - // Block 0x8, offset 0x200 - 0x0200: 0x86e6, 0x0201: 0x86e6, 0x0202: 0x86e6, 0x0203: 0x86e6, 0x0204: 0x86e6, 0x0205: 0x80e6, - 0x0206: 0x86e6, 0x0207: 0x86e6, 0x0208: 0x86e6, 0x0209: 0x86e6, 0x020a: 0x86e6, 0x020b: 0x86e6, - 0x020c: 0x86e6, 0x020d: 0x80e6, 0x020e: 0x80e6, 0x020f: 0x86e6, 0x0210: 0x80e6, 0x0211: 0x86e6, - 0x0212: 0x80e6, 0x0213: 0x86e6, 0x0214: 0x86e6, 0x0215: 0x80e8, 0x0216: 0x80dc, 0x0217: 0x80dc, - 0x0218: 0x80dc, 0x0219: 0x80dc, 0x021a: 0x80e8, 0x021b: 0x86d8, 0x021c: 0x80dc, 0x021d: 0x80dc, - 0x021e: 0x80dc, 0x021f: 0x80dc, 0x0220: 0x80dc, 0x0221: 0x80ca, 0x0222: 0x80ca, 0x0223: 0x86dc, - 0x0224: 0x86dc, 0x0225: 0x86dc, 0x0226: 0x86dc, 0x0227: 0x86ca, 0x0228: 0x86ca, 0x0229: 0x80dc, - 0x022a: 0x80dc, 0x022b: 0x80dc, 0x022c: 0x80dc, 0x022d: 0x86dc, 0x022e: 0x86dc, 0x022f: 0x80dc, - 0x0230: 0x86dc, 0x0231: 0x86dc, 0x0232: 0x80dc, 0x0233: 0x80dc, 0x0234: 0x8001, 0x0235: 0x8001, - 0x0236: 0x8001, 0x0237: 0x8001, 0x0238: 0x8601, 0x0239: 0x80dc, 0x023a: 0x80dc, 0x023b: 0x80dc, - 0x023c: 0x80dc, 0x023d: 0x80e6, 0x023e: 0x80e6, 0x023f: 0x80e6, - // Block 0x9, offset 0x240 - 0x0240: 0x4965, 0x0241: 0x496a, 0x0242: 0x86e6, 0x0243: 0x496f, 0x0244: 0x4980, 0x0245: 0x86f0, - 0x0246: 0x80e6, 0x0247: 0x80dc, 0x0248: 0x80dc, 0x0249: 0x80dc, 0x024a: 0x80e6, 0x024b: 0x80e6, - 0x024c: 0x80e6, 0x024d: 0x80dc, 0x024e: 0x80dc, 0x0250: 0x80e6, 0x0251: 0x80e6, - 0x0252: 0x80e6, 0x0253: 0x80dc, 0x0254: 0x80dc, 0x0255: 0x80dc, 0x0256: 0x80dc, 0x0257: 0x80e6, - 0x0258: 0x80e8, 0x0259: 0x80dc, 0x025a: 0x80dc, 0x025b: 0x80e6, 0x025c: 0x80e9, 0x025d: 0x80ea, - 0x025e: 0x80ea, 0x025f: 0x80e9, 0x0260: 0x80ea, 0x0261: 0x80ea, 0x0262: 0x80e9, 0x0263: 0x80e6, - 0x0264: 0x80e6, 0x0265: 0x80e6, 0x0266: 0x80e6, 0x0267: 0x80e6, 0x0268: 0x80e6, 0x0269: 0x80e6, - 0x026a: 0x80e6, 0x026b: 0x80e6, 0x026c: 0x80e6, 0x026d: 0x80e6, 0x026e: 0x80e6, 0x026f: 0x80e6, - 0x0274: 0x042d, - 0x027a: 0x4191, - 0x027e: 0x0105, - // Block 0xa, offset 0x280 - 0x0284: 0x4146, 0x0285: 0x4379, - 0x0286: 0x34ce, 0x0287: 0x0394, 0x0288: 0x34ec, 0x0289: 0x34f8, 0x028a: 0x350a, - 0x028c: 0x3528, 0x028e: 0x353a, 0x028f: 0x3558, 0x0290: 0x3ced, 0x0291: 0x8800, - 0x0295: 0x8800, 0x0297: 0x8800, - 0x0299: 0x8800, - 0x029f: 0x8800, 0x02a1: 0x8800, - 0x02a5: 0x8800, 0x02a9: 0x8800, - 0x02aa: 0x351c, 0x02ab: 0x354c, 0x02ac: 0x47b5, 0x02ad: 0x357c, 0x02ae: 0x47df, 0x02af: 0x358e, - 0x02b0: 0x3d55, 0x02b1: 0x8800, 0x02b5: 0x8800, - 0x02b7: 0x8800, 0x02b9: 0x8800, - 0x02bf: 0x8800, - // Block 0xb, offset 0x2c0 - 0x02c1: 0x8800, 0x02c5: 0x8800, - 0x02c9: 0x8800, 0x02ca: 0x47f7, 0x02cb: 0x4815, - 0x02cc: 0x35ac, 0x02cd: 0x35c4, 0x02ce: 0x482d, 0x02d0: 0x047b, 0x02d1: 0x048d, - 0x02d2: 0x0469, 0x02d3: 0x420a, 0x02d4: 0x4210, 0x02d5: 0x04b7, 0x02d6: 0x04a5, - 0x02f0: 0x0493, 0x02f1: 0x04a8, 0x02f2: 0x04ab, 0x02f4: 0x0445, 0x02f5: 0x0484, - 0x02f9: 0x0463, - // Block 0xc, offset 0x300 - 0x0300: 0x3606, 0x0301: 0x3612, 0x0303: 0x3600, - 0x0306: 0x8800, 0x0307: 0x35ee, - 0x030c: 0x3642, 0x030d: 0x362a, 0x030e: 0x3654, 0x0310: 0x8800, - 0x0313: 0x8800, 0x0315: 0x8800, 0x0316: 0x8800, 0x0317: 0x8800, - 0x0318: 0x8800, 0x0319: 0x3636, 0x031a: 0x8800, - 0x031e: 0x8800, 0x0323: 0x8800, - 0x0327: 0x8800, - 0x032b: 0x8800, 0x032d: 0x8800, - 0x0330: 0x8800, 0x0333: 0x8800, 0x0335: 0x8800, - 0x0336: 0x8800, 0x0337: 0x8800, 0x0338: 0x8800, 0x0339: 0x36ba, 0x033a: 0x8800, - 0x033e: 0x8800, - // Block 0xd, offset 0x340 - 0x0341: 0x3618, 0x0342: 0x369c, - 0x0350: 0x35f4, 0x0351: 0x3678, - 0x0352: 0x35fa, 0x0353: 0x367e, 0x0356: 0x360c, 0x0357: 0x3690, - 0x0358: 0x8800, 0x0359: 0x8800, 0x035a: 0x370e, 0x035b: 0x3714, 0x035c: 0x361e, 0x035d: 0x36a2, - 0x035e: 0x3624, 0x035f: 0x36a8, 0x0362: 0x3630, 0x0363: 0x36b4, - 0x0364: 0x363c, 0x0365: 0x36c0, 0x0366: 0x3648, 0x0367: 0x36cc, 0x0368: 0x8800, 0x0369: 0x8800, - 0x036a: 0x371a, 0x036b: 0x3720, 0x036c: 0x3672, 0x036d: 0x36f6, 0x036e: 0x364e, 0x036f: 0x36d2, - 0x0370: 0x365a, 0x0371: 0x36de, 0x0372: 0x3660, 0x0373: 0x36e4, 0x0374: 0x3666, 0x0375: 0x36ea, - 0x0378: 0x366c, 0x0379: 0x36f0, - // Block 0xe, offset 0x380 - 0x0387: 0x1c4e, - 0x0391: 0x80dc, - 0x0392: 0x80e6, 0x0393: 0x80e6, 0x0394: 0x80e6, 0x0395: 0x80e6, 0x0396: 0x80dc, 0x0397: 0x80e6, - 0x0398: 0x80e6, 0x0399: 0x80e6, 0x039a: 0x80de, 0x039b: 0x80dc, 0x039c: 0x80e6, 0x039d: 0x80e6, - 0x039e: 0x80e6, 0x039f: 0x80e6, 0x03a0: 0x80e6, 0x03a1: 0x80e6, 0x03a2: 0x80dc, 0x03a3: 0x80dc, - 0x03a4: 0x80dc, 0x03a5: 0x80dc, 0x03a6: 0x80dc, 0x03a7: 0x80dc, 0x03a8: 0x80e6, 0x03a9: 0x80e6, - 0x03aa: 0x80dc, 0x03ab: 0x80e6, 0x03ac: 0x80e6, 0x03ad: 0x80de, 0x03ae: 0x80e4, 0x03af: 0x80e6, - 0x03b0: 0x800a, 0x03b1: 0x800b, 0x03b2: 0x800c, 0x03b3: 0x800d, 0x03b4: 0x800e, 0x03b5: 0x800f, - 0x03b6: 0x8010, 0x03b7: 0x8011, 0x03b8: 0x8012, 0x03b9: 0x8013, 0x03ba: 0x8013, 0x03bb: 0x8014, - 0x03bc: 0x8015, 0x03bd: 0x8016, 0x03bf: 0x8017, - // Block 0xf, offset 0x3c0 - 0x03c8: 0x8800, 0x03ca: 0x8800, 0x03cb: 0x801b, - 0x03cc: 0x801c, 0x03cd: 0x801d, 0x03ce: 0x801e, 0x03cf: 0x801f, 0x03d0: 0x8020, 0x03d1: 0x8021, - 0x03d2: 0x8022, 0x03d3: 0x86e6, 0x03d4: 0x86e6, 0x03d5: 0x86dc, 0x03d6: 0x80dc, 0x03d7: 0x80e6, - 0x03d8: 0x80e6, 0x03d9: 0x80e6, 0x03da: 0x80e6, 0x03db: 0x80e6, 0x03dc: 0x80dc, 0x03dd: 0x80e6, - 0x03de: 0x80e6, 0x03df: 0x80dc, - 0x03f0: 0x8023, 0x03f5: 0x1c71, - 0x03f6: 0x1f00, 0x03f7: 0x1f3c, 0x03f8: 0x1f37, - // Block 0x10, offset 0x400 - 0x0405: 0x8800, - 0x0406: 0x0078, 0x0407: 0x8800, 0x0408: 0x007f, 0x0409: 0x8800, 0x040a: 0x0086, 0x040b: 0x8800, - 0x040c: 0x008d, 0x040d: 0x8800, 0x040e: 0x0094, 0x0411: 0x8800, - 0x0412: 0x009b, - 0x0434: 0x8007, 0x0435: 0x8600, - 0x043a: 0x8800, 0x043b: 0x00a2, - 0x043c: 0x8800, 0x043d: 0x00a9, 0x043e: 0x8800, 0x043f: 0x8800, - // Block 0x11, offset 0x440 - 0x0440: 0x0137, 0x0441: 0x0139, 0x0442: 0x013d, 0x0443: 0x0151, 0x0444: 0x03b5, 0x0445: 0x03b8, - 0x0446: 0x0951, 0x0447: 0x0153, 0x0448: 0x0157, 0x0449: 0x0159, 0x044a: 0x03c4, 0x044b: 0x03c7, - 0x044c: 0x03ca, 0x044d: 0x015d, 0x044f: 0x0165, 0x0450: 0x0169, 0x0451: 0x03a3, - 0x0452: 0x016d, 0x0453: 0x03be, 0x0454: 0x0955, 0x0455: 0x0959, 0x0456: 0x016f, 0x0457: 0x0177, - 0x0458: 0x0179, 0x0459: 0x0961, 0x045a: 0x03e8, 0x045b: 0x017b, 0x045c: 0x0965, 0x045d: 0x047b, - 0x045e: 0x047e, 0x045f: 0x0481, 0x0460: 0x04b7, 0x0461: 0x04ba, 0x0462: 0x0161, 0x0463: 0x0173, - 0x0464: 0x0179, 0x0465: 0x017b, 0x0466: 0x047b, 0x0467: 0x047e, 0x0468: 0x04a8, 0x0469: 0x04b7, - 0x046a: 0x04ba, - 0x0478: 0x04c9, - // Block 0x12, offset 0x480 - 0x049b: 0x03bb, 0x049c: 0x0155, 0x049d: 0x03c1, - 0x049e: 0x039a, 0x049f: 0x03ca, 0x04a0: 0x015b, 0x04a1: 0x03cd, 0x04a2: 0x03d0, 0x04a3: 0x03d6, - 0x04a4: 0x03dc, 0x04a5: 0x03df, 0x04a6: 0x03e2, 0x04a7: 0x0969, 0x04a8: 0x0427, 0x04a9: 0x03e5, - 0x04aa: 0x096d, 0x04ab: 0x042a, 0x04ac: 0x03ee, 0x04ad: 0x03eb, 0x04ae: 0x03f1, 0x04af: 0x03f4, - 0x04b0: 0x03f7, 0x04b1: 0x03fa, 0x04b2: 0x03fd, 0x04b3: 0x0409, 0x04b4: 0x040c, 0x04b5: 0x03ac, - 0x04b6: 0x040f, 0x04b7: 0x0412, 0x04b8: 0x095d, 0x04b9: 0x0415, 0x04ba: 0x0418, 0x04bb: 0x0183, - 0x04bc: 0x041b, 0x04bd: 0x041e, 0x04be: 0x0421, 0x04bf: 0x048d, - // Block 0x13, offset 0x4c0 - 0x04c0: 0x2e7c, 0x04c1: 0x3188, 0x04c2: 0x2e86, 0x04c3: 0x3192, 0x04c4: 0x2e8b, 0x04c5: 0x3197, - 0x04c6: 0x2e90, 0x04c7: 0x319c, 0x04c8: 0x37b1, 0x04c9: 0x3940, 0x04ca: 0x2ea9, 0x04cb: 0x31b5, - 0x04cc: 0x2eb3, 0x04cd: 0x31bf, 0x04ce: 0x2ec2, 0x04cf: 0x31ce, 0x04d0: 0x2eb8, 0x04d1: 0x31c4, - 0x04d2: 0x2ebd, 0x04d3: 0x31c9, 0x04d4: 0x37d4, 0x04d5: 0x3963, 0x04d6: 0x37db, 0x04d7: 0x396a, - 0x04d8: 0x2efe, 0x04d9: 0x320a, 0x04da: 0x2f03, 0x04db: 0x320f, 0x04dc: 0x37e9, 0x04dd: 0x3978, - 0x04de: 0x2f08, 0x04df: 0x3214, 0x04e0: 0x2f17, 0x04e1: 0x3223, 0x04e2: 0x2f35, 0x04e3: 0x3241, - 0x04e4: 0x2f44, 0x04e5: 0x3250, 0x04e6: 0x2f3a, 0x04e7: 0x3246, 0x04e8: 0x2f49, 0x04e9: 0x3255, - 0x04ea: 0x2f4e, 0x04eb: 0x325a, 0x04ec: 0x2f94, 0x04ed: 0x32a0, 0x04ee: 0x37f0, 0x04ef: 0x397f, - 0x04f0: 0x2f9e, 0x04f1: 0x32af, 0x04f2: 0x2fa8, 0x04f3: 0x32b9, 0x04f4: 0x2fb2, 0x04f5: 0x32c3, - 0x04f6: 0x467b, 0x04f7: 0x470c, 0x04f8: 0x37f7, 0x04f9: 0x3986, 0x04fa: 0x2fcb, 0x04fb: 0x32dc, - 0x04fc: 0x2fc6, 0x04fd: 0x32d7, 0x04fe: 0x2fd0, 0x04ff: 0x32e1, - // Block 0x14, offset 0x500 - 0x0500: 0x2fd5, 0x0501: 0x32e6, 0x0502: 0x2fda, 0x0503: 0x32eb, 0x0504: 0x2fee, 0x0505: 0x32ff, - 0x0506: 0x2ff8, 0x0507: 0x3309, 0x0508: 0x3007, 0x0509: 0x3318, 0x050a: 0x3002, 0x050b: 0x3313, - 0x050c: 0x381a, 0x050d: 0x39a9, 0x050e: 0x3828, 0x050f: 0x39b7, 0x0510: 0x382f, 0x0511: 0x39be, - 0x0512: 0x3836, 0x0513: 0x39c5, 0x0514: 0x3034, 0x0515: 0x3345, 0x0516: 0x3039, 0x0517: 0x334a, - 0x0518: 0x3043, 0x0519: 0x3354, 0x051a: 0x46a8, 0x051b: 0x4739, 0x051c: 0x387c, 0x051d: 0x3a0b, - 0x051e: 0x305c, 0x051f: 0x336d, 0x0520: 0x3066, 0x0521: 0x3377, 0x0522: 0x46b7, 0x0523: 0x4748, - 0x0524: 0x3883, 0x0525: 0x3a12, 0x0526: 0x388a, 0x0527: 0x3a19, 0x0528: 0x3891, 0x0529: 0x3a20, - 0x052a: 0x3075, 0x052b: 0x3386, 0x052c: 0x307f, 0x052d: 0x3395, 0x052e: 0x3093, 0x052f: 0x33a9, - 0x0530: 0x308e, 0x0531: 0x33a4, 0x0532: 0x30cf, 0x0533: 0x33e5, 0x0534: 0x30de, 0x0535: 0x33f4, - 0x0536: 0x30d9, 0x0537: 0x33ef, 0x0538: 0x3898, 0x0539: 0x3a27, 0x053a: 0x389f, 0x053b: 0x3a2e, - 0x053c: 0x30e3, 0x053d: 0x33f9, 0x053e: 0x30e8, 0x053f: 0x33fe, - // Block 0x15, offset 0x540 - 0x0540: 0x30ed, 0x0541: 0x3403, 0x0542: 0x30f2, 0x0543: 0x3408, 0x0544: 0x3101, 0x0545: 0x3417, - 0x0546: 0x30fc, 0x0547: 0x3412, 0x0548: 0x3106, 0x0549: 0x3421, 0x054a: 0x310b, 0x054b: 0x3426, - 0x054c: 0x3110, 0x054d: 0x342b, 0x054e: 0x312e, 0x054f: 0x3449, 0x0550: 0x3147, 0x0551: 0x3467, - 0x0552: 0x3156, 0x0553: 0x3476, 0x0554: 0x315b, 0x0555: 0x347b, 0x0556: 0x325f, 0x0557: 0x338b, - 0x0558: 0x341c, 0x0559: 0x3458, 0x055a: 0x0731, 0x055b: 0x41c3, - 0x0560: 0x4658, 0x0561: 0x46e9, 0x0562: 0x2e68, 0x0563: 0x3174, - 0x0564: 0x375d, 0x0565: 0x38ec, 0x0566: 0x3756, 0x0567: 0x38e5, 0x0568: 0x376b, 0x0569: 0x38fa, - 0x056a: 0x3764, 0x056b: 0x38f3, 0x056c: 0x37a3, 0x056d: 0x3932, 0x056e: 0x3779, 0x056f: 0x3908, - 0x0570: 0x3772, 0x0571: 0x3901, 0x0572: 0x3787, 0x0573: 0x3916, 0x0574: 0x3780, 0x0575: 0x390f, - 0x0576: 0x37aa, 0x0577: 0x3939, 0x0578: 0x466c, 0x0579: 0x46fd, 0x057a: 0x2ee5, 0x057b: 0x31f1, - 0x057c: 0x2ed1, 0x057d: 0x31dd, 0x057e: 0x37bf, 0x057f: 0x394e, - // Block 0x16, offset 0x580 - 0x0580: 0x37b8, 0x0581: 0x3947, 0x0582: 0x37cd, 0x0583: 0x395c, 0x0584: 0x37c6, 0x0585: 0x3955, - 0x0586: 0x37e2, 0x0587: 0x3971, 0x0588: 0x2f76, 0x0589: 0x3282, 0x058a: 0x2f8a, 0x058b: 0x3296, - 0x058c: 0x469e, 0x058d: 0x472f, 0x058e: 0x301b, 0x058f: 0x332c, 0x0590: 0x3805, 0x0591: 0x3994, - 0x0592: 0x37fe, 0x0593: 0x398d, 0x0594: 0x3813, 0x0595: 0x39a2, 0x0596: 0x380c, 0x0597: 0x399b, - 0x0598: 0x386e, 0x0599: 0x39fd, 0x059a: 0x3852, 0x059b: 0x39e1, 0x059c: 0x384b, 0x059d: 0x39da, - 0x059e: 0x3860, 0x059f: 0x39ef, 0x05a0: 0x3859, 0x05a1: 0x39e8, 0x05a2: 0x3867, 0x05a3: 0x39f6, - 0x05a4: 0x30ca, 0x05a5: 0x33e0, 0x05a6: 0x30ac, 0x05a7: 0x33c2, 0x05a8: 0x38c9, 0x05a9: 0x3a58, - 0x05aa: 0x38c2, 0x05ab: 0x3a51, 0x05ac: 0x38d7, 0x05ad: 0x3a66, 0x05ae: 0x38d0, 0x05af: 0x3a5f, - 0x05b0: 0x38de, 0x05b1: 0x3a6d, 0x05b2: 0x3115, 0x05b3: 0x3430, 0x05b4: 0x313d, 0x05b5: 0x345d, - 0x05b6: 0x3138, 0x05b7: 0x3453, 0x05b8: 0x3124, 0x05b9: 0x343f, - // Block 0x17, offset 0x5c0 - 0x05c0: 0x47bb, 0x05c1: 0x47c1, 0x05c2: 0x48d5, 0x05c3: 0x48ed, 0x05c4: 0x48dd, 0x05c5: 0x48f5, - 0x05c6: 0x48e5, 0x05c7: 0x48fd, 0x05c8: 0x4761, 0x05c9: 0x4767, 0x05ca: 0x4845, 0x05cb: 0x485d, - 0x05cc: 0x484d, 0x05cd: 0x4865, 0x05ce: 0x4855, 0x05cf: 0x486d, 0x05d0: 0x47cd, 0x05d1: 0x47d3, - 0x05d2: 0x3c9d, 0x05d3: 0x3cad, 0x05d4: 0x3ca5, 0x05d5: 0x3cb5, - 0x05d8: 0x476d, 0x05d9: 0x4773, 0x05da: 0x3bcd, 0x05db: 0x3bdd, 0x05dc: 0x3bd5, 0x05dd: 0x3be5, - 0x05e0: 0x47e5, 0x05e1: 0x47eb, 0x05e2: 0x4905, 0x05e3: 0x491d, - 0x05e4: 0x490d, 0x05e5: 0x4925, 0x05e6: 0x4915, 0x05e7: 0x492d, 0x05e8: 0x4779, 0x05e9: 0x477f, - 0x05ea: 0x4875, 0x05eb: 0x488d, 0x05ec: 0x487d, 0x05ed: 0x4895, 0x05ee: 0x4885, 0x05ef: 0x489d, - 0x05f0: 0x47fd, 0x05f1: 0x4803, 0x05f2: 0x3cfd, 0x05f3: 0x3d15, 0x05f4: 0x3d05, 0x05f5: 0x3d1d, - 0x05f6: 0x3d0d, 0x05f7: 0x3d25, 0x05f8: 0x4785, 0x05f9: 0x478b, 0x05fa: 0x3bfd, 0x05fb: 0x3c15, - 0x05fc: 0x3c05, 0x05fd: 0x3c1d, 0x05fe: 0x3c0d, 0x05ff: 0x3c25, - // Block 0x18, offset 0x600 - 0x0600: 0x4809, 0x0601: 0x480f, 0x0602: 0x3d2d, 0x0603: 0x3d3d, 0x0604: 0x3d35, 0x0605: 0x3d45, - 0x0608: 0x4791, 0x0609: 0x4797, 0x060a: 0x3c2d, 0x060b: 0x3c3d, - 0x060c: 0x3c35, 0x060d: 0x3c45, 0x0610: 0x481b, 0x0611: 0x4821, - 0x0612: 0x3d65, 0x0613: 0x3d7d, 0x0614: 0x3d6d, 0x0615: 0x3d85, 0x0616: 0x3d75, 0x0617: 0x3d8d, - 0x0619: 0x479d, 0x061b: 0x3c4d, 0x061d: 0x3c55, - 0x061f: 0x3c5d, 0x0620: 0x4833, 0x0621: 0x4839, 0x0622: 0x4935, 0x0623: 0x494d, - 0x0624: 0x493d, 0x0625: 0x4955, 0x0626: 0x4945, 0x0627: 0x495d, 0x0628: 0x47a3, 0x0629: 0x47a9, - 0x062a: 0x48a5, 0x062b: 0x48bd, 0x062c: 0x48ad, 0x062d: 0x48c5, 0x062e: 0x48b5, 0x062f: 0x48cd, - 0x0630: 0x47af, 0x0631: 0x421c, 0x0632: 0x3576, 0x0633: 0x4222, 0x0634: 0x47d9, 0x0635: 0x4228, - 0x0636: 0x3588, 0x0637: 0x422e, 0x0638: 0x35a6, 0x0639: 0x4234, 0x063a: 0x35be, 0x063b: 0x423a, - 0x063c: 0x4827, 0x063d: 0x4240, - // Block 0x19, offset 0x640 - 0x0640: 0x3c85, 0x0641: 0x3c8d, 0x0642: 0x4069, 0x0643: 0x4087, 0x0644: 0x4073, 0x0645: 0x4091, - 0x0646: 0x407d, 0x0647: 0x409b, 0x0648: 0x3bbd, 0x0649: 0x3bc5, 0x064a: 0x3fb5, 0x064b: 0x3fd3, - 0x064c: 0x3fbf, 0x064d: 0x3fdd, 0x064e: 0x3fc9, 0x064f: 0x3fe7, 0x0650: 0x3ccd, 0x0651: 0x3cd5, - 0x0652: 0x40a5, 0x0653: 0x40c3, 0x0654: 0x40af, 0x0655: 0x40cd, 0x0656: 0x40b9, 0x0657: 0x40d7, - 0x0658: 0x3bed, 0x0659: 0x3bf5, 0x065a: 0x3ff1, 0x065b: 0x400f, 0x065c: 0x3ffb, 0x065d: 0x4019, - 0x065e: 0x4005, 0x065f: 0x4023, 0x0660: 0x3da5, 0x0661: 0x3dad, 0x0662: 0x40e1, 0x0663: 0x40ff, - 0x0664: 0x40eb, 0x0665: 0x4109, 0x0666: 0x40f5, 0x0667: 0x4113, 0x0668: 0x3c65, 0x0669: 0x3c6d, - 0x066a: 0x402d, 0x066b: 0x404b, 0x066c: 0x4037, 0x066d: 0x4055, 0x066e: 0x4041, 0x066f: 0x405f, - 0x0670: 0x356a, 0x0671: 0x3564, 0x0672: 0x3c75, 0x0673: 0x3570, 0x0674: 0x3c7d, - 0x0676: 0x47c7, 0x0677: 0x3c95, 0x0678: 0x34da, 0x0679: 0x34d4, 0x067a: 0x34c8, 0x067b: 0x41ec, - 0x067c: 0x34e0, 0x067d: 0x4173, 0x067e: 0x0490, 0x067f: 0x4173, - // Block 0x1a, offset 0x680 - 0x0680: 0x418c, 0x0681: 0x4380, 0x0682: 0x3cbd, 0x0683: 0x3582, 0x0684: 0x3cc5, - 0x0686: 0x47f1, 0x0687: 0x3cdd, 0x0688: 0x34e6, 0x0689: 0x41f2, 0x068a: 0x34f2, 0x068b: 0x41f8, - 0x068c: 0x34fe, 0x068d: 0x4387, 0x068e: 0x438e, 0x068f: 0x4395, 0x0690: 0x359a, 0x0691: 0x3594, - 0x0692: 0x3ce5, 0x0693: 0x43e2, 0x0696: 0x35a0, 0x0697: 0x3cf5, - 0x0698: 0x3516, 0x0699: 0x3510, 0x069a: 0x3504, 0x069b: 0x41fe, 0x069d: 0x439c, - 0x069e: 0x43a3, 0x069f: 0x43aa, 0x06a0: 0x35d0, 0x06a1: 0x35ca, 0x06a2: 0x3d4d, 0x06a3: 0x43ea, - 0x06a4: 0x35b2, 0x06a5: 0x35b8, 0x06a6: 0x35d6, 0x06a7: 0x3d5d, 0x06a8: 0x3546, 0x06a9: 0x3540, - 0x06aa: 0x3534, 0x06ab: 0x420a, 0x06ac: 0x352e, 0x06ad: 0x4372, 0x06ae: 0x4379, 0x06af: 0x014f, - 0x06b2: 0x3d95, 0x06b3: 0x35dc, 0x06b4: 0x3d9d, - 0x06b6: 0x483f, 0x06b7: 0x3db5, 0x06b8: 0x3522, 0x06b9: 0x4204, 0x06ba: 0x3552, 0x06bb: 0x4216, - 0x06bc: 0x355e, 0x06bd: 0x4146, 0x06be: 0x4178, - // Block 0x1b, offset 0x6c0 - 0x06c0: 0x0729, 0x06c1: 0x072d, 0x06c2: 0x0115, 0x06c3: 0x07a5, 0x06c5: 0x0739, - 0x06c6: 0x073d, 0x06c7: 0x03a9, 0x06c9: 0x07a9, 0x06ca: 0x015d, 0x06cb: 0x011f, - 0x06cc: 0x011f, 0x06cd: 0x011f, 0x06ce: 0x015f, 0x06cf: 0x039d, 0x06d0: 0x0121, 0x06d1: 0x0121, - 0x06d2: 0x0127, 0x06d3: 0x0167, 0x06d5: 0x012b, 0x06d6: 0x02a7, - 0x06d9: 0x012f, 0x06da: 0x0131, 0x06db: 0x0133, 0x06dc: 0x0133, 0x06dd: 0x0133, - 0x06e0: 0x02b9, 0x06e1: 0x0719, 0x06e2: 0x02c2, - 0x06e4: 0x0143, 0x06e6: 0x0475, 0x06e8: 0x0143, - 0x06ea: 0x0125, 0x06eb: 0x41be, 0x06ec: 0x0113, 0x06ed: 0x0115, 0x06ef: 0x0159, - 0x06f0: 0x0119, 0x06f1: 0x011b, 0x06f3: 0x0129, 0x06f4: 0x016d, 0x06f5: 0x04cc, - 0x06f6: 0x04cf, 0x06f7: 0x04d2, 0x06f8: 0x04d5, 0x06f9: 0x0161, 0x06fb: 0x06e9, - 0x06fc: 0x04a5, 0x06fd: 0x047e, 0x06fe: 0x0436, 0x06ff: 0x045d, - // Block 0x1c, offset 0x700 - 0x0700: 0x09a1, 0x0705: 0x0117, - 0x0706: 0x0157, 0x0707: 0x0159, 0x0708: 0x0161, 0x0709: 0x0163, - 0x0710: 0x2341, 0x0711: 0x234d, - 0x0712: 0x2401, 0x0713: 0x2329, 0x0714: 0x23ad, 0x0715: 0x2335, 0x0716: 0x23b3, 0x0717: 0x23cb, - 0x0718: 0x23d7, 0x0719: 0x233b, 0x071a: 0x23dd, 0x071b: 0x2347, 0x071c: 0x23d1, 0x071d: 0x23e3, - 0x071e: 0x23e9, 0x071f: 0x1ba9, 0x0720: 0x0121, 0x0721: 0x027a, 0x0722: 0x06f5, 0x0723: 0x0283, - 0x0724: 0x013b, 0x0725: 0x02c5, 0x0726: 0x0721, 0x0727: 0x1c35, 0x0728: 0x0286, 0x0729: 0x013f, - 0x072a: 0x02d1, 0x072b: 0x0725, 0x072c: 0x0127, 0x072d: 0x0115, 0x072e: 0x0117, 0x072f: 0x0129, - 0x0730: 0x0161, 0x0731: 0x02fe, 0x0732: 0x0769, 0x0733: 0x0307, 0x0734: 0x017b, 0x0735: 0x037c, - 0x0736: 0x079d, 0x0737: 0x1c49, 0x0738: 0x030a, 0x0739: 0x017f, 0x073a: 0x037f, 0x073b: 0x07a1, - 0x073c: 0x0167, 0x073d: 0x0155, 0x073e: 0x0157, 0x073f: 0x0169, - // Block 0x1d, offset 0x740 - 0x0741: 0x3aeb, 0x0743: 0x8800, 0x0744: 0x3af2, 0x0745: 0x8800, - 0x0747: 0x3af9, 0x0748: 0x8800, 0x0749: 0x3b00, - 0x074d: 0x8800, - 0x0760: 0x2e4a, 0x0761: 0x8800, 0x0762: 0x3b0e, - 0x0764: 0x8800, 0x0765: 0x8800, - 0x076d: 0x3b07, 0x076e: 0x2e45, 0x076f: 0x2e4f, - 0x0770: 0x3b15, 0x0771: 0x3b1c, 0x0772: 0x8800, 0x0773: 0x8800, 0x0774: 0x3b23, 0x0775: 0x3b2a, - 0x0776: 0x8800, 0x0777: 0x8800, 0x0778: 0x3b31, 0x0779: 0x3b38, 0x077a: 0x8800, 0x077b: 0x8800, - 0x077c: 0x8800, 0x077d: 0x8800, - // Block 0x1e, offset 0x780 - 0x0780: 0x3b3f, 0x0781: 0x3b46, 0x0782: 0x8800, 0x0783: 0x8800, 0x0784: 0x3b5b, 0x0785: 0x3b62, - 0x0786: 0x8800, 0x0787: 0x8800, 0x0788: 0x3b69, 0x0789: 0x3b70, - 0x0791: 0x8800, - 0x0792: 0x8800, - 0x07a2: 0x8800, - 0x07a8: 0x8800, 0x07a9: 0x8800, - 0x07ab: 0x8800, 0x07ac: 0x3b85, 0x07ad: 0x3b8c, 0x07ae: 0x3b93, 0x07af: 0x3b9a, - 0x07b2: 0x8800, 0x07b3: 0x8800, 0x07b4: 0x8800, 0x07b5: 0x8800, - // Block 0x1f, offset 0x7c0 - 0x07e0: 0x00f1, 0x07e1: 0x00f3, 0x07e2: 0x00f5, 0x07e3: 0x00f7, - 0x07e4: 0x00f9, 0x07e5: 0x00fb, 0x07e6: 0x00fd, 0x07e7: 0x00ff, 0x07e8: 0x0101, 0x07e9: 0x01a2, - 0x07ea: 0x01a5, 0x07eb: 0x01a8, 0x07ec: 0x01ab, 0x07ed: 0x01ae, 0x07ee: 0x01b1, 0x07ef: 0x01b4, - 0x07f0: 0x01b7, 0x07f1: 0x01ba, 0x07f2: 0x01bd, 0x07f3: 0x01c6, 0x07f4: 0x05b9, 0x07f5: 0x05bd, - 0x07f6: 0x05c1, 0x07f7: 0x05c5, 0x07f8: 0x05c9, 0x07f9: 0x05cd, 0x07fa: 0x05d1, 0x07fb: 0x05d5, - 0x07fc: 0x05d9, 0x07fd: 0x1b6d, 0x07fe: 0x1b72, 0x07ff: 0x1b77, - // Block 0x20, offset 0x800 - 0x0800: 0x1b7c, 0x0801: 0x1b81, 0x0802: 0x1b86, 0x0803: 0x1b8b, 0x0804: 0x1b90, 0x0805: 0x1b95, - 0x0806: 0x1b9a, 0x0807: 0x1b9f, 0x0808: 0x019f, 0x0809: 0x01c3, 0x080a: 0x01e7, 0x080b: 0x020b, - 0x080c: 0x022f, 0x080d: 0x0238, 0x080e: 0x023e, 0x080f: 0x0244, 0x0810: 0x024a, 0x0811: 0x06b1, - 0x0812: 0x06b5, 0x0813: 0x06b9, 0x0814: 0x06bd, 0x0815: 0x06c1, 0x0816: 0x06c5, 0x0817: 0x06c9, - 0x0818: 0x06cd, 0x0819: 0x06d1, 0x081a: 0x06d5, 0x081b: 0x06d9, 0x081c: 0x0645, 0x081d: 0x0649, - 0x081e: 0x064d, 0x081f: 0x0651, 0x0820: 0x0655, 0x0821: 0x0659, 0x0822: 0x065d, 0x0823: 0x0661, - 0x0824: 0x0665, 0x0825: 0x0669, 0x0826: 0x066d, 0x0827: 0x0671, 0x0828: 0x0675, 0x0829: 0x0679, - 0x082a: 0x067d, 0x082b: 0x0681, 0x082c: 0x0685, 0x082d: 0x0689, 0x082e: 0x068d, 0x082f: 0x0691, - 0x0830: 0x0695, 0x0831: 0x0699, 0x0832: 0x069d, 0x0833: 0x06a1, 0x0834: 0x06a5, 0x0835: 0x06a9, - 0x0836: 0x0111, 0x0837: 0x0113, 0x0838: 0x0115, 0x0839: 0x0117, 0x083a: 0x0119, 0x083b: 0x011b, - 0x083c: 0x011d, 0x083d: 0x011f, 0x083e: 0x0121, 0x083f: 0x0123, - // Block 0x21, offset 0x840 - 0x0840: 0x0bfd, 0x0841: 0x0c21, 0x0842: 0x0c2d, 0x0843: 0x0c3d, 0x0844: 0x0c45, 0x0845: 0x0c51, - 0x0846: 0x0c59, 0x0847: 0x0c61, 0x0848: 0x0c6d, 0x0849: 0x0cc1, 0x084a: 0x0cd9, 0x084b: 0x0ce9, - 0x084c: 0x0cf9, 0x084d: 0x0d09, 0x084e: 0x0d19, 0x084f: 0x0d39, 0x0850: 0x0d3d, 0x0851: 0x0d41, - 0x0852: 0x0d75, 0x0853: 0x0d9d, 0x0854: 0x0dad, 0x0855: 0x0db5, 0x0856: 0x0db9, 0x0857: 0x0dc5, - 0x0858: 0x0de1, 0x0859: 0x0de5, 0x085a: 0x0dfd, 0x085b: 0x0e01, 0x085c: 0x0e09, 0x085d: 0x0e19, - 0x085e: 0x0eb5, 0x085f: 0x0ec9, 0x0860: 0x0f09, 0x0861: 0x0f1d, 0x0862: 0x0f25, 0x0863: 0x0f29, - 0x0864: 0x0f39, 0x0865: 0x0f55, 0x0866: 0x0f81, 0x0867: 0x0f8d, 0x0868: 0x0fad, 0x0869: 0x0fb9, - 0x086a: 0x0fbd, 0x086b: 0x0fc1, 0x086c: 0x0fd9, 0x086d: 0x0fdd, 0x086e: 0x1009, 0x086f: 0x1015, - 0x0870: 0x101d, 0x0871: 0x1025, 0x0872: 0x1035, 0x0873: 0x103d, 0x0874: 0x1045, 0x0875: 0x1071, - 0x0876: 0x1075, 0x0877: 0x107d, 0x0878: 0x1081, 0x0879: 0x1089, 0x087a: 0x1091, 0x087b: 0x10a1, - 0x087c: 0x10bd, 0x087d: 0x1135, 0x087e: 0x1149, 0x087f: 0x114d, - // Block 0x22, offset 0x880 - 0x0880: 0x11cd, 0x0881: 0x11d1, 0x0882: 0x11e5, 0x0883: 0x11e9, 0x0884: 0x11f1, 0x0885: 0x11f9, - 0x0886: 0x1201, 0x0887: 0x120d, 0x0888: 0x1235, 0x0889: 0x1245, 0x088a: 0x1259, 0x088b: 0x12c9, - 0x088c: 0x12d5, 0x088d: 0x12e5, 0x088e: 0x12f1, 0x088f: 0x12fd, 0x0890: 0x1305, 0x0891: 0x1309, - 0x0892: 0x130d, 0x0893: 0x1311, 0x0894: 0x1315, 0x0895: 0x13cd, 0x0896: 0x1415, 0x0897: 0x1421, - 0x0898: 0x1425, 0x0899: 0x1429, 0x089a: 0x142d, 0x089b: 0x1435, 0x089c: 0x1439, 0x089d: 0x144d, - 0x089e: 0x1469, 0x089f: 0x1471, 0x08a0: 0x14b1, 0x08a1: 0x14b5, 0x08a2: 0x14bd, 0x08a3: 0x14c1, - 0x08a4: 0x14c9, 0x08a5: 0x14cd, 0x08a6: 0x14f1, 0x08a7: 0x14f5, 0x08a8: 0x1511, 0x08a9: 0x1515, - 0x08aa: 0x1519, 0x08ab: 0x151d, 0x08ac: 0x1531, 0x08ad: 0x1555, 0x08ae: 0x1559, 0x08af: 0x155d, - 0x08b0: 0x1581, 0x08b1: 0x15c1, 0x08b2: 0x15c5, 0x08b3: 0x15e5, 0x08b4: 0x15f5, 0x08b5: 0x15fd, - 0x08b6: 0x161d, 0x08b7: 0x1641, 0x08b8: 0x1685, 0x08b9: 0x168d, 0x08ba: 0x16a1, 0x08bb: 0x16ad, - 0x08bc: 0x16b5, 0x08bd: 0x16bd, 0x08be: 0x16c1, 0x08bf: 0x16c5, - // Block 0x23, offset 0x8c0 - 0x08c0: 0x16dd, 0x08c1: 0x16e1, 0x08c2: 0x16fd, 0x08c3: 0x1705, 0x08c4: 0x170d, 0x08c5: 0x1711, - 0x08c6: 0x171d, 0x08c7: 0x1725, 0x08c8: 0x1729, 0x08c9: 0x172d, 0x08ca: 0x1735, 0x08cb: 0x1739, - 0x08cc: 0x17d9, 0x08cd: 0x17ed, 0x08ce: 0x1821, 0x08cf: 0x1825, 0x08d0: 0x182d, 0x08d1: 0x1859, - 0x08d2: 0x1861, 0x08d3: 0x1869, 0x08d4: 0x1871, 0x08d5: 0x18ad, 0x08d6: 0x18b1, 0x08d7: 0x18b9, - 0x08d8: 0x18bd, 0x08d9: 0x18c1, 0x08da: 0x18ed, 0x08db: 0x18f1, 0x08dc: 0x18f9, 0x08dd: 0x190d, - 0x08de: 0x1911, 0x08df: 0x192d, 0x08e0: 0x1935, 0x08e1: 0x1939, 0x08e2: 0x195d, 0x08e3: 0x1979, - 0x08e4: 0x1989, 0x08e5: 0x198d, 0x08e6: 0x1995, 0x08e7: 0x19c1, 0x08e8: 0x19c5, 0x08e9: 0x19d5, - 0x08ea: 0x19f9, 0x08eb: 0x1a01, 0x08ec: 0x1a11, 0x08ed: 0x1a29, 0x08ee: 0x1a31, 0x08ef: 0x1a35, - 0x08f0: 0x1a39, 0x08f1: 0x1a3d, 0x08f2: 0x1a49, 0x08f3: 0x1a4d, 0x08f4: 0x1a55, 0x08f5: 0x1a71, - 0x08f6: 0x1a75, 0x08f7: 0x1a79, 0x08f8: 0x1a91, 0x08f9: 0x1a95, 0x08fa: 0x1a9d, 0x08fb: 0x1ab1, - 0x08fc: 0x1ab5, 0x08fd: 0x1ab9, 0x08fe: 0x1ac1, 0x08ff: 0x1ac5, - // Block 0x24, offset 0x900 - 0x0906: 0x8800, 0x090b: 0x8800, - 0x090c: 0x3ded, 0x090d: 0x8800, 0x090e: 0x3df5, 0x090f: 0x8800, 0x0910: 0x3dfd, 0x0911: 0x8800, - 0x0912: 0x3e05, 0x0913: 0x8800, 0x0914: 0x3e0d, 0x0915: 0x8800, 0x0916: 0x3e15, 0x0917: 0x8800, - 0x0918: 0x3e1d, 0x0919: 0x8800, 0x091a: 0x3e25, 0x091b: 0x8800, 0x091c: 0x3e2d, 0x091d: 0x8800, - 0x091e: 0x3e35, 0x091f: 0x8800, 0x0920: 0x3e3d, 0x0921: 0x8800, 0x0922: 0x3e45, - 0x0924: 0x8800, 0x0925: 0x3e4d, 0x0926: 0x8800, 0x0927: 0x3e55, 0x0928: 0x8800, 0x0929: 0x3e5d, - 0x092f: 0x8800, - 0x0930: 0x3e65, 0x0931: 0x3e6d, 0x0932: 0x8800, 0x0933: 0x3e75, 0x0934: 0x3e7d, 0x0935: 0x8800, - 0x0936: 0x3e85, 0x0937: 0x3e8d, 0x0938: 0x8800, 0x0939: 0x3e95, 0x093a: 0x3e9d, 0x093b: 0x8800, - 0x093c: 0x3ea5, 0x093d: 0x3ead, - // Block 0x25, offset 0x940 - 0x0954: 0x3de5, - 0x0959: 0x8608, 0x095a: 0x8608, 0x095b: 0x41c8, 0x095c: 0x41ce, 0x095d: 0x8800, - 0x095e: 0x3eb5, 0x095f: 0x2830, - 0x0966: 0x8800, - 0x096b: 0x8800, 0x096c: 0x3ec5, 0x096d: 0x8800, 0x096e: 0x3ecd, 0x096f: 0x8800, - 0x0970: 0x3ed5, 0x0971: 0x8800, 0x0972: 0x3edd, 0x0973: 0x8800, 0x0974: 0x3ee5, 0x0975: 0x8800, - 0x0976: 0x3eed, 0x0977: 0x8800, 0x0978: 0x3ef5, 0x0979: 0x8800, 0x097a: 0x3efd, 0x097b: 0x8800, - 0x097c: 0x3f05, 0x097d: 0x8800, 0x097e: 0x3f0d, 0x097f: 0x8800, - // Block 0x26, offset 0x980 - 0x0980: 0x3f15, 0x0981: 0x8800, 0x0982: 0x3f1d, 0x0984: 0x8800, 0x0985: 0x3f25, - 0x0986: 0x8800, 0x0987: 0x3f2d, 0x0988: 0x8800, 0x0989: 0x3f35, - 0x098f: 0x8800, 0x0990: 0x3f3d, 0x0991: 0x3f45, - 0x0992: 0x8800, 0x0993: 0x3f4d, 0x0994: 0x3f55, 0x0995: 0x8800, 0x0996: 0x3f5d, 0x0997: 0x3f65, - 0x0998: 0x8800, 0x0999: 0x3f6d, 0x099a: 0x3f75, 0x099b: 0x8800, 0x099c: 0x3f7d, 0x099d: 0x3f85, - 0x09af: 0x8800, - 0x09b0: 0x8800, 0x09b1: 0x8800, 0x09b2: 0x8800, 0x09b4: 0x3ebd, - 0x09b7: 0x3f8d, 0x09b8: 0x3f95, 0x09b9: 0x3f9d, 0x09ba: 0x3fa5, - 0x09bd: 0x8800, 0x09be: 0x3fad, 0x09bf: 0x2845, - // Block 0x27, offset 0x9c0 - 0x09c0: 0x0875, 0x09c1: 0x0879, 0x09c2: 0x0949, 0x09c3: 0x094d, 0x09c4: 0x087d, 0x09c5: 0x0881, - 0x09c6: 0x0885, 0x09c7: 0x08e1, 0x09c8: 0x08e5, 0x09c9: 0x08e9, 0x09ca: 0x08ed, 0x09cb: 0x08f1, - 0x09cc: 0x08f5, 0x09cd: 0x08f9, 0x09ce: 0x08fd, - 0x09d2: 0x0bfd, 0x09d3: 0x0c59, 0x09d4: 0x0c09, 0x09d5: 0x0eb9, 0x09d6: 0x0c0d, 0x09d7: 0x0c25, - 0x09d8: 0x0c11, 0x09d9: 0x14d1, 0x09da: 0x0c45, 0x09db: 0x0c19, 0x09dc: 0x0c01, 0x09dd: 0x0f3d, - 0x09de: 0x0ecd, 0x09df: 0x0c6d, - // Block 0x28, offset 0xa00 - 0x0a00: 0x2167, 0x0a01: 0x216d, 0x0a02: 0x2173, 0x0a03: 0x2179, 0x0a04: 0x217f, 0x0a05: 0x2185, - 0x0a06: 0x218b, 0x0a07: 0x2191, 0x0a08: 0x2197, 0x0a09: 0x219d, 0x0a0a: 0x21a3, 0x0a0b: 0x21a9, - 0x0a0c: 0x21af, 0x0a0d: 0x21b5, 0x0a0e: 0x28a2, 0x0a0f: 0x28ab, 0x0a10: 0x28b4, 0x0a11: 0x28bd, - 0x0a12: 0x28c6, 0x0a13: 0x28cf, 0x0a14: 0x28d8, 0x0a15: 0x28e1, 0x0a16: 0x28ea, 0x0a17: 0x28fc, - 0x0a18: 0x2905, 0x0a19: 0x290e, 0x0a1a: 0x2917, 0x0a1b: 0x2920, 0x0a1c: 0x28f3, 0x0a1d: 0x2d45, - 0x0a1e: 0x2c76, 0x0a20: 0x21bb, 0x0a21: 0x21d3, 0x0a22: 0x21c7, 0x0a23: 0x221b, - 0x0a24: 0x21d9, 0x0a25: 0x21f7, 0x0a26: 0x21c1, 0x0a27: 0x21f1, 0x0a28: 0x21cd, 0x0a29: 0x2203, - 0x0a2a: 0x2233, 0x0a2b: 0x2251, 0x0a2c: 0x224b, 0x0a2d: 0x223f, 0x0a2e: 0x228d, 0x0a2f: 0x2221, - 0x0a30: 0x222d, 0x0a31: 0x2245, 0x0a32: 0x2239, 0x0a33: 0x2263, 0x0a34: 0x220f, 0x0a35: 0x2257, - 0x0a36: 0x2281, 0x0a37: 0x2269, 0x0a38: 0x21fd, 0x0a39: 0x21df, 0x0a3a: 0x2215, 0x0a3b: 0x2227, - 0x0a3c: 0x225d, 0x0a3d: 0x21e5, 0x0a3e: 0x2287, 0x0a3f: 0x2209, - // Block 0x29, offset 0xa40 - 0x0a40: 0x226f, 0x0a41: 0x21eb, 0x0a42: 0x2275, 0x0a43: 0x227b, 0x0a44: 0x0e6d, 0x0a45: 0x1041, - 0x0a46: 0x11e5, 0x0a47: 0x1605, - 0x0a50: 0x0715, 0x0a51: 0x01c9, - 0x0a52: 0x01cc, 0x0a53: 0x01cf, 0x0a54: 0x01d2, 0x0a55: 0x01d5, 0x0a56: 0x01d8, 0x0a57: 0x01db, - 0x0a58: 0x01de, 0x0a59: 0x01e1, 0x0a5a: 0x01ea, 0x0a5b: 0x01ed, 0x0a5c: 0x01f0, 0x0a5d: 0x01f3, - 0x0a5e: 0x01f6, 0x0a5f: 0x01f9, 0x0a60: 0x07d9, 0x0a61: 0x07e1, 0x0a62: 0x07e5, 0x0a63: 0x07ed, - 0x0a64: 0x07f1, 0x0a65: 0x07f5, 0x0a66: 0x07fd, 0x0a67: 0x0805, 0x0a68: 0x0809, 0x0a69: 0x0811, - 0x0a6a: 0x0815, 0x0a6b: 0x0819, 0x0a6c: 0x081d, 0x0a6d: 0x0821, 0x0a6e: 0x27a4, 0x0a6f: 0x27ab, - 0x0a70: 0x27b2, 0x0a71: 0x27b9, 0x0a72: 0x27c0, 0x0a73: 0x27c7, 0x0a74: 0x27ce, 0x0a75: 0x27d5, - 0x0a76: 0x27e3, 0x0a77: 0x27ea, 0x0a78: 0x27f1, 0x0a79: 0x27f8, 0x0a7a: 0x27ff, 0x0a7b: 0x2806, - 0x0a7c: 0x2c95, 0x0a7d: 0x2b0a, 0x0a7e: 0x27dc, - // Block 0x2a, offset 0xa80 - 0x0a80: 0x0bfd, 0x0a81: 0x0c59, 0x0a82: 0x0c09, 0x0a83: 0x0eb9, 0x0a84: 0x0c5d, 0x0a85: 0x0ced, - 0x0a86: 0x0c05, 0x0a87: 0x0ce9, 0x0a88: 0x0c49, 0x0a89: 0x0dc5, 0x0a8a: 0x1245, 0x0a8b: 0x13cd, - 0x0a8c: 0x1315, 0x0a8d: 0x1259, 0x0a8e: 0x1995, 0x0a8f: 0x0ec9, 0x0a90: 0x120d, 0x0a91: 0x1289, - 0x0a92: 0x1249, 0x0a93: 0x1589, 0x0a94: 0x0e39, 0x0a95: 0x1441, 0x0a96: 0x18c5, 0x0a97: 0x159d, - 0x0a98: 0x0d81, 0x0a99: 0x15cd, 0x0a9a: 0x14d9, 0x0a9b: 0x0f55, 0x0a9c: 0x194d, 0x0a9d: 0x0cbd, - 0x0a9e: 0x0de9, 0x0a9f: 0x1335, 0x0aa0: 0x1a59, 0x0aa1: 0x0c81, 0x0aa2: 0x0d11, 0x0aa3: 0x12d9, - 0x0aa4: 0x0c0d, 0x0aa5: 0x0c25, 0x0aa6: 0x0c11, 0x0aa7: 0x1019, 0x0aa8: 0x0e2d, 0x0aa9: 0x0dbd, - 0x0aaa: 0x0f95, 0x0aab: 0x0f89, 0x0aac: 0x1529, 0x0aad: 0x0c7d, 0x0aae: 0x18d9, 0x0aaf: 0x0dd9, - 0x0ab0: 0x0f31, 0x0ab1: 0x01fc, 0x0ab2: 0x01ff, 0x0ab3: 0x0202, 0x0ab4: 0x0205, 0x0ab5: 0x020e, - 0x0ab6: 0x0211, 0x0ab7: 0x0214, 0x0ab8: 0x0217, 0x0ab9: 0x021a, 0x0aba: 0x021d, 0x0abb: 0x0220, - 0x0abc: 0x0223, 0x0abd: 0x0226, 0x0abe: 0x0229, 0x0abf: 0x0232, - // Block 0x2b, offset 0xac0 - 0x0ac0: 0x1bb3, 0x0ac1: 0x1bc2, 0x0ac2: 0x1bd1, 0x0ac3: 0x1be0, 0x0ac4: 0x1bef, 0x0ac5: 0x1bfe, - 0x0ac6: 0x1c0d, 0x0ac7: 0x1c1c, 0x0ac8: 0x1c2b, 0x0ac9: 0x229f, 0x0aca: 0x22b1, 0x0acb: 0x22c3, - 0x0acc: 0x0274, 0x0acd: 0x0755, 0x0ace: 0x02ec, 0x0acf: 0x06f9, 0x0ad0: 0x0a09, 0x0ad1: 0x0a11, - 0x0ad2: 0x0a19, 0x0ad3: 0x0a21, 0x0ad4: 0x0a29, 0x0ad5: 0x0a2d, 0x0ad6: 0x0a31, 0x0ad7: 0x0a35, - 0x0ad8: 0x0a39, 0x0ad9: 0x0a3d, 0x0ada: 0x0a41, 0x0adb: 0x0a45, 0x0adc: 0x0a49, 0x0add: 0x0a4d, - 0x0ade: 0x0a51, 0x0adf: 0x0a55, 0x0ae0: 0x0a59, 0x0ae1: 0x0a61, 0x0ae2: 0x0a65, 0x0ae3: 0x0a69, - 0x0ae4: 0x0a6d, 0x0ae5: 0x0a71, 0x0ae6: 0x0a75, 0x0ae7: 0x0a79, 0x0ae8: 0x0a7d, 0x0ae9: 0x0a81, - 0x0aea: 0x0a85, 0x0aeb: 0x0a89, 0x0aec: 0x0a8d, 0x0aed: 0x0a91, 0x0aee: 0x0a95, 0x0aef: 0x0a99, - 0x0af0: 0x0a9d, 0x0af1: 0x0aa1, 0x0af2: 0x0aa5, 0x0af3: 0x0aad, 0x0af4: 0x0ab5, 0x0af5: 0x0abd, - 0x0af6: 0x0ac1, 0x0af7: 0x0ac5, 0x0af8: 0x0ac9, 0x0af9: 0x0acd, 0x0afa: 0x0ad1, 0x0afb: 0x0ad5, - 0x0afc: 0x0ad9, 0x0afd: 0x0add, 0x0afe: 0x0ae1, - // Block 0x2c, offset 0xb00 - 0x0b00: 0x2ca5, 0x0b01: 0x2b31, 0x0b02: 0x2cb5, 0x0b03: 0x29fc, 0x0b04: 0x45d3, 0x0b05: 0x2a06, - 0x0b06: 0x2a10, 0x0b07: 0x4617, 0x0b08: 0x2b3e, 0x0b09: 0x2a1a, 0x0b0a: 0x2a24, 0x0b0b: 0x2a2e, - 0x0b0c: 0x2b65, 0x0b0d: 0x2b72, 0x0b0e: 0x2b4b, 0x0b0f: 0x2b58, 0x0b10: 0x452b, 0x0b11: 0x2b7f, - 0x0b12: 0x2b8c, 0x0b13: 0x2d57, 0x0b14: 0x2837, 0x0b15: 0x2d6a, 0x0b16: 0x2d7d, 0x0b17: 0x2cc5, - 0x0b18: 0x2b99, 0x0b19: 0x2d90, 0x0b1a: 0x2da3, 0x0b1b: 0x2ba6, 0x0b1c: 0x2a38, 0x0b1d: 0x2a42, - 0x0b1e: 0x4539, 0x0b1f: 0x2bb3, 0x0b20: 0x2cd5, 0x0b21: 0x45e4, 0x0b22: 0x2a4c, 0x0b23: 0x2a56, - 0x0b24: 0x2bc0, 0x0b25: 0x2a60, 0x0b26: 0x2a6a, 0x0b27: 0x284c, 0x0b28: 0x2853, 0x0b29: 0x2a74, - 0x0b2a: 0x2a7e, 0x0b2b: 0x2db6, 0x0b2c: 0x2bcd, 0x0b2d: 0x2ce5, 0x0b2e: 0x2dc9, 0x0b2f: 0x2bda, - 0x0b30: 0x2a92, 0x0b31: 0x2a88, 0x0b32: 0x462b, 0x0b33: 0x2be7, 0x0b34: 0x2ddc, 0x0b35: 0x2a9c, - 0x0b36: 0x2cf5, 0x0b37: 0x2aa6, 0x0b38: 0x2c01, 0x0b39: 0x2ab0, 0x0b3a: 0x2c0e, 0x0b3b: 0x45f5, - 0x0b3c: 0x2bf4, 0x0b3d: 0x2d05, 0x0b3e: 0x2c1b, 0x0b3f: 0x285a, - // Block 0x2d, offset 0xb40 - 0x0b40: 0x4606, 0x0b41: 0x2aba, 0x0b42: 0x2ac4, 0x0b43: 0x2c28, 0x0b44: 0x2ace, 0x0b45: 0x2ad8, - 0x0b46: 0x2ae2, 0x0b47: 0x2d15, 0x0b48: 0x2c35, 0x0b49: 0x2861, 0x0b4a: 0x2def, 0x0b4b: 0x4520, - 0x0b4c: 0x2d25, 0x0b4d: 0x2c42, 0x0b4e: 0x4547, 0x0b4f: 0x2aec, 0x0b50: 0x2af6, 0x0b51: 0x2c4f, - 0x0b52: 0x2868, 0x0b53: 0x2c5c, 0x0b54: 0x2d35, 0x0b55: 0x286f, 0x0b56: 0x2e02, 0x0b57: 0x2b00, - 0x0b58: 0x1ba4, 0x0b59: 0x1bb8, 0x0b5a: 0x1bc7, 0x0b5b: 0x1bd6, 0x0b5c: 0x1be5, 0x0b5d: 0x1bf4, - 0x0b5e: 0x1c03, 0x0b5f: 0x1c12, 0x0b60: 0x1c21, 0x0b61: 0x1c30, 0x0b62: 0x22a5, 0x0b63: 0x22b7, - 0x0b64: 0x22c9, 0x0b65: 0x22d5, 0x0b66: 0x22e1, 0x0b67: 0x22ed, 0x0b68: 0x22f9, 0x0b69: 0x2305, - 0x0b6a: 0x2311, 0x0b6b: 0x231d, 0x0b6c: 0x2359, 0x0b6d: 0x2365, 0x0b6e: 0x2371, 0x0b6f: 0x237d, - 0x0b70: 0x2389, 0x0b71: 0x0765, 0x0b72: 0x02e0, 0x0b73: 0x0256, 0x0b74: 0x0735, 0x0b75: 0x0361, - 0x0b76: 0x0370, 0x0b77: 0x02e6, 0x0b78: 0x074d, 0x0b79: 0x0751, 0x0b7a: 0x0280, 0x0b7b: 0x287d, - 0x0b7c: 0x288b, 0x0b7d: 0x2876, 0x0b7e: 0x2884, 0x0b7f: 0x2c69, - // Block 0x2e, offset 0xb80 - 0x0b80: 0x0364, 0x0b81: 0x034c, 0x0b82: 0x07b1, 0x0b83: 0x0334, 0x0b84: 0x030d, 0x0b85: 0x0289, - 0x0b86: 0x0298, 0x0b87: 0x0268, 0x0b88: 0x0741, 0x0b89: 0x1c3f, 0x0b8a: 0x0367, 0x0b8b: 0x034f, - 0x0b8c: 0x07b5, 0x0b8d: 0x07c1, 0x0b8e: 0x0340, 0x0b8f: 0x0316, 0x0b90: 0x0277, 0x0b91: 0x076d, - 0x0b92: 0x0701, 0x0b93: 0x06ed, 0x0b94: 0x071d, 0x0b95: 0x07c5, 0x0b96: 0x0343, 0x0b97: 0x02e3, - 0x0b98: 0x0319, 0x0b99: 0x02f8, 0x0b9a: 0x035b, 0x0b9b: 0x07c9, 0x0b9c: 0x0346, 0x0b9d: 0x02da, - 0x0b9e: 0x031c, 0x0b9f: 0x078d, 0x0ba0: 0x0745, 0x0ba1: 0x032e, 0x0ba2: 0x0775, 0x0ba3: 0x0791, - 0x0ba4: 0x0749, 0x0ba5: 0x0331, 0x0ba6: 0x0779, 0x0ba7: 0x23fb, 0x0ba8: 0x240f, 0x0ba9: 0x02b0, - 0x0baa: 0x0771, 0x0bab: 0x0705, 0x0bac: 0x06f1, 0x0bad: 0x0799, 0x0bae: 0x2892, 0x0baf: 0x2929, - 0x0bb0: 0x0373, 0x0bb1: 0x035e, 0x0bb2: 0x07cd, 0x0bb3: 0x0349, 0x0bb4: 0x036a, 0x0bb5: 0x0352, - 0x0bb6: 0x07b9, 0x0bb7: 0x0337, 0x0bb8: 0x0310, 0x0bb9: 0x029b, 0x0bba: 0x036d, 0x0bbb: 0x0355, - 0x0bbc: 0x07bd, 0x0bbd: 0x033a, 0x0bbe: 0x0313, 0x0bbf: 0x029e, - // Block 0x2f, offset 0xbc0 - 0x0bc0: 0x077d, 0x0bc1: 0x0709, 0x0bc2: 0x1c3a, 0x0bc3: 0x0259, 0x0bc4: 0x02d4, 0x0bc5: 0x02d7, - 0x0bc6: 0x2408, 0x0bc7: 0x06e5, 0x0bc8: 0x02dd, 0x0bc9: 0x026b, 0x0bca: 0x02fb, 0x0bcb: 0x026e, - 0x0bcc: 0x0304, 0x0bcd: 0x028c, 0x0bce: 0x028f, 0x0bcf: 0x031f, 0x0bd0: 0x0325, 0x0bd1: 0x0328, - 0x0bd2: 0x0781, 0x0bd3: 0x032b, 0x0bd4: 0x033d, 0x0bd5: 0x0789, 0x0bd6: 0x0795, 0x0bd7: 0x02aa, - 0x0bd8: 0x1c44, 0x0bd9: 0x070d, 0x0bda: 0x02ad, 0x0bdb: 0x0376, 0x0bdc: 0x02bf, 0x0bdd: 0x02ce, - 0x0bde: 0x23f5, 0x0bdf: 0x23ef, 0x0be0: 0x1bae, 0x0be1: 0x1bbd, 0x0be2: 0x1bcc, 0x0be3: 0x1bdb, - 0x0be4: 0x1bea, 0x0be5: 0x1bf9, 0x0be6: 0x1c08, 0x0be7: 0x1c17, 0x0be8: 0x1c26, 0x0be9: 0x2299, - 0x0bea: 0x22ab, 0x0beb: 0x22bd, 0x0bec: 0x22cf, 0x0bed: 0x22db, 0x0bee: 0x22e7, 0x0bef: 0x22f3, - 0x0bf0: 0x22ff, 0x0bf1: 0x230b, 0x0bf2: 0x2317, 0x0bf3: 0x2353, 0x0bf4: 0x235f, 0x0bf5: 0x236b, - 0x0bf6: 0x2377, 0x0bf7: 0x2383, 0x0bf8: 0x238f, 0x0bf9: 0x2395, 0x0bfa: 0x239b, 0x0bfb: 0x23a1, - 0x0bfc: 0x23a7, 0x0bfd: 0x23b9, 0x0bfe: 0x23bf, 0x0bff: 0x0761, - // Block 0x30, offset 0xc00 - 0x0c00: 0x18b5, 0x0c01: 0x1239, 0x0c02: 0x1911, 0x0c03: 0x18dd, 0x0c04: 0x1395, 0x0c05: 0x0c29, - 0x0c06: 0x0e1d, 0x0c07: 0x1b5d, 0x0c08: 0x1b5d, 0x0c09: 0x0f49, 0x0c0a: 0x1995, 0x0c0b: 0x0e81, - 0x0c0c: 0x0f45, 0x0c0d: 0x112d, 0x0c0e: 0x150d, 0x0c0f: 0x169d, 0x0c10: 0x17d5, 0x0c11: 0x1811, - 0x0c12: 0x1845, 0x0c13: 0x1959, 0x0c14: 0x12b1, 0x0c15: 0x133d, 0x0c16: 0x13e9, 0x0c17: 0x1481, - 0x0c18: 0x179d, 0x0c19: 0x197d, 0x0c1a: 0x1aa5, 0x0c1b: 0x0c4d, 0x0c1c: 0x0df1, 0x0c1d: 0x12c5, - 0x0c1e: 0x140d, 0x0c1f: 0x17d1, 0x0c20: 0x1af5, 0x0c21: 0x0ff1, 0x0c22: 0x13b5, 0x0c23: 0x17c1, - 0x0c24: 0x1855, 0x0c25: 0x1161, 0x0c26: 0x16f9, 0x0c27: 0x181d, 0x0c28: 0x105d, 0x0c29: 0x124d, - 0x0c2a: 0x1355, 0x0c2b: 0x1459, 0x0c2c: 0x1965, 0x0c2d: 0x0c8d, 0x0c2e: 0x0d25, 0x0c2f: 0x0d91, - 0x0c30: 0x11c9, 0x0c31: 0x12bd, 0x0c32: 0x1409, 0x0c33: 0x152d, 0x0c34: 0x16b5, 0x0c35: 0x17c9, - 0x0c36: 0x17e1, 0x0c37: 0x1905, 0x0c38: 0x1a21, 0x0c39: 0x1ad5, 0x0c3a: 0x1af1, 0x0c3b: 0x1569, - 0x0c3c: 0x15a9, 0x0c3d: 0x1661, 0x0c3e: 0x1781, 0x0c3f: 0x19b1, - // Block 0x31, offset 0xc40 - 0x0c40: 0x1afd, 0x0c41: 0x1889, 0x0c42: 0x0f05, 0x0c43: 0x1079, 0x0c44: 0x1619, 0x0c45: 0x16d9, - 0x0c46: 0x143d, 0x0c47: 0x1571, 0x0c48: 0x18d5, 0x0c49: 0x1a19, 0x0c4a: 0x0f01, 0x0c4b: 0x0fcd, - 0x0c4c: 0x12b5, 0x0c4d: 0x1369, 0x0c4e: 0x139d, 0x0c4f: 0x1651, 0x0c50: 0x1679, 0x0c51: 0x19dd, - 0x0c52: 0x0d8d, 0x0c53: 0x16e5, 0x0c54: 0x0d31, 0x0c55: 0x0d2d, 0x0c56: 0x15d5, 0x0c57: 0x1665, - 0x0c58: 0x1799, 0x0c59: 0x19e5, 0x0c5a: 0x18a5, 0x0c5b: 0x1165, 0x0c5c: 0x12b1, 0x0c5d: 0x1895, - 0x0c5e: 0x0c35, 0x0c5f: 0x0fa1, 0x0c60: 0x10d1, 0x0c61: 0x146d, 0x0c62: 0x14ed, 0x0c63: 0x0db1, - 0x0c64: 0x1579, 0x0c65: 0x0c9d, 0x0c66: 0x10b5, 0x0c67: 0x0c15, 0x0c68: 0x1329, 0x0c69: 0x11e1, - 0x0c6a: 0x164d, 0x0c6b: 0x0e05, 0x0c6c: 0x0ef1, 0x0c6d: 0x1539, 0x0c6e: 0x17a1, 0x0c6f: 0x1879, - 0x0c70: 0x12f5, 0x0c71: 0x1935, 0x0c72: 0x1321, 0x0c73: 0x1175, 0x0c74: 0x1759, 0x0c75: 0x1195, - 0x0c76: 0x14e9, 0x0c77: 0x0c69, 0x0c78: 0x0ce5, 0x0c79: 0x0d29, 0x0c7a: 0x1291, 0x0c7b: 0x1639, - 0x0c7c: 0x1731, 0x0c7d: 0x1885, 0x0c7e: 0x1991, 0x0c7f: 0x0d99, - // Block 0x32, offset 0xc80 - 0x0c80: 0x0e4d, 0x0c81: 0x0f55, 0x0c82: 0x106d, 0x0c83: 0x11fd, 0x0c84: 0x13b9, 0x0c85: 0x157d, - 0x0c86: 0x19cd, 0x0c87: 0x1aad, 0x0c88: 0x1b01, 0x0c89: 0x1b19, 0x0c8a: 0x0d75, 0x0c8b: 0x1231, - 0x0c8c: 0x12e1, 0x0c8d: 0x1929, 0x0c8e: 0x1039, 0x0c8f: 0x1115, 0x0c90: 0x1131, 0x0c91: 0x11c1, - 0x0c92: 0x13a9, 0x0c93: 0x13f5, 0x0c94: 0x14a5, 0x0c95: 0x15c9, 0x0c96: 0x166d, 0x0c97: 0x16d1, - 0x0c98: 0x1919, 0x0c99: 0x17a9, 0x0c9a: 0x1941, 0x0c9b: 0x19b5, 0x0c9c: 0x0d4d, 0x0c9d: 0x0d79, - 0x0c9e: 0x0e61, 0x0c9f: 0x13e5, 0x0ca0: 0x1831, 0x0ca1: 0x1879, 0x0ca2: 0x1059, 0x0ca3: 0x10c9, - 0x0ca4: 0x118d, 0x0ca5: 0x12ed, 0x0ca6: 0x1615, 0x0ca7: 0x1461, 0x0ca8: 0x0c79, 0x0ca9: 0x0ebd, - 0x0caa: 0x0fa1, 0x0cab: 0x1005, 0x0cac: 0x10d5, 0x0cad: 0x147d, 0x0cae: 0x1499, 0x0caf: 0x16a9, - 0x0cb0: 0x16c9, 0x0cb1: 0x1999, 0x0cb2: 0x1a15, 0x0cb3: 0x1a25, 0x0cb4: 0x1a61, 0x0cb5: 0x0c91, - 0x0cb6: 0x15bd, 0x0cb7: 0x1985, 0x0cb8: 0x19fd, 0x0cb9: 0x10ed, 0x0cba: 0x0c55, 0x0cbb: 0x0cb5, - 0x0cbc: 0x0fa5, 0x0cbd: 0x0fc5, 0x0cbe: 0x11ed, 0x0cbf: 0x12b1, - // Block 0x33, offset 0xcc0 - 0x0cc0: 0x1401, 0x0cc1: 0x1509, 0x0cc2: 0x17b5, 0x0cc3: 0x1955, 0x0cc4: 0x1b55, 0x0cc5: 0x1221, - 0x0cc6: 0x19d9, 0x0cc7: 0x0d71, 0x0cc8: 0x126d, 0x0cc9: 0x1279, 0x0cca: 0x134d, 0x0ccb: 0x1385, - 0x0ccc: 0x1489, 0x0ccd: 0x14e5, 0x0cce: 0x1565, 0x0ccf: 0x1649, 0x0cd0: 0x1a6d, 0x0cd1: 0x0ced, - 0x0cd2: 0x1141, 0x0cd3: 0x19e9, 0x0cd4: 0x0ca5, 0x0cd5: 0x0fe9, 0x0cd6: 0x136d, 0x0cd7: 0x191d, - 0x0cd8: 0x10a5, 0x0cd9: 0x10f5, 0x0cda: 0x1281, 0x0cdb: 0x146d, 0x0cdc: 0x19f1, 0x0cdd: 0x0d55, - 0x0cde: 0x0e3d, 0x0cdf: 0x0fd5, 0x0ce0: 0x1211, 0x0ce1: 0x125d, 0x0ce2: 0x129d, 0x0ce3: 0x1331, - 0x0ce4: 0x1485, 0x0ce5: 0x14f9, 0x0ce6: 0x1695, 0x0ce7: 0x1835, 0x0ce8: 0x1841, 0x0ce9: 0x198d, - 0x0cea: 0x1a09, 0x0ceb: 0x0dc1, 0x0cec: 0x1389, 0x0ced: 0x0e41, 0x0cee: 0x1405, 0x0cef: 0x14a9, - 0x0cf0: 0x17c5, 0x0cf1: 0x19f5, 0x0cf2: 0x1add, 0x0cf3: 0x1b05, 0x0cf4: 0x1275, 0x0cf5: 0x1365, - 0x0cf6: 0x1701, 0x0cf7: 0x15f5, 0x0cf8: 0x1601, 0x0cf9: 0x1625, 0x0cfa: 0x1455, 0x0cfb: 0x13dd, - 0x0cfc: 0x18a1, 0x0cfd: 0x0c71, 0x0cfe: 0x1769, 0x0cff: 0x0d59, - // Block 0x34, offset 0xd00 - 0x0d00: 0x0d49, 0x0d01: 0x1049, 0x0d02: 0x1169, 0x0d03: 0x1631, 0x0d04: 0x0f91, 0x0d05: 0x1341, - 0x0d06: 0x122d, 0x0d07: 0x1925, 0x0d08: 0x1825, 0x0d09: 0x19e1, 0x0d0a: 0x1861, 0x0d0b: 0x1065, - 0x0d0c: 0x0cc5, 0x0d0d: 0x0e99, 0x0d10: 0x0eed, - 0x0d12: 0x121d, 0x0d15: 0x0d35, 0x0d16: 0x145d, 0x0d17: 0x1521, - 0x0d18: 0x1585, 0x0d19: 0x15a1, 0x0d1a: 0x15a5, 0x0d1b: 0x15b9, 0x0d1c: 0x1a2d, 0x0d1d: 0x1629, - 0x0d1e: 0x16ad, 0x0d20: 0x17cd, 0x0d22: 0x1891, - 0x0d25: 0x1945, 0x0d26: 0x196d, - 0x0d2a: 0x1a81, 0x0d2b: 0x1a85, 0x0d2c: 0x1a89, 0x0d2d: 0x1aed, - 0x0d30: 0x0c95, 0x0d31: 0x0cb9, 0x0d32: 0x0ccd, 0x0d33: 0x0d89, 0x0d34: 0x0d95, 0x0d35: 0x0dd5, - 0x0d36: 0x0e89, 0x0d37: 0x0ea5, 0x0d38: 0x0ead, 0x0d39: 0x0ee9, 0x0d3a: 0x0ef5, 0x0d3b: 0x0fd1, - 0x0d3c: 0x0fd9, 0x0d3d: 0x10e1, 0x0d3e: 0x1109, 0x0d3f: 0x1111, - // Block 0x35, offset 0xd40 - 0x0d40: 0x1129, 0x0d41: 0x11d5, 0x0d42: 0x1205, 0x0d43: 0x1225, 0x0d44: 0x1295, 0x0d45: 0x1359, - 0x0d46: 0x1375, 0x0d47: 0x13a5, 0x0d48: 0x13f9, 0x0d49: 0x1419, 0x0d4a: 0x148d, 0x0d4b: 0x156d, - 0x0d4c: 0x1589, 0x0d4d: 0x1591, 0x0d4e: 0x158d, 0x0d4f: 0x1595, 0x0d50: 0x1599, 0x0d51: 0x159d, - 0x0d52: 0x15b1, 0x0d53: 0x15b5, 0x0d54: 0x15d9, 0x0d55: 0x15ed, 0x0d56: 0x1609, 0x0d57: 0x166d, - 0x0d58: 0x1675, 0x0d59: 0x167d, 0x0d5a: 0x1691, 0x0d5b: 0x16b9, 0x0d5c: 0x1709, 0x0d5d: 0x173d, - 0x0d5e: 0x173d, 0x0d5f: 0x17a5, 0x0d60: 0x184d, 0x0d61: 0x1865, 0x0d62: 0x1899, 0x0d63: 0x189d, - 0x0d64: 0x18e1, 0x0d65: 0x18e5, 0x0d66: 0x193d, 0x0d67: 0x1945, 0x0d68: 0x1a0d, 0x0d69: 0x1a51, - 0x0d6a: 0x1a69, 0x0d6b: 0x10d9, 0x0d6c: 0x2018, 0x0d6d: 0x1721, - 0x0d70: 0x0c1d, 0x0d71: 0x0d21, 0x0d72: 0x0ce1, 0x0d73: 0x0c89, 0x0d74: 0x0cc9, 0x0d75: 0x0cf5, - 0x0d76: 0x0d85, 0x0d77: 0x0da1, 0x0d78: 0x0e89, 0x0d79: 0x0e75, 0x0d7a: 0x0e85, 0x0d7b: 0x0ea1, - 0x0d7c: 0x0eed, 0x0d7d: 0x0efd, 0x0d7e: 0x0f41, 0x0d7f: 0x0f4d, - // Block 0x36, offset 0xd80 - 0x0d80: 0x0f69, 0x0d81: 0x0f79, 0x0d82: 0x1061, 0x0d83: 0x1069, 0x0d84: 0x1099, 0x0d85: 0x10b9, - 0x0d86: 0x10e9, 0x0d87: 0x1101, 0x0d88: 0x10f1, 0x0d89: 0x1111, 0x0d8a: 0x1105, 0x0d8b: 0x1129, - 0x0d8c: 0x1145, 0x0d8d: 0x119d, 0x0d8e: 0x11a9, 0x0d8f: 0x11b1, 0x0d90: 0x11d9, 0x0d91: 0x121d, - 0x0d92: 0x124d, 0x0d93: 0x1251, 0x0d94: 0x1265, 0x0d95: 0x12e5, 0x0d96: 0x12f5, 0x0d97: 0x134d, - 0x0d98: 0x1399, 0x0d99: 0x1391, 0x0d9a: 0x13a5, 0x0d9b: 0x13c1, 0x0d9c: 0x13f9, 0x0d9d: 0x1551, - 0x0d9e: 0x141d, 0x0d9f: 0x1451, 0x0da0: 0x145d, 0x0da1: 0x149d, 0x0da2: 0x14b9, 0x0da3: 0x14dd, - 0x0da4: 0x1501, 0x0da5: 0x1505, 0x0da6: 0x1521, 0x0da7: 0x1525, 0x0da8: 0x1535, 0x0da9: 0x1549, - 0x0daa: 0x1545, 0x0dab: 0x1575, 0x0dac: 0x15f1, 0x0dad: 0x1609, 0x0dae: 0x1621, 0x0daf: 0x1659, - 0x0db0: 0x166d, 0x0db1: 0x1689, 0x0db2: 0x16b9, 0x0db3: 0x176d, 0x0db4: 0x1795, 0x0db5: 0x1809, - 0x0db6: 0x1851, 0x0db7: 0x185d, 0x0db8: 0x1865, 0x0db9: 0x187d, 0x0dba: 0x1891, 0x0dbb: 0x1881, - 0x0dbc: 0x1899, 0x0dbd: 0x1895, 0x0dbe: 0x188d, 0x0dbf: 0x189d, - // Block 0x37, offset 0xdc0 - 0x0dc0: 0x18a9, 0x0dc1: 0x18e5, 0x0dc2: 0x1921, 0x0dc3: 0x1951, 0x0dc4: 0x1981, 0x0dc5: 0x19a1, - 0x0dc6: 0x19ed, 0x0dc7: 0x1a0d, 0x0dc8: 0x1a2d, 0x0dc9: 0x1a41, 0x0dca: 0x1a51, 0x0dcb: 0x1a5d, - 0x0dcc: 0x1a69, 0x0dcd: 0x1abd, 0x0dce: 0x1b5d, 0x0dcf: 0x1faf, 0x0dd0: 0x1faa, 0x0dd1: 0x1fdc, - 0x0dd2: 0x0b45, 0x0dd3: 0x0b6d, 0x0dd4: 0x0b71, 0x0dd5: 0x205e, 0x0dd6: 0x208b, 0x0dd7: 0x2103, - 0x0dd8: 0x1b49, 0x0dd9: 0x1b59, - // Block 0x38, offset 0xe00 - 0x0e00: 0x02ef, 0x0e01: 0x02f2, 0x0e02: 0x02f5, 0x0e03: 0x0759, 0x0e04: 0x075d, 0x0e05: 0x0379, - 0x0e06: 0x0379, - 0x0e13: 0x1c62, 0x0e14: 0x1c53, 0x0e15: 0x1c58, 0x0e16: 0x1c67, 0x0e17: 0x1c5d, - 0x0e1d: 0x428e, - 0x0e1e: 0x801a, 0x0e1f: 0x4300, 0x0e20: 0x04e4, 0x0e21: 0x04cc, 0x0e22: 0x04d5, 0x0e23: 0x04d8, - 0x0e24: 0x04db, 0x0e25: 0x04de, 0x0e26: 0x04e1, 0x0e27: 0x04e7, 0x0e28: 0x04ea, 0x0e29: 0x00e5, - 0x0e2a: 0x42ee, 0x0e2b: 0x42f4, 0x0e2c: 0x43f2, 0x0e2d: 0x43fa, 0x0e2e: 0x4246, 0x0e2f: 0x424c, - 0x0e30: 0x4252, 0x0e31: 0x4258, 0x0e32: 0x4264, 0x0e33: 0x426a, 0x0e34: 0x4270, 0x0e35: 0x427c, - 0x0e36: 0x4282, 0x0e38: 0x4288, 0x0e39: 0x4294, 0x0e3a: 0x429a, 0x0e3b: 0x42a0, - 0x0e3c: 0x42ac, 0x0e3e: 0x42b2, - // Block 0x39, offset 0xe40 - 0x0e40: 0x42b8, 0x0e41: 0x42be, 0x0e43: 0x42c4, 0x0e44: 0x42ca, - 0x0e46: 0x42d6, 0x0e47: 0x42dc, 0x0e48: 0x42e2, 0x0e49: 0x42e8, 0x0e4a: 0x42fa, 0x0e4b: 0x4276, - 0x0e4c: 0x425e, 0x0e4d: 0x42a6, 0x0e4e: 0x42d0, 0x0e4f: 0x1c6c, 0x0e50: 0x054a, 0x0e51: 0x054a, - 0x0e52: 0x0553, 0x0e53: 0x0553, 0x0e54: 0x0553, 0x0e55: 0x0553, 0x0e56: 0x0556, 0x0e57: 0x0556, - 0x0e58: 0x0556, 0x0e59: 0x0556, 0x0e5a: 0x055c, 0x0e5b: 0x055c, 0x0e5c: 0x055c, 0x0e5d: 0x055c, - 0x0e5e: 0x0550, 0x0e5f: 0x0550, 0x0e60: 0x0550, 0x0e61: 0x0550, 0x0e62: 0x0559, 0x0e63: 0x0559, - 0x0e64: 0x0559, 0x0e65: 0x0559, 0x0e66: 0x054d, 0x0e67: 0x054d, 0x0e68: 0x054d, 0x0e69: 0x054d, - 0x0e6a: 0x057d, 0x0e6b: 0x057d, 0x0e6c: 0x057d, 0x0e6d: 0x057d, 0x0e6e: 0x0580, 0x0e6f: 0x0580, - 0x0e70: 0x0580, 0x0e71: 0x0580, 0x0e72: 0x0562, 0x0e73: 0x0562, 0x0e74: 0x0562, 0x0e75: 0x0562, - 0x0e76: 0x055f, 0x0e77: 0x055f, 0x0e78: 0x055f, 0x0e79: 0x055f, 0x0e7a: 0x0565, 0x0e7b: 0x0565, - 0x0e7c: 0x0565, 0x0e7d: 0x0565, 0x0e7e: 0x0568, 0x0e7f: 0x0568, - // Block 0x3a, offset 0xe80 - 0x0e80: 0x0568, 0x0e81: 0x0568, 0x0e82: 0x0571, 0x0e83: 0x0571, 0x0e84: 0x056e, 0x0e85: 0x056e, - 0x0e86: 0x0574, 0x0e87: 0x0574, 0x0e88: 0x056b, 0x0e89: 0x056b, 0x0e8a: 0x057a, 0x0e8b: 0x057a, - 0x0e8c: 0x0577, 0x0e8d: 0x0577, 0x0e8e: 0x0583, 0x0e8f: 0x0583, 0x0e90: 0x0583, 0x0e91: 0x0583, - 0x0e92: 0x0589, 0x0e93: 0x0589, 0x0e94: 0x0589, 0x0e95: 0x0589, 0x0e96: 0x058f, 0x0e97: 0x058f, - 0x0e98: 0x058f, 0x0e99: 0x058f, 0x0e9a: 0x058c, 0x0e9b: 0x058c, 0x0e9c: 0x058c, 0x0e9d: 0x058c, - 0x0e9e: 0x0592, 0x0e9f: 0x0592, 0x0ea0: 0x0595, 0x0ea1: 0x0595, 0x0ea2: 0x0595, 0x0ea3: 0x0595, - 0x0ea4: 0x436c, 0x0ea5: 0x436c, 0x0ea6: 0x059b, 0x0ea7: 0x059b, 0x0ea8: 0x059b, 0x0ea9: 0x059b, - 0x0eaa: 0x0598, 0x0eab: 0x0598, 0x0eac: 0x0598, 0x0ead: 0x0598, 0x0eae: 0x05b6, 0x0eaf: 0x05b6, - 0x0eb0: 0x4366, 0x0eb1: 0x4366, - // Block 0x3b, offset 0xec0 - 0x0ed3: 0x0586, 0x0ed4: 0x0586, 0x0ed5: 0x0586, 0x0ed6: 0x0586, 0x0ed7: 0x05a4, - 0x0ed8: 0x05a4, 0x0ed9: 0x05a1, 0x0eda: 0x05a1, 0x0edb: 0x05a7, 0x0edc: 0x05a7, 0x0edd: 0x1f3c, - 0x0ede: 0x05ad, 0x0edf: 0x05ad, 0x0ee0: 0x059e, 0x0ee1: 0x059e, 0x0ee2: 0x05aa, 0x0ee3: 0x05aa, - 0x0ee4: 0x05b3, 0x0ee5: 0x05b3, 0x0ee6: 0x05b3, 0x0ee7: 0x05b3, 0x0ee8: 0x0544, 0x0ee9: 0x0544, - 0x0eea: 0x26bd, 0x0eeb: 0x26bd, 0x0eec: 0x272d, 0x0eed: 0x272d, 0x0eee: 0x26fc, 0x0eef: 0x26fc, - 0x0ef0: 0x2718, 0x0ef1: 0x2718, 0x0ef2: 0x2711, 0x0ef3: 0x2711, 0x0ef4: 0x271f, 0x0ef5: 0x271f, - 0x0ef6: 0x2726, 0x0ef7: 0x2726, 0x0ef8: 0x2726, 0x0ef9: 0x2703, 0x0efa: 0x2703, 0x0efb: 0x2703, - 0x0efc: 0x05b0, 0x0efd: 0x05b0, 0x0efe: 0x05b0, 0x0eff: 0x05b0, - // Block 0x3c, offset 0xf00 - 0x0f00: 0x26c4, 0x0f01: 0x26cb, 0x0f02: 0x26e7, 0x0f03: 0x2703, 0x0f04: 0x270a, 0x0f05: 0x1c76, - 0x0f06: 0x1c7b, 0x0f07: 0x1c80, 0x0f08: 0x1c8f, 0x0f09: 0x1c9e, 0x0f0a: 0x1ca3, 0x0f0b: 0x1ca8, - 0x0f0c: 0x1cad, 0x0f0d: 0x1cb2, 0x0f0e: 0x1cc1, 0x0f0f: 0x1cd0, 0x0f10: 0x1cd5, 0x0f11: 0x1cda, - 0x0f12: 0x1ce9, 0x0f13: 0x1cf8, 0x0f14: 0x1cfd, 0x0f15: 0x1d02, 0x0f16: 0x1d07, 0x0f17: 0x1d16, - 0x0f18: 0x1d1b, 0x0f19: 0x1d2a, 0x0f1a: 0x1d2f, 0x0f1b: 0x1d34, 0x0f1c: 0x1d43, 0x0f1d: 0x1d48, - 0x0f1e: 0x1d4d, 0x0f1f: 0x1d57, 0x0f20: 0x1d93, 0x0f21: 0x1da2, 0x0f22: 0x1db1, 0x0f23: 0x1db6, - 0x0f24: 0x1dbb, 0x0f25: 0x1dc5, 0x0f26: 0x1dd4, 0x0f27: 0x1dd9, 0x0f28: 0x1de8, 0x0f29: 0x1ded, - 0x0f2a: 0x1df2, 0x0f2b: 0x1e01, 0x0f2c: 0x1e06, 0x0f2d: 0x1e15, 0x0f2e: 0x1e1a, 0x0f2f: 0x1e1f, - 0x0f30: 0x1e24, 0x0f31: 0x1e29, 0x0f32: 0x1e2e, 0x0f33: 0x1e33, 0x0f34: 0x1e38, 0x0f35: 0x1e3d, - 0x0f36: 0x1e42, 0x0f37: 0x1e47, 0x0f38: 0x1e4c, 0x0f39: 0x1e51, 0x0f3a: 0x1e56, 0x0f3b: 0x1e5b, - 0x0f3c: 0x1e60, 0x0f3d: 0x1e65, 0x0f3e: 0x1e6a, 0x0f3f: 0x1e74, - // Block 0x3d, offset 0xf40 - 0x0f40: 0x1e79, 0x0f41: 0x1e7e, 0x0f42: 0x1e83, 0x0f43: 0x1e8d, 0x0f44: 0x1e92, 0x0f45: 0x1e9c, - 0x0f46: 0x1ea1, 0x0f47: 0x1ea6, 0x0f48: 0x1eab, 0x0f49: 0x1eb0, 0x0f4a: 0x1eb5, 0x0f4b: 0x1eba, - 0x0f4c: 0x1ebf, 0x0f4d: 0x1ec4, 0x0f4e: 0x1ed3, 0x0f4f: 0x1ee2, 0x0f50: 0x1ee7, 0x0f51: 0x1eec, - 0x0f52: 0x1ef1, 0x0f53: 0x1ef6, 0x0f54: 0x1efb, 0x0f55: 0x1f05, 0x0f56: 0x1f0a, 0x0f57: 0x1f0f, - 0x0f58: 0x1f1e, 0x0f59: 0x1f2d, 0x0f5a: 0x1f32, 0x0f5b: 0x431e, 0x0f5c: 0x4324, 0x0f5d: 0x435a, - 0x0f5e: 0x43b1, 0x0f5f: 0x43b8, 0x0f60: 0x43bf, 0x0f61: 0x43c6, 0x0f62: 0x43cd, 0x0f63: 0x43d4, - 0x0f64: 0x26d9, 0x0f65: 0x26e0, 0x0f66: 0x26e7, 0x0f67: 0x26ee, 0x0f68: 0x2703, 0x0f69: 0x270a, - 0x0f6a: 0x1c85, 0x0f6b: 0x1c8a, 0x0f6c: 0x1c8f, 0x0f6d: 0x1c94, 0x0f6e: 0x1c9e, 0x0f6f: 0x1ca3, - 0x0f70: 0x1cb7, 0x0f71: 0x1cbc, 0x0f72: 0x1cc1, 0x0f73: 0x1cc6, 0x0f74: 0x1cd0, 0x0f75: 0x1cd5, - 0x0f76: 0x1cdf, 0x0f77: 0x1ce4, 0x0f78: 0x1ce9, 0x0f79: 0x1cee, 0x0f7a: 0x1cf8, 0x0f7b: 0x1cfd, - 0x0f7c: 0x1e29, 0x0f7d: 0x1e2e, 0x0f7e: 0x1e3d, 0x0f7f: 0x1e42, - // Block 0x3e, offset 0xf80 - 0x0f80: 0x1e47, 0x0f81: 0x1e5b, 0x0f82: 0x1e60, 0x0f83: 0x1e65, 0x0f84: 0x1e6a, 0x0f85: 0x1e83, - 0x0f86: 0x1e8d, 0x0f87: 0x1e92, 0x0f88: 0x1e97, 0x0f89: 0x1eab, 0x0f8a: 0x1ec9, 0x0f8b: 0x1ece, - 0x0f8c: 0x1ed3, 0x0f8d: 0x1ed8, 0x0f8e: 0x1ee2, 0x0f8f: 0x1ee7, 0x0f90: 0x435a, 0x0f91: 0x1f14, - 0x0f92: 0x1f19, 0x0f93: 0x1f1e, 0x0f94: 0x1f23, 0x0f95: 0x1f2d, 0x0f96: 0x1f32, 0x0f97: 0x26c4, - 0x0f98: 0x26cb, 0x0f99: 0x26d2, 0x0f9a: 0x26e7, 0x0f9b: 0x26f5, 0x0f9c: 0x1c76, 0x0f9d: 0x1c7b, - 0x0f9e: 0x1c80, 0x0f9f: 0x1c8f, 0x0fa0: 0x1c99, 0x0fa1: 0x1ca8, 0x0fa2: 0x1cad, 0x0fa3: 0x1cb2, - 0x0fa4: 0x1cc1, 0x0fa5: 0x1ccb, 0x0fa6: 0x1ce9, 0x0fa7: 0x1d02, 0x0fa8: 0x1d07, 0x0fa9: 0x1d16, - 0x0faa: 0x1d1b, 0x0fab: 0x1d2a, 0x0fac: 0x1d34, 0x0fad: 0x1d43, 0x0fae: 0x1d48, 0x0faf: 0x1d4d, - 0x0fb0: 0x1d57, 0x0fb1: 0x1d93, 0x0fb2: 0x1d98, 0x0fb3: 0x1da2, 0x0fb4: 0x1db1, 0x0fb5: 0x1db6, - 0x0fb6: 0x1dbb, 0x0fb7: 0x1dc5, 0x0fb8: 0x1dd4, 0x0fb9: 0x1de8, 0x0fba: 0x1ded, 0x0fbb: 0x1df2, - 0x0fbc: 0x1e01, 0x0fbd: 0x1e06, 0x0fbe: 0x1e15, 0x0fbf: 0x1e1a, - // Block 0x3f, offset 0xfc0 - 0x0fc0: 0x1e1f, 0x0fc1: 0x1e24, 0x0fc2: 0x1e33, 0x0fc3: 0x1e38, 0x0fc4: 0x1e4c, 0x0fc5: 0x1e51, - 0x0fc6: 0x1e56, 0x0fc7: 0x1e5b, 0x0fc8: 0x1e60, 0x0fc9: 0x1e74, 0x0fca: 0x1e79, 0x0fcb: 0x1e7e, - 0x0fcc: 0x1e83, 0x0fcd: 0x1e88, 0x0fce: 0x1e9c, 0x0fcf: 0x1ea1, 0x0fd0: 0x1ea6, 0x0fd1: 0x1eab, - 0x0fd2: 0x1eba, 0x0fd3: 0x1ebf, 0x0fd4: 0x1ec4, 0x0fd5: 0x1ed3, 0x0fd6: 0x1edd, 0x0fd7: 0x1eec, - 0x0fd8: 0x1ef1, 0x0fd9: 0x434e, 0x0fda: 0x1f05, 0x0fdb: 0x1f0a, 0x0fdc: 0x1f0f, 0x0fdd: 0x1f1e, - 0x0fde: 0x1f28, 0x0fdf: 0x26e7, 0x0fe0: 0x26f5, 0x0fe1: 0x1c8f, 0x0fe2: 0x1c99, 0x0fe3: 0x1cc1, - 0x0fe4: 0x1ccb, 0x0fe5: 0x1ce9, 0x0fe6: 0x1cf3, 0x0fe7: 0x1d57, 0x0fe8: 0x1d5c, 0x0fe9: 0x1d7f, - 0x0fea: 0x1d84, 0x0feb: 0x1e5b, 0x0fec: 0x1e60, 0x0fed: 0x1e83, 0x0fee: 0x1ed3, 0x0fef: 0x1edd, - 0x0ff0: 0x1f1e, 0x0ff1: 0x1f28, 0x0ff2: 0x4402, 0x0ff3: 0x440a, 0x0ff4: 0x4412, 0x0ff5: 0x1dde, - 0x0ff6: 0x1de3, 0x0ff7: 0x1df7, 0x0ff8: 0x1dfc, 0x0ff9: 0x1e0b, 0x0ffa: 0x1e10, 0x0ffb: 0x1d61, - 0x0ffc: 0x1d66, 0x0ffd: 0x1d89, 0x0ffe: 0x1d8e, 0x0fff: 0x1d20, - // Block 0x40, offset 0x1000 - 0x1000: 0x1d25, 0x1001: 0x1d0c, 0x1002: 0x1d11, 0x1003: 0x1d39, 0x1004: 0x1d3e, 0x1005: 0x1da7, - 0x1006: 0x1dac, 0x1007: 0x1dca, 0x1008: 0x1dcf, 0x1009: 0x1d6b, 0x100a: 0x1d70, 0x100b: 0x1d75, - 0x100c: 0x1d7f, 0x100d: 0x1d7a, 0x100e: 0x1d52, 0x100f: 0x1d9d, 0x1010: 0x1dc0, 0x1011: 0x1dde, - 0x1012: 0x1de3, 0x1013: 0x1df7, 0x1014: 0x1dfc, 0x1015: 0x1e0b, 0x1016: 0x1e10, 0x1017: 0x1d61, - 0x1018: 0x1d66, 0x1019: 0x1d89, 0x101a: 0x1d8e, 0x101b: 0x1d20, 0x101c: 0x1d25, 0x101d: 0x1d0c, - 0x101e: 0x1d11, 0x101f: 0x1d39, 0x1020: 0x1d3e, 0x1021: 0x1da7, 0x1022: 0x1dac, 0x1023: 0x1dca, - 0x1024: 0x1dcf, 0x1025: 0x1d6b, 0x1026: 0x1d70, 0x1027: 0x1d75, 0x1028: 0x1d7f, 0x1029: 0x1d7a, - 0x102a: 0x1d52, 0x102b: 0x1d9d, 0x102c: 0x1dc0, 0x102d: 0x1d6b, 0x102e: 0x1d70, 0x102f: 0x1d75, - 0x1030: 0x1d7f, 0x1031: 0x1d5c, 0x1032: 0x1d84, 0x1033: 0x1dd9, 0x1034: 0x1d43, 0x1035: 0x1d48, - 0x1036: 0x1d4d, 0x1037: 0x1d6b, 0x1038: 0x1d70, 0x1039: 0x1d75, 0x103a: 0x1dd9, 0x103b: 0x1de8, - 0x103c: 0x4306, 0x103d: 0x4306, - // Block 0x41, offset 0x1040 - 0x1050: 0x2424, 0x1051: 0x2439, - 0x1052: 0x2439, 0x1053: 0x2440, 0x1054: 0x2447, 0x1055: 0x245c, 0x1056: 0x2463, 0x1057: 0x246a, - 0x1058: 0x248d, 0x1059: 0x248d, 0x105a: 0x24b0, 0x105b: 0x24a9, 0x105c: 0x24c5, 0x105d: 0x24b7, - 0x105e: 0x24be, 0x105f: 0x24e1, 0x1060: 0x24e1, 0x1061: 0x24da, 0x1062: 0x24e8, 0x1063: 0x24e8, - 0x1064: 0x2512, 0x1065: 0x2512, 0x1066: 0x252e, 0x1067: 0x24f6, 0x1068: 0x24f6, 0x1069: 0x24ef, - 0x106a: 0x2504, 0x106b: 0x2504, 0x106c: 0x250b, 0x106d: 0x250b, 0x106e: 0x2535, 0x106f: 0x2543, - 0x1070: 0x2543, 0x1071: 0x254a, 0x1072: 0x254a, 0x1073: 0x2551, 0x1074: 0x2558, 0x1075: 0x255f, - 0x1076: 0x2566, 0x1077: 0x2566, 0x1078: 0x256d, 0x1079: 0x257b, 0x107a: 0x2589, 0x107b: 0x2582, - 0x107c: 0x2590, 0x107d: 0x2590, 0x107e: 0x25a5, 0x107f: 0x25ac, - // Block 0x42, offset 0x1080 - 0x1080: 0x25dd, 0x1081: 0x25eb, 0x1082: 0x25e4, 0x1083: 0x25c8, 0x1084: 0x25c8, 0x1085: 0x25f2, - 0x1086: 0x25f2, 0x1087: 0x25f9, 0x1088: 0x25f9, 0x1089: 0x2623, 0x108a: 0x262a, 0x108b: 0x2631, - 0x108c: 0x2607, 0x108d: 0x2615, 0x108e: 0x2638, 0x108f: 0x263f, - 0x1092: 0x260e, 0x1093: 0x2693, 0x1094: 0x269a, 0x1095: 0x2670, 0x1096: 0x2677, 0x1097: 0x265b, - 0x1098: 0x265b, 0x1099: 0x2662, 0x109a: 0x268c, 0x109b: 0x2685, 0x109c: 0x26af, 0x109d: 0x26af, - 0x109e: 0x241d, 0x109f: 0x2432, 0x10a0: 0x242b, 0x10a1: 0x2455, 0x10a2: 0x244e, 0x10a3: 0x2478, - 0x10a4: 0x2471, 0x10a5: 0x249b, 0x10a6: 0x247f, 0x10a7: 0x2494, 0x10a8: 0x24cc, 0x10a9: 0x2519, - 0x10aa: 0x24fd, 0x10ab: 0x253c, 0x10ac: 0x25d6, 0x10ad: 0x2600, 0x10ae: 0x26a8, 0x10af: 0x26a1, - 0x10b0: 0x26b6, 0x10b1: 0x264d, 0x10b2: 0x25b3, 0x10b3: 0x267e, 0x10b4: 0x25a5, 0x10b5: 0x25dd, - 0x10b6: 0x2574, 0x10b7: 0x25c1, 0x10b8: 0x2654, 0x10b9: 0x2646, 0x10ba: 0x25cf, 0x10bb: 0x25ba, - 0x10bc: 0x25cf, 0x10bd: 0x2654, 0x10be: 0x2486, 0x10bf: 0x24a2, - // Block 0x43, offset 0x10c0 - 0x10c0: 0x261c, 0x10c1: 0x2597, 0x10c2: 0x2416, 0x10c3: 0x25ba, 0x10c4: 0x255f, 0x10c5: 0x252e, - 0x10c6: 0x24d3, 0x10c7: 0x2669, - 0x10f0: 0x2527, 0x10f1: 0x259e, 0x10f2: 0x293b, 0x10f3: 0x2932, 0x10f4: 0x2968, 0x10f5: 0x2956, - 0x10f6: 0x2944, 0x10f7: 0x295f, 0x10f8: 0x2971, 0x10f9: 0x2520, 0x10fa: 0x2e15, 0x10fb: 0x2c85, - 0x10fc: 0x294d, - // Block 0x44, offset 0x1100 - 0x1110: 0x00e7, 0x1111: 0x09c1, - 0x1112: 0x09c5, 0x1113: 0x0103, 0x1114: 0x0105, 0x1115: 0x00d1, 0x1116: 0x010d, 0x1117: 0x09fd, - 0x1118: 0x0a01, 0x1119: 0x06ad, - 0x1120: 0x80e6, 0x1121: 0x80e6, 0x1122: 0x80e6, 0x1123: 0x80e6, - 0x1124: 0x80e6, 0x1125: 0x80e6, 0x1126: 0x80e6, - 0x1130: 0x0193, 0x1131: 0x0981, 0x1132: 0x097d, 0x1133: 0x014d, 0x1134: 0x014d, 0x1135: 0x00df, - 0x1136: 0x00e1, 0x1137: 0x0185, 0x1138: 0x0189, 0x1139: 0x09f5, 0x113a: 0x09f9, 0x113b: 0x09e9, - 0x113c: 0x09ed, 0x113d: 0x09d1, 0x113e: 0x09d5, 0x113f: 0x09c9, - // Block 0x45, offset 0x1140 - 0x1140: 0x09cd, 0x1141: 0x09d9, 0x1142: 0x09dd, 0x1143: 0x09e1, 0x1144: 0x09e5, - 0x1147: 0x0145, 0x1148: 0x0149, 0x1149: 0x4155, 0x114a: 0x4155, 0x114b: 0x4155, - 0x114c: 0x4155, 0x114d: 0x014d, 0x114e: 0x014d, 0x114f: 0x014d, 0x1150: 0x00e7, 0x1151: 0x09c1, - 0x1152: 0x00eb, 0x1154: 0x0105, 0x1155: 0x0103, 0x1156: 0x010d, 0x1157: 0x00d1, - 0x1158: 0x0981, 0x1159: 0x00df, 0x115a: 0x00e1, 0x115b: 0x0185, 0x115c: 0x0189, 0x115d: 0x09f5, - 0x115e: 0x09f9, 0x115f: 0x00d5, 0x1160: 0x00db, 0x1161: 0x00e3, 0x1162: 0x00e5, 0x1163: 0x00e9, - 0x1164: 0x0107, 0x1165: 0x010b, 0x1166: 0x0109, 0x1168: 0x0147, 0x1169: 0x00d7, - 0x116a: 0x00d9, 0x116b: 0x010f, - 0x1170: 0x4196, 0x1171: 0x432a, 0x1172: 0x419b, 0x1174: 0x41a0, - 0x1176: 0x41a5, 0x1177: 0x4330, 0x1178: 0x41aa, 0x1179: 0x4336, 0x117a: 0x41af, 0x117b: 0x433c, - 0x117c: 0x41b4, 0x117d: 0x4342, 0x117e: 0x41b9, 0x117f: 0x4348, - // Block 0x46, offset 0x1180 - 0x1180: 0x04ed, 0x1181: 0x430c, 0x1182: 0x430c, 0x1183: 0x4312, 0x1184: 0x4312, 0x1185: 0x4354, - 0x1186: 0x4354, 0x1187: 0x4318, 0x1188: 0x4318, 0x1189: 0x4360, 0x118a: 0x4360, 0x118b: 0x4360, - 0x118c: 0x4360, 0x118d: 0x04f0, 0x118e: 0x04f0, 0x118f: 0x04f3, 0x1190: 0x04f3, 0x1191: 0x04f3, - 0x1192: 0x04f3, 0x1193: 0x04f6, 0x1194: 0x04f6, 0x1195: 0x04f9, 0x1196: 0x04f9, 0x1197: 0x04f9, - 0x1198: 0x04f9, 0x1199: 0x04fc, 0x119a: 0x04fc, 0x119b: 0x04fc, 0x119c: 0x04fc, 0x119d: 0x04ff, - 0x119e: 0x04ff, 0x119f: 0x04ff, 0x11a0: 0x04ff, 0x11a1: 0x0502, 0x11a2: 0x0502, 0x11a3: 0x0502, - 0x11a4: 0x0502, 0x11a5: 0x0505, 0x11a6: 0x0505, 0x11a7: 0x0505, 0x11a8: 0x0505, 0x11a9: 0x0508, - 0x11aa: 0x0508, 0x11ab: 0x050b, 0x11ac: 0x050b, 0x11ad: 0x050e, 0x11ae: 0x050e, 0x11af: 0x0511, - 0x11b0: 0x0511, 0x11b1: 0x0514, 0x11b2: 0x0514, 0x11b3: 0x0514, 0x11b4: 0x0514, 0x11b5: 0x0517, - 0x11b6: 0x0517, 0x11b7: 0x0517, 0x11b8: 0x0517, 0x11b9: 0x051a, 0x11ba: 0x051a, 0x11bb: 0x051a, - 0x11bc: 0x051a, 0x11bd: 0x051d, 0x11be: 0x051d, 0x11bf: 0x051d, - // Block 0x47, offset 0x11c0 - 0x11c0: 0x051d, 0x11c1: 0x0520, 0x11c2: 0x0520, 0x11c3: 0x0520, 0x11c4: 0x0520, 0x11c5: 0x0523, - 0x11c6: 0x0523, 0x11c7: 0x0523, 0x11c8: 0x0523, 0x11c9: 0x0526, 0x11ca: 0x0526, 0x11cb: 0x0526, - 0x11cc: 0x0526, 0x11cd: 0x0529, 0x11ce: 0x0529, 0x11cf: 0x0529, 0x11d0: 0x0529, 0x11d1: 0x052c, - 0x11d2: 0x052c, 0x11d3: 0x052c, 0x11d4: 0x052c, 0x11d5: 0x052f, 0x11d6: 0x052f, 0x11d7: 0x052f, - 0x11d8: 0x052f, 0x11d9: 0x0532, 0x11da: 0x0532, 0x11db: 0x0532, 0x11dc: 0x0532, 0x11dd: 0x0535, - 0x11de: 0x0535, 0x11df: 0x0535, 0x11e0: 0x0535, 0x11e1: 0x0538, 0x11e2: 0x0538, 0x11e3: 0x0538, - 0x11e4: 0x0538, 0x11e5: 0x053b, 0x11e6: 0x053b, 0x11e7: 0x053b, 0x11e8: 0x053b, 0x11e9: 0x053e, - 0x11ea: 0x053e, 0x11eb: 0x053e, 0x11ec: 0x053e, 0x11ed: 0x0541, 0x11ee: 0x0541, 0x11ef: 0x0544, - 0x11f0: 0x0544, 0x11f1: 0x0547, 0x11f2: 0x0547, 0x11f3: 0x0547, 0x11f4: 0x0547, 0x11f5: 0x441a, - 0x11f6: 0x441a, 0x11f7: 0x4422, 0x11f8: 0x4422, 0x11f9: 0x442a, 0x11fa: 0x442a, 0x11fb: 0x1e6f, - 0x11fc: 0x1e6f, - // Block 0x48, offset 0x1200 - 0x1200: 0x014f, 0x1201: 0x0151, 0x1202: 0x0153, 0x1203: 0x0155, 0x1204: 0x0157, 0x1205: 0x0159, - 0x1206: 0x015b, 0x1207: 0x015d, 0x1208: 0x015f, 0x1209: 0x0161, 0x120a: 0x0163, 0x120b: 0x0165, - 0x120c: 0x0167, 0x120d: 0x0169, 0x120e: 0x016b, 0x120f: 0x016d, 0x1210: 0x016f, 0x1211: 0x0171, - 0x1212: 0x0173, 0x1213: 0x0175, 0x1214: 0x0177, 0x1215: 0x0179, 0x1216: 0x017b, 0x1217: 0x017d, - 0x1218: 0x017f, 0x1219: 0x0181, 0x121a: 0x0183, 0x121b: 0x0185, 0x121c: 0x0187, 0x121d: 0x0189, - 0x121e: 0x018b, 0x121f: 0x09b5, 0x1220: 0x09b9, 0x1221: 0x09c5, 0x1222: 0x09d9, 0x1223: 0x09dd, - 0x1224: 0x09c1, 0x1225: 0x0ae9, 0x1226: 0x0ae1, 0x1227: 0x0a05, 0x1228: 0x0a0d, 0x1229: 0x0a15, - 0x122a: 0x0a1d, 0x122b: 0x0a25, 0x122c: 0x0aa9, 0x122d: 0x0ab1, 0x122e: 0x0ab9, 0x122f: 0x0a5d, - 0x1230: 0x0aed, 0x1231: 0x0a09, 0x1232: 0x0a11, 0x1233: 0x0a19, 0x1234: 0x0a21, 0x1235: 0x0a29, - 0x1236: 0x0a2d, 0x1237: 0x0a31, 0x1238: 0x0a35, 0x1239: 0x0a39, 0x123a: 0x0a3d, 0x123b: 0x0a41, - 0x123c: 0x0a45, 0x123d: 0x0a49, 0x123e: 0x0a4d, 0x123f: 0x0a51, - // Block 0x49, offset 0x1240 - 0x1240: 0x0a55, 0x1241: 0x0a59, 0x1242: 0x0a61, 0x1243: 0x0a65, 0x1244: 0x0a69, 0x1245: 0x0a6d, - 0x1246: 0x0a71, 0x1247: 0x0a75, 0x1248: 0x0a79, 0x1249: 0x0a7d, 0x124a: 0x0a81, 0x124b: 0x0a85, - 0x124c: 0x0a89, 0x124d: 0x0a8d, 0x124e: 0x0a91, 0x124f: 0x0a95, 0x1250: 0x0a99, 0x1251: 0x0a9d, - 0x1252: 0x0aa1, 0x1253: 0x0aa5, 0x1254: 0x0aad, 0x1255: 0x0ab5, 0x1256: 0x0abd, 0x1257: 0x0ac1, - 0x1258: 0x0ac5, 0x1259: 0x0ac9, 0x125a: 0x0acd, 0x125b: 0x0ad1, 0x125c: 0x0ad5, 0x125d: 0x0ae5, - 0x125e: 0x4974, 0x125f: 0x497a, 0x1260: 0x0889, 0x1261: 0x07d9, 0x1262: 0x07dd, 0x1263: 0x0901, - 0x1264: 0x07e1, 0x1265: 0x0905, 0x1266: 0x0909, 0x1267: 0x07e5, 0x1268: 0x07e9, 0x1269: 0x07ed, - 0x126a: 0x090d, 0x126b: 0x0911, 0x126c: 0x0915, 0x126d: 0x0919, 0x126e: 0x091d, 0x126f: 0x0921, - 0x1270: 0x082d, 0x1271: 0x07f1, 0x1272: 0x07f5, 0x1273: 0x07f9, 0x1274: 0x0841, 0x1275: 0x07fd, - 0x1276: 0x0801, 0x1277: 0x0805, 0x1278: 0x0809, 0x1279: 0x080d, 0x127a: 0x0811, 0x127b: 0x0815, - 0x127c: 0x0819, 0x127d: 0x081d, 0x127e: 0x0821, - // Block 0x4a, offset 0x1280 - 0x1280: 0x0131, 0x1281: 0x0133, 0x1282: 0x0135, 0x1283: 0x0137, 0x1284: 0x0139, 0x1285: 0x013b, - 0x1286: 0x013d, 0x1287: 0x013f, 0x1288: 0x0141, 0x1289: 0x0143, 0x128a: 0x0151, 0x128b: 0x0153, - 0x128c: 0x0155, 0x128d: 0x0157, 0x128e: 0x0159, 0x128f: 0x015b, 0x1290: 0x015d, 0x1291: 0x015f, - 0x1292: 0x0161, 0x1293: 0x0163, 0x1294: 0x0165, 0x1295: 0x0167, 0x1296: 0x0169, 0x1297: 0x016b, - 0x1298: 0x016d, 0x1299: 0x016f, 0x129a: 0x0171, 0x129b: 0x0173, 0x129c: 0x0175, 0x129d: 0x0177, - 0x129e: 0x0179, 0x129f: 0x017b, 0x12a0: 0x017d, 0x12a1: 0x017f, 0x12a2: 0x0181, 0x12a3: 0x0183, - 0x12a4: 0x03a0, 0x12a5: 0x03b2, 0x12a8: 0x0430, 0x12a9: 0x0433, - 0x12aa: 0x0436, 0x12ab: 0x0439, 0x12ac: 0x043c, 0x12ad: 0x043f, 0x12ae: 0x0442, 0x12af: 0x0445, - 0x12b0: 0x0448, 0x12b1: 0x044b, 0x12b2: 0x044e, 0x12b3: 0x0451, 0x12b4: 0x0454, 0x12b5: 0x0457, - 0x12b6: 0x045a, 0x12b7: 0x045d, 0x12b8: 0x0460, 0x12b9: 0x0445, 0x12ba: 0x0463, 0x12bb: 0x0466, - 0x12bc: 0x0469, 0x12bd: 0x046c, 0x12be: 0x046f, 0x12bf: 0x0472, - // Block 0x4b, offset 0x12c0 - 0x12c0: 0x04ba, 0x12c1: 0x04bd, 0x12c2: 0x04c0, 0x12c3: 0x0999, 0x12c4: 0x0484, 0x12c5: 0x048d, - 0x12c6: 0x0493, 0x12c7: 0x04b7, 0x12c8: 0x04a8, 0x12c9: 0x04a5, 0x12ca: 0x04c3, 0x12cb: 0x04c6, - 0x12ce: 0x00ef, 0x12cf: 0x00f1, 0x12d0: 0x00f3, 0x12d1: 0x00f5, - 0x12d2: 0x00f7, 0x12d3: 0x00f9, 0x12d4: 0x00fb, 0x12d5: 0x00fd, 0x12d6: 0x00ff, 0x12d7: 0x0101, - 0x12d8: 0x00ef, 0x12d9: 0x00f1, 0x12da: 0x00f3, 0x12db: 0x00f5, 0x12dc: 0x00f7, 0x12dd: 0x00f9, - 0x12de: 0x00fb, 0x12df: 0x00fd, 0x12e0: 0x00ff, 0x12e1: 0x0101, 0x12e2: 0x00ef, 0x12e3: 0x00f1, - 0x12e4: 0x00f3, 0x12e5: 0x00f5, 0x12e6: 0x00f7, 0x12e7: 0x00f9, 0x12e8: 0x00fb, 0x12e9: 0x00fd, - 0x12ea: 0x00ff, 0x12eb: 0x0101, 0x12ec: 0x00ef, 0x12ed: 0x00f1, 0x12ee: 0x00f3, 0x12ef: 0x00f5, - 0x12f0: 0x00f7, 0x12f1: 0x00f9, 0x12f2: 0x00fb, 0x12f3: 0x00fd, 0x12f4: 0x00ff, 0x12f5: 0x0101, - 0x12f6: 0x00ef, 0x12f7: 0x00f1, 0x12f8: 0x00f3, 0x12f9: 0x00f5, 0x12fa: 0x00f7, 0x12fb: 0x00f9, - 0x12fc: 0x00fb, 0x12fd: 0x00fd, 0x12fe: 0x00ff, 0x12ff: 0x0101, - // Block 0x4c, offset 0x1300 - 0x1300: 0x0199, 0x1301: 0x0196, 0x1302: 0x019c, 0x1303: 0x01c0, 0x1304: 0x01e4, 0x1305: 0x0208, - 0x1306: 0x022c, 0x1307: 0x0235, 0x1308: 0x023b, 0x1309: 0x0241, 0x130a: 0x0247, - 0x1310: 0x05dd, 0x1311: 0x05e1, - 0x1312: 0x05e5, 0x1313: 0x05e9, 0x1314: 0x05ed, 0x1315: 0x05f1, 0x1316: 0x05f5, 0x1317: 0x05f9, - 0x1318: 0x05fd, 0x1319: 0x0601, 0x131a: 0x0605, 0x131b: 0x0609, 0x131c: 0x060d, 0x131d: 0x0611, - 0x131e: 0x0615, 0x131f: 0x0619, 0x1320: 0x061d, 0x1321: 0x0621, 0x1322: 0x0625, 0x1323: 0x0629, - 0x1324: 0x062d, 0x1325: 0x0631, 0x1326: 0x0635, 0x1327: 0x0639, 0x1328: 0x063d, 0x1329: 0x0641, - 0x132a: 0x289a, 0x132b: 0x0115, 0x132c: 0x0133, 0x132d: 0x025c, 0x132e: 0x02cb, - 0x1330: 0x0111, 0x1331: 0x0113, 0x1332: 0x0115, 0x1333: 0x0117, 0x1334: 0x0119, 0x1335: 0x011b, - 0x1336: 0x011d, 0x1337: 0x011f, 0x1338: 0x0121, 0x1339: 0x0123, 0x133a: 0x0125, 0x133b: 0x0127, - 0x133c: 0x0129, 0x133d: 0x012b, 0x133e: 0x012d, 0x133f: 0x012f, - // Block 0x4d, offset 0x1340 - 0x1340: 0x2829, 0x1341: 0x283e, 0x1342: 0x0a41, - 0x1350: 0x114d, 0x1351: 0x0f85, - 0x1352: 0x0e11, 0x1353: 0x44da, 0x1354: 0x0c59, 0x1355: 0x0f2d, 0x1356: 0x186d, 0x1357: 0x0f3d, - 0x1358: 0x0c65, 0x1359: 0x1215, 0x135a: 0x13ed, 0x135b: 0x11ed, 0x135c: 0x0d65, 0x135d: 0x10a9, - 0x135e: 0x0cfd, 0x135f: 0x11f5, 0x1360: 0x0d51, 0x1361: 0x1655, 0x1362: 0x14c1, 0x1363: 0x18c9, - 0x1364: 0x0f11, 0x1365: 0x0e49, 0x1366: 0x13a1, 0x1367: 0x1159, 0x1368: 0x1185, 0x1369: 0x0bfd, - 0x136a: 0x0c09, 0x136b: 0x1949, 0x136c: 0x1019, 0x136d: 0x0c25, 0x136e: 0x0e2d, 0x136f: 0x1179, - 0x1370: 0x18f1, 0x1371: 0x1151, 0x1372: 0x15ad, 0x1373: 0x15e9, 0x1374: 0x0e35, 0x1375: 0x1381, - 0x1376: 0x1249, 0x1377: 0x1245, 0x1378: 0x14d5, 0x1379: 0x0d69, 0x137a: 0x0e95, - // Block 0x4e, offset 0x1380 - 0x1380: 0x0c39, 0x1381: 0x0c31, 0x1382: 0x0c41, 0x1383: 0x1f41, 0x1384: 0x0c85, 0x1385: 0x0c95, - 0x1386: 0x0c99, 0x1387: 0x0ca1, 0x1388: 0x0ca9, 0x1389: 0x0cad, 0x138a: 0x0cb9, 0x138b: 0x0cb1, - 0x138c: 0x0af1, 0x138d: 0x1f55, 0x138e: 0x0ccd, 0x138f: 0x0cd1, 0x1390: 0x0cd5, 0x1391: 0x0cf1, - 0x1392: 0x1f46, 0x1393: 0x0af5, 0x1394: 0x0cdd, 0x1395: 0x0cfd, 0x1396: 0x1f50, 0x1397: 0x0d0d, - 0x1398: 0x0d15, 0x1399: 0x0c75, 0x139a: 0x0d1d, 0x139b: 0x0d21, 0x139c: 0x212b, 0x139d: 0x0d3d, - 0x139e: 0x0d45, 0x139f: 0x0afd, 0x13a0: 0x0d5d, 0x13a1: 0x0d61, 0x13a2: 0x0d69, 0x13a3: 0x0d6d, - 0x13a4: 0x0b01, 0x13a5: 0x0d85, 0x13a6: 0x0d89, 0x13a7: 0x0d95, 0x13a8: 0x0da1, 0x13a9: 0x0da5, - 0x13aa: 0x0da9, 0x13ab: 0x0db1, 0x13ac: 0x0dd1, 0x13ad: 0x0dd5, 0x13ae: 0x0ddd, 0x13af: 0x0ded, - 0x13b0: 0x0df5, 0x13b1: 0x0df9, 0x13b2: 0x0df9, 0x13b3: 0x0df9, 0x13b4: 0x1f64, 0x13b5: 0x13d1, - 0x13b6: 0x0e0d, 0x13b7: 0x0e15, 0x13b8: 0x1f69, 0x13b9: 0x0e21, 0x13ba: 0x0e29, 0x13bb: 0x0e31, - 0x13bc: 0x0e59, 0x13bd: 0x0e45, 0x13be: 0x0e51, 0x13bf: 0x0e55, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x0e5d, 0x13c1: 0x0e65, 0x13c2: 0x0e69, 0x13c3: 0x0e71, 0x13c4: 0x0e79, 0x13c5: 0x0e7d, - 0x13c6: 0x0e7d, 0x13c7: 0x0e85, 0x13c8: 0x0e8d, 0x13c9: 0x0e91, 0x13ca: 0x0e9d, 0x13cb: 0x0ec1, - 0x13cc: 0x0ea5, 0x13cd: 0x0ec5, 0x13ce: 0x0ea9, 0x13cf: 0x0eb1, 0x13d0: 0x0d49, 0x13d1: 0x0f0d, - 0x13d2: 0x0ed5, 0x13d3: 0x0ed9, 0x13d4: 0x0edd, 0x13d5: 0x0ed1, 0x13d6: 0x0ee5, 0x13d7: 0x0ee1, - 0x13d8: 0x0ef9, 0x13d9: 0x1f6e, 0x13da: 0x0f15, 0x13db: 0x0f19, 0x13dc: 0x0f21, 0x13dd: 0x0f2d, - 0x13de: 0x0f35, 0x13df: 0x0f51, 0x13e0: 0x1f73, 0x13e1: 0x1f78, 0x13e2: 0x0f5d, 0x13e3: 0x0f61, - 0x13e4: 0x0f65, 0x13e5: 0x0f59, 0x13e6: 0x0f6d, 0x13e7: 0x0b05, 0x13e8: 0x0b09, 0x13e9: 0x0f75, - 0x13ea: 0x0f7d, 0x13eb: 0x0f7d, 0x13ec: 0x1f7d, 0x13ed: 0x0f99, 0x13ee: 0x0f9d, 0x13ef: 0x0fa1, - 0x13f0: 0x0fa9, 0x13f1: 0x1f82, 0x13f2: 0x0fb1, 0x13f3: 0x0fb5, 0x13f4: 0x108d, 0x13f5: 0x0fbd, - 0x13f6: 0x0b0d, 0x13f7: 0x0fc9, 0x13f8: 0x0fd9, 0x13f9: 0x0fe5, 0x13fa: 0x0fe1, 0x13fb: 0x1f8c, - 0x13fc: 0x0fed, 0x13fd: 0x1f91, 0x13fe: 0x0ff9, 0x13ff: 0x0ff5, - // Block 0x50, offset 0x1400 - 0x1400: 0x0ffd, 0x1401: 0x100d, 0x1402: 0x1011, 0x1403: 0x0b11, 0x1404: 0x1021, 0x1405: 0x1029, - 0x1406: 0x102d, 0x1407: 0x1031, 0x1408: 0x0b15, 0x1409: 0x1f96, 0x140a: 0x0b19, 0x140b: 0x104d, - 0x140c: 0x1051, 0x140d: 0x1055, 0x140e: 0x105d, 0x140f: 0x215d, 0x1410: 0x1075, 0x1411: 0x1fa0, - 0x1412: 0x1fa0, 0x1413: 0x1715, 0x1414: 0x1085, 0x1415: 0x1085, 0x1416: 0x0b1d, 0x1417: 0x1fc3, - 0x1418: 0x2095, 0x1419: 0x1095, 0x141a: 0x109d, 0x141b: 0x0b21, 0x141c: 0x10b1, 0x141d: 0x10c1, - 0x141e: 0x10c5, 0x141f: 0x10cd, 0x1420: 0x10dd, 0x1421: 0x0b29, 0x1422: 0x0b25, 0x1423: 0x10e1, - 0x1424: 0x1fa5, 0x1425: 0x10e5, 0x1426: 0x10f9, 0x1427: 0x10fd, 0x1428: 0x1101, 0x1429: 0x10fd, - 0x142a: 0x110d, 0x142b: 0x1111, 0x142c: 0x1121, 0x142d: 0x1119, 0x142e: 0x111d, 0x142f: 0x1125, - 0x1430: 0x1129, 0x1431: 0x112d, 0x1432: 0x1139, 0x1433: 0x113d, 0x1434: 0x1155, 0x1435: 0x115d, - 0x1436: 0x116d, 0x1437: 0x1181, 0x1438: 0x1fb4, 0x1439: 0x117d, 0x143a: 0x1171, 0x143b: 0x1189, - 0x143c: 0x1191, 0x143d: 0x11a5, 0x143e: 0x1fb9, 0x143f: 0x11ad, - // Block 0x51, offset 0x1440 - 0x1440: 0x11a1, 0x1441: 0x1199, 0x1442: 0x0b2d, 0x1443: 0x11b5, 0x1444: 0x11bd, 0x1445: 0x11c5, - 0x1446: 0x11b9, 0x1447: 0x0b31, 0x1448: 0x11d5, 0x1449: 0x11dd, 0x144a: 0x1fbe, 0x144b: 0x1209, - 0x144c: 0x123d, 0x144d: 0x1219, 0x144e: 0x0b3d, 0x144f: 0x1225, 0x1450: 0x0b39, 0x1451: 0x0b35, - 0x1452: 0x0d01, 0x1453: 0x0d05, 0x1454: 0x1241, 0x1455: 0x1229, 0x1456: 0x16e9, 0x1457: 0x0ba1, - 0x1458: 0x124d, 0x1459: 0x1251, 0x145a: 0x1255, 0x145b: 0x1269, 0x145c: 0x1261, 0x145d: 0x1fd7, - 0x145e: 0x0b41, 0x145f: 0x127d, 0x1460: 0x1271, 0x1461: 0x128d, 0x1462: 0x1295, 0x1463: 0x1fe1, - 0x1464: 0x1299, 0x1465: 0x1285, 0x1466: 0x12a1, 0x1467: 0x0b45, 0x1468: 0x12a5, 0x1469: 0x12a9, - 0x146a: 0x12ad, 0x146b: 0x12b9, 0x146c: 0x1fe6, 0x146d: 0x12c1, 0x146e: 0x0b49, 0x146f: 0x12cd, - 0x1470: 0x1feb, 0x1471: 0x12d1, 0x1472: 0x0b4d, 0x1473: 0x12dd, 0x1474: 0x12e9, 0x1475: 0x12f5, - 0x1476: 0x12f9, 0x1477: 0x1ff0, 0x1478: 0x1f87, 0x1479: 0x1ff5, 0x147a: 0x1319, 0x147b: 0x1ffa, - 0x147c: 0x1325, 0x147d: 0x132d, 0x147e: 0x131d, 0x147f: 0x1339, - // Block 0x52, offset 0x1480 - 0x1480: 0x1349, 0x1481: 0x1359, 0x1482: 0x134d, 0x1483: 0x1351, 0x1484: 0x135d, 0x1485: 0x1361, - 0x1486: 0x1fff, 0x1487: 0x1345, 0x1488: 0x1379, 0x1489: 0x137d, 0x148a: 0x0b51, 0x148b: 0x1391, - 0x148c: 0x138d, 0x148d: 0x2004, 0x148e: 0x1371, 0x148f: 0x13ad, 0x1490: 0x2009, 0x1491: 0x200e, - 0x1492: 0x13b1, 0x1493: 0x13c5, 0x1494: 0x13c1, 0x1495: 0x13bd, 0x1496: 0x0b55, 0x1497: 0x13c9, - 0x1498: 0x13d9, 0x1499: 0x13d5, 0x149a: 0x13e1, 0x149b: 0x1f4b, 0x149c: 0x13f1, 0x149d: 0x2013, - 0x149e: 0x13fd, 0x149f: 0x201d, 0x14a0: 0x1411, 0x14a1: 0x141d, 0x14a2: 0x1431, 0x14a3: 0x2022, - 0x14a4: 0x1445, 0x14a5: 0x1449, 0x14a6: 0x2027, 0x14a7: 0x202c, 0x14a8: 0x1465, 0x14a9: 0x1475, - 0x14aa: 0x0b59, 0x14ab: 0x1479, 0x14ac: 0x0b5d, 0x14ad: 0x0b5d, 0x14ae: 0x1491, 0x14af: 0x1495, - 0x14b0: 0x149d, 0x14b1: 0x14a1, 0x14b2: 0x14ad, 0x14b3: 0x0b61, 0x14b4: 0x14c5, 0x14b5: 0x2031, - 0x14b6: 0x14e1, 0x14b7: 0x2036, 0x14b8: 0x14ed, 0x14b9: 0x1f9b, 0x14ba: 0x14fd, 0x14bb: 0x203b, - 0x14bc: 0x2040, 0x14bd: 0x2045, 0x14be: 0x0b65, 0x14bf: 0x0b69, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x1535, 0x14c1: 0x204f, 0x14c2: 0x204a, 0x14c3: 0x2054, 0x14c4: 0x2059, 0x14c5: 0x153d, - 0x14c6: 0x1541, 0x14c7: 0x1541, 0x14c8: 0x1549, 0x14c9: 0x0b71, 0x14ca: 0x154d, 0x14cb: 0x0b75, - 0x14cc: 0x0b79, 0x14cd: 0x2063, 0x14ce: 0x1561, 0x14cf: 0x1569, 0x14d0: 0x1575, 0x14d1: 0x0b7d, - 0x14d2: 0x2068, 0x14d3: 0x1599, 0x14d4: 0x206d, 0x14d5: 0x2072, 0x14d6: 0x15b9, 0x14d7: 0x15d1, - 0x14d8: 0x0b81, 0x14d9: 0x15d9, 0x14da: 0x15dd, 0x14db: 0x15e1, 0x14dc: 0x2077, 0x14dd: 0x207c, - 0x14de: 0x207c, 0x14df: 0x15f9, 0x14e0: 0x0b85, 0x14e1: 0x2081, 0x14e2: 0x160d, 0x14e3: 0x1611, - 0x14e4: 0x0b89, 0x14e5: 0x2086, 0x14e6: 0x162d, 0x14e7: 0x0b8d, 0x14e8: 0x163d, 0x14e9: 0x1635, - 0x14ea: 0x1645, 0x14eb: 0x2090, 0x14ec: 0x165d, 0x14ed: 0x0b91, 0x14ee: 0x1669, 0x14ef: 0x1671, - 0x14f0: 0x1681, 0x14f1: 0x0b95, 0x14f2: 0x209a, 0x14f3: 0x209f, 0x14f4: 0x0b99, 0x14f5: 0x20a4, - 0x14f6: 0x1699, 0x14f7: 0x20a9, 0x14f8: 0x16a5, 0x14f9: 0x16b1, 0x14fa: 0x16b9, 0x14fb: 0x20ae, - 0x14fc: 0x20b3, 0x14fd: 0x16cd, 0x14fe: 0x20b8, 0x14ff: 0x16d5, - // Block 0x54, offset 0x1500 - 0x1500: 0x1fc8, 0x1501: 0x0b9d, 0x1502: 0x16ed, 0x1503: 0x16f1, 0x1504: 0x0ba5, 0x1505: 0x16f5, - 0x1506: 0x0f71, 0x1507: 0x20bd, 0x1508: 0x20c2, 0x1509: 0x1fcd, 0x150a: 0x1fd2, 0x150b: 0x1715, - 0x150c: 0x1719, 0x150d: 0x1931, 0x150e: 0x0ba9, 0x150f: 0x1745, 0x1510: 0x1741, 0x1511: 0x1749, - 0x1512: 0x0d7d, 0x1513: 0x174d, 0x1514: 0x1751, 0x1515: 0x1755, 0x1516: 0x175d, 0x1517: 0x20c7, - 0x1518: 0x1759, 0x1519: 0x1761, 0x151a: 0x1775, 0x151b: 0x1779, 0x151c: 0x1765, 0x151d: 0x177d, - 0x151e: 0x1791, 0x151f: 0x17a5, 0x1520: 0x1771, 0x1521: 0x1785, 0x1522: 0x1789, 0x1523: 0x178d, - 0x1524: 0x20cc, 0x1525: 0x20d6, 0x1526: 0x20d1, 0x1527: 0x0bad, 0x1528: 0x17ad, 0x1529: 0x17b1, - 0x152a: 0x17b9, 0x152b: 0x20ea, 0x152c: 0x17bd, 0x152d: 0x20db, 0x152e: 0x0bb1, 0x152f: 0x0bb5, - 0x1530: 0x20e0, 0x1531: 0x20e5, 0x1532: 0x0bb9, 0x1533: 0x17dd, 0x1534: 0x17e1, 0x1535: 0x17e5, - 0x1536: 0x17e9, 0x1537: 0x17f5, 0x1538: 0x17f1, 0x1539: 0x17fd, 0x153a: 0x17f9, 0x153b: 0x1809, - 0x153c: 0x1801, 0x153d: 0x1805, 0x153e: 0x180d, 0x153f: 0x0bbd, - // Block 0x55, offset 0x1540 - 0x1540: 0x1815, 0x1541: 0x1819, 0x1542: 0x0bc1, 0x1543: 0x1829, 0x1544: 0x182d, 0x1545: 0x20ef, - 0x1546: 0x1839, 0x1547: 0x183d, 0x1548: 0x0bc5, 0x1549: 0x1849, 0x154a: 0x0af9, 0x154b: 0x20f4, - 0x154c: 0x20f9, 0x154d: 0x0bc9, 0x154e: 0x0bcd, 0x154f: 0x1875, 0x1550: 0x188d, 0x1551: 0x18a9, - 0x1552: 0x18b9, 0x1553: 0x20fe, 0x1554: 0x18cd, 0x1555: 0x18d1, 0x1556: 0x18e9, 0x1557: 0x18f5, - 0x1558: 0x2108, 0x1559: 0x1f5a, 0x155a: 0x1901, 0x155b: 0x18fd, 0x155c: 0x1909, 0x155d: 0x1f5f, - 0x155e: 0x1915, 0x155f: 0x1921, 0x1560: 0x210d, 0x1561: 0x2112, 0x1562: 0x1961, 0x1563: 0x1969, - 0x1564: 0x1971, 0x1565: 0x2117, 0x1566: 0x1975, 0x1567: 0x199d, 0x1568: 0x19a9, 0x1569: 0x19ad, - 0x156a: 0x19a5, 0x156b: 0x19b9, 0x156c: 0x19bd, 0x156d: 0x211c, 0x156e: 0x19c9, 0x156f: 0x0bd1, - 0x1570: 0x19d1, 0x1571: 0x2121, 0x1572: 0x0bd5, 0x1573: 0x1a05, 0x1574: 0x1001, 0x1575: 0x1a1d, - 0x1576: 0x2126, 0x1577: 0x2130, 0x1578: 0x0bd9, 0x1579: 0x0bdd, 0x157a: 0x1a45, 0x157b: 0x2135, - 0x157c: 0x0be1, 0x157d: 0x213a, 0x157e: 0x1a5d, 0x157f: 0x1a5d, - // Block 0x56, offset 0x1580 - 0x1580: 0x1a65, 0x1581: 0x213f, 0x1582: 0x1a7d, 0x1583: 0x0be5, 0x1584: 0x1a8d, 0x1585: 0x1a99, - 0x1586: 0x1aa1, 0x1587: 0x1aa9, 0x1588: 0x0be9, 0x1589: 0x2144, 0x158a: 0x1abd, 0x158b: 0x1ad9, - 0x158c: 0x1ae5, 0x158d: 0x0bed, 0x158e: 0x0bf1, 0x158f: 0x1ae9, 0x1590: 0x2149, 0x1591: 0x0bf5, - 0x1592: 0x214e, 0x1593: 0x2153, 0x1594: 0x2158, 0x1595: 0x1b0d, 0x1596: 0x0bf9, 0x1597: 0x1b21, - 0x1598: 0x1b29, 0x1599: 0x1b2d, 0x159a: 0x1b35, 0x159b: 0x1b3d, 0x159c: 0x1b45, 0x159d: 0x2162, -} - -// nfkcSparseOffset: 123 entries, 246 bytes -var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x7e, 0x85, 0x88, 0x90, 0x94, 0x98, 0x9a, 0x9c, 0xa5, 0xa9, 0xb0, 0xb5, 0xb8, 0xc2, 0xc4, 0xcb, 0xd3, 0xd7, 0xd9, 0xdc, 0xe0, 0xe6, 0xf7, 0x103, 0x105, 0x10b, 0x10d, 0x10f, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11c, 0x11f, 0x121, 0x124, 0x127, 0x12b, 0x134, 0x136, 0x139, 0x13b, 0x144, 0x14f, 0x15e, 0x16c, 0x17a, 0x18a, 0x198, 0x19f, 0x1a5, 0x1b4, 0x1b8, 0x1ba, 0x1be, 0x1c0, 0x1c3, 0x1c5, 0x1c8, 0x1ca, 0x1cd, 0x1cf, 0x1d1, 0x1d3, 0x1df, 0x1e8, 0x1ef, 0x1fc, 0x1ff, 0x201, 0x203, 0x205, 0x208, 0x20a, 0x20c, 0x20e, 0x210, 0x216, 0x218, 0x21a, 0x21c, 0x21e, 0x220, 0x22f, 0x231, 0x237, 0x23f, 0x24c, 0x256, 0x258, 0x25a, 0x25e, 0x263, 0x26f, 0x274, 0x27d, 0x283, 0x288, 0x28c, 0x291, 0x295, 0x2a5, 0x2b3, 0x2c1, 0x2cf, 0x2d7, 0x2d9} - -// nfkcSparseValues: 739 entries, 2956 bytes -var nfkcSparseValues = [739]valueRange{ - // Block 0x0, offset 0x1 - {value: 0x0002, lo: 0x0d}, - {value: 0x00cf, lo: 0xa0, hi: 0xa0}, - {value: 0x4164, lo: 0xa8, hi: 0xa8}, - {value: 0x0151, lo: 0xaa, hi: 0xaa}, - {value: 0x4150, lo: 0xaf, hi: 0xaf}, - {value: 0x00f3, lo: 0xb2, hi: 0xb3}, - {value: 0x4146, lo: 0xb4, hi: 0xb4}, - {value: 0x0499, lo: 0xb5, hi: 0xb5}, - {value: 0x417d, lo: 0xb8, hi: 0xb8}, - {value: 0x00f1, lo: 0xb9, hi: 0xb9}, - {value: 0x016d, lo: 0xba, hi: 0xba}, - {value: 0x232f, lo: 0xbc, hi: 0xbc}, - {value: 0x2323, lo: 0xbd, hi: 0xbd}, - {value: 0x23c5, lo: 0xbe, hi: 0xbe}, - // Block 0x1, offset 0x2 - {value: 0x0091, lo: 0x03}, - {value: 0x4699, lo: 0xa0, hi: 0xa1}, - {value: 0x46cb, lo: 0xaf, hi: 0xb0}, - {value: 0x8800, lo: 0xb7, hi: 0xb7}, - // Block 0x2, offset 0x3 - {value: 0x0003, lo: 0x08}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x015f, lo: 0xb0, hi: 0xb0}, - {value: 0x03d9, lo: 0xb1, hi: 0xb1}, - {value: 0x0163, lo: 0xb2, hi: 0xb2}, - {value: 0x0173, lo: 0xb3, hi: 0xb3}, - {value: 0x0400, lo: 0xb4, hi: 0xb6}, - {value: 0x017d, lo: 0xb7, hi: 0xb7}, - {value: 0x0181, lo: 0xb8, hi: 0xb8}, - // Block 0x3, offset 0x4 - {value: 0x000a, lo: 0x09}, - {value: 0x415a, lo: 0x98, hi: 0x98}, - {value: 0x415f, lo: 0x99, hi: 0x9a}, - {value: 0x4182, lo: 0x9b, hi: 0x9b}, - {value: 0x414b, lo: 0x9c, hi: 0x9c}, - {value: 0x416e, lo: 0x9d, hi: 0x9d}, - {value: 0x03d3, lo: 0xa0, hi: 0xa0}, - {value: 0x0167, lo: 0xa1, hi: 0xa1}, - {value: 0x0175, lo: 0xa2, hi: 0xa3}, - {value: 0x0424, lo: 0xa4, hi: 0xa4}, - // Block 0x4, offset 0x5 - {value: 0x0000, lo: 0x0f}, - {value: 0x8800, lo: 0x83, hi: 0x83}, - {value: 0x8800, lo: 0x87, hi: 0x87}, - {value: 0x8800, lo: 0x8b, hi: 0x8b}, - {value: 0x8800, lo: 0x8d, hi: 0x8d}, - {value: 0x368a, lo: 0x90, hi: 0x90}, - {value: 0x3696, lo: 0x91, hi: 0x91}, - {value: 0x3684, lo: 0x93, hi: 0x93}, - {value: 0x8800, lo: 0x96, hi: 0x96}, - {value: 0x36fc, lo: 0x97, hi: 0x97}, - {value: 0x36c6, lo: 0x9c, hi: 0x9c}, - {value: 0x36ae, lo: 0x9d, hi: 0x9d}, - {value: 0x36d8, lo: 0x9e, hi: 0x9e}, - {value: 0x8800, lo: 0xb4, hi: 0xb5}, - {value: 0x3702, lo: 0xb6, hi: 0xb6}, - {value: 0x3708, lo: 0xb7, hi: 0xb7}, - // Block 0x5, offset 0x6 - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0x83, hi: 0x87}, - // Block 0x6, offset 0x7 - {value: 0x0001, lo: 0x04}, - {value: 0x8018, lo: 0x81, hi: 0x82}, - {value: 0x80e6, lo: 0x84, hi: 0x84}, - {value: 0x80dc, lo: 0x85, hi: 0x85}, - {value: 0x8012, lo: 0x87, hi: 0x87}, - // Block 0x7, offset 0x8 - {value: 0x0000, lo: 0x0a}, - {value: 0x80e6, lo: 0x90, hi: 0x97}, - {value: 0x801e, lo: 0x98, hi: 0x98}, - {value: 0x801f, lo: 0x99, hi: 0x99}, - {value: 0x8020, lo: 0x9a, hi: 0x9a}, - {value: 0x3726, lo: 0xa2, hi: 0xa2}, - {value: 0x372c, lo: 0xa3, hi: 0xa3}, - {value: 0x3738, lo: 0xa4, hi: 0xa4}, - {value: 0x3732, lo: 0xa5, hi: 0xa5}, - {value: 0x373e, lo: 0xa6, hi: 0xa6}, - {value: 0x8800, lo: 0xa7, hi: 0xa7}, - // Block 0x8, offset 0x9 - {value: 0x0000, lo: 0x0e}, - {value: 0x3750, lo: 0x80, hi: 0x80}, - {value: 0x8800, lo: 0x81, hi: 0x81}, - {value: 0x3744, lo: 0x82, hi: 0x82}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x374a, lo: 0x93, hi: 0x93}, - {value: 0x8800, lo: 0x95, hi: 0x95}, - {value: 0x80e6, lo: 0x96, hi: 0x9c}, - {value: 0x80e6, lo: 0x9f, hi: 0xa2}, - {value: 0x80dc, lo: 0xa3, hi: 0xa3}, - {value: 0x80e6, lo: 0xa4, hi: 0xa4}, - {value: 0x80e6, lo: 0xa7, hi: 0xa8}, - {value: 0x80dc, lo: 0xaa, hi: 0xaa}, - {value: 0x80e6, lo: 0xab, hi: 0xac}, - {value: 0x80dc, lo: 0xad, hi: 0xad}, - // Block 0x9, offset 0xa - {value: 0x0000, lo: 0x0c}, - {value: 0x8024, lo: 0x91, hi: 0x91}, - {value: 0x80e6, lo: 0xb0, hi: 0xb0}, - {value: 0x80dc, lo: 0xb1, hi: 0xb1}, - {value: 0x80e6, lo: 0xb2, hi: 0xb3}, - {value: 0x80dc, lo: 0xb4, hi: 0xb4}, - {value: 0x80e6, lo: 0xb5, hi: 0xb6}, - {value: 0x80dc, lo: 0xb7, hi: 0xb9}, - {value: 0x80e6, lo: 0xba, hi: 0xba}, - {value: 0x80dc, lo: 0xbb, hi: 0xbc}, - {value: 0x80e6, lo: 0xbd, hi: 0xbd}, - {value: 0x80dc, lo: 0xbe, hi: 0xbe}, - {value: 0x80e6, lo: 0xbf, hi: 0xbf}, - // Block 0xa, offset 0xb - {value: 0x000a, lo: 0x07}, - {value: 0x80e6, lo: 0x80, hi: 0x80}, - {value: 0x80e6, lo: 0x81, hi: 0x81}, - {value: 0x80dc, lo: 0x82, hi: 0x83}, - {value: 0x80dc, lo: 0x84, hi: 0x85}, - {value: 0x80dc, lo: 0x86, hi: 0x87}, - {value: 0x80dc, lo: 0x88, hi: 0x89}, - {value: 0x80e6, lo: 0x8a, hi: 0x8a}, - // Block 0xb, offset 0xc - {value: 0x0000, lo: 0x03}, - {value: 0x80e6, lo: 0xab, hi: 0xb1}, - {value: 0x80dc, lo: 0xb2, hi: 0xb2}, - {value: 0x80e6, lo: 0xb3, hi: 0xb3}, - // Block 0xc, offset 0xd - {value: 0x0000, lo: 0x04}, - {value: 0x80e6, lo: 0x96, hi: 0x99}, - {value: 0x80e6, lo: 0x9b, hi: 0xa3}, - {value: 0x80e6, lo: 0xa5, hi: 0xa7}, - {value: 0x80e6, lo: 0xa9, hi: 0xad}, - // Block 0xd, offset 0xe - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0x99, hi: 0x9b}, - // Block 0xe, offset 0xf - {value: 0x0000, lo: 0x07}, - {value: 0x8800, lo: 0xa8, hi: 0xa8}, - {value: 0x3dbd, lo: 0xa9, hi: 0xa9}, - {value: 0x8800, lo: 0xb0, hi: 0xb0}, - {value: 0x3dc5, lo: 0xb1, hi: 0xb1}, - {value: 0x8800, lo: 0xb3, hi: 0xb3}, - {value: 0x3dcd, lo: 0xb4, hi: 0xb4}, - {value: 0x8607, lo: 0xbc, hi: 0xbc}, - // Block 0xf, offset 0x10 - {value: 0x0008, lo: 0x06}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x80e6, lo: 0x91, hi: 0x91}, - {value: 0x80dc, lo: 0x92, hi: 0x92}, - {value: 0x80e6, lo: 0x93, hi: 0x93}, - {value: 0x80e6, lo: 0x94, hi: 0x94}, - {value: 0x4432, lo: 0x98, hi: 0x9f}, - // Block 0x10, offset 0x11 - {value: 0x0000, lo: 0x02}, - {value: 0x8007, lo: 0xbc, hi: 0xbc}, - {value: 0x8600, lo: 0xbe, hi: 0xbe}, - // Block 0x11, offset 0x12 - {value: 0x0007, lo: 0x07}, - {value: 0x8800, lo: 0x87, hi: 0x87}, - {value: 0x0001, lo: 0x8b, hi: 0x8c}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x97, hi: 0x97}, - {value: 0x4472, lo: 0x9c, hi: 0x9c}, - {value: 0x447a, lo: 0x9d, hi: 0x9d}, - {value: 0x4482, lo: 0x9f, hi: 0x9f}, - // Block 0x12, offset 0x13 - {value: 0x0000, lo: 0x03}, - {value: 0x44aa, lo: 0xb3, hi: 0xb3}, - {value: 0x44b2, lo: 0xb6, hi: 0xb6}, - {value: 0x8007, lo: 0xbc, hi: 0xbc}, - // Block 0x13, offset 0x14 - {value: 0x0008, lo: 0x03}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x448a, lo: 0x99, hi: 0x9b}, - {value: 0x44a2, lo: 0x9e, hi: 0x9e}, - // Block 0x14, offset 0x15 - {value: 0x0000, lo: 0x01}, - {value: 0x8007, lo: 0xbc, hi: 0xbc}, - // Block 0x15, offset 0x16 - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - // Block 0x16, offset 0x17 - {value: 0x0000, lo: 0x08}, - {value: 0x8800, lo: 0x87, hi: 0x87}, - {value: 0x0016, lo: 0x88, hi: 0x88}, - {value: 0x000f, lo: 0x8b, hi: 0x8b}, - {value: 0x001d, lo: 0x8c, hi: 0x8c}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x96, hi: 0x97}, - {value: 0x44ba, lo: 0x9c, hi: 0x9c}, - {value: 0x44c2, lo: 0x9d, hi: 0x9d}, - // Block 0x17, offset 0x18 - {value: 0x0000, lo: 0x03}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x0024, lo: 0x94, hi: 0x94}, - {value: 0x8600, lo: 0xbe, hi: 0xbe}, - // Block 0x18, offset 0x19 - {value: 0x0000, lo: 0x06}, - {value: 0x8800, lo: 0x86, hi: 0x87}, - {value: 0x002b, lo: 0x8a, hi: 0x8a}, - {value: 0x0039, lo: 0x8b, hi: 0x8b}, - {value: 0x0032, lo: 0x8c, hi: 0x8c}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x97, hi: 0x97}, - // Block 0x19, offset 0x1a - {value: 0x0607, lo: 0x04}, - {value: 0x8800, lo: 0x86, hi: 0x86}, - {value: 0x3dd5, lo: 0x88, hi: 0x88}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8054, lo: 0x95, hi: 0x96}, - // Block 0x1a, offset 0x1b - {value: 0x0000, lo: 0x02}, - {value: 0x8007, lo: 0xbc, hi: 0xbc}, - {value: 0x8800, lo: 0xbf, hi: 0xbf}, - // Block 0x1b, offset 0x1c - {value: 0x0000, lo: 0x09}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x8600, lo: 0x82, hi: 0x82}, - {value: 0x8800, lo: 0x86, hi: 0x86}, - {value: 0x0047, lo: 0x87, hi: 0x87}, - {value: 0x004e, lo: 0x88, hi: 0x88}, - {value: 0x2e37, lo: 0x8a, hi: 0x8a}, - {value: 0x00c5, lo: 0x8b, hi: 0x8b}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x95, hi: 0x96}, - // Block 0x1c, offset 0x1d - {value: 0x0000, lo: 0x01}, - {value: 0x8600, lo: 0xbe, hi: 0xbe}, - // Block 0x1d, offset 0x1e - {value: 0x0000, lo: 0x06}, - {value: 0x8800, lo: 0x86, hi: 0x87}, - {value: 0x0055, lo: 0x8a, hi: 0x8a}, - {value: 0x0063, lo: 0x8b, hi: 0x8b}, - {value: 0x005c, lo: 0x8c, hi: 0x8c}, - {value: 0x8009, lo: 0x8d, hi: 0x8d}, - {value: 0x8600, lo: 0x97, hi: 0x97}, - // Block 0x1e, offset 0x1f - {value: 0x12fd, lo: 0x07}, - {value: 0x8609, lo: 0x8a, hi: 0x8a}, - {value: 0x8600, lo: 0x8f, hi: 0x8f}, - {value: 0x8800, lo: 0x99, hi: 0x99}, - {value: 0x3ddd, lo: 0x9a, hi: 0x9a}, - {value: 0x2e3e, lo: 0x9c, hi: 0x9d}, - {value: 0x006a, lo: 0x9e, hi: 0x9e}, - {value: 0x8600, lo: 0x9f, hi: 0x9f}, - // Block 0x1f, offset 0x20 - {value: 0x0000, lo: 0x03}, - {value: 0x2734, lo: 0xb3, hi: 0xb3}, - {value: 0x8067, lo: 0xb8, hi: 0xb9}, - {value: 0x8009, lo: 0xba, hi: 0xba}, - // Block 0x20, offset 0x21 - {value: 0x0000, lo: 0x01}, - {value: 0x806b, lo: 0x88, hi: 0x8b}, - // Block 0x21, offset 0x22 - {value: 0x0000, lo: 0x02}, - {value: 0x2749, lo: 0xb3, hi: 0xb3}, - {value: 0x8076, lo: 0xb8, hi: 0xb9}, - // Block 0x22, offset 0x23 - {value: 0x0000, lo: 0x03}, - {value: 0x807a, lo: 0x88, hi: 0x8b}, - {value: 0x273b, lo: 0x9c, hi: 0x9c}, - {value: 0x2742, lo: 0x9d, hi: 0x9d}, - // Block 0x23, offset 0x24 - {value: 0x0000, lo: 0x05}, - {value: 0x07d1, lo: 0x8c, hi: 0x8c}, - {value: 0x80dc, lo: 0x98, hi: 0x99}, - {value: 0x80dc, lo: 0xb5, hi: 0xb5}, - {value: 0x80dc, lo: 0xb7, hi: 0xb7}, - {value: 0x80d8, lo: 0xb9, hi: 0xb9}, - // Block 0x24, offset 0x25 - {value: 0x0000, lo: 0x10}, - {value: 0x2757, lo: 0x83, hi: 0x83}, - {value: 0x275e, lo: 0x8d, hi: 0x8d}, - {value: 0x2765, lo: 0x92, hi: 0x92}, - {value: 0x276c, lo: 0x97, hi: 0x97}, - {value: 0x2773, lo: 0x9c, hi: 0x9c}, - {value: 0x2750, lo: 0xa9, hi: 0xa9}, - {value: 0x8081, lo: 0xb1, hi: 0xb1}, - {value: 0x8082, lo: 0xb2, hi: 0xb2}, - {value: 0x4987, lo: 0xb3, hi: 0xb3}, - {value: 0x8084, lo: 0xb4, hi: 0xb4}, - {value: 0x4990, lo: 0xb5, hi: 0xb5}, - {value: 0x44ca, lo: 0xb6, hi: 0xb6}, - {value: 0x450a, lo: 0xb7, hi: 0xb7}, - {value: 0x44d2, lo: 0xb8, hi: 0xb8}, - {value: 0x4515, lo: 0xb9, hi: 0xb9}, - {value: 0x8082, lo: 0xba, hi: 0xbd}, - // Block 0x25, offset 0x26 - {value: 0x0000, lo: 0x0b}, - {value: 0x8082, lo: 0x80, hi: 0x80}, - {value: 0x4999, lo: 0x81, hi: 0x81}, - {value: 0x80e6, lo: 0x82, hi: 0x83}, - {value: 0x8009, lo: 0x84, hi: 0x84}, - {value: 0x80e6, lo: 0x86, hi: 0x87}, - {value: 0x2781, lo: 0x93, hi: 0x93}, - {value: 0x2788, lo: 0x9d, hi: 0x9d}, - {value: 0x278f, lo: 0xa2, hi: 0xa2}, - {value: 0x2796, lo: 0xa7, hi: 0xa7}, - {value: 0x279d, lo: 0xac, hi: 0xac}, - {value: 0x277a, lo: 0xb9, hi: 0xb9}, - // Block 0x26, offset 0x27 - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0x86, hi: 0x86}, - // Block 0x27, offset 0x28 - {value: 0x0000, lo: 0x05}, - {value: 0x8800, lo: 0xa5, hi: 0xa5}, - {value: 0x0071, lo: 0xa6, hi: 0xa6}, - {value: 0x8600, lo: 0xae, hi: 0xae}, - {value: 0x8007, lo: 0xb7, hi: 0xb7}, - {value: 0x8009, lo: 0xb9, hi: 0xba}, - // Block 0x28, offset 0x29 - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0x8d, hi: 0x8d}, - // Block 0x29, offset 0x2a - {value: 0x0000, lo: 0x01}, - {value: 0x07d5, lo: 0xbc, hi: 0xbc}, - // Block 0x2a, offset 0x2b - {value: 0x0000, lo: 0x01}, - {value: 0x8800, lo: 0x80, hi: 0x92}, - // Block 0x2b, offset 0x2c - {value: 0x0000, lo: 0x01}, - {value: 0x8e00, lo: 0xa1, hi: 0xb5}, - // Block 0x2c, offset 0x2d - {value: 0x0000, lo: 0x01}, - {value: 0x8600, lo: 0xa8, hi: 0xbf}, - // Block 0x2d, offset 0x2e - {value: 0x0000, lo: 0x01}, - {value: 0x8600, lo: 0x80, hi: 0x82}, - // Block 0x2e, offset 0x2f - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0x9d, hi: 0x9f}, - // Block 0x2f, offset 0x30 - {value: 0x0000, lo: 0x02}, - {value: 0x8009, lo: 0x94, hi: 0x94}, - {value: 0x8009, lo: 0xb4, hi: 0xb4}, - // Block 0x30, offset 0x31 - {value: 0x0000, lo: 0x02}, - {value: 0x8009, lo: 0x92, hi: 0x92}, - {value: 0x80e6, lo: 0x9d, hi: 0x9d}, - // Block 0x31, offset 0x32 - {value: 0x0000, lo: 0x01}, - {value: 0x80e4, lo: 0xa9, hi: 0xa9}, - // Block 0x32, offset 0x33 - {value: 0x0008, lo: 0x02}, - {value: 0x80de, lo: 0xb9, hi: 0xba}, - {value: 0x80dc, lo: 0xbb, hi: 0xbb}, - // Block 0x33, offset 0x34 - {value: 0x0000, lo: 0x02}, - {value: 0x80e6, lo: 0x97, hi: 0x97}, - {value: 0x80dc, lo: 0x98, hi: 0x98}, - // Block 0x34, offset 0x35 - {value: 0x0000, lo: 0x03}, - {value: 0x8009, lo: 0xa0, hi: 0xa0}, - {value: 0x80e6, lo: 0xb5, hi: 0xbc}, - {value: 0x80dc, lo: 0xbf, hi: 0xbf}, - // Block 0x35, offset 0x36 - {value: 0x0000, lo: 0x08}, - {value: 0x00b0, lo: 0x80, hi: 0x80}, - {value: 0x00b7, lo: 0x81, hi: 0x81}, - {value: 0x8800, lo: 0x82, hi: 0x82}, - {value: 0x00be, lo: 0x83, hi: 0x83}, - {value: 0x8009, lo: 0x84, hi: 0x84}, - {value: 0x80e6, lo: 0xab, hi: 0xab}, - {value: 0x80dc, lo: 0xac, hi: 0xac}, - {value: 0x80e6, lo: 0xad, hi: 0xb3}, - // Block 0x36, offset 0x37 - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0xaa, hi: 0xaa}, - // Block 0x37, offset 0x38 - {value: 0x0000, lo: 0x02}, - {value: 0x8007, lo: 0xa6, hi: 0xa6}, - {value: 0x8009, lo: 0xb2, hi: 0xb3}, - // Block 0x38, offset 0x39 - {value: 0x0000, lo: 0x01}, - {value: 0x8007, lo: 0xb7, hi: 0xb7}, - // Block 0x39, offset 0x3a - {value: 0x0000, lo: 0x08}, - {value: 0x80e6, lo: 0x90, hi: 0x92}, - {value: 0x8001, lo: 0x94, hi: 0x94}, - {value: 0x80dc, lo: 0x95, hi: 0x99}, - {value: 0x80e6, lo: 0x9a, hi: 0x9b}, - {value: 0x80dc, lo: 0x9c, hi: 0x9f}, - {value: 0x80e6, lo: 0xa0, hi: 0xa0}, - {value: 0x8001, lo: 0xa2, hi: 0xa8}, - {value: 0x80dc, lo: 0xad, hi: 0xad}, - // Block 0x3a, offset 0x3b - {value: 0x0002, lo: 0x0a}, - {value: 0x0111, lo: 0xac, hi: 0xac}, - {value: 0x0397, lo: 0xad, hi: 0xad}, - {value: 0x0113, lo: 0xae, hi: 0xae}, - {value: 0x0117, lo: 0xb0, hi: 0xb1}, - {value: 0x03a6, lo: 0xb2, hi: 0xb2}, - {value: 0x011d, lo: 0xb3, hi: 0xba}, - {value: 0x012d, lo: 0xbc, hi: 0xbc}, - {value: 0x03af, lo: 0xbd, hi: 0xbd}, - {value: 0x012f, lo: 0xbe, hi: 0xbe}, - {value: 0x0133, lo: 0xbf, hi: 0xbf}, - // Block 0x3b, offset 0x3c - {value: 0x0000, lo: 0x0e}, - {value: 0x80e6, lo: 0x80, hi: 0x81}, - {value: 0x80dc, lo: 0x82, hi: 0x82}, - {value: 0x80e6, lo: 0x83, hi: 0x89}, - {value: 0x80dc, lo: 0x8a, hi: 0x8a}, - {value: 0x80e6, lo: 0x8b, hi: 0x8c}, - {value: 0x80ea, lo: 0x8d, hi: 0x8d}, - {value: 0x80d6, lo: 0x8e, hi: 0x8e}, - {value: 0x80dc, lo: 0x8f, hi: 0x8f}, - {value: 0x80ca, lo: 0x90, hi: 0x90}, - {value: 0x80e6, lo: 0x91, hi: 0xa6}, - {value: 0x80e9, lo: 0xbc, hi: 0xbc}, - {value: 0x80dc, lo: 0xbd, hi: 0xbd}, - {value: 0x80e6, lo: 0xbe, hi: 0xbe}, - {value: 0x80dc, lo: 0xbf, hi: 0xbf}, - // Block 0x3c, offset 0x3d - {value: 0x0000, lo: 0x0d}, - {value: 0x00cf, lo: 0x80, hi: 0x8a}, - {value: 0x0979, lo: 0x91, hi: 0x91}, - {value: 0x4187, lo: 0x97, hi: 0x97}, - {value: 0x00eb, lo: 0xa4, hi: 0xa4}, - {value: 0x0193, lo: 0xa5, hi: 0xa5}, - {value: 0x06ad, lo: 0xa6, hi: 0xa6}, - {value: 0x00cf, lo: 0xaf, hi: 0xaf}, - {value: 0x280d, lo: 0xb3, hi: 0xb3}, - {value: 0x297a, lo: 0xb4, hi: 0xb4}, - {value: 0x2814, lo: 0xb6, hi: 0xb6}, - {value: 0x2984, lo: 0xb7, hi: 0xb7}, - {value: 0x018d, lo: 0xbc, hi: 0xbc}, - {value: 0x4155, lo: 0xbe, hi: 0xbe}, - // Block 0x3d, offset 0x3e - {value: 0x0002, lo: 0x0d}, - {value: 0x0253, lo: 0x87, hi: 0x87}, - {value: 0x0250, lo: 0x88, hi: 0x88}, - {value: 0x0190, lo: 0x89, hi: 0x89}, - {value: 0x2b17, lo: 0x97, hi: 0x97}, - {value: 0x00cf, lo: 0x9f, hi: 0x9f}, - {value: 0x00ef, lo: 0xb0, hi: 0xb0}, - {value: 0x0161, lo: 0xb1, hi: 0xb1}, - {value: 0x00f7, lo: 0xb4, hi: 0xb9}, - {value: 0x00e5, lo: 0xba, hi: 0xba}, - {value: 0x09a5, lo: 0xbb, hi: 0xbb}, - {value: 0x0109, lo: 0xbc, hi: 0xbc}, - {value: 0x00df, lo: 0xbd, hi: 0xbe}, - {value: 0x016b, lo: 0xbf, hi: 0xbf}, - // Block 0x3e, offset 0x3f - {value: 0x0002, lo: 0x0f}, - {value: 0x00ef, lo: 0x80, hi: 0x89}, - {value: 0x00e5, lo: 0x8a, hi: 0x8a}, - {value: 0x09a5, lo: 0x8b, hi: 0x8b}, - {value: 0x0109, lo: 0x8c, hi: 0x8c}, - {value: 0x00df, lo: 0x8d, hi: 0x8e}, - {value: 0x0151, lo: 0x90, hi: 0x90}, - {value: 0x0159, lo: 0x91, hi: 0x91}, - {value: 0x016d, lo: 0x92, hi: 0x92}, - {value: 0x017f, lo: 0x93, hi: 0x93}, - {value: 0x03c4, lo: 0x94, hi: 0x94}, - {value: 0x015f, lo: 0x95, hi: 0x95}, - {value: 0x0165, lo: 0x96, hi: 0x99}, - {value: 0x016f, lo: 0x9a, hi: 0x9a}, - {value: 0x0175, lo: 0x9b, hi: 0x9c}, - {value: 0x02b3, lo: 0xa8, hi: 0xa8}, - // Block 0x3f, offset 0x40 - {value: 0x0000, lo: 0x0d}, - {value: 0x80e6, lo: 0x90, hi: 0x91}, - {value: 0x8001, lo: 0x92, hi: 0x93}, - {value: 0x80e6, lo: 0x94, hi: 0x97}, - {value: 0x8001, lo: 0x98, hi: 0x9a}, - {value: 0x80e6, lo: 0x9b, hi: 0x9c}, - {value: 0x80e6, lo: 0xa1, hi: 0xa1}, - {value: 0x8001, lo: 0xa5, hi: 0xa6}, - {value: 0x80e6, lo: 0xa7, hi: 0xa7}, - {value: 0x80dc, lo: 0xa8, hi: 0xa8}, - {value: 0x80e6, lo: 0xa9, hi: 0xa9}, - {value: 0x8001, lo: 0xaa, hi: 0xab}, - {value: 0x80dc, lo: 0xac, hi: 0xaf}, - {value: 0x80e6, lo: 0xb0, hi: 0xb0}, - // Block 0x40, offset 0x41 - {value: 0x0007, lo: 0x06}, - {value: 0x2293, lo: 0x89, hi: 0x89}, - {value: 0x8800, lo: 0x90, hi: 0x90}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x8800, lo: 0x94, hi: 0x94}, - {value: 0x3a9e, lo: 0x9a, hi: 0x9b}, - {value: 0x3aac, lo: 0xae, hi: 0xae}, - // Block 0x41, offset 0x42 - {value: 0x000e, lo: 0x05}, - {value: 0x3ab3, lo: 0x8d, hi: 0x8e}, - {value: 0x3aba, lo: 0x8f, hi: 0x8f}, - {value: 0x8800, lo: 0x90, hi: 0x90}, - {value: 0x8800, lo: 0x92, hi: 0x92}, - {value: 0x8800, lo: 0x94, hi: 0x94}, - // Block 0x42, offset 0x43 - {value: 0x0173, lo: 0x0e}, - {value: 0x8800, lo: 0x83, hi: 0x83}, - {value: 0x3ac8, lo: 0x84, hi: 0x84}, - {value: 0x8800, lo: 0x88, hi: 0x88}, - {value: 0x3acf, lo: 0x89, hi: 0x89}, - {value: 0x8800, lo: 0x8b, hi: 0x8b}, - {value: 0x3ad6, lo: 0x8c, hi: 0x8c}, - {value: 0x8800, lo: 0xa3, hi: 0xa3}, - {value: 0x3add, lo: 0xa4, hi: 0xa4}, - {value: 0x8800, lo: 0xa5, hi: 0xa5}, - {value: 0x3ae4, lo: 0xa6, hi: 0xa6}, - {value: 0x281b, lo: 0xac, hi: 0xad}, - {value: 0x2822, lo: 0xaf, hi: 0xaf}, - {value: 0x2998, lo: 0xb0, hi: 0xb0}, - {value: 0x8800, lo: 0xbc, hi: 0xbc}, - // Block 0x43, offset 0x44 - {value: 0x0007, lo: 0x03}, - {value: 0x3b4d, lo: 0xa0, hi: 0xa1}, - {value: 0x3b77, lo: 0xa2, hi: 0xa3}, - {value: 0x3ba1, lo: 0xaa, hi: 0xad}, - // Block 0x44, offset 0x45 - {value: 0x0004, lo: 0x01}, - {value: 0x09c9, lo: 0xa9, hi: 0xaa}, - // Block 0x45, offset 0x46 - {value: 0x0002, lo: 0x03}, - {value: 0x0125, lo: 0x80, hi: 0x8f}, - {value: 0x0151, lo: 0x90, hi: 0xa9}, - {value: 0x00ef, lo: 0xaa, hi: 0xaa}, - // Block 0x46, offset 0x47 - {value: 0x0000, lo: 0x01}, - {value: 0x2b24, lo: 0x8c, hi: 0x8c}, - // Block 0x47, offset 0x48 - {value: 0x0494, lo: 0x02}, - {value: 0x06dd, lo: 0xb4, hi: 0xb4}, - {value: 0x024d, lo: 0xb5, hi: 0xb6}, - // Block 0x48, offset 0x49 - {value: 0x0000, lo: 0x01}, - {value: 0x43db, lo: 0x9c, hi: 0x9c}, - // Block 0x49, offset 0x4a - {value: 0x0000, lo: 0x02}, - {value: 0x0163, lo: 0xbc, hi: 0xbc}, - {value: 0x013b, lo: 0xbd, hi: 0xbd}, - // Block 0x4a, offset 0x4b - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0xaf, hi: 0xb1}, - // Block 0x4b, offset 0x4c - {value: 0x0000, lo: 0x02}, - {value: 0x09bd, lo: 0xaf, hi: 0xaf}, - {value: 0x8009, lo: 0xbf, hi: 0xbf}, - // Block 0x4c, offset 0x4d - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0xa0, hi: 0xbf}, - // Block 0x4d, offset 0x4e - {value: 0x0000, lo: 0x01}, - {value: 0x1301, lo: 0x9f, hi: 0x9f}, - // Block 0x4e, offset 0x4f - {value: 0x0000, lo: 0x01}, - {value: 0x1b61, lo: 0xb3, hi: 0xb3}, - // Block 0x4f, offset 0x50 - {value: 0x0004, lo: 0x0b}, - {value: 0x1ac9, lo: 0x80, hi: 0x82}, - {value: 0x1ae1, lo: 0x83, hi: 0x83}, - {value: 0x1af9, lo: 0x84, hi: 0x85}, - {value: 0x1b09, lo: 0x86, hi: 0x89}, - {value: 0x1b1d, lo: 0x8a, hi: 0x8c}, - {value: 0x1b31, lo: 0x8d, hi: 0x8d}, - {value: 0x1b39, lo: 0x8e, hi: 0x8e}, - {value: 0x1b41, lo: 0x8f, hi: 0x90}, - {value: 0x1b4d, lo: 0x91, hi: 0x93}, - {value: 0x1b5d, lo: 0x94, hi: 0x94}, - {value: 0x1b65, lo: 0x95, hi: 0x95}, - // Block 0x50, offset 0x51 - {value: 0x0004, lo: 0x08}, - {value: 0x00cf, lo: 0x80, hi: 0x80}, - {value: 0x80da, lo: 0xaa, hi: 0xaa}, - {value: 0x80e4, lo: 0xab, hi: 0xac}, - {value: 0x80de, lo: 0xad, hi: 0xad}, - {value: 0x80e0, lo: 0xae, hi: 0xae}, - {value: 0x80e0, lo: 0xaf, hi: 0xaf}, - {value: 0x09f1, lo: 0xb6, hi: 0xb6}, - {value: 0x0dc5, lo: 0xb8, hi: 0xba}, - // Block 0x51, offset 0x52 - {value: 0x0004, lo: 0x06}, - {value: 0x07d9, lo: 0xb1, hi: 0xb2}, - {value: 0x0901, lo: 0xb3, hi: 0xb3}, - {value: 0x07e1, lo: 0xb4, hi: 0xb4}, - {value: 0x0905, lo: 0xb5, hi: 0xb6}, - {value: 0x07e5, lo: 0xb7, hi: 0xb9}, - {value: 0x090d, lo: 0xba, hi: 0xbf}, - // Block 0x52, offset 0x53 - {value: 0x0004, lo: 0x0c}, - {value: 0x082d, lo: 0x80, hi: 0x80}, - {value: 0x07f1, lo: 0x81, hi: 0x83}, - {value: 0x0841, lo: 0x84, hi: 0x84}, - {value: 0x07fd, lo: 0x85, hi: 0x8e}, - {value: 0x088d, lo: 0x8f, hi: 0xa3}, - {value: 0x0889, lo: 0xa4, hi: 0xa4}, - {value: 0x0825, lo: 0xa5, hi: 0xa6}, - {value: 0x0925, lo: 0xa7, hi: 0xad}, - {value: 0x0831, lo: 0xae, hi: 0xae}, - {value: 0x0941, lo: 0xaf, hi: 0xb0}, - {value: 0x0835, lo: 0xb1, hi: 0xb3}, - {value: 0x0845, lo: 0xb4, hi: 0xbf}, - // Block 0x53, offset 0x54 - {value: 0x0000, lo: 0x02}, - {value: 0x80e6, lo: 0xaf, hi: 0xaf}, - {value: 0x80e6, lo: 0xbc, hi: 0xbd}, - // Block 0x54, offset 0x55 - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0xb0, hi: 0xb1}, - // Block 0x55, offset 0x56 - {value: 0x0000, lo: 0x01}, - {value: 0x1b69, lo: 0xb0, hi: 0xb0}, - // Block 0x56, offset 0x57 - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0x86, hi: 0x86}, - // Block 0x57, offset 0x58 - {value: 0x0000, lo: 0x02}, - {value: 0x8009, lo: 0x84, hi: 0x84}, - {value: 0x80e6, lo: 0xa0, hi: 0xb1}, - // Block 0x58, offset 0x59 - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0xab, hi: 0xad}, - // Block 0x59, offset 0x5a - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0x93, hi: 0x93}, - // Block 0x5a, offset 0x5b - {value: 0x0000, lo: 0x01}, - {value: 0x8007, lo: 0xb3, hi: 0xb3}, - // Block 0x5b, offset 0x5c - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0x80, hi: 0x80}, - // Block 0x5c, offset 0x5d - {value: 0x0000, lo: 0x05}, - {value: 0x80e6, lo: 0xb0, hi: 0xb0}, - {value: 0x80e6, lo: 0xb2, hi: 0xb3}, - {value: 0x80dc, lo: 0xb4, hi: 0xb4}, - {value: 0x80e6, lo: 0xb7, hi: 0xb8}, - {value: 0x80e6, lo: 0xbe, hi: 0xbf}, - // Block 0x5d, offset 0x5e - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0x81, hi: 0x81}, - // Block 0x5e, offset 0x5f - {value: 0x0000, lo: 0x01}, - {value: 0x8009, lo: 0xad, hi: 0xad}, - // Block 0x5f, offset 0x60 - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0x80, hi: 0xbf}, - // Block 0x60, offset 0x61 - {value: 0x0000, lo: 0x01}, - {value: 0x8100, lo: 0x80, hi: 0xa3}, - // Block 0x61, offset 0x62 - {value: 0x0002, lo: 0x01}, - {value: 0x00d1, lo: 0x81, hi: 0xbf}, - // Block 0x62, offset 0x63 - {value: 0x0004, lo: 0x0e}, - {value: 0x088d, lo: 0x82, hi: 0x87}, - {value: 0x08a5, lo: 0x8a, hi: 0x8f}, - {value: 0x08bd, lo: 0x92, hi: 0x97}, - {value: 0x08d5, lo: 0x9a, hi: 0x9c}, - {value: 0x0382, lo: 0xa0, hi: 0xa0}, - {value: 0x0385, lo: 0xa1, hi: 0xa1}, - {value: 0x038e, lo: 0xa2, hi: 0xa2}, - {value: 0x4150, lo: 0xa3, hi: 0xa3}, - {value: 0x038b, lo: 0xa4, hi: 0xa4}, - {value: 0x0388, lo: 0xa5, hi: 0xa5}, - {value: 0x0985, lo: 0xa6, hi: 0xa6}, - {value: 0x09a9, lo: 0xa8, hi: 0xa8}, - {value: 0x0989, lo: 0xa9, hi: 0xac}, - {value: 0x09ad, lo: 0xad, hi: 0xae}, - // Block 0x63, offset 0x64 - {value: 0x0000, lo: 0x01}, - {value: 0x80dc, lo: 0xbd, hi: 0xbd}, - // Block 0x64, offset 0x65 - {value: 0x00db, lo: 0x05}, - {value: 0x80dc, lo: 0x8d, hi: 0x8d}, - {value: 0x80e6, lo: 0x8f, hi: 0x8f}, - {value: 0x80e6, lo: 0xb8, hi: 0xb8}, - {value: 0x8001, lo: 0xb9, hi: 0xba}, - {value: 0x8009, lo: 0xbf, hi: 0xbf}, - // Block 0x65, offset 0x66 - {value: 0x05fe, lo: 0x07}, - {value: 0x8800, lo: 0x99, hi: 0x99}, - {value: 0x411d, lo: 0x9a, hi: 0x9a}, - {value: 0x8800, lo: 0x9b, hi: 0x9b}, - {value: 0x4127, lo: 0x9c, hi: 0x9c}, - {value: 0x8800, lo: 0xa5, hi: 0xa5}, - {value: 0x4131, lo: 0xab, hi: 0xab}, - {value: 0x8009, lo: 0xb9, hi: 0xba}, - // Block 0x66, offset 0x67 - {value: 0x0000, lo: 0x0c}, - {value: 0x44e2, lo: 0x9e, hi: 0x9e}, - {value: 0x44ec, lo: 0x9f, hi: 0x9f}, - {value: 0x4555, lo: 0xa0, hi: 0xa0}, - {value: 0x4563, lo: 0xa1, hi: 0xa1}, - {value: 0x4571, lo: 0xa2, hi: 0xa2}, - {value: 0x457f, lo: 0xa3, hi: 0xa3}, - {value: 0x458d, lo: 0xa4, hi: 0xa4}, - {value: 0x80d8, lo: 0xa5, hi: 0xa6}, - {value: 0x8001, lo: 0xa7, hi: 0xa9}, - {value: 0x80e2, lo: 0xad, hi: 0xad}, - {value: 0x80d8, lo: 0xae, hi: 0xb2}, - {value: 0x80dc, lo: 0xbb, hi: 0xbf}, - // Block 0x67, offset 0x68 - {value: 0x0000, lo: 0x09}, - {value: 0x80dc, lo: 0x80, hi: 0x82}, - {value: 0x80e6, lo: 0x85, hi: 0x89}, - {value: 0x80dc, lo: 0x8a, hi: 0x8b}, - {value: 0x80e6, lo: 0xaa, hi: 0xad}, - {value: 0x44f6, lo: 0xbb, hi: 0xbb}, - {value: 0x4500, lo: 0xbc, hi: 0xbc}, - {value: 0x459b, lo: 0xbd, hi: 0xbd}, - {value: 0x45b7, lo: 0xbe, hi: 0xbe}, - {value: 0x45a9, lo: 0xbf, hi: 0xbf}, - // Block 0x68, offset 0x69 - {value: 0x0000, lo: 0x01}, - {value: 0x45c5, lo: 0x80, hi: 0x80}, - // Block 0x69, offset 0x6a - {value: 0x0000, lo: 0x01}, - {value: 0x80e6, lo: 0x82, hi: 0x84}, - // Block 0x6a, offset 0x6b - {value: 0x0002, lo: 0x03}, - {value: 0x0111, lo: 0x80, hi: 0x99}, - {value: 0x0151, lo: 0x9a, hi: 0xb3}, - {value: 0x0111, lo: 0xb4, hi: 0xbf}, - // Block 0x6b, offset 0x6c - {value: 0x0002, lo: 0x04}, - {value: 0x0129, lo: 0x80, hi: 0x8d}, - {value: 0x0151, lo: 0x8e, hi: 0x94}, - {value: 0x0161, lo: 0x96, hi: 0xa7}, - {value: 0x0111, lo: 0xa8, hi: 0xbf}, - // Block 0x6c, offset 0x6d - {value: 0x0002, lo: 0x0b}, - {value: 0x0141, lo: 0x80, hi: 0x81}, - {value: 0x0151, lo: 0x82, hi: 0x9b}, - {value: 0x0111, lo: 0x9c, hi: 0x9c}, - {value: 0x0115, lo: 0x9e, hi: 0x9f}, - {value: 0x011d, lo: 0xa2, hi: 0xa2}, - {value: 0x0123, lo: 0xa5, hi: 0xa6}, - {value: 0x012b, lo: 0xa9, hi: 0xac}, - {value: 0x0135, lo: 0xae, hi: 0xb5}, - {value: 0x0151, lo: 0xb6, hi: 0xb9}, - {value: 0x015b, lo: 0xbb, hi: 0xbb}, - {value: 0x015f, lo: 0xbd, hi: 0xbf}, - // Block 0x6d, offset 0x6e - {value: 0x0002, lo: 0x04}, - {value: 0x0165, lo: 0x80, hi: 0x83}, - {value: 0x016f, lo: 0x85, hi: 0x8f}, - {value: 0x0111, lo: 0x90, hi: 0xa9}, - {value: 0x0151, lo: 0xaa, hi: 0xbf}, - // Block 0x6e, offset 0x6f - {value: 0x0002, lo: 0x08}, - {value: 0x017d, lo: 0x80, hi: 0x83}, - {value: 0x0111, lo: 0x84, hi: 0x85}, - {value: 0x0117, lo: 0x87, hi: 0x8a}, - {value: 0x0123, lo: 0x8d, hi: 0x94}, - {value: 0x0135, lo: 0x96, hi: 0x9c}, - {value: 0x0151, lo: 0x9e, hi: 0xb7}, - {value: 0x0111, lo: 0xb8, hi: 0xb9}, - {value: 0x0117, lo: 0xbb, hi: 0xbe}, - // Block 0x6f, offset 0x70 - {value: 0x0002, lo: 0x05}, - {value: 0x0121, lo: 0x80, hi: 0x84}, - {value: 0x012d, lo: 0x86, hi: 0x86}, - {value: 0x0135, lo: 0x8a, hi: 0x90}, - {value: 0x0151, lo: 0x92, hi: 0xab}, - {value: 0x0111, lo: 0xac, hi: 0xbf}, - // Block 0x70, offset 0x71 - {value: 0x0002, lo: 0x04}, - {value: 0x0139, lo: 0x80, hi: 0x85}, - {value: 0x0151, lo: 0x86, hi: 0x9f}, - {value: 0x0111, lo: 0xa0, hi: 0xb9}, - {value: 0x0151, lo: 0xba, hi: 0xbf}, - // Block 0x71, offset 0x72 - {value: 0x0002, lo: 0x03}, - {value: 0x015d, lo: 0x80, hi: 0x93}, - {value: 0x0111, lo: 0x94, hi: 0xad}, - {value: 0x0151, lo: 0xae, hi: 0xbf}, - // Block 0x72, offset 0x73 - {value: 0x0002, lo: 0x04}, - {value: 0x0175, lo: 0x80, hi: 0x87}, - {value: 0x0111, lo: 0x88, hi: 0xa1}, - {value: 0x0151, lo: 0xa2, hi: 0xbb}, - {value: 0x0111, lo: 0xbc, hi: 0xbf}, - // Block 0x73, offset 0x74 - {value: 0x0002, lo: 0x03}, - {value: 0x0119, lo: 0x80, hi: 0x95}, - {value: 0x0151, lo: 0x96, hi: 0xaf}, - {value: 0x0111, lo: 0xb0, hi: 0xbf}, - // Block 0x74, offset 0x75 - {value: 0x0003, lo: 0x0f}, - {value: 0x0475, lo: 0x80, hi: 0x80}, - {value: 0x099d, lo: 0x81, hi: 0x81}, - {value: 0x0478, lo: 0x82, hi: 0x9a}, - {value: 0x0999, lo: 0x9b, hi: 0x9b}, - {value: 0x0484, lo: 0x9c, hi: 0x9c}, - {value: 0x048d, lo: 0x9d, hi: 0x9d}, - {value: 0x0493, lo: 0x9e, hi: 0x9e}, - {value: 0x04b7, lo: 0x9f, hi: 0x9f}, - {value: 0x04a8, lo: 0xa0, hi: 0xa0}, - {value: 0x04a5, lo: 0xa1, hi: 0xa1}, - {value: 0x0430, lo: 0xa2, hi: 0xb2}, - {value: 0x0445, lo: 0xb3, hi: 0xb3}, - {value: 0x0463, lo: 0xb4, hi: 0xba}, - {value: 0x099d, lo: 0xbb, hi: 0xbb}, - {value: 0x0478, lo: 0xbc, hi: 0xbf}, - // Block 0x75, offset 0x76 - {value: 0x0003, lo: 0x0d}, - {value: 0x0484, lo: 0x80, hi: 0x94}, - {value: 0x0999, lo: 0x95, hi: 0x95}, - {value: 0x0484, lo: 0x96, hi: 0x96}, - {value: 0x048d, lo: 0x97, hi: 0x97}, - {value: 0x0493, lo: 0x98, hi: 0x98}, - {value: 0x04b7, lo: 0x99, hi: 0x99}, - {value: 0x04a8, lo: 0x9a, hi: 0x9a}, - {value: 0x04a5, lo: 0x9b, hi: 0x9b}, - {value: 0x0430, lo: 0x9c, hi: 0xac}, - {value: 0x0445, lo: 0xad, hi: 0xad}, - {value: 0x0463, lo: 0xae, hi: 0xb4}, - {value: 0x099d, lo: 0xb5, hi: 0xb5}, - {value: 0x0478, lo: 0xb6, hi: 0xbf}, - // Block 0x76, offset 0x77 - {value: 0x0003, lo: 0x0d}, - {value: 0x0496, lo: 0x80, hi: 0x8e}, - {value: 0x0999, lo: 0x8f, hi: 0x8f}, - {value: 0x0484, lo: 0x90, hi: 0x90}, - {value: 0x048d, lo: 0x91, hi: 0x91}, - {value: 0x0493, lo: 0x92, hi: 0x92}, - {value: 0x04b7, lo: 0x93, hi: 0x93}, - {value: 0x04a8, lo: 0x94, hi: 0x94}, - {value: 0x04a5, lo: 0x95, hi: 0x95}, - {value: 0x0430, lo: 0x96, hi: 0xa6}, - {value: 0x0445, lo: 0xa7, hi: 0xa7}, - {value: 0x0463, lo: 0xa8, hi: 0xae}, - {value: 0x099d, lo: 0xaf, hi: 0xaf}, - {value: 0x0478, lo: 0xb0, hi: 0xbf}, - // Block 0x77, offset 0x78 - {value: 0x0003, lo: 0x0d}, - {value: 0x04a8, lo: 0x80, hi: 0x88}, - {value: 0x0999, lo: 0x89, hi: 0x89}, - {value: 0x0484, lo: 0x8a, hi: 0x8a}, - {value: 0x048d, lo: 0x8b, hi: 0x8b}, - {value: 0x0493, lo: 0x8c, hi: 0x8c}, - {value: 0x04b7, lo: 0x8d, hi: 0x8d}, - {value: 0x04a8, lo: 0x8e, hi: 0x8e}, - {value: 0x04a5, lo: 0x8f, hi: 0x8f}, - {value: 0x0430, lo: 0x90, hi: 0xa0}, - {value: 0x0445, lo: 0xa1, hi: 0xa1}, - {value: 0x0463, lo: 0xa2, hi: 0xa8}, - {value: 0x099d, lo: 0xa9, hi: 0xa9}, - {value: 0x0478, lo: 0xaa, hi: 0xbf}, - // Block 0x78, offset 0x79 - {value: 0x0002, lo: 0x07}, - {value: 0x0131, lo: 0x80, hi: 0x89}, - {value: 0x0271, lo: 0x8a, hi: 0x8a}, - {value: 0x029b, lo: 0x8b, hi: 0x8b}, - {value: 0x02b6, lo: 0x8c, hi: 0x8c}, - {value: 0x02bc, lo: 0x8d, hi: 0x8d}, - {value: 0x0711, lo: 0x8e, hi: 0x8e}, - {value: 0x02c8, lo: 0x8f, hi: 0x8f}, - // Block 0x79, offset 0x7a - {value: 0x0000, lo: 0x01}, - {value: 0x025f, lo: 0x90, hi: 0x90}, - // Block 0x7a, offset 0x7b - {value: 0x0028, lo: 0x09}, - {value: 0x29de, lo: 0x80, hi: 0x80}, - {value: 0x29a2, lo: 0x81, hi: 0x81}, - {value: 0x29ac, lo: 0x82, hi: 0x82}, - {value: 0x29c0, lo: 0x83, hi: 0x84}, - {value: 0x29ca, lo: 0x85, hi: 0x86}, - {value: 0x29b6, lo: 0x87, hi: 0x87}, - {value: 0x29d4, lo: 0x88, hi: 0x88}, - {value: 0x10ad, lo: 0x90, hi: 0x90}, - {value: 0x0e25, lo: 0x91, hi: 0x91}, -} - -// nfkcLookup: 1152 bytes -// Block 0 is the null block. -var nfkcLookup = [1152]uint8{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x0c2: 0x57, 0x0c3: 0x03, 0x0c4: 0x04, 0x0c5: 0x05, 0x0c6: 0x58, 0x0c7: 0x06, - 0x0c8: 0x07, 0x0ca: 0x59, 0x0cb: 0x5a, 0x0cc: 0x08, 0x0cd: 0x09, 0x0ce: 0x0a, 0x0cf: 0x0b, - 0x0d0: 0x0c, 0x0d1: 0x5b, 0x0d2: 0x5c, 0x0d3: 0x0d, 0x0d6: 0x0e, 0x0d7: 0x5d, - 0x0d8: 0x5e, 0x0d9: 0x0f, 0x0db: 0x5f, 0x0dc: 0x60, 0x0dd: 0x61, 0x0df: 0x62, - 0x0e0: 0x04, 0x0e1: 0x05, 0x0e2: 0x06, 0x0e3: 0x07, - 0x0ea: 0x08, 0x0eb: 0x09, 0x0ec: 0x09, 0x0ed: 0x0a, 0x0ef: 0x0b, - 0x0f0: 0x11, - // Block 0x4, offset 0x100 - 0x120: 0x63, 0x121: 0x64, 0x124: 0x65, 0x125: 0x66, 0x126: 0x67, 0x127: 0x68, - 0x128: 0x69, 0x129: 0x6a, 0x12a: 0x6b, 0x12b: 0x6c, 0x12c: 0x67, 0x12d: 0x6d, 0x12e: 0x6e, 0x12f: 0x6f, - 0x131: 0x70, 0x132: 0x71, 0x133: 0x72, 0x134: 0x73, 0x135: 0x74, 0x137: 0x75, - 0x138: 0x76, 0x139: 0x77, 0x13a: 0x78, 0x13b: 0x79, 0x13c: 0x7a, 0x13d: 0x7b, 0x13e: 0x7c, 0x13f: 0x7d, - // Block 0x5, offset 0x140 - 0x140: 0x7e, 0x142: 0x7f, 0x143: 0x80, 0x144: 0x81, 0x145: 0x82, 0x146: 0x83, 0x147: 0x84, - 0x14d: 0x85, - 0x15c: 0x86, 0x15f: 0x87, - 0x162: 0x88, 0x164: 0x89, - 0x168: 0x8a, 0x169: 0x8b, 0x16c: 0x10, 0x16d: 0x8c, 0x16e: 0x8d, 0x16f: 0x8e, - 0x170: 0x8f, 0x173: 0x90, 0x174: 0x91, 0x175: 0x11, 0x176: 0x12, 0x177: 0x92, - 0x178: 0x13, 0x179: 0x14, 0x17a: 0x15, 0x17b: 0x16, 0x17c: 0x17, 0x17d: 0x18, 0x17e: 0x19, 0x17f: 0x1a, - // Block 0x6, offset 0x180 - 0x180: 0x93, 0x181: 0x94, 0x182: 0x95, 0x183: 0x96, 0x184: 0x1b, 0x185: 0x1c, 0x186: 0x97, 0x187: 0x98, - 0x188: 0x99, 0x189: 0x1d, 0x18a: 0x1e, 0x18b: 0x9a, 0x18c: 0x9b, - 0x191: 0x1f, 0x192: 0x20, 0x193: 0x9c, - 0x1a8: 0x9d, 0x1a9: 0x9e, 0x1ab: 0x9f, - 0x1b1: 0xa0, 0x1b3: 0xa1, 0x1b5: 0xa2, 0x1b7: 0xa3, - 0x1ba: 0xa4, 0x1bb: 0xa5, 0x1bc: 0x21, 0x1bd: 0x22, 0x1be: 0x23, 0x1bf: 0xa6, - // Block 0x7, offset 0x1c0 - 0x1c0: 0xa7, 0x1c1: 0x24, 0x1c2: 0x25, 0x1c3: 0x26, 0x1c4: 0xa8, 0x1c5: 0xa9, 0x1c6: 0x27, - 0x1c8: 0x28, 0x1c9: 0x29, 0x1ca: 0x2a, 0x1cb: 0x2b, 0x1cc: 0x2c, 0x1cd: 0x2d, 0x1ce: 0x2e, 0x1cf: 0x2f, - // Block 0x8, offset 0x200 - 0x219: 0xaa, 0x21b: 0xab, 0x21d: 0xac, - 0x220: 0xad, 0x223: 0xae, 0x224: 0xaf, 0x225: 0xb0, 0x226: 0xb1, 0x227: 0xb2, - 0x22a: 0xb3, 0x22b: 0xb4, 0x22f: 0xb5, - 0x230: 0xb6, 0x231: 0xb6, 0x232: 0xb6, 0x233: 0xb6, 0x234: 0xb6, 0x235: 0xb6, 0x236: 0xb6, 0x237: 0xb6, - 0x238: 0xb6, 0x239: 0xb6, 0x23a: 0xb6, 0x23b: 0xb6, 0x23c: 0xb6, 0x23d: 0xb6, 0x23e: 0xb6, 0x23f: 0xb6, - // Block 0x9, offset 0x240 - 0x240: 0xb6, 0x241: 0xb6, 0x242: 0xb6, 0x243: 0xb6, 0x244: 0xb6, 0x245: 0xb6, 0x246: 0xb6, 0x247: 0xb6, - 0x248: 0xb6, 0x249: 0xb6, 0x24a: 0xb6, 0x24b: 0xb6, 0x24c: 0xb6, 0x24d: 0xb6, 0x24e: 0xb6, 0x24f: 0xb6, - 0x250: 0xb6, 0x251: 0xb6, 0x252: 0xb6, 0x253: 0xb6, 0x254: 0xb6, 0x255: 0xb6, 0x256: 0xb6, 0x257: 0xb6, - 0x258: 0xb6, 0x259: 0xb6, 0x25a: 0xb6, 0x25b: 0xb6, 0x25c: 0xb6, 0x25d: 0xb6, 0x25e: 0xb6, 0x25f: 0xb6, - 0x260: 0xb6, 0x261: 0xb6, 0x262: 0xb6, 0x263: 0xb6, 0x264: 0xb6, 0x265: 0xb6, 0x266: 0xb6, 0x267: 0xb6, - 0x268: 0xb6, 0x269: 0xb6, 0x26a: 0xb6, 0x26b: 0xb6, 0x26c: 0xb6, 0x26d: 0xb6, 0x26e: 0xb6, 0x26f: 0xb6, - 0x270: 0xb6, 0x271: 0xb6, 0x272: 0xb6, 0x273: 0xb6, 0x274: 0xb6, 0x275: 0xb6, 0x276: 0xb6, 0x277: 0xb6, - 0x278: 0xb6, 0x279: 0xb6, 0x27a: 0xb6, 0x27b: 0xb6, 0x27c: 0xb6, 0x27d: 0xb6, 0x27e: 0xb6, 0x27f: 0xb6, - // Block 0xa, offset 0x280 - 0x280: 0xb6, 0x281: 0xb6, 0x282: 0xb6, 0x283: 0xb6, 0x284: 0xb6, 0x285: 0xb6, 0x286: 0xb6, 0x287: 0xb6, - 0x288: 0xb6, 0x289: 0xb6, 0x28a: 0xb6, 0x28b: 0xb6, 0x28c: 0xb6, 0x28d: 0xb6, 0x28e: 0xb6, 0x28f: 0xb6, - 0x290: 0xb6, 0x291: 0xb6, 0x292: 0xb6, 0x293: 0xb6, 0x294: 0xb6, 0x295: 0xb6, 0x296: 0xb6, 0x297: 0xb6, - 0x298: 0xb6, 0x299: 0xb6, 0x29a: 0xb6, 0x29b: 0xb6, 0x29c: 0xb6, 0x29d: 0xb6, 0x29e: 0xb7, - // Block 0xb, offset 0x2c0 - 0x2e4: 0x30, 0x2e5: 0x31, 0x2e6: 0x32, 0x2e7: 0x33, - 0x2e8: 0x34, 0x2e9: 0x35, 0x2ea: 0x36, 0x2eb: 0x37, 0x2ec: 0x38, 0x2ed: 0x39, 0x2ee: 0x3a, 0x2ef: 0x3b, - 0x2f0: 0x3c, 0x2f1: 0x3d, 0x2f2: 0x3e, 0x2f3: 0x3f, 0x2f4: 0x40, 0x2f5: 0x41, 0x2f6: 0x42, 0x2f7: 0x43, - 0x2f8: 0x44, 0x2f9: 0x45, 0x2fa: 0x46, 0x2fb: 0x47, 0x2fc: 0xb8, 0x2fd: 0x48, 0x2fe: 0x49, 0x2ff: 0xb9, - // Block 0xc, offset 0x300 - 0x307: 0xba, - 0x328: 0xbb, - // Block 0xd, offset 0x340 - 0x341: 0xad, 0x342: 0xbc, - // Block 0xe, offset 0x380 - 0x385: 0xbd, 0x386: 0xbe, 0x387: 0xbf, - 0x389: 0xc0, - 0x390: 0xc1, 0x391: 0xc2, 0x392: 0xc3, 0x393: 0xc4, 0x394: 0xc5, 0x395: 0xc6, 0x396: 0xc7, 0x397: 0xc8, - 0x398: 0xc9, 0x399: 0xca, 0x39a: 0x4a, 0x39b: 0xcb, 0x39c: 0xcc, 0x39d: 0xcd, 0x39e: 0xce, 0x39f: 0x4b, - // Block 0xf, offset 0x3c0 - 0x3c4: 0x4c, 0x3c5: 0xcf, 0x3c6: 0xd0, - 0x3c8: 0x4d, 0x3c9: 0xd1, - // Block 0x10, offset 0x400 - 0x420: 0x4e, 0x421: 0x4f, 0x422: 0x50, 0x423: 0x51, 0x424: 0x52, 0x425: 0x53, 0x426: 0x54, 0x427: 0x55, - 0x428: 0x56, - // Block 0x11, offset 0x440 - 0x450: 0x0c, 0x451: 0x0d, - 0x45d: 0x0e, 0x45f: 0x0f, - 0x46f: 0x10, -} - -var nfkcTrie = trie{nfkcLookup[:], nfkcValues[:], nfkcSparseValues[:], nfkcSparseOffset[:], 87} - -// recompMap: 7448 bytes (entries only) -var recompMap = map[uint32]rune{ - 0x00410300: 0x00C0, - 0x00410301: 0x00C1, - 0x00410302: 0x00C2, - 0x00410303: 0x00C3, - 0x00410308: 0x00C4, - 0x0041030A: 0x00C5, - 0x00430327: 0x00C7, - 0x00450300: 0x00C8, - 0x00450301: 0x00C9, - 0x00450302: 0x00CA, - 0x00450308: 0x00CB, - 0x00490300: 0x00CC, - 0x00490301: 0x00CD, - 0x00490302: 0x00CE, - 0x00490308: 0x00CF, - 0x004E0303: 0x00D1, - 0x004F0300: 0x00D2, - 0x004F0301: 0x00D3, - 0x004F0302: 0x00D4, - 0x004F0303: 0x00D5, - 0x004F0308: 0x00D6, - 0x00550300: 0x00D9, - 0x00550301: 0x00DA, - 0x00550302: 0x00DB, - 0x00550308: 0x00DC, - 0x00590301: 0x00DD, - 0x00610300: 0x00E0, - 0x00610301: 0x00E1, - 0x00610302: 0x00E2, - 0x00610303: 0x00E3, - 0x00610308: 0x00E4, - 0x0061030A: 0x00E5, - 0x00630327: 0x00E7, - 0x00650300: 0x00E8, - 0x00650301: 0x00E9, - 0x00650302: 0x00EA, - 0x00650308: 0x00EB, - 0x00690300: 0x00EC, - 0x00690301: 0x00ED, - 0x00690302: 0x00EE, - 0x00690308: 0x00EF, - 0x006E0303: 0x00F1, - 0x006F0300: 0x00F2, - 0x006F0301: 0x00F3, - 0x006F0302: 0x00F4, - 0x006F0303: 0x00F5, - 0x006F0308: 0x00F6, - 0x00750300: 0x00F9, - 0x00750301: 0x00FA, - 0x00750302: 0x00FB, - 0x00750308: 0x00FC, - 0x00790301: 0x00FD, - 0x00790308: 0x00FF, - 0x00410304: 0x0100, - 0x00610304: 0x0101, - 0x00410306: 0x0102, - 0x00610306: 0x0103, - 0x00410328: 0x0104, - 0x00610328: 0x0105, - 0x00430301: 0x0106, - 0x00630301: 0x0107, - 0x00430302: 0x0108, - 0x00630302: 0x0109, - 0x00430307: 0x010A, - 0x00630307: 0x010B, - 0x0043030C: 0x010C, - 0x0063030C: 0x010D, - 0x0044030C: 0x010E, - 0x0064030C: 0x010F, - 0x00450304: 0x0112, - 0x00650304: 0x0113, - 0x00450306: 0x0114, - 0x00650306: 0x0115, - 0x00450307: 0x0116, - 0x00650307: 0x0117, - 0x00450328: 0x0118, - 0x00650328: 0x0119, - 0x0045030C: 0x011A, - 0x0065030C: 0x011B, - 0x00470302: 0x011C, - 0x00670302: 0x011D, - 0x00470306: 0x011E, - 0x00670306: 0x011F, - 0x00470307: 0x0120, - 0x00670307: 0x0121, - 0x00470327: 0x0122, - 0x00670327: 0x0123, - 0x00480302: 0x0124, - 0x00680302: 0x0125, - 0x00490303: 0x0128, - 0x00690303: 0x0129, - 0x00490304: 0x012A, - 0x00690304: 0x012B, - 0x00490306: 0x012C, - 0x00690306: 0x012D, - 0x00490328: 0x012E, - 0x00690328: 0x012F, - 0x00490307: 0x0130, - 0x004A0302: 0x0134, - 0x006A0302: 0x0135, - 0x004B0327: 0x0136, - 0x006B0327: 0x0137, - 0x004C0301: 0x0139, - 0x006C0301: 0x013A, - 0x004C0327: 0x013B, - 0x006C0327: 0x013C, - 0x004C030C: 0x013D, - 0x006C030C: 0x013E, - 0x004E0301: 0x0143, - 0x006E0301: 0x0144, - 0x004E0327: 0x0145, - 0x006E0327: 0x0146, - 0x004E030C: 0x0147, - 0x006E030C: 0x0148, - 0x004F0304: 0x014C, - 0x006F0304: 0x014D, - 0x004F0306: 0x014E, - 0x006F0306: 0x014F, - 0x004F030B: 0x0150, - 0x006F030B: 0x0151, - 0x00520301: 0x0154, - 0x00720301: 0x0155, - 0x00520327: 0x0156, - 0x00720327: 0x0157, - 0x0052030C: 0x0158, - 0x0072030C: 0x0159, - 0x00530301: 0x015A, - 0x00730301: 0x015B, - 0x00530302: 0x015C, - 0x00730302: 0x015D, - 0x00530327: 0x015E, - 0x00730327: 0x015F, - 0x0053030C: 0x0160, - 0x0073030C: 0x0161, - 0x00540327: 0x0162, - 0x00740327: 0x0163, - 0x0054030C: 0x0164, - 0x0074030C: 0x0165, - 0x00550303: 0x0168, - 0x00750303: 0x0169, - 0x00550304: 0x016A, - 0x00750304: 0x016B, - 0x00550306: 0x016C, - 0x00750306: 0x016D, - 0x0055030A: 0x016E, - 0x0075030A: 0x016F, - 0x0055030B: 0x0170, - 0x0075030B: 0x0171, - 0x00550328: 0x0172, - 0x00750328: 0x0173, - 0x00570302: 0x0174, - 0x00770302: 0x0175, - 0x00590302: 0x0176, - 0x00790302: 0x0177, - 0x00590308: 0x0178, - 0x005A0301: 0x0179, - 0x007A0301: 0x017A, - 0x005A0307: 0x017B, - 0x007A0307: 0x017C, - 0x005A030C: 0x017D, - 0x007A030C: 0x017E, - 0x004F031B: 0x01A0, - 0x006F031B: 0x01A1, - 0x0055031B: 0x01AF, - 0x0075031B: 0x01B0, - 0x0041030C: 0x01CD, - 0x0061030C: 0x01CE, - 0x0049030C: 0x01CF, - 0x0069030C: 0x01D0, - 0x004F030C: 0x01D1, - 0x006F030C: 0x01D2, - 0x0055030C: 0x01D3, - 0x0075030C: 0x01D4, - 0x00DC0304: 0x01D5, - 0x00FC0304: 0x01D6, - 0x00DC0301: 0x01D7, - 0x00FC0301: 0x01D8, - 0x00DC030C: 0x01D9, - 0x00FC030C: 0x01DA, - 0x00DC0300: 0x01DB, - 0x00FC0300: 0x01DC, - 0x00C40304: 0x01DE, - 0x00E40304: 0x01DF, - 0x02260304: 0x01E0, - 0x02270304: 0x01E1, - 0x00C60304: 0x01E2, - 0x00E60304: 0x01E3, - 0x0047030C: 0x01E6, - 0x0067030C: 0x01E7, - 0x004B030C: 0x01E8, - 0x006B030C: 0x01E9, - 0x004F0328: 0x01EA, - 0x006F0328: 0x01EB, - 0x01EA0304: 0x01EC, - 0x01EB0304: 0x01ED, - 0x01B7030C: 0x01EE, - 0x0292030C: 0x01EF, - 0x006A030C: 0x01F0, - 0x00470301: 0x01F4, - 0x00670301: 0x01F5, - 0x004E0300: 0x01F8, - 0x006E0300: 0x01F9, - 0x00C50301: 0x01FA, - 0x00E50301: 0x01FB, - 0x00C60301: 0x01FC, - 0x00E60301: 0x01FD, - 0x00D80301: 0x01FE, - 0x00F80301: 0x01FF, - 0x0041030F: 0x0200, - 0x0061030F: 0x0201, - 0x00410311: 0x0202, - 0x00610311: 0x0203, - 0x0045030F: 0x0204, - 0x0065030F: 0x0205, - 0x00450311: 0x0206, - 0x00650311: 0x0207, - 0x0049030F: 0x0208, - 0x0069030F: 0x0209, - 0x00490311: 0x020A, - 0x00690311: 0x020B, - 0x004F030F: 0x020C, - 0x006F030F: 0x020D, - 0x004F0311: 0x020E, - 0x006F0311: 0x020F, - 0x0052030F: 0x0210, - 0x0072030F: 0x0211, - 0x00520311: 0x0212, - 0x00720311: 0x0213, - 0x0055030F: 0x0214, - 0x0075030F: 0x0215, - 0x00550311: 0x0216, - 0x00750311: 0x0217, - 0x00530326: 0x0218, - 0x00730326: 0x0219, - 0x00540326: 0x021A, - 0x00740326: 0x021B, - 0x0048030C: 0x021E, - 0x0068030C: 0x021F, - 0x00410307: 0x0226, - 0x00610307: 0x0227, - 0x00450327: 0x0228, - 0x00650327: 0x0229, - 0x00D60304: 0x022A, - 0x00F60304: 0x022B, - 0x00D50304: 0x022C, - 0x00F50304: 0x022D, - 0x004F0307: 0x022E, - 0x006F0307: 0x022F, - 0x022E0304: 0x0230, - 0x022F0304: 0x0231, - 0x00590304: 0x0232, - 0x00790304: 0x0233, - 0x00A80301: 0x0385, - 0x03910301: 0x0386, - 0x03950301: 0x0388, - 0x03970301: 0x0389, - 0x03990301: 0x038A, - 0x039F0301: 0x038C, - 0x03A50301: 0x038E, - 0x03A90301: 0x038F, - 0x03CA0301: 0x0390, - 0x03990308: 0x03AA, - 0x03A50308: 0x03AB, - 0x03B10301: 0x03AC, - 0x03B50301: 0x03AD, - 0x03B70301: 0x03AE, - 0x03B90301: 0x03AF, - 0x03CB0301: 0x03B0, - 0x03B90308: 0x03CA, - 0x03C50308: 0x03CB, - 0x03BF0301: 0x03CC, - 0x03C50301: 0x03CD, - 0x03C90301: 0x03CE, - 0x03D20301: 0x03D3, - 0x03D20308: 0x03D4, - 0x04150300: 0x0400, - 0x04150308: 0x0401, - 0x04130301: 0x0403, - 0x04060308: 0x0407, - 0x041A0301: 0x040C, - 0x04180300: 0x040D, - 0x04230306: 0x040E, - 0x04180306: 0x0419, - 0x04380306: 0x0439, - 0x04350300: 0x0450, - 0x04350308: 0x0451, - 0x04330301: 0x0453, - 0x04560308: 0x0457, - 0x043A0301: 0x045C, - 0x04380300: 0x045D, - 0x04430306: 0x045E, - 0x0474030F: 0x0476, - 0x0475030F: 0x0477, - 0x04160306: 0x04C1, - 0x04360306: 0x04C2, - 0x04100306: 0x04D0, - 0x04300306: 0x04D1, - 0x04100308: 0x04D2, - 0x04300308: 0x04D3, - 0x04150306: 0x04D6, - 0x04350306: 0x04D7, - 0x04D80308: 0x04DA, - 0x04D90308: 0x04DB, - 0x04160308: 0x04DC, - 0x04360308: 0x04DD, - 0x04170308: 0x04DE, - 0x04370308: 0x04DF, - 0x04180304: 0x04E2, - 0x04380304: 0x04E3, - 0x04180308: 0x04E4, - 0x04380308: 0x04E5, - 0x041E0308: 0x04E6, - 0x043E0308: 0x04E7, - 0x04E80308: 0x04EA, - 0x04E90308: 0x04EB, - 0x042D0308: 0x04EC, - 0x044D0308: 0x04ED, - 0x04230304: 0x04EE, - 0x04430304: 0x04EF, - 0x04230308: 0x04F0, - 0x04430308: 0x04F1, - 0x0423030B: 0x04F2, - 0x0443030B: 0x04F3, - 0x04270308: 0x04F4, - 0x04470308: 0x04F5, - 0x042B0308: 0x04F8, - 0x044B0308: 0x04F9, - 0x06270653: 0x0622, - 0x06270654: 0x0623, - 0x06480654: 0x0624, - 0x06270655: 0x0625, - 0x064A0654: 0x0626, - 0x06D50654: 0x06C0, - 0x06C10654: 0x06C2, - 0x06D20654: 0x06D3, - 0x0928093C: 0x0929, - 0x0930093C: 0x0931, - 0x0933093C: 0x0934, - 0x09C709BE: 0x09CB, - 0x09C709D7: 0x09CC, - 0x0B470B56: 0x0B48, - 0x0B470B3E: 0x0B4B, - 0x0B470B57: 0x0B4C, - 0x0B920BD7: 0x0B94, - 0x0BC60BBE: 0x0BCA, - 0x0BC70BBE: 0x0BCB, - 0x0BC60BD7: 0x0BCC, - 0x0C460C56: 0x0C48, - 0x0CBF0CD5: 0x0CC0, - 0x0CC60CD5: 0x0CC7, - 0x0CC60CD6: 0x0CC8, - 0x0CC60CC2: 0x0CCA, - 0x0CCA0CD5: 0x0CCB, - 0x0D460D3E: 0x0D4A, - 0x0D470D3E: 0x0D4B, - 0x0D460D57: 0x0D4C, - 0x0DD90DCA: 0x0DDA, - 0x0DD90DCF: 0x0DDC, - 0x0DDC0DCA: 0x0DDD, - 0x0DD90DDF: 0x0DDE, - 0x1025102E: 0x1026, - 0x1B051B35: 0x1B06, - 0x1B071B35: 0x1B08, - 0x1B091B35: 0x1B0A, - 0x1B0B1B35: 0x1B0C, - 0x1B0D1B35: 0x1B0E, - 0x1B111B35: 0x1B12, - 0x1B3A1B35: 0x1B3B, - 0x1B3C1B35: 0x1B3D, - 0x1B3E1B35: 0x1B40, - 0x1B3F1B35: 0x1B41, - 0x1B421B35: 0x1B43, - 0x00410325: 0x1E00, - 0x00610325: 0x1E01, - 0x00420307: 0x1E02, - 0x00620307: 0x1E03, - 0x00420323: 0x1E04, - 0x00620323: 0x1E05, - 0x00420331: 0x1E06, - 0x00620331: 0x1E07, - 0x00C70301: 0x1E08, - 0x00E70301: 0x1E09, - 0x00440307: 0x1E0A, - 0x00640307: 0x1E0B, - 0x00440323: 0x1E0C, - 0x00640323: 0x1E0D, - 0x00440331: 0x1E0E, - 0x00640331: 0x1E0F, - 0x00440327: 0x1E10, - 0x00640327: 0x1E11, - 0x0044032D: 0x1E12, - 0x0064032D: 0x1E13, - 0x01120300: 0x1E14, - 0x01130300: 0x1E15, - 0x01120301: 0x1E16, - 0x01130301: 0x1E17, - 0x0045032D: 0x1E18, - 0x0065032D: 0x1E19, - 0x00450330: 0x1E1A, - 0x00650330: 0x1E1B, - 0x02280306: 0x1E1C, - 0x02290306: 0x1E1D, - 0x00460307: 0x1E1E, - 0x00660307: 0x1E1F, - 0x00470304: 0x1E20, - 0x00670304: 0x1E21, - 0x00480307: 0x1E22, - 0x00680307: 0x1E23, - 0x00480323: 0x1E24, - 0x00680323: 0x1E25, - 0x00480308: 0x1E26, - 0x00680308: 0x1E27, - 0x00480327: 0x1E28, - 0x00680327: 0x1E29, - 0x0048032E: 0x1E2A, - 0x0068032E: 0x1E2B, - 0x00490330: 0x1E2C, - 0x00690330: 0x1E2D, - 0x00CF0301: 0x1E2E, - 0x00EF0301: 0x1E2F, - 0x004B0301: 0x1E30, - 0x006B0301: 0x1E31, - 0x004B0323: 0x1E32, - 0x006B0323: 0x1E33, - 0x004B0331: 0x1E34, - 0x006B0331: 0x1E35, - 0x004C0323: 0x1E36, - 0x006C0323: 0x1E37, - 0x1E360304: 0x1E38, - 0x1E370304: 0x1E39, - 0x004C0331: 0x1E3A, - 0x006C0331: 0x1E3B, - 0x004C032D: 0x1E3C, - 0x006C032D: 0x1E3D, - 0x004D0301: 0x1E3E, - 0x006D0301: 0x1E3F, - 0x004D0307: 0x1E40, - 0x006D0307: 0x1E41, - 0x004D0323: 0x1E42, - 0x006D0323: 0x1E43, - 0x004E0307: 0x1E44, - 0x006E0307: 0x1E45, - 0x004E0323: 0x1E46, - 0x006E0323: 0x1E47, - 0x004E0331: 0x1E48, - 0x006E0331: 0x1E49, - 0x004E032D: 0x1E4A, - 0x006E032D: 0x1E4B, - 0x00D50301: 0x1E4C, - 0x00F50301: 0x1E4D, - 0x00D50308: 0x1E4E, - 0x00F50308: 0x1E4F, - 0x014C0300: 0x1E50, - 0x014D0300: 0x1E51, - 0x014C0301: 0x1E52, - 0x014D0301: 0x1E53, - 0x00500301: 0x1E54, - 0x00700301: 0x1E55, - 0x00500307: 0x1E56, - 0x00700307: 0x1E57, - 0x00520307: 0x1E58, - 0x00720307: 0x1E59, - 0x00520323: 0x1E5A, - 0x00720323: 0x1E5B, - 0x1E5A0304: 0x1E5C, - 0x1E5B0304: 0x1E5D, - 0x00520331: 0x1E5E, - 0x00720331: 0x1E5F, - 0x00530307: 0x1E60, - 0x00730307: 0x1E61, - 0x00530323: 0x1E62, - 0x00730323: 0x1E63, - 0x015A0307: 0x1E64, - 0x015B0307: 0x1E65, - 0x01600307: 0x1E66, - 0x01610307: 0x1E67, - 0x1E620307: 0x1E68, - 0x1E630307: 0x1E69, - 0x00540307: 0x1E6A, - 0x00740307: 0x1E6B, - 0x00540323: 0x1E6C, - 0x00740323: 0x1E6D, - 0x00540331: 0x1E6E, - 0x00740331: 0x1E6F, - 0x0054032D: 0x1E70, - 0x0074032D: 0x1E71, - 0x00550324: 0x1E72, - 0x00750324: 0x1E73, - 0x00550330: 0x1E74, - 0x00750330: 0x1E75, - 0x0055032D: 0x1E76, - 0x0075032D: 0x1E77, - 0x01680301: 0x1E78, - 0x01690301: 0x1E79, - 0x016A0308: 0x1E7A, - 0x016B0308: 0x1E7B, - 0x00560303: 0x1E7C, - 0x00760303: 0x1E7D, - 0x00560323: 0x1E7E, - 0x00760323: 0x1E7F, - 0x00570300: 0x1E80, - 0x00770300: 0x1E81, - 0x00570301: 0x1E82, - 0x00770301: 0x1E83, - 0x00570308: 0x1E84, - 0x00770308: 0x1E85, - 0x00570307: 0x1E86, - 0x00770307: 0x1E87, - 0x00570323: 0x1E88, - 0x00770323: 0x1E89, - 0x00580307: 0x1E8A, - 0x00780307: 0x1E8B, - 0x00580308: 0x1E8C, - 0x00780308: 0x1E8D, - 0x00590307: 0x1E8E, - 0x00790307: 0x1E8F, - 0x005A0302: 0x1E90, - 0x007A0302: 0x1E91, - 0x005A0323: 0x1E92, - 0x007A0323: 0x1E93, - 0x005A0331: 0x1E94, - 0x007A0331: 0x1E95, - 0x00680331: 0x1E96, - 0x00740308: 0x1E97, - 0x0077030A: 0x1E98, - 0x0079030A: 0x1E99, - 0x017F0307: 0x1E9B, - 0x00410323: 0x1EA0, - 0x00610323: 0x1EA1, - 0x00410309: 0x1EA2, - 0x00610309: 0x1EA3, - 0x00C20301: 0x1EA4, - 0x00E20301: 0x1EA5, - 0x00C20300: 0x1EA6, - 0x00E20300: 0x1EA7, - 0x00C20309: 0x1EA8, - 0x00E20309: 0x1EA9, - 0x00C20303: 0x1EAA, - 0x00E20303: 0x1EAB, - 0x1EA00302: 0x1EAC, - 0x1EA10302: 0x1EAD, - 0x01020301: 0x1EAE, - 0x01030301: 0x1EAF, - 0x01020300: 0x1EB0, - 0x01030300: 0x1EB1, - 0x01020309: 0x1EB2, - 0x01030309: 0x1EB3, - 0x01020303: 0x1EB4, - 0x01030303: 0x1EB5, - 0x1EA00306: 0x1EB6, - 0x1EA10306: 0x1EB7, - 0x00450323: 0x1EB8, - 0x00650323: 0x1EB9, - 0x00450309: 0x1EBA, - 0x00650309: 0x1EBB, - 0x00450303: 0x1EBC, - 0x00650303: 0x1EBD, - 0x00CA0301: 0x1EBE, - 0x00EA0301: 0x1EBF, - 0x00CA0300: 0x1EC0, - 0x00EA0300: 0x1EC1, - 0x00CA0309: 0x1EC2, - 0x00EA0309: 0x1EC3, - 0x00CA0303: 0x1EC4, - 0x00EA0303: 0x1EC5, - 0x1EB80302: 0x1EC6, - 0x1EB90302: 0x1EC7, - 0x00490309: 0x1EC8, - 0x00690309: 0x1EC9, - 0x00490323: 0x1ECA, - 0x00690323: 0x1ECB, - 0x004F0323: 0x1ECC, - 0x006F0323: 0x1ECD, - 0x004F0309: 0x1ECE, - 0x006F0309: 0x1ECF, - 0x00D40301: 0x1ED0, - 0x00F40301: 0x1ED1, - 0x00D40300: 0x1ED2, - 0x00F40300: 0x1ED3, - 0x00D40309: 0x1ED4, - 0x00F40309: 0x1ED5, - 0x00D40303: 0x1ED6, - 0x00F40303: 0x1ED7, - 0x1ECC0302: 0x1ED8, - 0x1ECD0302: 0x1ED9, - 0x01A00301: 0x1EDA, - 0x01A10301: 0x1EDB, - 0x01A00300: 0x1EDC, - 0x01A10300: 0x1EDD, - 0x01A00309: 0x1EDE, - 0x01A10309: 0x1EDF, - 0x01A00303: 0x1EE0, - 0x01A10303: 0x1EE1, - 0x01A00323: 0x1EE2, - 0x01A10323: 0x1EE3, - 0x00550323: 0x1EE4, - 0x00750323: 0x1EE5, - 0x00550309: 0x1EE6, - 0x00750309: 0x1EE7, - 0x01AF0301: 0x1EE8, - 0x01B00301: 0x1EE9, - 0x01AF0300: 0x1EEA, - 0x01B00300: 0x1EEB, - 0x01AF0309: 0x1EEC, - 0x01B00309: 0x1EED, - 0x01AF0303: 0x1EEE, - 0x01B00303: 0x1EEF, - 0x01AF0323: 0x1EF0, - 0x01B00323: 0x1EF1, - 0x00590300: 0x1EF2, - 0x00790300: 0x1EF3, - 0x00590323: 0x1EF4, - 0x00790323: 0x1EF5, - 0x00590309: 0x1EF6, - 0x00790309: 0x1EF7, - 0x00590303: 0x1EF8, - 0x00790303: 0x1EF9, - 0x03B10313: 0x1F00, - 0x03B10314: 0x1F01, - 0x1F000300: 0x1F02, - 0x1F010300: 0x1F03, - 0x1F000301: 0x1F04, - 0x1F010301: 0x1F05, - 0x1F000342: 0x1F06, - 0x1F010342: 0x1F07, - 0x03910313: 0x1F08, - 0x03910314: 0x1F09, - 0x1F080300: 0x1F0A, - 0x1F090300: 0x1F0B, - 0x1F080301: 0x1F0C, - 0x1F090301: 0x1F0D, - 0x1F080342: 0x1F0E, - 0x1F090342: 0x1F0F, - 0x03B50313: 0x1F10, - 0x03B50314: 0x1F11, - 0x1F100300: 0x1F12, - 0x1F110300: 0x1F13, - 0x1F100301: 0x1F14, - 0x1F110301: 0x1F15, - 0x03950313: 0x1F18, - 0x03950314: 0x1F19, - 0x1F180300: 0x1F1A, - 0x1F190300: 0x1F1B, - 0x1F180301: 0x1F1C, - 0x1F190301: 0x1F1D, - 0x03B70313: 0x1F20, - 0x03B70314: 0x1F21, - 0x1F200300: 0x1F22, - 0x1F210300: 0x1F23, - 0x1F200301: 0x1F24, - 0x1F210301: 0x1F25, - 0x1F200342: 0x1F26, - 0x1F210342: 0x1F27, - 0x03970313: 0x1F28, - 0x03970314: 0x1F29, - 0x1F280300: 0x1F2A, - 0x1F290300: 0x1F2B, - 0x1F280301: 0x1F2C, - 0x1F290301: 0x1F2D, - 0x1F280342: 0x1F2E, - 0x1F290342: 0x1F2F, - 0x03B90313: 0x1F30, - 0x03B90314: 0x1F31, - 0x1F300300: 0x1F32, - 0x1F310300: 0x1F33, - 0x1F300301: 0x1F34, - 0x1F310301: 0x1F35, - 0x1F300342: 0x1F36, - 0x1F310342: 0x1F37, - 0x03990313: 0x1F38, - 0x03990314: 0x1F39, - 0x1F380300: 0x1F3A, - 0x1F390300: 0x1F3B, - 0x1F380301: 0x1F3C, - 0x1F390301: 0x1F3D, - 0x1F380342: 0x1F3E, - 0x1F390342: 0x1F3F, - 0x03BF0313: 0x1F40, - 0x03BF0314: 0x1F41, - 0x1F400300: 0x1F42, - 0x1F410300: 0x1F43, - 0x1F400301: 0x1F44, - 0x1F410301: 0x1F45, - 0x039F0313: 0x1F48, - 0x039F0314: 0x1F49, - 0x1F480300: 0x1F4A, - 0x1F490300: 0x1F4B, - 0x1F480301: 0x1F4C, - 0x1F490301: 0x1F4D, - 0x03C50313: 0x1F50, - 0x03C50314: 0x1F51, - 0x1F500300: 0x1F52, - 0x1F510300: 0x1F53, - 0x1F500301: 0x1F54, - 0x1F510301: 0x1F55, - 0x1F500342: 0x1F56, - 0x1F510342: 0x1F57, - 0x03A50314: 0x1F59, - 0x1F590300: 0x1F5B, - 0x1F590301: 0x1F5D, - 0x1F590342: 0x1F5F, - 0x03C90313: 0x1F60, - 0x03C90314: 0x1F61, - 0x1F600300: 0x1F62, - 0x1F610300: 0x1F63, - 0x1F600301: 0x1F64, - 0x1F610301: 0x1F65, - 0x1F600342: 0x1F66, - 0x1F610342: 0x1F67, - 0x03A90313: 0x1F68, - 0x03A90314: 0x1F69, - 0x1F680300: 0x1F6A, - 0x1F690300: 0x1F6B, - 0x1F680301: 0x1F6C, - 0x1F690301: 0x1F6D, - 0x1F680342: 0x1F6E, - 0x1F690342: 0x1F6F, - 0x03B10300: 0x1F70, - 0x03B50300: 0x1F72, - 0x03B70300: 0x1F74, - 0x03B90300: 0x1F76, - 0x03BF0300: 0x1F78, - 0x03C50300: 0x1F7A, - 0x03C90300: 0x1F7C, - 0x1F000345: 0x1F80, - 0x1F010345: 0x1F81, - 0x1F020345: 0x1F82, - 0x1F030345: 0x1F83, - 0x1F040345: 0x1F84, - 0x1F050345: 0x1F85, - 0x1F060345: 0x1F86, - 0x1F070345: 0x1F87, - 0x1F080345: 0x1F88, - 0x1F090345: 0x1F89, - 0x1F0A0345: 0x1F8A, - 0x1F0B0345: 0x1F8B, - 0x1F0C0345: 0x1F8C, - 0x1F0D0345: 0x1F8D, - 0x1F0E0345: 0x1F8E, - 0x1F0F0345: 0x1F8F, - 0x1F200345: 0x1F90, - 0x1F210345: 0x1F91, - 0x1F220345: 0x1F92, - 0x1F230345: 0x1F93, - 0x1F240345: 0x1F94, - 0x1F250345: 0x1F95, - 0x1F260345: 0x1F96, - 0x1F270345: 0x1F97, - 0x1F280345: 0x1F98, - 0x1F290345: 0x1F99, - 0x1F2A0345: 0x1F9A, - 0x1F2B0345: 0x1F9B, - 0x1F2C0345: 0x1F9C, - 0x1F2D0345: 0x1F9D, - 0x1F2E0345: 0x1F9E, - 0x1F2F0345: 0x1F9F, - 0x1F600345: 0x1FA0, - 0x1F610345: 0x1FA1, - 0x1F620345: 0x1FA2, - 0x1F630345: 0x1FA3, - 0x1F640345: 0x1FA4, - 0x1F650345: 0x1FA5, - 0x1F660345: 0x1FA6, - 0x1F670345: 0x1FA7, - 0x1F680345: 0x1FA8, - 0x1F690345: 0x1FA9, - 0x1F6A0345: 0x1FAA, - 0x1F6B0345: 0x1FAB, - 0x1F6C0345: 0x1FAC, - 0x1F6D0345: 0x1FAD, - 0x1F6E0345: 0x1FAE, - 0x1F6F0345: 0x1FAF, - 0x03B10306: 0x1FB0, - 0x03B10304: 0x1FB1, - 0x1F700345: 0x1FB2, - 0x03B10345: 0x1FB3, - 0x03AC0345: 0x1FB4, - 0x03B10342: 0x1FB6, - 0x1FB60345: 0x1FB7, - 0x03910306: 0x1FB8, - 0x03910304: 0x1FB9, - 0x03910300: 0x1FBA, - 0x03910345: 0x1FBC, - 0x00A80342: 0x1FC1, - 0x1F740345: 0x1FC2, - 0x03B70345: 0x1FC3, - 0x03AE0345: 0x1FC4, - 0x03B70342: 0x1FC6, - 0x1FC60345: 0x1FC7, - 0x03950300: 0x1FC8, - 0x03970300: 0x1FCA, - 0x03970345: 0x1FCC, - 0x1FBF0300: 0x1FCD, - 0x1FBF0301: 0x1FCE, - 0x1FBF0342: 0x1FCF, - 0x03B90306: 0x1FD0, - 0x03B90304: 0x1FD1, - 0x03CA0300: 0x1FD2, - 0x03B90342: 0x1FD6, - 0x03CA0342: 0x1FD7, - 0x03990306: 0x1FD8, - 0x03990304: 0x1FD9, - 0x03990300: 0x1FDA, - 0x1FFE0300: 0x1FDD, - 0x1FFE0301: 0x1FDE, - 0x1FFE0342: 0x1FDF, - 0x03C50306: 0x1FE0, - 0x03C50304: 0x1FE1, - 0x03CB0300: 0x1FE2, - 0x03C10313: 0x1FE4, - 0x03C10314: 0x1FE5, - 0x03C50342: 0x1FE6, - 0x03CB0342: 0x1FE7, - 0x03A50306: 0x1FE8, - 0x03A50304: 0x1FE9, - 0x03A50300: 0x1FEA, - 0x03A10314: 0x1FEC, - 0x00A80300: 0x1FED, - 0x1F7C0345: 0x1FF2, - 0x03C90345: 0x1FF3, - 0x03CE0345: 0x1FF4, - 0x03C90342: 0x1FF6, - 0x1FF60345: 0x1FF7, - 0x039F0300: 0x1FF8, - 0x03A90300: 0x1FFA, - 0x03A90345: 0x1FFC, - 0x21900338: 0x219A, - 0x21920338: 0x219B, - 0x21940338: 0x21AE, - 0x21D00338: 0x21CD, - 0x21D40338: 0x21CE, - 0x21D20338: 0x21CF, - 0x22030338: 0x2204, - 0x22080338: 0x2209, - 0x220B0338: 0x220C, - 0x22230338: 0x2224, - 0x22250338: 0x2226, - 0x223C0338: 0x2241, - 0x22430338: 0x2244, - 0x22450338: 0x2247, - 0x22480338: 0x2249, - 0x003D0338: 0x2260, - 0x22610338: 0x2262, - 0x224D0338: 0x226D, - 0x003C0338: 0x226E, - 0x003E0338: 0x226F, - 0x22640338: 0x2270, - 0x22650338: 0x2271, - 0x22720338: 0x2274, - 0x22730338: 0x2275, - 0x22760338: 0x2278, - 0x22770338: 0x2279, - 0x227A0338: 0x2280, - 0x227B0338: 0x2281, - 0x22820338: 0x2284, - 0x22830338: 0x2285, - 0x22860338: 0x2288, - 0x22870338: 0x2289, - 0x22A20338: 0x22AC, - 0x22A80338: 0x22AD, - 0x22A90338: 0x22AE, - 0x22AB0338: 0x22AF, - 0x227C0338: 0x22E0, - 0x227D0338: 0x22E1, - 0x22910338: 0x22E2, - 0x22920338: 0x22E3, - 0x22B20338: 0x22EA, - 0x22B30338: 0x22EB, - 0x22B40338: 0x22EC, - 0x22B50338: 0x22ED, - 0x304B3099: 0x304C, - 0x304D3099: 0x304E, - 0x304F3099: 0x3050, - 0x30513099: 0x3052, - 0x30533099: 0x3054, - 0x30553099: 0x3056, - 0x30573099: 0x3058, - 0x30593099: 0x305A, - 0x305B3099: 0x305C, - 0x305D3099: 0x305E, - 0x305F3099: 0x3060, - 0x30613099: 0x3062, - 0x30643099: 0x3065, - 0x30663099: 0x3067, - 0x30683099: 0x3069, - 0x306F3099: 0x3070, - 0x306F309A: 0x3071, - 0x30723099: 0x3073, - 0x3072309A: 0x3074, - 0x30753099: 0x3076, - 0x3075309A: 0x3077, - 0x30783099: 0x3079, - 0x3078309A: 0x307A, - 0x307B3099: 0x307C, - 0x307B309A: 0x307D, - 0x30463099: 0x3094, - 0x309D3099: 0x309E, - 0x30AB3099: 0x30AC, - 0x30AD3099: 0x30AE, - 0x30AF3099: 0x30B0, - 0x30B13099: 0x30B2, - 0x30B33099: 0x30B4, - 0x30B53099: 0x30B6, - 0x30B73099: 0x30B8, - 0x30B93099: 0x30BA, - 0x30BB3099: 0x30BC, - 0x30BD3099: 0x30BE, - 0x30BF3099: 0x30C0, - 0x30C13099: 0x30C2, - 0x30C43099: 0x30C5, - 0x30C63099: 0x30C7, - 0x30C83099: 0x30C9, - 0x30CF3099: 0x30D0, - 0x30CF309A: 0x30D1, - 0x30D23099: 0x30D3, - 0x30D2309A: 0x30D4, - 0x30D53099: 0x30D6, - 0x30D5309A: 0x30D7, - 0x30D83099: 0x30D9, - 0x30D8309A: 0x30DA, - 0x30DB3099: 0x30DC, - 0x30DB309A: 0x30DD, - 0x30A63099: 0x30F4, - 0x30EF3099: 0x30F7, - 0x30F03099: 0x30F8, - 0x30F13099: 0x30F9, - 0x30F23099: 0x30FA, - 0x30FD3099: 0x30FE, - 0x109910BA: 0x1109A, - 0x109B10BA: 0x1109C, - 0x10A510BA: 0x110AB, -} - -// Total size of tables: 50KB (50848 bytes) diff --git a/src/pkg/exp/norm/trie.go b/src/pkg/exp/norm/trie.go deleted file mode 100644 index 93cb9c3390..0000000000 --- a/src/pkg/exp/norm/trie.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -type valueRange struct { - value uint16 // header: value:stride - lo, hi byte // header: lo:n -} - -type trie struct { - index []uint8 - values []uint16 - sparse []valueRange - sparseOffset []uint16 - cutoff uint8 // indices >= cutoff are sparse -} - -// lookupValue determines the type of block n and looks up the value for b. -// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block -// is a list of ranges with an accompanying value. Given a matching range r, -// the value for b is by r.value + (b - r.lo) * stride. -func (t *trie) lookupValue(n uint8, b byte) uint16 { - if n < t.cutoff { - return t.values[uint16(n)<<6+uint16(b&maskx)] - } - offset := t.sparseOffset[n-t.cutoff] - header := t.sparse[offset] - lo := offset + 1 - hi := lo + uint16(header.lo) - for lo < hi { - m := lo + (hi-lo)/2 - r := t.sparse[m] - if r.lo <= b && b <= r.hi { - return r.value + uint16(b-r.lo)*header.value - } - if b < r.lo { - hi = m - } else { - lo = m + 1 - } - } - return 0 -} - -const ( - t1 = 0x00 // 0000 0000 - tx = 0x80 // 1000 0000 - t2 = 0xC0 // 1100 0000 - t3 = 0xE0 // 1110 0000 - t4 = 0xF0 // 1111 0000 - t5 = 0xF8 // 1111 1000 - t6 = 0xFC // 1111 1100 - te = 0xFE // 1111 1110 - - maskx = 0x3F // 0011 1111 - mask2 = 0x1F // 0001 1111 - mask3 = 0x0F // 0000 1111 - mask4 = 0x07 // 0000 0111 -) - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *trie) lookup(s []byte) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < tx: - return t.values[c0], 1 - case c0 < t2: - return 0, 1 - case c0 < t3: - if len(s) < 2 { - return 0, 0 - } - i := t.index[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - return t.lookupValue(i, c1), 2 - case c0 < t4: - if len(s) < 3 { - return 0, 0 - } - i := t.index[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - o := uint16(i)<<6 + uint16(c1)&maskx - i = t.index[o] - c2 := s[2] - if c2 < tx || t2 <= c2 { - return 0, 2 - } - return t.lookupValue(i, c2), 3 - case c0 < t5: - if len(s) < 4 { - return 0, 0 - } - i := t.index[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - o := uint16(i)<<6 + uint16(c1)&maskx - i = t.index[o] - c2 := s[2] - if c2 < tx || t2 <= c2 { - return 0, 2 - } - o = uint16(i)<<6 + uint16(c2)&maskx - i = t.index[o] - c3 := s[3] - if c3 < tx || t2 <= c3 { - return 0, 3 - } - return t.lookupValue(i, c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *trie) lookupString(s string) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < tx: - return t.values[c0], 1 - case c0 < t2: - return 0, 1 - case c0 < t3: - if len(s) < 2 { - return 0, 0 - } - i := t.index[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - return t.lookupValue(i, c1), 2 - case c0 < t4: - if len(s) < 3 { - return 0, 0 - } - i := t.index[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - o := uint16(i)<<6 + uint16(c1)&maskx - i = t.index[o] - c2 := s[2] - if c2 < tx || t2 <= c2 { - return 0, 2 - } - return t.lookupValue(i, c2), 3 - case c0 < t5: - if len(s) < 4 { - return 0, 0 - } - i := t.index[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - o := uint16(i)<<6 + uint16(c1)&maskx - i = t.index[o] - c2 := s[2] - if c2 < tx || t2 <= c2 { - return 0, 2 - } - o = uint16(i)<<6 + uint16(c2)&maskx - i = t.index[o] - c3 := s[3] - if c3 < tx || t2 <= c3 { - return 0, 3 - } - return t.lookupValue(i, c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must hold a full encoding. -func (t *trie) lookupUnsafe(s []byte) uint16 { - c0 := s[0] - if c0 < tx { - return t.values[c0] - } - if c0 < t2 { - return 0 - } - i := t.index[c0] - if c0 < t3 { - return t.lookupValue(i, s[1]) - } - i = t.index[uint16(i)<<6+uint16(s[1])&maskx] - if c0 < t4 { - return t.lookupValue(i, s[2]) - } - i = t.index[uint16(i)<<6+uint16(s[2])&maskx] - if c0 < t5 { - return t.lookupValue(i, s[3]) - } - return 0 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must hold a full encoding. -func (t *trie) lookupStringUnsafe(s string) uint16 { - c0 := s[0] - if c0 < tx { - return t.values[c0] - } - if c0 < t2 { - return 0 - } - i := t.index[c0] - if c0 < t3 { - return t.lookupValue(i, s[1]) - } - i = t.index[uint16(i)<<6+uint16(s[1])&maskx] - if c0 < t4 { - return t.lookupValue(i, s[2]) - } - i = t.index[uint16(i)<<6+uint16(s[2])&maskx] - if c0 < t5 { - return t.lookupValue(i, s[3]) - } - return 0 -} diff --git a/src/pkg/exp/norm/trie_test.go b/src/pkg/exp/norm/trie_test.go deleted file mode 100644 index c457c9d974..0000000000 --- a/src/pkg/exp/norm/trie_test.go +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package norm - -import ( - "testing" - "unicode/utf8" -) - -// Test data is located in triedata_test.go; generated by maketesttables. -var testdata = testdataTrie - -type rangeTest struct { - block uint8 - lookup byte - result uint16 - table []valueRange - offsets []uint16 -} - -var range1Off = []uint16{0, 2} -var range1 = []valueRange{ - {0, 1, 0}, - {1, 0x80, 0x80}, - {0, 2, 0}, - {1, 0x80, 0x80}, - {9, 0xff, 0xff}, -} - -var rangeTests = []rangeTest{ - {10, 0x80, 1, range1, range1Off}, - {10, 0x00, 0, range1, range1Off}, - {11, 0x80, 1, range1, range1Off}, - {11, 0xff, 9, range1, range1Off}, - {11, 0x00, 0, range1, range1Off}, -} - -func TestLookupSparse(t *testing.T) { - for i, test := range rangeTests { - n := trie{sparse: test.table, sparseOffset: test.offsets, cutoff: 10} - v := n.lookupValue(test.block, test.lookup) - if v != test.result { - t.Errorf("LookupSparse:%d: found %X; want %X", i, v, test.result) - } - } -} - -// Test cases for illegal runes. -type trietest struct { - size int - bytes []byte -} - -var tests = []trietest{ - // illegal runes - {1, []byte{0x80}}, - {1, []byte{0xFF}}, - {1, []byte{t2, tx - 1}}, - {1, []byte{t2, t2}}, - {2, []byte{t3, tx, tx - 1}}, - {2, []byte{t3, tx, t2}}, - {1, []byte{t3, tx - 1, tx}}, - {3, []byte{t4, tx, tx, tx - 1}}, - {3, []byte{t4, tx, tx, t2}}, - {1, []byte{t4, t2, tx, tx - 1}}, - {2, []byte{t4, tx, t2, tx - 1}}, - - // short runes - {0, []byte{t2}}, - {0, []byte{t3, tx}}, - {0, []byte{t4, tx, tx}}, - - // we only support UTF-8 up to utf8.UTFMax bytes (4 bytes) - {1, []byte{t5, tx, tx, tx, tx}}, - {1, []byte{t6, tx, tx, tx, tx, tx}}, -} - -func mkUTF8(r rune) ([]byte, int) { - var b [utf8.UTFMax]byte - sz := utf8.EncodeRune(b[:], r) - return b[:sz], sz -} - -func TestLookup(t *testing.T) { - for i, tt := range testRunes { - b, szg := mkUTF8(tt) - v, szt := testdata.lookup(b) - if int(v) != i { - t.Errorf("lookup(%U): found value %#x, expected %#x", tt, v, i) - } - if szt != szg { - t.Errorf("lookup(%U): found size %d, expected %d", tt, szt, szg) - } - } - for i, tt := range tests { - v, sz := testdata.lookup(tt.bytes) - if int(v) != 0 { - t.Errorf("lookup of illegal rune, case %d: found value %#x, expected 0", i, v) - } - if sz != tt.size { - t.Errorf("lookup of illegal rune, case %d: found size %d, expected %d", i, sz, tt.size) - } - } -} - -func TestLookupUnsafe(t *testing.T) { - for i, tt := range testRunes { - b, _ := mkUTF8(tt) - v := testdata.lookupUnsafe(b) - if int(v) != i { - t.Errorf("lookupUnsafe(%U): found value %#x, expected %#x", i, v, i) - } - } -} - -func TestLookupString(t *testing.T) { - for i, tt := range testRunes { - b, szg := mkUTF8(tt) - v, szt := testdata.lookupString(string(b)) - if int(v) != i { - t.Errorf("lookup(%U): found value %#x, expected %#x", i, v, i) - } - if szt != szg { - t.Errorf("lookup(%U): found size %d, expected %d", i, szt, szg) - } - } - for i, tt := range tests { - v, sz := testdata.lookupString(string(tt.bytes)) - if int(v) != 0 { - t.Errorf("lookup of illegal rune, case %d: found value %#x, expected 0", i, v) - } - if sz != tt.size { - t.Errorf("lookup of illegal rune, case %d: found size %d, expected %d", i, sz, tt.size) - } - } -} - -func TestLookupStringUnsafe(t *testing.T) { - for i, tt := range testRunes { - b, _ := mkUTF8(tt) - v := testdata.lookupStringUnsafe(string(b)) - if int(v) != i { - t.Errorf("lookupUnsafe(%U): found value %#x, expected %#x", i, v, i) - } - } -} diff --git a/src/pkg/exp/norm/triedata_test.go b/src/pkg/exp/norm/triedata_test.go deleted file mode 100644 index 7f6276096c..0000000000 --- a/src/pkg/exp/norm/triedata_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// Generated by running -// maketesttables -// DO NOT EDIT - -package norm - -var testRunes = []rune{1, 12, 127, 128, 256, 2047, 2048, 2457, 65535, 65536, 65793, 1114111, 512, 513, 514, 528, 533} - -// testdataValues: 192 entries, 384 bytes -// Block 2 is the null block. -var testdataValues = [192]uint16{ - // Block 0x0, offset 0x0 - 0x000c: 0x0001, - // Block 0x1, offset 0x40 - 0x007f: 0x0002, - // Block 0x2, offset 0x80 -} - -// testdataSparseOffset: 10 entries, 20 bytes -var testdataSparseOffset = []uint16{0x0, 0x2, 0x4, 0x8, 0xa, 0xc, 0xe, 0x10, 0x12, 0x14} - -// testdataSparseValues: 22 entries, 88 bytes -var testdataSparseValues = [22]valueRange{ - // Block 0x0, offset 0x1 - {value: 0x0000, lo: 0x01}, - {value: 0x0003, lo: 0x80, hi: 0x80}, - // Block 0x1, offset 0x2 - {value: 0x0000, lo: 0x01}, - {value: 0x0004, lo: 0x80, hi: 0x80}, - // Block 0x2, offset 0x3 - {value: 0x0001, lo: 0x03}, - {value: 0x000c, lo: 0x80, hi: 0x82}, - {value: 0x000f, lo: 0x90, hi: 0x90}, - {value: 0x0010, lo: 0x95, hi: 0x95}, - // Block 0x3, offset 0x4 - {value: 0x0000, lo: 0x01}, - {value: 0x0005, lo: 0xbf, hi: 0xbf}, - // Block 0x4, offset 0x5 - {value: 0x0000, lo: 0x01}, - {value: 0x0006, lo: 0x80, hi: 0x80}, - // Block 0x5, offset 0x6 - {value: 0x0000, lo: 0x01}, - {value: 0x0007, lo: 0x99, hi: 0x99}, - // Block 0x6, offset 0x7 - {value: 0x0000, lo: 0x01}, - {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0x7, offset 0x8 - {value: 0x0000, lo: 0x01}, - {value: 0x0009, lo: 0x80, hi: 0x80}, - // Block 0x8, offset 0x9 - {value: 0x0000, lo: 0x01}, - {value: 0x000a, lo: 0x81, hi: 0x81}, - // Block 0x9, offset 0xa - {value: 0x0000, lo: 0x01}, - {value: 0x000b, lo: 0xbf, hi: 0xbf}, -} - -// testdataLookup: 640 bytes -// Block 0 is the null block. -var testdataLookup = [640]uint8{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x0c2: 0x03, 0x0c4: 0x04, - 0x0c8: 0x05, - 0x0df: 0x06, - 0x0e0: 0x04, - 0x0ef: 0x05, - 0x0f0: 0x07, 0x0f4: 0x09, - // Block 0x4, offset 0x100 - 0x120: 0x07, 0x126: 0x08, - // Block 0x5, offset 0x140 - 0x17f: 0x09, - // Block 0x6, offset 0x180 - 0x180: 0x0a, 0x184: 0x0b, - // Block 0x7, offset 0x1c0 - 0x1d0: 0x06, - // Block 0x8, offset 0x200 - 0x23f: 0x0c, - // Block 0x9, offset 0x240 - 0x24f: 0x08, -} - -var testdataTrie = trie{testdataLookup[:], testdataValues[:], testdataSparseValues[:], testdataSparseOffset[:], 3} diff --git a/src/pkg/exp/norm/triegen.go b/src/pkg/exp/norm/triegen.go deleted file mode 100644 index 2e275a0625..0000000000 --- a/src/pkg/exp/norm/triegen.go +++ /dev/null @@ -1,314 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Trie table generator. -// Used by make*tables tools to generate a go file with trie data structures -// for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte -// sequence are used to lookup offsets in the index table to be used for the -// next byte. The last byte is used to index into a table with 16-bit values. - -package main - -import ( - "fmt" - "hash/crc32" - "log" - "unicode/utf8" -) - -const blockSize = 64 -const maxSparseEntries = 16 - -// Intermediate trie structure -type trieNode struct { - table [256]*trieNode - value int - b byte - leaf bool -} - -func newNode() *trieNode { - return new(trieNode) -} - -func (n trieNode) String() string { - s := fmt.Sprint("trieNode{table: { non-nil at index: ") - for i, v := range n.table { - if v != nil { - s += fmt.Sprintf("%d, ", i) - } - } - s += fmt.Sprintf("}, value:%#x, b:%#x leaf:%v}", n.value, n.b, n.leaf) - return s -} - -func (n trieNode) isInternal() bool { - internal := true - for i := 0; i < 256; i++ { - if nn := n.table[i]; nn != nil { - if !internal && !nn.leaf { - log.Fatalf("triegen: isInternal: node contains both leaf and non-leaf children (%v)", n) - } - internal = internal && !nn.leaf - } - } - return internal -} - -func (n trieNode) mostFrequentStride() int { - counts := make(map[int]int) - v := 0 - for _, t := range n.table[0x80 : 0x80+blockSize] { - if t != nil { - if stride := t.value - v; v != 0 && stride >= 0 { - counts[stride]++ - } - v = t.value - } else { - v = 0 - } - } - var maxs, maxc int - for stride, cnt := range counts { - if cnt > maxc || (cnt == maxc && stride < maxs) { - maxs, maxc = stride, cnt - } - } - return maxs -} - -func (n trieNode) countSparseEntries() int { - stride := n.mostFrequentStride() - var count, v int - for _, t := range n.table[0x80 : 0x80+blockSize] { - tv := 0 - if t != nil { - tv = t.value - } - if tv-v != stride { - if tv != 0 { - count++ - } - } - v = tv - } - return count -} - -func (n *trieNode) insert(r rune, value uint16) { - var p [utf8.UTFMax]byte - sz := utf8.EncodeRune(p[:], r) - - for i := 0; i < sz; i++ { - if n.leaf { - log.Fatalf("triegen: insert: node (%#v) should not be a leaf", n) - } - nn := n.table[p[i]] - if nn == nil { - nn = newNode() - nn.b = p[i] - n.table[p[i]] = nn - } - n = nn - } - n.value = int(value) - n.leaf = true -} - -type nodeIndex struct { - lookupBlocks []*trieNode - valueBlocks []*trieNode - sparseBlocks []*trieNode - sparseOffset []uint16 - sparseCount int - - lookupBlockIdx map[uint32]int - valueBlockIdx map[uint32]int -} - -func newIndex() *nodeIndex { - index := &nodeIndex{} - index.lookupBlocks = make([]*trieNode, 0) - index.valueBlocks = make([]*trieNode, 0) - index.sparseBlocks = make([]*trieNode, 0) - index.sparseOffset = make([]uint16, 1) - index.lookupBlockIdx = make(map[uint32]int) - index.valueBlockIdx = make(map[uint32]int) - return index -} - -func computeOffsets(index *nodeIndex, n *trieNode) int { - if n.leaf { - return n.value - } - hasher := crc32.New(crc32.MakeTable(crc32.IEEE)) - // We only index continuation bytes. - for i := 0; i < blockSize; i++ { - v := 0 - if nn := n.table[0x80+i]; nn != nil { - v = computeOffsets(index, nn) - } - hasher.Write([]byte{uint8(v >> 8), uint8(v)}) - } - h := hasher.Sum32() - if n.isInternal() { - v, ok := index.lookupBlockIdx[h] - if !ok { - v = len(index.lookupBlocks) - index.lookupBlocks = append(index.lookupBlocks, n) - index.lookupBlockIdx[h] = v - } - n.value = v - } else { - v, ok := index.valueBlockIdx[h] - if !ok { - if c := n.countSparseEntries(); c > maxSparseEntries { - v = len(index.valueBlocks) - index.valueBlocks = append(index.valueBlocks, n) - index.valueBlockIdx[h] = v - } else { - v = -len(index.sparseOffset) - index.sparseBlocks = append(index.sparseBlocks, n) - index.sparseOffset = append(index.sparseOffset, uint16(index.sparseCount)) - index.sparseCount += c + 1 - index.valueBlockIdx[h] = v - } - } - n.value = v - } - return n.value -} - -func printValueBlock(nr int, n *trieNode, offset int) { - boff := nr * blockSize - fmt.Printf("\n// Block %#x, offset %#x", nr, boff) - var printnewline bool - for i := 0; i < blockSize; i++ { - if i%6 == 0 { - printnewline = true - } - v := 0 - if nn := n.table[i+offset]; nn != nil { - v = nn.value - } - if v != 0 { - if printnewline { - fmt.Printf("\n") - printnewline = false - } - fmt.Printf("%#04x:%#04x, ", boff+i, v) - } - } -} - -func printSparseBlock(nr int, n *trieNode) { - boff := -n.value - fmt.Printf("\n// Block %#x, offset %#x", nr, boff) - v := 0 - //stride := f(n) - stride := n.mostFrequentStride() - c := n.countSparseEntries() - fmt.Printf("\n{value:%#04x,lo:%#02x},", stride, uint8(c)) - for i, nn := range n.table[0x80 : 0x80+blockSize] { - nv := 0 - if nn != nil { - nv = nn.value - } - if nv-v != stride { - if v != 0 { - fmt.Printf(",hi:%#02x},", 0x80+i-1) - } - if nv != 0 { - fmt.Printf("\n{value:%#04x,lo:%#02x", nv, nn.b) - } - } - v = nv - } - if v != 0 { - fmt.Printf(",hi:%#02x},", 0x80+blockSize-1) - } -} - -func printLookupBlock(nr int, n *trieNode, offset, cutoff int) { - boff := nr * blockSize - fmt.Printf("\n// Block %#x, offset %#x", nr, boff) - var printnewline bool - for i := 0; i < blockSize; i++ { - if i%8 == 0 { - printnewline = true - } - v := 0 - if nn := n.table[i+offset]; nn != nil { - v = nn.value - } - if v != 0 { - if v < 0 { - v = -v - 1 + cutoff - } - if printnewline { - fmt.Printf("\n") - printnewline = false - } - fmt.Printf("%#03x:%#02x, ", boff+i, v) - } - } -} - -// printTables returns the size in bytes of the generated tables. -func (t *trieNode) printTables(name string) int { - index := newIndex() - // Values for 7-bit ASCII are stored in first two block, followed by nil block. - index.valueBlocks = append(index.valueBlocks, nil, nil, nil) - // First byte of multi-byte UTF-8 codepoints are indexed in 4th block. - index.lookupBlocks = append(index.lookupBlocks, nil, nil, nil, nil) - // Index starter bytes of multi-byte UTF-8. - for i := 0xC0; i < 0x100; i++ { - if t.table[i] != nil { - computeOffsets(index, t.table[i]) - } - } - - nv := len(index.valueBlocks) * blockSize - fmt.Printf("// %sValues: %d entries, %d bytes\n", name, nv, nv*2) - fmt.Printf("// Block 2 is the null block.\n") - fmt.Printf("var %sValues = [%d]uint16 {", name, nv) - printValueBlock(0, t, 0) - printValueBlock(1, t, 64) - printValueBlock(2, newNode(), 0) - for i := 3; i < len(index.valueBlocks); i++ { - printValueBlock(i, index.valueBlocks[i], 0x80) - } - fmt.Print("\n}\n\n") - - ls := len(index.sparseBlocks) - fmt.Printf("// %sSparseOffset: %d entries, %d bytes\n", name, ls, ls*2) - fmt.Printf("var %sSparseOffset = %#v\n\n", name, index.sparseOffset[1:]) - - ns := index.sparseCount - fmt.Printf("// %sSparseValues: %d entries, %d bytes\n", name, ns, ns*4) - fmt.Printf("var %sSparseValues = [%d]valueRange {", name, ns) - for i, n := range index.sparseBlocks { - printSparseBlock(i, n) - } - fmt.Print("\n}\n\n") - - cutoff := len(index.valueBlocks) - ni := len(index.lookupBlocks) * blockSize - fmt.Printf("// %sLookup: %d bytes\n", name, ni) - fmt.Printf("// Block 0 is the null block.\n") - fmt.Printf("var %sLookup = [%d]uint8 {", name, ni) - printLookupBlock(0, newNode(), 0, cutoff) - printLookupBlock(1, newNode(), 0, cutoff) - printLookupBlock(2, newNode(), 0, cutoff) - printLookupBlock(3, t, 0xC0, cutoff) - for i := 4; i < len(index.lookupBlocks); i++ { - printLookupBlock(i, index.lookupBlocks[i], 0x80, cutoff) - } - fmt.Print("\n}\n\n") - fmt.Printf("var %sTrie = trie{ %sLookup[:], %sValues[:], %sSparseValues[:], %sSparseOffset[:], %d}\n\n", - name, name, name, name, name, cutoff) - return nv*2 + ns*4 + ni + ls*2 -} diff --git a/src/pkg/exp/proxy/direct.go b/src/pkg/exp/proxy/direct.go deleted file mode 100644 index 4c5ad88b1e..0000000000 --- a/src/pkg/exp/proxy/direct.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "net" -) - -type direct struct{} - -// Direct is a direct proxy: one that makes network connections directly. -var Direct = direct{} - -func (direct) Dial(network, addr string) (net.Conn, error) { - return net.Dial(network, addr) -} diff --git a/src/pkg/exp/proxy/per_host.go b/src/pkg/exp/proxy/per_host.go deleted file mode 100644 index 0c627e9ab5..0000000000 --- a/src/pkg/exp/proxy/per_host.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "net" - "strings" -) - -// A PerHost directs connections to a default Dailer unless the hostname -// requested matches one of a number of exceptions. -type PerHost struct { - def, bypass Dialer - - bypassNetworks []*net.IPNet - bypassIPs []net.IP - bypassZones []string - bypassHosts []string -} - -// NewPerHost returns a PerHost Dialer that directs connections to either -// defaultDialer or bypass, depending on whether the connection matches one of -// the configured rules. -func NewPerHost(defaultDialer, bypass Dialer) *PerHost { - return &PerHost{ - def: defaultDialer, - bypass: bypass, - } -} - -// Dial connects to the address addr on the network net through either -// defaultDialer or bypass. -func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) { - host, _, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - - return p.dialerForRequest(host).Dial(network, addr) -} - -func (p *PerHost) dialerForRequest(host string) Dialer { - if ip := net.ParseIP(host); ip != nil { - for _, net := range p.bypassNetworks { - if net.Contains(ip) { - return p.bypass - } - } - for _, bypassIP := range p.bypassIPs { - if bypassIP.Equal(ip) { - return p.bypass - } - } - return p.def - } - - for _, zone := range p.bypassZones { - if strings.HasSuffix(host, zone) { - return p.bypass - } - if host == zone[1:] { - // For a zone "example.com", we match "example.com" - // too. - return p.bypass - } - } - for _, bypassHost := range p.bypassHosts { - if bypassHost == host { - return p.bypass - } - } - return p.def -} - -// AddFromString parses a string that contains comma-separated values -// specifying hosts that should use the bypass proxy. Each value is either an -// IP address, a CIDR range, a zone (*.example.com) or a hostname -// (localhost). A best effort is made to parse the string and errors are -// ignored. -func (p *PerHost) AddFromString(s string) { - hosts := strings.Split(s, ",") - for _, host := range hosts { - host = strings.TrimSpace(host) - if len(host) == 0 { - continue - } - if strings.Contains(host, "/") { - // We assume that it's a CIDR address like 127.0.0.0/8 - if _, net, err := net.ParseCIDR(host); err == nil { - p.AddNetwork(net) - } - continue - } - if ip := net.ParseIP(host); ip != nil { - p.AddIP(ip) - continue - } - if strings.HasPrefix(host, "*.") { - p.AddZone(host[1:]) - continue - } - p.AddHost(host) - } -} - -// AddIP specifies an IP address that will use the bypass proxy. Note that -// this will only take effect if a literal IP address is dialed. A connection -// to a named host will never match an IP. -func (p *PerHost) AddIP(ip net.IP) { - p.bypassIPs = append(p.bypassIPs, ip) -} - -// AddIP specifies an IP range that will use the bypass proxy. Note that this -// will only take effect if a literal IP address is dialed. A connection to a -// named host will never match. -func (p *PerHost) AddNetwork(net *net.IPNet) { - p.bypassNetworks = append(p.bypassNetworks, net) -} - -// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of -// "example.com" matches "example.com" and all of its subdomains. -func (p *PerHost) AddZone(zone string) { - if strings.HasSuffix(zone, ".") { - zone = zone[:len(zone)-1] - } - if !strings.HasPrefix(zone, ".") { - zone = "." + zone - } - p.bypassZones = append(p.bypassZones, zone) -} - -// AddHost specifies a hostname that will use the bypass proxy. -func (p *PerHost) AddHost(host string) { - if strings.HasSuffix(host, ".") { - host = host[:len(host)-1] - } - p.bypassHosts = append(p.bypassHosts, host) -} diff --git a/src/pkg/exp/proxy/per_host_test.go b/src/pkg/exp/proxy/per_host_test.go deleted file mode 100644 index a7d8095711..0000000000 --- a/src/pkg/exp/proxy/per_host_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "errors" - "net" - "reflect" - "testing" -) - -type recordingProxy struct { - addrs []string -} - -func (r *recordingProxy) Dial(network, addr string) (net.Conn, error) { - r.addrs = append(r.addrs, addr) - return nil, errors.New("recordingProxy") -} - -func TestPerHost(t *testing.T) { - var def, bypass recordingProxy - perHost := NewPerHost(&def, &bypass) - perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16") - - expectedDef := []string{ - "example.com:123", - "1.2.3.4:123", - "[1001::]:123", - } - expectedBypass := []string{ - "localhost:123", - "zone:123", - "foo.zone:123", - "127.0.0.1:123", - "10.1.2.3:123", - "[1000::]:123", - } - - for _, addr := range expectedDef { - perHost.Dial("tcp", addr) - } - for _, addr := range expectedBypass { - perHost.Dial("tcp", addr) - } - - if !reflect.DeepEqual(expectedDef, def.addrs) { - t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef) - } - if !reflect.DeepEqual(expectedBypass, bypass.addrs) { - t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass) - } -} diff --git a/src/pkg/exp/proxy/proxy.go b/src/pkg/exp/proxy/proxy.go deleted file mode 100644 index b6cfd45108..0000000000 --- a/src/pkg/exp/proxy/proxy.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package proxy provides support for a variety of protocols to proxy network -// data. -package proxy - -import ( - "errors" - "net" - "net/url" - "os" -) - -// A Dialer is a means to establish a connection. -type Dialer interface { - // Dial connects to the given address via the proxy. - Dial(network, addr string) (c net.Conn, err error) -} - -// Auth contains authentication parameters that specific Dialers may require. -type Auth struct { - User, Password string -} - -// DefaultDialer returns the dialer specified by the proxy related variables in -// the environment. -func FromEnvironment() Dialer { - allProxy := os.Getenv("all_proxy") - if len(allProxy) == 0 { - return Direct - } - - proxyURL, err := url.Parse(allProxy) - if err != nil { - return Direct - } - proxy, err := FromURL(proxyURL, Direct) - if err != nil { - return Direct - } - - noProxy := os.Getenv("no_proxy") - if len(noProxy) == 0 { - return proxy - } - - perHost := NewPerHost(proxy, Direct) - perHost.AddFromString(noProxy) - return perHost -} - -// proxySchemes is a map from URL schemes to a function that creates a Dialer -// from a URL with such a scheme. -var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error) - -// RegisterDialerType takes a URL scheme and a function to generate Dialers from -// a URL with that scheme and a forwarding Dialer. Registered schemes are used -// by FromURL. -func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) { - if proxySchemes == nil { - proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error)) - } - proxySchemes[scheme] = f -} - -// FromURL returns a Dialer given a URL specification and an underlying -// Dialer for it to make network requests. -func FromURL(u *url.URL, forward Dialer) (Dialer, error) { - var auth *Auth - if u.User != nil { - auth = new(Auth) - auth.User = u.User.Username() - if p, ok := u.User.Password(); ok { - auth.Password = p - } - } - - switch u.Scheme { - case "socks5": - return SOCKS5("tcp", u.Host, auth, forward) - } - - // If the scheme doesn't match any of the built-in schemes, see if it - // was registered by another package. - if proxySchemes != nil { - if f, ok := proxySchemes[u.Scheme]; ok { - return f(u, forward) - } - } - - return nil, errors.New("proxy: unknown scheme: " + u.Scheme) -} diff --git a/src/pkg/exp/proxy/proxy_test.go b/src/pkg/exp/proxy/proxy_test.go deleted file mode 100644 index 4078bc76ae..0000000000 --- a/src/pkg/exp/proxy/proxy_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "net" - "net/url" - "testing" -) - -type testDialer struct { - network, addr string -} - -func (t *testDialer) Dial(network, addr string) (net.Conn, error) { - t.network = network - t.addr = addr - return nil, t -} - -func (t *testDialer) Error() string { - return "testDialer " + t.network + " " + t.addr -} - -func TestFromURL(t *testing.T) { - u, err := url.Parse("socks5://user:password@1.2.3.4:5678") - if err != nil { - t.Fatalf("failed to parse URL: %s", err) - } - - tp := &testDialer{} - proxy, err := FromURL(u, tp) - if err != nil { - t.Fatalf("FromURL failed: %s", err) - } - - conn, err := proxy.Dial("tcp", "example.com:80") - if conn != nil { - t.Error("Dial unexpected didn't return an error") - } - if tp, ok := err.(*testDialer); ok { - if tp.network != "tcp" || tp.addr != "1.2.3.4:5678" { - t.Errorf("Dialer connected to wrong host. Wanted 1.2.3.4:5678, got: %v", tp) - } - } else { - t.Errorf("Unexpected error from Dial: %s", err) - } -} diff --git a/src/pkg/exp/proxy/socks5.go b/src/pkg/exp/proxy/socks5.go deleted file mode 100644 index 62fa5c9296..0000000000 --- a/src/pkg/exp/proxy/socks5.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "errors" - "io" - "net" - "strconv" -) - -// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address -// with an optional username and password. See RFC 1928. -func SOCKS5(network, addr string, auth *Auth, forward Dialer) (Dialer, error) { - s := &socks5{ - network: network, - addr: addr, - forward: forward, - } - if auth != nil { - s.user = auth.User - s.password = auth.Password - } - - return s, nil -} - -type socks5 struct { - user, password string - network, addr string - forward Dialer -} - -const socks5Version = 5 - -const ( - socks5AuthNone = 0 - socks5AuthPassword = 2 -) - -const socks5Connect = 1 - -const ( - socks5IP4 = 1 - socks5Domain = 3 - socks5IP6 = 4 -) - -var socks5Errors = []string{ - "", - "general failure", - "connection forbidden", - "network unreachable", - "host unreachable", - "connection refused", - "TTL expired", - "command not supported", - "address type not supported", -} - -// Dial connects to the address addr on the network net via the SOCKS5 proxy. -func (s *socks5) Dial(network, addr string) (net.Conn, error) { - switch network { - case "tcp", "tcp6", "tcp4": - break - default: - return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network) - } - - conn, err := s.forward.Dial(s.network, s.addr) - if err != nil { - return nil, err - } - closeConn := &conn - defer func() { - if closeConn != nil { - (*closeConn).Close() - } - }() - - host, portStr, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - - port, err := strconv.Atoi(portStr) - if err != nil { - return nil, errors.New("proxy: failed to parse port number: " + portStr) - } - if port < 1 || port > 0xffff { - return nil, errors.New("proxy: port number out of range: " + portStr) - } - - // the size here is just an estimate - buf := make([]byte, 0, 6+len(host)) - - buf = append(buf, socks5Version) - if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 { - buf = append(buf, 2 /* num auth methods */, socks5AuthNone, socks5AuthPassword) - } else { - buf = append(buf, 1 /* num auth methods */, socks5AuthNone) - } - - if _, err = conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err = io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - if buf[0] != 5 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) - } - if buf[1] == 0xff { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") - } - - if buf[1] == socks5AuthPassword { - buf = buf[:0] - buf = append(buf, socks5Version) - buf = append(buf, uint8(len(s.user))) - buf = append(buf, s.user...) - buf = append(buf, uint8(len(s.password))) - buf = append(buf, s.password...) - - if _, err = conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err = io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if buf[1] != 0 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") - } - } - - buf = buf[:0] - buf = append(buf, socks5Version, socks5Connect, 0 /* reserved */) - - if ip := net.ParseIP(host); ip != nil { - if len(ip) == 4 { - buf = append(buf, socks5IP4) - } else { - buf = append(buf, socks5IP6) - } - buf = append(buf, []byte(ip)...) - } else { - buf = append(buf, socks5Domain) - buf = append(buf, byte(len(host))) - buf = append(buf, host...) - } - buf = append(buf, byte(port>>8), byte(port)) - - if _, err = conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err = io.ReadFull(conn, buf[:4]); err != nil { - return nil, errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - failure := "unknown error" - if int(buf[1]) < len(socks5Errors) { - failure = socks5Errors[buf[1]] - } - - if len(failure) > 0 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) - } - - bytesToDiscard := 0 - switch buf[3] { - case socks5IP4: - bytesToDiscard = 4 - case socks5IP6: - bytesToDiscard = 16 - case socks5Domain: - _, err := io.ReadFull(conn, buf[:1]) - if err != nil { - return nil, errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - bytesToDiscard = int(buf[0]) - default: - return nil, errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) - } - - if cap(buf) < bytesToDiscard { - buf = make([]byte, bytesToDiscard) - } else { - buf = buf[:bytesToDiscard] - } - if _, err = io.ReadFull(conn, buf); err != nil { - return nil, errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - // Also need to discard the port number - if _, err = io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - closeConn = nil - return conn, nil -} diff --git a/src/pkg/exp/terminal/terminal.go b/src/pkg/exp/terminal/terminal.go deleted file mode 100644 index c1ed0c0c44..0000000000 --- a/src/pkg/exp/terminal/terminal.go +++ /dev/null @@ -1,520 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package terminal - -import ( - "io" - "sync" -) - -// EscapeCodes contains escape sequences that can be written to the terminal in -// order to achieve different styles of text. -type EscapeCodes struct { - // Foreground colors - Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte - - // Reset all attributes - Reset []byte -} - -var vt100EscapeCodes = EscapeCodes{ - Black: []byte{keyEscape, '[', '3', '0', 'm'}, - Red: []byte{keyEscape, '[', '3', '1', 'm'}, - Green: []byte{keyEscape, '[', '3', '2', 'm'}, - Yellow: []byte{keyEscape, '[', '3', '3', 'm'}, - Blue: []byte{keyEscape, '[', '3', '4', 'm'}, - Magenta: []byte{keyEscape, '[', '3', '5', 'm'}, - Cyan: []byte{keyEscape, '[', '3', '6', 'm'}, - White: []byte{keyEscape, '[', '3', '7', 'm'}, - - Reset: []byte{keyEscape, '[', '0', 'm'}, -} - -// Terminal contains the state for running a VT100 terminal that is capable of -// reading lines of input. -type Terminal struct { - // AutoCompleteCallback, if non-null, is called for each keypress - // with the full input line and the current position of the cursor. - // If it returns a nil newLine, the key press is processed normally. - // Otherwise it returns a replacement line and the new cursor position. - AutoCompleteCallback func(line []byte, pos, key int) (newLine []byte, newPos int) - - // Escape contains a pointer to the escape codes for this terminal. - // It's always a valid pointer, although the escape codes themselves - // may be empty if the terminal doesn't support them. - Escape *EscapeCodes - - // lock protects the terminal and the state in this object from - // concurrent processing of a key press and a Write() call. - lock sync.Mutex - - c io.ReadWriter - prompt string - - // line is the current line being entered. - line []byte - // pos is the logical position of the cursor in line - pos int - // echo is true if local echo is enabled - echo bool - - // cursorX contains the current X value of the cursor where the left - // edge is 0. cursorY contains the row number where the first row of - // the current line is 0. - cursorX, cursorY int - // maxLine is the greatest value of cursorY so far. - maxLine int - - termWidth, termHeight int - - // outBuf contains the terminal data to be sent. - outBuf []byte - // remainder contains the remainder of any partial key sequences after - // a read. It aliases into inBuf. - remainder []byte - inBuf [256]byte -} - -// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is -// a local terminal, that terminal must first have been put into raw mode. -// prompt is a string that is written at the start of each input line (i.e. -// "> "). -func NewTerminal(c io.ReadWriter, prompt string) *Terminal { - return &Terminal{ - Escape: &vt100EscapeCodes, - c: c, - prompt: prompt, - termWidth: 80, - termHeight: 24, - echo: true, - } -} - -const ( - keyCtrlD = 4 - keyEnter = '\r' - keyEscape = 27 - keyBackspace = 127 - keyUnknown = 256 + iota - keyUp - keyDown - keyLeft - keyRight - keyAltLeft - keyAltRight -) - -// bytesToKey tries to parse a key sequence from b. If successful, it returns -// the key and the remainder of the input. Otherwise it returns -1. -func bytesToKey(b []byte) (int, []byte) { - if len(b) == 0 { - return -1, nil - } - - if b[0] != keyEscape { - return int(b[0]), b[1:] - } - - if len(b) >= 3 && b[0] == keyEscape && b[1] == '[' { - switch b[2] { - case 'A': - return keyUp, b[3:] - case 'B': - return keyDown, b[3:] - case 'C': - return keyRight, b[3:] - case 'D': - return keyLeft, b[3:] - } - } - - if len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' { - switch b[5] { - case 'C': - return keyAltRight, b[6:] - case 'D': - return keyAltLeft, b[6:] - } - } - - // If we get here then we have a key that we don't recognise, or a - // partial sequence. It's not clear how one should find the end of a - // sequence without knowing them all, but it seems that [a-zA-Z] only - // appears at the end of a sequence. - for i, c := range b[0:] { - if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' { - return keyUnknown, b[i+1:] - } - } - - return -1, b -} - -// queue appends data to the end of t.outBuf -func (t *Terminal) queue(data []byte) { - t.outBuf = append(t.outBuf, data...) -} - -var eraseUnderCursor = []byte{' ', keyEscape, '[', 'D'} -var space = []byte{' '} - -func isPrintable(key int) bool { - return key >= 32 && key < 127 -} - -// moveCursorToPos appends data to t.outBuf which will move the cursor to the -// given, logical position in the text. -func (t *Terminal) moveCursorToPos(pos int) { - if !t.echo { - return - } - - x := len(t.prompt) + pos - y := x / t.termWidth - x = x % t.termWidth - - up := 0 - if y < t.cursorY { - up = t.cursorY - y - } - - down := 0 - if y > t.cursorY { - down = y - t.cursorY - } - - left := 0 - if x < t.cursorX { - left = t.cursorX - x - } - - right := 0 - if x > t.cursorX { - right = x - t.cursorX - } - - t.cursorX = x - t.cursorY = y - t.move(up, down, left, right) -} - -func (t *Terminal) move(up, down, left, right int) { - movement := make([]byte, 3*(up+down+left+right)) - m := movement - for i := 0; i < up; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'A' - m = m[3:] - } - for i := 0; i < down; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'B' - m = m[3:] - } - for i := 0; i < left; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'D' - m = m[3:] - } - for i := 0; i < right; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'C' - m = m[3:] - } - - t.queue(movement) -} - -func (t *Terminal) clearLineToRight() { - op := []byte{keyEscape, '[', 'K'} - t.queue(op) -} - -const maxLineLength = 4096 - -// handleKey processes the given key and, optionally, returns a line of text -// that the user has entered. -func (t *Terminal) handleKey(key int) (line string, ok bool) { - switch key { - case keyBackspace: - if t.pos == 0 { - return - } - t.pos-- - t.moveCursorToPos(t.pos) - - copy(t.line[t.pos:], t.line[1+t.pos:]) - t.line = t.line[:len(t.line)-1] - if t.echo { - t.writeLine(t.line[t.pos:]) - } - t.queue(eraseUnderCursor) - t.moveCursorToPos(t.pos) - case keyAltLeft: - // move left by a word. - if t.pos == 0 { - return - } - t.pos-- - for t.pos > 0 { - if t.line[t.pos] != ' ' { - break - } - t.pos-- - } - for t.pos > 0 { - if t.line[t.pos] == ' ' { - t.pos++ - break - } - t.pos-- - } - t.moveCursorToPos(t.pos) - case keyAltRight: - // move right by a word. - for t.pos < len(t.line) { - if t.line[t.pos] == ' ' { - break - } - t.pos++ - } - for t.pos < len(t.line) { - if t.line[t.pos] != ' ' { - break - } - t.pos++ - } - t.moveCursorToPos(t.pos) - case keyLeft: - if t.pos == 0 { - return - } - t.pos-- - t.moveCursorToPos(t.pos) - case keyRight: - if t.pos == len(t.line) { - return - } - t.pos++ - t.moveCursorToPos(t.pos) - case keyEnter: - t.moveCursorToPos(len(t.line)) - t.queue([]byte("\r\n")) - line = string(t.line) - ok = true - t.line = t.line[:0] - t.pos = 0 - t.cursorX = 0 - t.cursorY = 0 - t.maxLine = 0 - default: - if t.AutoCompleteCallback != nil { - t.lock.Unlock() - newLine, newPos := t.AutoCompleteCallback(t.line, t.pos, key) - t.lock.Lock() - - if newLine != nil { - if t.echo { - t.moveCursorToPos(0) - t.writeLine(newLine) - for i := len(newLine); i < len(t.line); i++ { - t.writeLine(space) - } - t.moveCursorToPos(newPos) - } - t.line = newLine - t.pos = newPos - return - } - } - if !isPrintable(key) { - return - } - if len(t.line) == maxLineLength { - return - } - if len(t.line) == cap(t.line) { - newLine := make([]byte, len(t.line), 2*(1+len(t.line))) - copy(newLine, t.line) - t.line = newLine - } - t.line = t.line[:len(t.line)+1] - copy(t.line[t.pos+1:], t.line[t.pos:]) - t.line[t.pos] = byte(key) - if t.echo { - t.writeLine(t.line[t.pos:]) - } - t.pos++ - t.moveCursorToPos(t.pos) - } - return -} - -func (t *Terminal) writeLine(line []byte) { - for len(line) != 0 { - remainingOnLine := t.termWidth - t.cursorX - todo := len(line) - if todo > remainingOnLine { - todo = remainingOnLine - } - t.queue(line[:todo]) - t.cursorX += todo - line = line[todo:] - - if t.cursorX == t.termWidth { - t.cursorX = 0 - t.cursorY++ - if t.cursorY > t.maxLine { - t.maxLine = t.cursorY - } - } - } -} - -func (t *Terminal) Write(buf []byte) (n int, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - if t.cursorX == 0 && t.cursorY == 0 { - // This is the easy case: there's nothing on the screen that we - // have to move out of the way. - return t.c.Write(buf) - } - - // We have a prompt and possibly user input on the screen. We - // have to clear it first. - t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */) - t.cursorX = 0 - t.clearLineToRight() - - for t.cursorY > 0 { - t.move(1 /* up */, 0, 0, 0) - t.cursorY-- - t.clearLineToRight() - } - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - - if n, err = t.c.Write(buf); err != nil { - return - } - - t.queue([]byte(t.prompt)) - chars := len(t.prompt) - if t.echo { - t.queue(t.line) - chars += len(t.line) - } - t.cursorX = chars % t.termWidth - t.cursorY = chars / t.termWidth - t.moveCursorToPos(t.pos) - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - return -} - -// ReadPassword temporarily changes the prompt and reads a password, without -// echo, from the terminal. -func (t *Terminal) ReadPassword(prompt string) (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - oldPrompt := t.prompt - t.prompt = prompt - t.echo = false - - line, err = t.readLine() - - t.prompt = oldPrompt - t.echo = true - - return -} - -// ReadLine returns a line of input from the terminal. -func (t *Terminal) ReadLine() (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - return t.readLine() -} - -func (t *Terminal) readLine() (line string, err error) { - // t.lock must be held at this point - - if t.cursorX == 0 && t.cursorY == 0 { - t.writeLine([]byte(t.prompt)) - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - } - - for { - rest := t.remainder - lineOk := false - for !lineOk { - var key int - key, rest = bytesToKey(rest) - if key < 0 { - break - } - if key == keyCtrlD { - return "", io.EOF - } - line, lineOk = t.handleKey(key) - } - if len(rest) > 0 { - n := copy(t.inBuf[:], rest) - t.remainder = t.inBuf[:n] - } else { - t.remainder = nil - } - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - if lineOk { - return - } - - // t.remainder is a slice at the beginning of t.inBuf - // containing a partial key sequence - readBuf := t.inBuf[len(t.remainder):] - var n int - - t.lock.Unlock() - n, err = t.c.Read(readBuf) - t.lock.Lock() - - if err != nil { - return - } - - t.remainder = t.inBuf[:n+len(t.remainder)] - } - panic("unreachable") -} - -// SetPrompt sets the prompt to be used when reading subsequent lines. -func (t *Terminal) SetPrompt(prompt string) { - t.lock.Lock() - defer t.lock.Unlock() - - t.prompt = prompt -} - -func (t *Terminal) SetSize(width, height int) { - t.lock.Lock() - defer t.lock.Unlock() - - t.termWidth, t.termHeight = width, height -} diff --git a/src/pkg/exp/terminal/terminal_test.go b/src/pkg/exp/terminal/terminal_test.go deleted file mode 100644 index a2197210e2..0000000000 --- a/src/pkg/exp/terminal/terminal_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package terminal - -import ( - "io" - "testing" -) - -type MockTerminal struct { - toSend []byte - bytesPerRead int - received []byte -} - -func (c *MockTerminal) Read(data []byte) (n int, err error) { - n = len(data) - if n == 0 { - return - } - if n > len(c.toSend) { - n = len(c.toSend) - } - if n == 0 { - return 0, io.EOF - } - if c.bytesPerRead > 0 && n > c.bytesPerRead { - n = c.bytesPerRead - } - copy(data, c.toSend[:n]) - c.toSend = c.toSend[n:] - return -} - -func (c *MockTerminal) Write(data []byte) (n int, err error) { - c.received = append(c.received, data...) - return len(data), nil -} - -func TestClose(t *testing.T) { - c := &MockTerminal{} - ss := NewTerminal(c, "> ") - line, err := ss.ReadLine() - if line != "" { - t.Errorf("Expected empty line but got: %s", line) - } - if err != io.EOF { - t.Errorf("Error should have been EOF but got: %s", err) - } -} - -var keyPressTests = []struct { - in string - line string - err error -}{ - { - "", - "", - io.EOF, - }, - { - "\r", - "", - nil, - }, - { - "foo\r", - "foo", - nil, - }, - { - "a\x1b[Cb\r", // right - "ab", - nil, - }, - { - "a\x1b[Db\r", // left - "ba", - nil, - }, - { - "a\177b\r", // backspace - "b", - nil, - }, -} - -func TestKeyPresses(t *testing.T) { - for i, test := range keyPressTests { - for j := 0; j < len(test.in); j++ { - c := &MockTerminal{ - toSend: []byte(test.in), - bytesPerRead: j, - } - ss := NewTerminal(c, "> ") - line, err := ss.ReadLine() - if line != test.line { - t.Errorf("Line resulting from test %d (%d bytes per read) was '%s', expected '%s'", i, j, line, test.line) - break - } - if err != test.err { - t.Errorf("Error resulting from test %d (%d bytes per read) was '%v', expected '%v'", i, j, err, test.err) - break - } - } - } -} diff --git a/src/pkg/exp/terminal/util.go b/src/pkg/exp/terminal/util.go deleted file mode 100644 index 67b287ca6d..0000000000 --- a/src/pkg/exp/terminal/util.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal - -import ( - "io" - "syscall" - "unsafe" -) - -// State contains the state of a terminal. -type State struct { - termios syscall.Termios -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCGETS), uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - var oldState State - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCGETS), uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 0 { - return nil, err - } - - newState := oldState.termios - newState.Iflag &^= syscall.ISTRIP | syscall.INLCR | syscall.ICRNL | syscall.IGNCR | syscall.IXON | syscall.IXOFF - newState.Lflag &^= syscall.ECHO | syscall.ICANON | syscall.ISIG - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCSETS), uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 { - return nil, err - } - - return &oldState, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCSETS), uintptr(unsafe.Pointer(&state.termios)), 0, 0, 0) - return err -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - var dimensions [4]uint16 - - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&dimensions)), 0, 0, 0); err != 0 { - return -1, -1, err - } - return int(dimensions[1]), int(dimensions[0]), nil -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - var oldState syscall.Termios - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCGETS), uintptr(unsafe.Pointer(&oldState)), 0, 0, 0); err != 0 { - return nil, err - } - - newState := oldState - newState.Lflag &^= syscall.ECHO - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCSETS), uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 { - return nil, err - } - - defer func() { - syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), uintptr(syscall.TCSETS), uintptr(unsafe.Pointer(&oldState)), 0, 0, 0) - }() - - var buf [16]byte - var ret []byte - for { - n, err := syscall.Read(fd, buf[:]) - if err != nil { - return nil, err - } - if n == 0 { - if len(ret) == 0 { - return nil, io.EOF - } - break - } - if buf[n-1] == '\n' { - n-- - } - ret = append(ret, buf[:n]...) - if n < len(buf) { - break - } - } - - return ret, nil -} diff --git a/src/pkg/exp/types/check.go b/src/pkg/exp/types/check.go deleted file mode 100644 index ae0beb4e9b..0000000000 --- a/src/pkg/exp/types/check.go +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements the Check function, which typechecks a package. - -package types - -import ( - "fmt" - "go/ast" - "go/scanner" - "go/token" - "strconv" -) - -const debug = false - -type checker struct { - fset *token.FileSet - errors scanner.ErrorList - types map[ast.Expr]Type -} - -func (c *checker) errorf(pos token.Pos, format string, args ...interface{}) string { - msg := fmt.Sprintf(format, args...) - c.errors.Add(c.fset.Position(pos), msg) - return msg -} - -// collectFields collects struct fields tok = token.STRUCT), interface methods -// (tok = token.INTERFACE), and function arguments/results (tok = token.FUNC). -func (c *checker) collectFields(tok token.Token, list *ast.FieldList, cycleOk bool) (fields ObjList, tags []string, isVariadic bool) { - if list != nil { - for _, field := range list.List { - ftype := field.Type - if t, ok := ftype.(*ast.Ellipsis); ok { - ftype = t.Elt - isVariadic = true - } - typ := c.makeType(ftype, cycleOk) - tag := "" - if field.Tag != nil { - assert(field.Tag.Kind == token.STRING) - tag, _ = strconv.Unquote(field.Tag.Value) - } - if len(field.Names) > 0 { - // named fields - for _, name := range field.Names { - obj := name.Obj - obj.Type = typ - fields = append(fields, obj) - if tok == token.STRUCT { - tags = append(tags, tag) - } - } - } else { - // anonymous field - switch tok { - case token.STRUCT: - tags = append(tags, tag) - fallthrough - case token.FUNC: - obj := ast.NewObj(ast.Var, "") - obj.Type = typ - fields = append(fields, obj) - case token.INTERFACE: - utyp := Underlying(typ) - if typ, ok := utyp.(*Interface); ok { - // TODO(gri) This is not good enough. Check for double declarations! - fields = append(fields, typ.Methods...) - } else if _, ok := utyp.(*Bad); !ok { - // if utyp is Bad, don't complain (the root cause was reported before) - c.errorf(ftype.Pos(), "interface contains embedded non-interface type") - } - default: - panic("unreachable") - } - } - } - } - return -} - -// makeType makes a new type for an AST type specification x or returns -// the type referred to by a type name x. If cycleOk is set, a type may -// refer to itself directly or indirectly; otherwise cycles are errors. -// -func (c *checker) makeType(x ast.Expr, cycleOk bool) (typ Type) { - if debug { - fmt.Printf("makeType (cycleOk = %v)\n", cycleOk) - ast.Print(c.fset, x) - defer func() { - fmt.Printf("-> %T %v\n\n", typ, typ) - }() - } - - switch t := x.(type) { - case *ast.BadExpr: - return &Bad{} - - case *ast.Ident: - // type name - obj := t.Obj - if obj == nil { - // unresolved identifier (error has been reported before) - return &Bad{Msg: "unresolved identifier"} - } - if obj.Kind != ast.Typ { - msg := c.errorf(t.Pos(), "%s is not a type", t.Name) - return &Bad{Msg: msg} - } - c.checkObj(obj, cycleOk) - if !cycleOk && obj.Type.(*Name).Underlying == nil { - // TODO(gri) Enable this message again once its position - // is independent of the underlying map implementation. - // msg := c.errorf(obj.Pos(), "illegal cycle in declaration of %s", obj.Name) - msg := "illegal cycle" - return &Bad{Msg: msg} - } - return obj.Type.(Type) - - case *ast.ParenExpr: - return c.makeType(t.X, cycleOk) - - case *ast.SelectorExpr: - // qualified identifier - // TODO (gri) eventually, this code belongs to expression - // type checking - here for the time being - if ident, ok := t.X.(*ast.Ident); ok { - if obj := ident.Obj; obj != nil { - if obj.Kind != ast.Pkg { - msg := c.errorf(ident.Pos(), "%s is not a package", obj.Name) - return &Bad{Msg: msg} - } - // TODO(gri) we have a package name but don't - // have the mapping from package name to package - // scope anymore (created in ast.NewPackage). - return &Bad{} // for now - } - } - // TODO(gri) can this really happen (the parser should have excluded this)? - msg := c.errorf(t.Pos(), "expected qualified identifier") - return &Bad{Msg: msg} - - case *ast.StarExpr: - return &Pointer{Base: c.makeType(t.X, true)} - - case *ast.ArrayType: - if t.Len != nil { - // TODO(gri) compute length - return &Array{Elt: c.makeType(t.Elt, cycleOk)} - } - return &Slice{Elt: c.makeType(t.Elt, true)} - - case *ast.StructType: - fields, tags, _ := c.collectFields(token.STRUCT, t.Fields, cycleOk) - return &Struct{Fields: fields, Tags: tags} - - case *ast.FuncType: - params, _, _ := c.collectFields(token.FUNC, t.Params, true) - results, _, isVariadic := c.collectFields(token.FUNC, t.Results, true) - return &Func{Recv: nil, Params: params, Results: results, IsVariadic: isVariadic} - - case *ast.InterfaceType: - methods, _, _ := c.collectFields(token.INTERFACE, t.Methods, cycleOk) - methods.Sort() - return &Interface{Methods: methods} - - case *ast.MapType: - return &Map{Key: c.makeType(t.Key, true), Elt: c.makeType(t.Key, true)} - - case *ast.ChanType: - return &Chan{Dir: t.Dir, Elt: c.makeType(t.Value, true)} - } - - panic(fmt.Sprintf("unreachable (%T)", x)) -} - -// checkObj type checks an object. -func (c *checker) checkObj(obj *ast.Object, ref bool) { - if obj.Type != nil { - // object has already been type checked - return - } - - switch obj.Kind { - case ast.Bad: - // ignore - - case ast.Con: - // TODO(gri) complete this - - case ast.Typ: - typ := &Name{Obj: obj} - obj.Type = typ // "mark" object so recursion terminates - typ.Underlying = Underlying(c.makeType(obj.Decl.(*ast.TypeSpec).Type, ref)) - - case ast.Var: - // TODO(gri) complete this - - case ast.Fun: - // TODO(gri) complete this - - default: - panic("unreachable") - } -} - -// Check typechecks a package. -// It augments the AST by assigning types to all ast.Objects and returns a map -// of types for all expression nodes in statements, and a scanner.ErrorList if -// there are errors. -// -func Check(fset *token.FileSet, pkg *ast.Package) (types map[ast.Expr]Type, err error) { - var c checker - c.fset = fset - c.types = make(map[ast.Expr]Type) - - for _, obj := range pkg.Scope.Objects { - c.checkObj(obj, false) - } - - c.errors.RemoveMultiples() - return c.types, c.errors.Err() -} diff --git a/src/pkg/exp/types/check_test.go b/src/pkg/exp/types/check_test.go deleted file mode 100644 index 34c26c9908..0000000000 --- a/src/pkg/exp/types/check_test.go +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements a typechecker test harness. The packages specified -// in tests are typechecked. Error messages reported by the typechecker are -// compared against the error messages expected in the test files. -// -// Expected errors are indicated in the test files by putting a comment -// of the form /* ERROR "rx" */ immediately following an offending token. -// The harness will verify that an error matching the regular expression -// rx is reported at that source position. Consecutive comments may be -// used to indicate multiple errors for the same token position. -// -// For instance, the following test file indicates that a "not declared" -// error should be reported for the undeclared variable x: -// -// package p -// func f() { -// _ = x /* ERROR "not declared" */ + 1 -// } - -package types - -import ( - "fmt" - "go/ast" - "go/parser" - "go/scanner" - "go/token" - "io/ioutil" - "os" - "regexp" - "testing" -) - -// The test filenames do not end in .go so that they are invisible -// to gofmt since they contain comments that must not change their -// positions relative to surrounding tokens. - -var tests = []struct { - name string - files []string -}{ - {"test0", []string{"testdata/test0.src"}}, -} - -var fset = token.NewFileSet() - -func getFile(filename string) (file *token.File) { - fset.Iterate(func(f *token.File) bool { - if f.Name() == filename { - file = f - return false // end iteration - } - return true - }) - return file -} - -func getPos(filename string, offset int) token.Pos { - if f := getFile(filename); f != nil { - return f.Pos(offset) - } - return token.NoPos -} - -func parseFiles(t *testing.T, testname string, filenames []string) (map[string]*ast.File, error) { - files := make(map[string]*ast.File) - var errors scanner.ErrorList - for _, filename := range filenames { - if _, exists := files[filename]; exists { - t.Fatalf("%s: duplicate file %s", testname, filename) - } - file, err := parser.ParseFile(fset, filename, nil, parser.DeclarationErrors) - if file == nil { - t.Fatalf("%s: could not parse file %s", testname, filename) - } - files[filename] = file - if err != nil { - // if the parser returns a non-scanner.ErrorList error - // the file couldn't be read in the first place and - // file == nil; in that case we shouldn't reach here - errors = append(errors, err.(scanner.ErrorList)...) - } - - } - return files, errors -} - -// ERROR comments must be of the form /* ERROR "rx" */ and rx is -// a regular expression that matches the expected error message. -// -var errRx = regexp.MustCompile(`^/\* *ERROR *"([^"]*)" *\*/$`) - -// expectedErrors collects the regular expressions of ERROR comments found -// in files and returns them as a map of error positions to error messages. -// -func expectedErrors(t *testing.T, testname string, files map[string]*ast.File) map[token.Pos]string { - errors := make(map[token.Pos]string) - for filename := range files { - src, err := ioutil.ReadFile(filename) - if err != nil { - t.Fatalf("%s: could not read %s", testname, filename) - } - - var s scanner.Scanner - // file was parsed already - do not add it again to the file - // set otherwise the position information returned here will - // not match the position information collected by the parser - s.Init(getFile(filename), src, nil, scanner.ScanComments) - var prev token.Pos // position of last non-comment, non-semicolon token - - scanFile: - for { - pos, tok, lit := s.Scan() - switch tok { - case token.EOF: - break scanFile - case token.COMMENT: - s := errRx.FindStringSubmatch(lit) - if len(s) == 2 { - errors[prev] = string(s[1]) - } - case token.SEMICOLON: - // ignore automatically inserted semicolon - if lit == "\n" { - break - } - fallthrough - default: - prev = pos - } - } - } - return errors -} - -func eliminate(t *testing.T, expected map[token.Pos]string, errors error) { - if errors == nil { - return - } - for _, error := range errors.(scanner.ErrorList) { - // error.Pos is a token.Position, but we want - // a token.Pos so we can do a map lookup - pos := getPos(error.Pos.Filename, error.Pos.Offset) - if msg, found := expected[pos]; found { - // we expect a message at pos; check if it matches - rx, err := regexp.Compile(msg) - if err != nil { - t.Errorf("%s: %v", error.Pos, err) - continue - } - if match := rx.MatchString(error.Msg); !match { - t.Errorf("%s: %q does not match %q", error.Pos, error.Msg, msg) - continue - } - // we have a match - eliminate this error - delete(expected, pos) - } else { - // To keep in mind when analyzing failed test output: - // If the same error position occurs multiple times in errors, - // this message will be triggered (because the first error at - // the position removes this position from the expected errors). - t.Errorf("%s: no (multiple?) error expected, but found: %s", error.Pos, error.Msg) - } - } -} - -func check(t *testing.T, testname string, testfiles []string) { - // TODO(gri) Eventually all these different phases should be - // subsumed into a single function call that takes - // a set of files and creates a fully resolved and - // type-checked AST. - - files, err := parseFiles(t, testname, testfiles) - - // we are expecting the following errors - // (collect these after parsing the files so that - // they are found in the file set) - errors := expectedErrors(t, testname, files) - - // verify errors returned by the parser - eliminate(t, errors, err) - - // verify errors returned after resolving identifiers - pkg, err := ast.NewPackage(fset, files, GcImport, Universe) - eliminate(t, errors, err) - - // verify errors returned by the typechecker - _, err = Check(fset, pkg) - eliminate(t, errors, err) - - // there should be no expected errors left - if len(errors) > 0 { - t.Errorf("%s: %d errors not reported:", testname, len(errors)) - for pos, msg := range errors { - t.Errorf("%s: %s\n", fset.Position(pos), msg) - } - } -} - -func TestCheck(t *testing.T) { - // For easy debugging w/o changing the testing code, - // if there is a local test file, only test that file. - const testfile = "test.go" - if fi, err := os.Stat(testfile); err == nil && !fi.IsDir() { - fmt.Printf("WARNING: Testing only %s (remove it to run all tests)\n", testfile) - check(t, testfile, []string{testfile}) - return - } - - // Otherwise, run all the tests. - for _, test := range tests { - check(t, test.name, test.files) - } -} diff --git a/src/pkg/exp/types/const.go b/src/pkg/exp/types/const.go deleted file mode 100644 index 048f63bb7d..0000000000 --- a/src/pkg/exp/types/const.go +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements operations on ideal constants. - -package types - -import ( - "go/token" - "math/big" - "strconv" -) - -// TODO(gri) Consider changing the API so Const is an interface -// and operations on consts don't have to type switch. - -// A Const implements an ideal constant Value. -// The zero value z for a Const is not a valid constant value. -type Const struct { - // representation of constant values: - // ideal bool -> bool - // ideal int -> *big.Int - // ideal float -> *big.Rat - // ideal complex -> cmplx - // ideal string -> string - val interface{} -} - -// Representation of complex values. -type cmplx struct { - re, im *big.Rat -} - -func assert(cond bool) { - if !cond { - panic("go/types internal error: assertion failed") - } -} - -// MakeConst makes an ideal constant from a literal -// token and the corresponding literal string. -func MakeConst(tok token.Token, lit string) Const { - switch tok { - case token.INT: - var x big.Int - _, ok := x.SetString(lit, 0) - assert(ok) - return Const{&x} - case token.FLOAT: - var y big.Rat - _, ok := y.SetString(lit) - assert(ok) - return Const{&y} - case token.IMAG: - assert(lit[len(lit)-1] == 'i') - var im big.Rat - _, ok := im.SetString(lit[0 : len(lit)-1]) - assert(ok) - return Const{cmplx{big.NewRat(0, 1), &im}} - case token.CHAR: - assert(lit[0] == '\'' && lit[len(lit)-1] == '\'') - code, _, _, err := strconv.UnquoteChar(lit[1:len(lit)-1], '\'') - assert(err == nil) - return Const{big.NewInt(int64(code))} - case token.STRING: - s, err := strconv.Unquote(lit) - assert(err == nil) - return Const{s} - } - panic("unreachable") -} - -// MakeZero returns the zero constant for the given type. -func MakeZero(typ *Type) Const { - // TODO(gri) fix this - return Const{0} -} - -// Match attempts to match the internal constant representations of x and y. -// If the attempt is successful, the result is the values of x and y, -// if necessary converted to have the same internal representation; otherwise -// the results are invalid. -func (x Const) Match(y Const) (u, v Const) { - switch a := x.val.(type) { - case bool: - if _, ok := y.val.(bool); ok { - u, v = x, y - } - case *big.Int: - switch y.val.(type) { - case *big.Int: - u, v = x, y - case *big.Rat: - var z big.Rat - z.SetInt(a) - u, v = Const{&z}, y - case cmplx: - var z big.Rat - z.SetInt(a) - u, v = Const{cmplx{&z, big.NewRat(0, 1)}}, y - } - case *big.Rat: - switch y.val.(type) { - case *big.Int: - v, u = y.Match(x) - case *big.Rat: - u, v = x, y - case cmplx: - u, v = Const{cmplx{a, big.NewRat(0, 0)}}, y - } - case cmplx: - switch y.val.(type) { - case *big.Int, *big.Rat: - v, u = y.Match(x) - case cmplx: - u, v = x, y - } - case string: - if _, ok := y.val.(string); ok { - u, v = x, y - } - default: - panic("unreachable") - } - return -} - -// Convert attempts to convert the constant x to a given type. -// If the attempt is successful, the result is the new constant; -// otherwise the result is invalid. -func (x Const) Convert(typ *Type) Const { - // TODO(gri) implement this - switch x.val.(type) { - case bool: - case *big.Int: - case *big.Rat: - case cmplx: - case string: - } - return x -} - -func (x Const) String() string { - switch x := x.val.(type) { - case bool: - if x { - return "true" - } - return "false" - case *big.Int: - return x.String() - case *big.Rat: - return x.FloatString(10) // 10 digits of precision after decimal point seems fine - case cmplx: - // TODO(gri) don't print 0 components - return x.re.FloatString(10) + " + " + x.im.FloatString(10) + "i" - case string: - return x - } - panic("unreachable") -} - -func (x Const) UnaryOp(op token.Token) Const { - panic("unimplemented") -} - -func (x Const) BinaryOp(op token.Token, y Const) Const { - var z interface{} - switch x := x.val.(type) { - case bool: - z = binaryBoolOp(x, op, y.val.(bool)) - case *big.Int: - z = binaryIntOp(x, op, y.val.(*big.Int)) - case *big.Rat: - z = binaryFloatOp(x, op, y.val.(*big.Rat)) - case cmplx: - z = binaryCmplxOp(x, op, y.val.(cmplx)) - case string: - z = binaryStringOp(x, op, y.val.(string)) - default: - panic("unreachable") - } - return Const{z} -} - -func binaryBoolOp(x bool, op token.Token, y bool) interface{} { - switch op { - case token.EQL: - return x == y - case token.NEQ: - return x != y - } - panic("unreachable") -} - -func binaryIntOp(x *big.Int, op token.Token, y *big.Int) interface{} { - var z big.Int - switch op { - case token.ADD: - return z.Add(x, y) - case token.SUB: - return z.Sub(x, y) - case token.MUL: - return z.Mul(x, y) - case token.QUO: - return z.Quo(x, y) - case token.REM: - return z.Rem(x, y) - case token.AND: - return z.And(x, y) - case token.OR: - return z.Or(x, y) - case token.XOR: - return z.Xor(x, y) - case token.AND_NOT: - return z.AndNot(x, y) - case token.SHL: - panic("unimplemented") - case token.SHR: - panic("unimplemented") - case token.EQL: - return x.Cmp(y) == 0 - case token.NEQ: - return x.Cmp(y) != 0 - case token.LSS: - return x.Cmp(y) < 0 - case token.LEQ: - return x.Cmp(y) <= 0 - case token.GTR: - return x.Cmp(y) > 0 - case token.GEQ: - return x.Cmp(y) >= 0 - } - panic("unreachable") -} - -func binaryFloatOp(x *big.Rat, op token.Token, y *big.Rat) interface{} { - var z big.Rat - switch op { - case token.ADD: - return z.Add(x, y) - case token.SUB: - return z.Sub(x, y) - case token.MUL: - return z.Mul(x, y) - case token.QUO: - return z.Quo(x, y) - case token.EQL: - return x.Cmp(y) == 0 - case token.NEQ: - return x.Cmp(y) != 0 - case token.LSS: - return x.Cmp(y) < 0 - case token.LEQ: - return x.Cmp(y) <= 0 - case token.GTR: - return x.Cmp(y) > 0 - case token.GEQ: - return x.Cmp(y) >= 0 - } - panic("unreachable") -} - -func binaryCmplxOp(x cmplx, op token.Token, y cmplx) interface{} { - a, b := x.re, x.im - c, d := y.re, y.im - switch op { - case token.ADD: - // (a+c) + i(b+d) - var re, im big.Rat - re.Add(a, c) - im.Add(b, d) - return cmplx{&re, &im} - case token.SUB: - // (a-c) + i(b-d) - var re, im big.Rat - re.Sub(a, c) - im.Sub(b, d) - return cmplx{&re, &im} - case token.MUL: - // (ac-bd) + i(bc+ad) - var ac, bd, bc, ad big.Rat - ac.Mul(a, c) - bd.Mul(b, d) - bc.Mul(b, c) - ad.Mul(a, d) - var re, im big.Rat - re.Sub(&ac, &bd) - im.Add(&bc, &ad) - return cmplx{&re, &im} - case token.QUO: - // (ac+bd)/s + i(bc-ad)/s, with s = cc + dd - var ac, bd, bc, ad, s big.Rat - ac.Mul(a, c) - bd.Mul(b, d) - bc.Mul(b, c) - ad.Mul(a, d) - s.Add(c.Mul(c, c), d.Mul(d, d)) - var re, im big.Rat - re.Add(&ac, &bd) - re.Quo(&re, &s) - im.Sub(&bc, &ad) - im.Quo(&im, &s) - return cmplx{&re, &im} - case token.EQL: - return a.Cmp(c) == 0 && b.Cmp(d) == 0 - case token.NEQ: - return a.Cmp(c) != 0 || b.Cmp(d) != 0 - } - panic("unreachable") -} - -func binaryStringOp(x string, op token.Token, y string) interface{} { - switch op { - case token.ADD: - return x + y - case token.EQL: - return x == y - case token.NEQ: - return x != y - case token.LSS: - return x < y - case token.LEQ: - return x <= y - case token.GTR: - return x > y - case token.GEQ: - return x >= y - } - panic("unreachable") -} diff --git a/src/pkg/exp/types/exportdata.go b/src/pkg/exp/types/exportdata.go deleted file mode 100644 index bca2038804..0000000000 --- a/src/pkg/exp/types/exportdata.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements FindGcExportData. - -package types - -import ( - "bufio" - "errors" - "fmt" - "io" - "strconv" - "strings" -) - -func readGopackHeader(r *bufio.Reader) (name string, size int, err error) { - // See $GOROOT/include/ar.h. - hdr := make([]byte, 16+12+6+6+8+10+2) - _, err = io.ReadFull(r, hdr) - if err != nil { - return - } - if trace { - fmt.Printf("header: %s", hdr) - } - s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10])) - size, err = strconv.Atoi(s) - if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' { - err = errors.New("invalid archive header") - return - } - name = strings.TrimSpace(string(hdr[:16])) - return -} - -// FindGcExportData positions the reader r at the beginning of the -// export data section of an underlying GC-created object/archive -// file by reading from it. The reader must be positioned at the -// start of the file before calling this function. -// -func FindGcExportData(r *bufio.Reader) (err error) { - // Read first line to make sure this is an object file. - line, err := r.ReadSlice('\n') - if err != nil { - return - } - if string(line) == "!<arch>\n" { - // Archive file. Scan to __.PKGDEF, which should - // be second archive entry. - var name string - var size int - - // First entry should be __.SYMDEF. - // Read and discard. - if name, size, err = readGopackHeader(r); err != nil { - return - } - if name != "__.SYMDEF" { - err = errors.New("go archive does not begin with __.SYMDEF") - return - } - const block = 4096 - tmp := make([]byte, block) - for size > 0 { - n := size - if n > block { - n = block - } - if _, err = io.ReadFull(r, tmp[:n]); err != nil { - return - } - size -= n - } - - // Second entry should be __.PKGDEF. - if name, size, err = readGopackHeader(r); err != nil { - return - } - if name != "__.PKGDEF" { - err = errors.New("go archive is missing __.PKGDEF") - return - } - - // Read first line of __.PKGDEF data, so that line - // is once again the first line of the input. - if line, err = r.ReadSlice('\n'); err != nil { - return - } - } - - // Now at __.PKGDEF in archive or still at beginning of file. - // Either way, line should begin with "go object ". - if !strings.HasPrefix(string(line), "go object ") { - err = errors.New("not a go object file") - return - } - - // Skip over object header to export data. - // Begins after first line with $$. - for line[0] != '$' { - if line, err = r.ReadSlice('\n'); err != nil { - return - } - } - - return -} diff --git a/src/pkg/exp/types/gcimporter.go b/src/pkg/exp/types/gcimporter.go deleted file mode 100644 index 07ab087abf..0000000000 --- a/src/pkg/exp/types/gcimporter.go +++ /dev/null @@ -1,890 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements an ast.Importer for gc-generated object files. -// TODO(gri) Eventually move this into a separate package outside types. - -package types - -import ( - "bufio" - "errors" - "fmt" - "go/ast" - "go/build" - "go/token" - "io" - "math/big" - "os" - "path/filepath" - "strconv" - "strings" - "text/scanner" -) - -const trace = false // set to true for debugging - -var pkgExts = [...]string{".a", ".5", ".6", ".8"} - -// FindPkg returns the filename and unique package id for an import -// path based on package information provided by build.Import (using -// the build.Default build.Context). -// If no file was found, an empty filename is returned. -// -func FindPkg(path, srcDir string) (filename, id string) { - if len(path) == 0 { - return - } - - id = path - var noext string - switch { - default: - // "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x" - bp, _ := build.Import(path, srcDir, build.FindOnly) - if bp.PkgObj == "" { - return - } - noext = bp.PkgObj - if strings.HasSuffix(noext, ".a") { - noext = noext[:len(noext)-len(".a")] - } - - case build.IsLocalImport(path): - // "./x" -> "/this/directory/x.ext", "/this/directory/x" - noext = filepath.Join(srcDir, path) - id = noext - - case filepath.IsAbs(path): - // for completeness only - go/build.Import - // does not support absolute imports - // "/x" -> "/x.ext", "/x" - noext = path - } - - // try extensions - for _, ext := range pkgExts { - filename = noext + ext - if f, err := os.Stat(filename); err == nil && !f.IsDir() { - return - } - } - - filename = "" // not found - return -} - -// GcImportData imports a package by reading the gc-generated export data, -// adds the corresponding package object to the imports map indexed by id, -// and returns the object. -// -// The imports map must contains all packages already imported, and no map -// entry with id as the key must be present. The data reader position must -// be the beginning of the export data section. The filename is only used -// in error messages. -// -func GcImportData(imports map[string]*ast.Object, filename, id string, data *bufio.Reader) (pkg *ast.Object, err error) { - if trace { - fmt.Printf("importing %s (%s)\n", id, filename) - } - - if imports[id] != nil { - panic(fmt.Sprintf("package %s already imported", id)) - } - - // support for gcParser error handling - defer func() { - if r := recover(); r != nil { - err = r.(importError) // will re-panic if r is not an importError - } - }() - - var p gcParser - p.init(filename, id, data, imports) - pkg = p.parseExport() - - return -} - -// GcImport imports a gc-generated package given its import path, adds the -// corresponding package object to the imports map, and returns the object. -// Local import paths are interpreted relative to the current working directory. -// The imports map must contains all packages already imported. -// GcImport satisfies the ast.Importer signature. -// -func GcImport(imports map[string]*ast.Object, path string) (pkg *ast.Object, err error) { - if path == "unsafe" { - return Unsafe, nil - } - - srcDir, err := os.Getwd() - if err != nil { - return - } - filename, id := FindPkg(path, srcDir) - if filename == "" { - err = errors.New("can't find import: " + id) - return - } - - if pkg = imports[id]; pkg != nil { - return // package was imported before - } - - // open file - f, err := os.Open(filename) - if err != nil { - return - } - defer func() { - f.Close() - if err != nil { - // Add file name to error. - err = fmt.Errorf("reading export data: %s: %v", filename, err) - } - }() - - buf := bufio.NewReader(f) - if err = FindGcExportData(buf); err != nil { - return - } - - pkg, err = GcImportData(imports, filename, id, buf) - - return -} - -// ---------------------------------------------------------------------------- -// gcParser - -// gcParser parses the exports inside a gc compiler-produced -// object/archive file and populates its scope with the results. -type gcParser struct { - scanner scanner.Scanner - tok rune // current token - lit string // literal string; only valid for Ident, Int, String tokens - id string // package id of imported package - imports map[string]*ast.Object // package id -> package object -} - -func (p *gcParser) init(filename, id string, src io.Reader, imports map[string]*ast.Object) { - p.scanner.Init(src) - p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) } - p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanChars | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments - p.scanner.Whitespace = 1<<'\t' | 1<<' ' - p.scanner.Filename = filename // for good error messages - p.next() - p.id = id - p.imports = imports -} - -func (p *gcParser) next() { - p.tok = p.scanner.Scan() - switch p.tok { - case scanner.Ident, scanner.Int, scanner.String: - p.lit = p.scanner.TokenText() - default: - p.lit = "" - } - if trace { - fmt.Printf("%s: %q -> %q\n", scanner.TokenString(p.tok), p.scanner.TokenText(), p.lit) - } -} - -// Declare inserts a named object of the given kind in scope. -func (p *gcParser) declare(scope *ast.Scope, kind ast.ObjKind, name string) *ast.Object { - // the object may have been imported before - if it exists - // already in the respective package scope, return that object - if obj := scope.Lookup(name); obj != nil { - assert(obj.Kind == kind) - return obj - } - - // otherwise create a new object and insert it into the package scope - obj := ast.NewObj(kind, name) - if scope.Insert(obj) != nil { - p.errorf("already declared: %v %s", kind, obj.Name) - } - - // a new type object is a named type and may be referred - // to before the underlying type is known - set it up - if kind == ast.Typ { - obj.Type = &Name{Obj: obj} - } - - return obj -} - -// ---------------------------------------------------------------------------- -// Error handling - -// Internal errors are boxed as importErrors. -type importError struct { - pos scanner.Position - err error -} - -func (e importError) Error() string { - return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err) -} - -func (p *gcParser) error(err interface{}) { - if s, ok := err.(string); ok { - err = errors.New(s) - } - // panic with a runtime.Error if err is not an error - panic(importError{p.scanner.Pos(), err.(error)}) -} - -func (p *gcParser) errorf(format string, args ...interface{}) { - p.error(fmt.Sprintf(format, args...)) -} - -func (p *gcParser) expect(tok rune) string { - lit := p.lit - if p.tok != tok { - panic(1) - p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit) - } - p.next() - return lit -} - -func (p *gcParser) expectSpecial(tok string) { - sep := 'x' // not white space - i := 0 - for i < len(tok) && p.tok == rune(tok[i]) && sep > ' ' { - sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token - p.next() - i++ - } - if i < len(tok) { - p.errorf("expected %q, got %q", tok, tok[0:i]) - } -} - -func (p *gcParser) expectKeyword(keyword string) { - lit := p.expect(scanner.Ident) - if lit != keyword { - p.errorf("expected keyword %s, got %q", keyword, lit) - } -} - -// ---------------------------------------------------------------------------- -// Import declarations - -// ImportPath = string_lit . -// -func (p *gcParser) parsePkgId() *ast.Object { - id, err := strconv.Unquote(p.expect(scanner.String)) - if err != nil { - p.error(err) - } - - switch id { - case "": - // id == "" stands for the imported package id - // (only known at time of package installation) - id = p.id - case "unsafe": - // package unsafe is not in the imports map - handle explicitly - return Unsafe - } - - pkg := p.imports[id] - if pkg == nil { - scope = ast.NewScope(nil) - pkg = ast.NewObj(ast.Pkg, "") - pkg.Data = scope - p.imports[id] = pkg - } - - return pkg -} - -// dotIdentifier = ( ident | '·' ) { ident | int | '·' } . -func (p *gcParser) parseDotIdent() string { - ident := "" - if p.tok != scanner.Int { - sep := 'x' // not white space - for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' { - ident += p.lit - sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token - p.next() - } - } - if ident == "" { - p.expect(scanner.Ident) // use expect() for error handling - } - return ident -} - -// ExportedName = "@" ImportPath "." dotIdentifier . -// -func (p *gcParser) parseExportedName() (*ast.Object, string) { - p.expect('@') - pkg := p.parsePkgId() - p.expect('.') - name := p.parseDotIdent() - return pkg, name -} - -// ---------------------------------------------------------------------------- -// Types - -// BasicType = identifier . -// -func (p *gcParser) parseBasicType() Type { - id := p.expect(scanner.Ident) - obj := Universe.Lookup(id) - if obj == nil || obj.Kind != ast.Typ { - p.errorf("not a basic type: %s", id) - } - return obj.Type.(Type) -} - -// ArrayType = "[" int_lit "]" Type . -// -func (p *gcParser) parseArrayType() Type { - // "[" already consumed and lookahead known not to be "]" - lit := p.expect(scanner.Int) - p.expect(']') - elt := p.parseType() - n, err := strconv.ParseUint(lit, 10, 64) - if err != nil { - p.error(err) - } - return &Array{Len: n, Elt: elt} -} - -// MapType = "map" "[" Type "]" Type . -// -func (p *gcParser) parseMapType() Type { - p.expectKeyword("map") - p.expect('[') - key := p.parseType() - p.expect(']') - elt := p.parseType() - return &Map{Key: key, Elt: elt} -} - -// Name = identifier | "?" | ExportedName . -// -func (p *gcParser) parseName() (name string) { - switch p.tok { - case scanner.Ident: - name = p.lit - p.next() - case '?': - // anonymous - p.next() - case '@': - // exported name prefixed with package path - _, name = p.parseExportedName() - default: - p.error("name expected") - } - return -} - -// Field = Name Type [ string_lit ] . -// -func (p *gcParser) parseField() (fld *ast.Object, tag string) { - name := p.parseName() - ftyp := p.parseType() - if name == "" { - // anonymous field - ftyp must be T or *T and T must be a type name - if _, ok := Deref(ftyp).(*Name); !ok { - p.errorf("anonymous field expected") - } - } - if p.tok == scanner.String { - tag = p.expect(scanner.String) - } - fld = ast.NewObj(ast.Var, name) - fld.Type = ftyp - return -} - -// StructType = "struct" "{" [ FieldList ] "}" . -// FieldList = Field { ";" Field } . -// -func (p *gcParser) parseStructType() Type { - var fields []*ast.Object - var tags []string - - parseField := func() { - fld, tag := p.parseField() - fields = append(fields, fld) - tags = append(tags, tag) - } - - p.expectKeyword("struct") - p.expect('{') - if p.tok != '}' { - parseField() - for p.tok == ';' { - p.next() - parseField() - } - } - p.expect('}') - - return &Struct{Fields: fields, Tags: tags} -} - -// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] . -// -func (p *gcParser) parseParameter() (par *ast.Object, isVariadic bool) { - name := p.parseName() - if name == "" { - name = "_" // cannot access unnamed identifiers - } - if p.tok == '.' { - p.expectSpecial("...") - isVariadic = true - } - ptyp := p.parseType() - // ignore argument tag - if p.tok == scanner.String { - p.expect(scanner.String) - } - par = ast.NewObj(ast.Var, name) - par.Type = ptyp - return -} - -// Parameters = "(" [ ParameterList ] ")" . -// ParameterList = { Parameter "," } Parameter . -// -func (p *gcParser) parseParameters() (list []*ast.Object, isVariadic bool) { - parseParameter := func() { - par, variadic := p.parseParameter() - list = append(list, par) - if variadic { - if isVariadic { - p.error("... not on final argument") - } - isVariadic = true - } - } - - p.expect('(') - if p.tok != ')' { - parseParameter() - for p.tok == ',' { - p.next() - parseParameter() - } - } - p.expect(')') - - return -} - -// Signature = Parameters [ Result ] . -// Result = Type | Parameters . -// -func (p *gcParser) parseSignature() *Func { - params, isVariadic := p.parseParameters() - - // optional result type - var results []*ast.Object - switch p.tok { - case scanner.Ident, '[', '*', '<', '@': - // single, unnamed result - result := ast.NewObj(ast.Var, "_") - result.Type = p.parseType() - results = []*ast.Object{result} - case '(': - // named or multiple result(s) - var variadic bool - results, variadic = p.parseParameters() - if variadic { - p.error("... not permitted on result type") - } - } - - return &Func{Params: params, Results: results, IsVariadic: isVariadic} -} - -// MethodOrEmbedSpec = Name [ Signature ] . -// -func (p *gcParser) parseMethodOrEmbedSpec() *ast.Object { - p.parseName() - if p.tok == '(' { - p.parseSignature() - // TODO(gri) compute method object - return ast.NewObj(ast.Fun, "_") - } - // TODO lookup name and return that type - return ast.NewObj(ast.Typ, "_") -} - -// InterfaceType = "interface" "{" [ MethodOrEmbedList ] "}" . -// MethodOrEmbedList = MethodOrEmbedSpec { ";" MethodOrEmbedSpec } . -// -func (p *gcParser) parseInterfaceType() Type { - var methods ObjList - - parseMethod := func() { - switch m := p.parseMethodOrEmbedSpec(); m.Kind { - case ast.Typ: - // TODO expand embedded methods - case ast.Fun: - methods = append(methods, m) - } - } - - p.expectKeyword("interface") - p.expect('{') - if p.tok != '}' { - parseMethod() - for p.tok == ';' { - p.next() - parseMethod() - } - } - p.expect('}') - - methods.Sort() - return &Interface{Methods: methods} -} - -// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type . -// -func (p *gcParser) parseChanType() Type { - dir := ast.SEND | ast.RECV - if p.tok == scanner.Ident { - p.expectKeyword("chan") - if p.tok == '<' { - p.expectSpecial("<-") - dir = ast.SEND - } - } else { - p.expectSpecial("<-") - p.expectKeyword("chan") - dir = ast.RECV - } - elt := p.parseType() - return &Chan{Dir: dir, Elt: elt} -} - -// Type = -// BasicType | TypeName | ArrayType | SliceType | StructType | -// PointerType | FuncType | InterfaceType | MapType | ChanType | -// "(" Type ")" . -// BasicType = ident . -// TypeName = ExportedName . -// SliceType = "[" "]" Type . -// PointerType = "*" Type . -// FuncType = "func" Signature . -// -func (p *gcParser) parseType() Type { - switch p.tok { - case scanner.Ident: - switch p.lit { - default: - return p.parseBasicType() - case "struct": - return p.parseStructType() - case "func": - // FuncType - p.next() - return p.parseSignature() - case "interface": - return p.parseInterfaceType() - case "map": - return p.parseMapType() - case "chan": - return p.parseChanType() - } - case '@': - // TypeName - pkg, name := p.parseExportedName() - return p.declare(pkg.Data.(*ast.Scope), ast.Typ, name).Type.(Type) - case '[': - p.next() // look ahead - if p.tok == ']' { - // SliceType - p.next() - return &Slice{Elt: p.parseType()} - } - return p.parseArrayType() - case '*': - // PointerType - p.next() - return &Pointer{Base: p.parseType()} - case '<': - return p.parseChanType() - case '(': - // "(" Type ")" - p.next() - typ := p.parseType() - p.expect(')') - return typ - } - p.errorf("expected type, got %s (%q)", scanner.TokenString(p.tok), p.lit) - return nil -} - -// ---------------------------------------------------------------------------- -// Declarations - -// ImportDecl = "import" identifier string_lit . -// -func (p *gcParser) parseImportDecl() { - p.expectKeyword("import") - // The identifier has no semantic meaning in the import data. - // It exists so that error messages can print the real package - // name: binary.ByteOrder instead of "encoding/binary".ByteOrder. - name := p.expect(scanner.Ident) - pkg := p.parsePkgId() - assert(pkg.Name == "" || pkg.Name == name) - pkg.Name = name -} - -// int_lit = [ "+" | "-" ] { "0" ... "9" } . -// -func (p *gcParser) parseInt() (sign, val string) { - switch p.tok { - case '-': - p.next() - sign = "-" - case '+': - p.next() - } - val = p.expect(scanner.Int) - return -} - -// number = int_lit [ "p" int_lit ] . -// -func (p *gcParser) parseNumber() Const { - // mantissa - sign, val := p.parseInt() - mant, ok := new(big.Int).SetString(sign+val, 10) - assert(ok) - - if p.lit == "p" { - // exponent (base 2) - p.next() - sign, val = p.parseInt() - exp64, err := strconv.ParseUint(val, 10, 0) - if err != nil { - p.error(err) - } - exp := uint(exp64) - if sign == "-" { - denom := big.NewInt(1) - denom.Lsh(denom, exp) - return Const{new(big.Rat).SetFrac(mant, denom)} - } - if exp > 0 { - mant.Lsh(mant, exp) - } - return Const{new(big.Rat).SetInt(mant)} - } - - return Const{mant} -} - -// ConstDecl = "const" ExportedName [ Type ] "=" Literal . -// Literal = bool_lit | int_lit | float_lit | complex_lit | string_lit . -// bool_lit = "true" | "false" . -// complex_lit = "(" float_lit "+" float_lit ")" . -// rune_lit = "(" int_lit "+" int_lit ")" . -// string_lit = `"` { unicode_char } `"` . -// -func (p *gcParser) parseConstDecl() { - p.expectKeyword("const") - pkg, name := p.parseExportedName() - obj := p.declare(pkg.Data.(*ast.Scope), ast.Con, name) - var x Const - var typ Type - if p.tok != '=' { - obj.Type = p.parseType() - } - p.expect('=') - switch p.tok { - case scanner.Ident: - // bool_lit - if p.lit != "true" && p.lit != "false" { - p.error("expected true or false") - } - x = Const{p.lit == "true"} - typ = Bool.Underlying - p.next() - case '-', scanner.Int: - // int_lit - x = p.parseNumber() - typ = Int.Underlying - if _, ok := x.val.(*big.Rat); ok { - typ = Float64.Underlying - } - case '(': - // complex_lit or rune_lit - p.next() - if p.tok == scanner.Char { - p.next() - p.expect('+') - p.parseNumber() - p.expect(')') - // TODO: x = ... - break - } - re := p.parseNumber() - p.expect('+') - im := p.parseNumber() - p.expect(')') - x = Const{cmplx{re.val.(*big.Rat), im.val.(*big.Rat)}} - typ = Complex128.Underlying - case scanner.Char: - // TODO: x = ... - p.next() - case scanner.String: - // string_lit - x = MakeConst(token.STRING, p.lit) - p.next() - typ = String.Underlying - default: - p.errorf("expected literal got %s", scanner.TokenString(p.tok)) - } - if obj.Type == nil { - obj.Type = typ - } - obj.Data = x -} - -// TypeDecl = "type" ExportedName Type . -// -func (p *gcParser) parseTypeDecl() { - p.expectKeyword("type") - pkg, name := p.parseExportedName() - obj := p.declare(pkg.Data.(*ast.Scope), ast.Typ, name) - - // The type object may have been imported before and thus already - // have a type associated with it. We still need to parse the type - // structure, but throw it away if the object already has a type. - // This ensures that all imports refer to the same type object for - // a given type declaration. - typ := p.parseType() - - if name := obj.Type.(*Name); name.Underlying == nil { - assert(Underlying(typ) == typ) - name.Underlying = typ - } -} - -// VarDecl = "var" ExportedName Type . -// -func (p *gcParser) parseVarDecl() { - p.expectKeyword("var") - pkg, name := p.parseExportedName() - obj := p.declare(pkg.Data.(*ast.Scope), ast.Var, name) - obj.Type = p.parseType() -} - -// FuncBody = "{" ... "}" . -// -func (p *gcParser) parseFuncBody() { - p.expect('{') - for i := 1; i > 0; p.next() { - switch p.tok { - case '{': - i++ - case '}': - i-- - } - } -} - -// FuncDecl = "func" ExportedName Signature [ FuncBody ] . -// -func (p *gcParser) parseFuncDecl() { - // "func" already consumed - pkg, name := p.parseExportedName() - obj := p.declare(pkg.Data.(*ast.Scope), ast.Fun, name) - obj.Type = p.parseSignature() - if p.tok == '{' { - p.parseFuncBody() - } -} - -// MethodDecl = "func" Receiver Name Signature . -// Receiver = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" [ FuncBody ]. -// -func (p *gcParser) parseMethodDecl() { - // "func" already consumed - p.expect('(') - p.parseParameter() // receiver - p.expect(')') - p.parseName() // unexported method names in imports are qualified with their package. - p.parseSignature() - if p.tok == '{' { - p.parseFuncBody() - } -} - -// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" . -// -func (p *gcParser) parseDecl() { - switch p.lit { - case "import": - p.parseImportDecl() - case "const": - p.parseConstDecl() - case "type": - p.parseTypeDecl() - case "var": - p.parseVarDecl() - case "func": - p.next() // look ahead - if p.tok == '(' { - p.parseMethodDecl() - } else { - p.parseFuncDecl() - } - } - p.expect('\n') -} - -// ---------------------------------------------------------------------------- -// Export - -// Export = "PackageClause { Decl } "$$" . -// PackageClause = "package" identifier [ "safe" ] "\n" . -// -func (p *gcParser) parseExport() *ast.Object { - p.expectKeyword("package") - name := p.expect(scanner.Ident) - if p.tok != '\n' { - // A package is safe if it was compiled with the -u flag, - // which disables the unsafe package. - // TODO(gri) remember "safe" package - p.expectKeyword("safe") - } - p.expect('\n') - - assert(p.imports[p.id] == nil) - pkg := ast.NewObj(ast.Pkg, name) - pkg.Data = ast.NewScope(nil) - p.imports[p.id] = pkg - - for p.tok != '$' && p.tok != scanner.EOF { - p.parseDecl() - } - - if ch := p.scanner.Peek(); p.tok != '$' || ch != '$' { - // don't call next()/expect() since reading past the - // export data may cause scanner errors (e.g. NUL chars) - p.errorf("expected '$$', got %s %c", scanner.TokenString(p.tok), ch) - } - - if n := p.scanner.ErrorCount; n != 0 { - p.errorf("expected no scanner errors, got %d", n) - } - - return pkg -} diff --git a/src/pkg/exp/types/gcimporter_test.go b/src/pkg/exp/types/gcimporter_test.go deleted file mode 100644 index 20247b0dc4..0000000000 --- a/src/pkg/exp/types/gcimporter_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package types - -import ( - "go/ast" - "go/build" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "testing" - "time" -) - -var gcPath string // Go compiler path - -func init() { - // determine compiler - var gc string - switch runtime.GOARCH { - case "386": - gc = "8g" - case "amd64": - gc = "6g" - case "arm": - gc = "5g" - default: - gcPath = "unknown-GOARCH-compiler" - return - } - gcPath = filepath.Join(build.ToolDir, gc) -} - -func compile(t *testing.T, dirname, filename string) { - cmd := exec.Command(gcPath, filename) - cmd.Dir = dirname - out, err := cmd.CombinedOutput() - if err != nil { - t.Errorf("%s %s failed: %s", gcPath, filename, err) - return - } - t.Logf("%s", string(out)) -} - -// Use the same global imports map for all tests. The effect is -// as if all tested packages were imported into a single package. -var imports = make(map[string]*ast.Object) - -func testPath(t *testing.T, path string) bool { - _, err := GcImport(imports, path) - if err != nil { - t.Errorf("testPath(%s): %s", path, err) - return false - } - return true -} - -const maxTime = 3 * time.Second - -func testDir(t *testing.T, dir string, endTime time.Time) (nimports int) { - dirname := filepath.Join(runtime.GOROOT(), "pkg", runtime.GOOS+"_"+runtime.GOARCH, dir) - list, err := ioutil.ReadDir(dirname) - if err != nil { - t.Errorf("testDir(%s): %s", dirname, err) - } - for _, f := range list { - if time.Now().After(endTime) { - t.Log("testing time used up") - return - } - switch { - case !f.IsDir(): - // try extensions - for _, ext := range pkgExts { - if strings.HasSuffix(f.Name(), ext) { - name := f.Name()[0 : len(f.Name())-len(ext)] // remove extension - if testPath(t, filepath.Join(dir, name)) { - nimports++ - } - } - } - case f.IsDir(): - nimports += testDir(t, filepath.Join(dir, f.Name()), endTime) - } - } - return -} - -func TestGcImport(t *testing.T) { - // On cross-compile builds, the path will not exist. - // Need to use GOHOSTOS, which is not available. - if _, err := os.Stat(gcPath); err != nil { - t.Logf("skipping test: %v", err) - return - } - - compile(t, "testdata", "exports.go") - - nimports := 0 - if testPath(t, "./testdata/exports") { - nimports++ - } - nimports += testDir(t, "", time.Now().Add(maxTime)) // installed packages - t.Logf("tested %d imports", nimports) -} diff --git a/src/pkg/exp/types/testdata/exports.go b/src/pkg/exp/types/testdata/exports.go deleted file mode 100644 index ed63bf9ade..0000000000 --- a/src/pkg/exp/types/testdata/exports.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file is used to generate an object file which -// serves as test file for gcimporter_test.go. - -package exports - -import ( - "go/ast" -) - -const ( - C0 int = 0 - C1 = 3.14159265 - C2 = 2.718281828i - C3 = -123.456e-789 - C4 = +123.456E+789 - C5 = 1234i - C6 = "foo\n" - C7 = `bar\n` -) - -type ( - T1 int - T2 [10]int - T3 []int - T4 *int - T5 chan int - T6a chan<- int - T6b chan (<-chan int) - T6c chan<- (chan int) - T7 <-chan *ast.File - T8 struct{} - T9 struct { - a int - b, c float32 - d []string `go:"tag"` - } - T10 struct { - T8 - T9 - _ *T10 - } - T11 map[int]string - T12 interface{} - T13 interface { - m1() - m2(int) float32 - } - T14 interface { - T12 - T13 - m3(x ...struct{}) []T9 - } - T15 func() - T16 func(int) - T17 func(x int) - T18 func() float32 - T19 func() (x float32) - T20 func(...interface{}) - T21 struct{ next *T21 } - T22 struct{ link *T23 } - T23 struct{ link *T22 } - T24 *T24 - T25 *T26 - T26 *T27 - T27 *T25 - T28 func(T28) T28 -) - -var ( - V0 int - V1 = -991.0 -) - -func F1() {} -func F2(x int) {} -func F3() int { return 0 } -func F4() float32 { return 0 } -func F5(a, b, c int, u, v, w struct{ x, y T1 }, more ...interface{}) (p, q, r chan<- T10) - -func (p *T1) M1() diff --git a/src/pkg/exp/types/testdata/test0.src b/src/pkg/exp/types/testdata/test0.src deleted file mode 100644 index 84a1abe270..0000000000 --- a/src/pkg/exp/types/testdata/test0.src +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// type declarations - -package test0 - -import "unsafe" - -const pi = 3.1415 - -type ( - N undeclared /* ERROR "undeclared" */ - B bool - I int32 - A [10]P - T struct { - x, y P - } - P *T - R (*R) - F func(A) I - Y interface { - f(A) I - } - S [](((P))) - M map[I]F - C chan<- I -) - - -type ( - p1 pi /* ERROR "not a package" */ .foo - p2 unsafe.Pointer -) - - -type ( - Pi pi /* ERROR "not a type" */ - - a /* DISABLED "illegal cycle" */ a - a /* ERROR "redeclared" */ int - - // where the cycle error appears depends on the - // order in which declarations are processed - // (which depends on the order in which a map - // is iterated through) - b c - c /* DISABLED "illegal cycle" */ d - d e - e b - - t *t - - U V - V *W - W U - - P1 *S2 - P2 P1 - - S0 struct { - } - S1 struct { - a, b, c int - u, v, a /* ERROR "redeclared" */ float32 - } - S2 struct { - U // anonymous field - // TODO(gri) recognize double-declaration below - // U /* ERROR "redeclared" */ int - } - S3 struct { - x S2 - } - S4/* DISABLED "illegal cycle" */ struct { - S4 - } - S5 struct { - S6 - } - S6 /* DISABLED "illegal cycle" */ struct { - field S7 - } - S7 struct { - S5 - } - - L1 []L1 - L2 []int - - A1 [10]int - A2 /* DISABLED "illegal cycle" */ [10]A2 - A3 /* DISABLED "illegal cycle" */ [10]struct { - x A4 - } - A4 [10]A3 - - F1 func() - F2 func(x, y, z float32) - F3 func(x, y, x /* ERROR "redeclared" */ float32) - F4 func() (x, y, x /* ERROR "redeclared" */ float32) - F5 func(x int) (x /* ERROR "redeclared" */ float32) - F6 func(x ...int) - - I1 interface{} - I2 interface { - m1() - } - I3 interface { - m1() - m1 /* ERROR "redeclared" */ () - } - I4 interface { - m1(x, y, x /* ERROR "redeclared" */ float32) - m2() (x, y, x /* ERROR "redeclared" */ float32) - m3(x int) (x /* ERROR "redeclared" */ float32) - } - I5 interface { - m1(I5) - } - I6 interface { - S0 /* ERROR "non-interface" */ - } - I7 interface { - I1 - I1 - } - I8 /* DISABLED "illegal cycle" */ interface { - I8 - } - I9 /* DISABLED "illegal cycle" */ interface { - I10 - } - I10 interface { - I11 - } - I11 interface { - I9 - } - - C1 chan int - C2 <-chan int - C3 chan<- C3 - C4 chan C5 - C5 chan C6 - C6 chan C4 - - M1 map[Last]string - M2 map[string]M2 - - Last int -) diff --git a/src/pkg/exp/types/types.go b/src/pkg/exp/types/types.go deleted file mode 100644 index 85d244cf04..0000000000 --- a/src/pkg/exp/types/types.go +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package types declares the types used to represent Go types -// (UNDER CONSTRUCTION). ANY AND ALL PARTS MAY CHANGE. -// -package types - -import ( - "go/ast" - "sort" -) - -// All types implement the Type interface. -type Type interface { - isType() -} - -// All concrete types embed ImplementsType which -// ensures that all types implement the Type interface. -type ImplementsType struct{} - -func (t *ImplementsType) isType() {} - -// A Bad type is a non-nil placeholder type when we don't know a type. -type Bad struct { - ImplementsType - Msg string // for better error reporting/debugging -} - -// A Basic represents a (unnamed) basic type. -type Basic struct { - ImplementsType - // TODO(gri) need a field specifying the exact basic type -} - -// An Array represents an array type [Len]Elt. -type Array struct { - ImplementsType - Len uint64 - Elt Type -} - -// A Slice represents a slice type []Elt. -type Slice struct { - ImplementsType - Elt Type -} - -// A Struct represents a struct type struct{...}. -// Anonymous fields are represented by objects with empty names. -type Struct struct { - ImplementsType - Fields ObjList // struct fields; or nil - Tags []string // corresponding tags; or nil - // TODO(gri) This type needs some rethinking: - // - at the moment anonymous fields are marked with "" object names, - // and their names have to be reconstructed - // - there is no scope for fast lookup (but the parser creates one) -} - -// A Pointer represents a pointer type *Base. -type Pointer struct { - ImplementsType - Base Type -} - -// A Func represents a function type func(...) (...). -// Unnamed parameters are represented by objects with empty names. -type Func struct { - ImplementsType - Recv *ast.Object // nil if not a method - Params ObjList // (incoming) parameters from left to right; or nil - Results ObjList // (outgoing) results from left to right; or nil - IsVariadic bool // true if the last parameter's type is of the form ...T -} - -// An Interface represents an interface type interface{...}. -type Interface struct { - ImplementsType - Methods ObjList // interface methods sorted by name; or nil -} - -// A Map represents a map type map[Key]Elt. -type Map struct { - ImplementsType - Key, Elt Type -} - -// A Chan represents a channel type chan Elt, <-chan Elt, or chan<-Elt. -type Chan struct { - ImplementsType - Dir ast.ChanDir - Elt Type -} - -// A Name represents a named type as declared in a type declaration. -type Name struct { - ImplementsType - Underlying Type // nil if not fully declared - Obj *ast.Object // corresponding declared object - // TODO(gri) need to remember fields and methods. -} - -// If typ is a pointer type, Deref returns the pointer's base type; -// otherwise it returns typ. -func Deref(typ Type) Type { - if typ, ok := typ.(*Pointer); ok { - return typ.Base - } - return typ -} - -// Underlying returns the underlying type of a type. -func Underlying(typ Type) Type { - if typ, ok := typ.(*Name); ok { - utyp := typ.Underlying - if _, ok := utyp.(*Basic); !ok { - return utyp - } - // the underlying type of a type name referring - // to an (untyped) basic type is the basic type - // name - } - return typ -} - -// An ObjList represents an ordered (in some fashion) list of objects. -type ObjList []*ast.Object - -// ObjList implements sort.Interface. -func (list ObjList) Len() int { return len(list) } -func (list ObjList) Less(i, j int) bool { return list[i].Name < list[j].Name } -func (list ObjList) Swap(i, j int) { list[i], list[j] = list[j], list[i] } - -// Sort sorts an object list by object name. -func (list ObjList) Sort() { sort.Sort(list) } - -// identicalTypes returns true if both lists a and b have the -// same length and corresponding objects have identical types. -func identicalTypes(a, b ObjList) bool { - if len(a) == len(b) { - for i, x := range a { - y := b[i] - if !Identical(x.Type.(Type), y.Type.(Type)) { - return false - } - } - return true - } - return false -} - -// Identical returns true if two types are identical. -func Identical(x, y Type) bool { - if x == y { - return true - } - - switch x := x.(type) { - case *Bad: - // A Bad type is always identical to any other type - // (to avoid spurious follow-up errors). - return true - - case *Basic: - if y, ok := y.(*Basic); ok { - panic("unimplemented") - _ = y - } - - case *Array: - // Two array types are identical if they have identical element types - // and the same array length. - if y, ok := y.(*Array); ok { - return x.Len == y.Len && Identical(x.Elt, y.Elt) - } - - case *Slice: - // Two slice types are identical if they have identical element types. - if y, ok := y.(*Slice); ok { - return Identical(x.Elt, y.Elt) - } - - case *Struct: - // Two struct types are identical if they have the same sequence of fields, - // and if corresponding fields have the same names, and identical types, - // and identical tags. Two anonymous fields are considered to have the same - // name. Lower-case field names from different packages are always different. - if y, ok := y.(*Struct); ok { - // TODO(gri) handle structs from different packages - if identicalTypes(x.Fields, y.Fields) { - for i, f := range x.Fields { - g := y.Fields[i] - if f.Name != g.Name || x.Tags[i] != y.Tags[i] { - return false - } - } - return true - } - } - - case *Pointer: - // Two pointer types are identical if they have identical base types. - if y, ok := y.(*Pointer); ok { - return Identical(x.Base, y.Base) - } - - case *Func: - // Two function types are identical if they have the same number of parameters - // and result values, corresponding parameter and result types are identical, - // and either both functions are variadic or neither is. Parameter and result - // names are not required to match. - if y, ok := y.(*Func); ok { - return identicalTypes(x.Params, y.Params) && - identicalTypes(x.Results, y.Results) && - x.IsVariadic == y.IsVariadic - } - - case *Interface: - // Two interface types are identical if they have the same set of methods with - // the same names and identical function types. Lower-case method names from - // different packages are always different. The order of the methods is irrelevant. - if y, ok := y.(*Interface); ok { - return identicalTypes(x.Methods, y.Methods) // methods are sorted - } - - case *Map: - // Two map types are identical if they have identical key and value types. - if y, ok := y.(*Map); ok { - return Identical(x.Key, y.Key) && Identical(x.Elt, y.Elt) - } - - case *Chan: - // Two channel types are identical if they have identical value types - // and the same direction. - if y, ok := y.(*Chan); ok { - return x.Dir == y.Dir && Identical(x.Elt, y.Elt) - } - - case *Name: - // Two named types are identical if their type names originate - // in the same type declaration. - if y, ok := y.(*Name); ok { - return x.Obj == y.Obj || - // permit bad objects to be equal to avoid - // follow up errors - x.Obj != nil && x.Obj.Kind == ast.Bad || - y.Obj != nil && y.Obj.Kind == ast.Bad - } - } - - return false -} diff --git a/src/pkg/exp/types/universe.go b/src/pkg/exp/types/universe.go deleted file mode 100644 index cb89397b2e..0000000000 --- a/src/pkg/exp/types/universe.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// FILE UNDER CONSTRUCTION. ANY AND ALL PARTS MAY CHANGE. -// This file implements the universe and unsafe package scopes. - -package types - -import "go/ast" - -var ( - scope *ast.Scope // current scope to use for initialization - Universe *ast.Scope - Unsafe *ast.Object // package unsafe -) - -func define(kind ast.ObjKind, name string) *ast.Object { - obj := ast.NewObj(kind, name) - if scope.Insert(obj) != nil { - panic("types internal error: double declaration") - } - obj.Decl = scope - return obj -} - -func defType(name string) *Name { - obj := define(ast.Typ, name) - typ := &Name{Underlying: &Basic{}, Obj: obj} - obj.Type = typ - return typ -} - -func defConst(name string) { - obj := define(ast.Con, name) - _ = obj // TODO(gri) fill in other properties -} - -func defFun(name string) { - obj := define(ast.Fun, name) - _ = obj // TODO(gri) fill in other properties -} - -var ( - Bool, - Int, - Float64, - Complex128, - String *Name -) - -func init() { - scope = ast.NewScope(nil) - Universe = scope - - Bool = defType("bool") - defType("byte") // TODO(gri) should be an alias for uint8 - defType("rune") // TODO(gri) should be an alias for int - defType("complex64") - Complex128 = defType("complex128") - defType("error") - defType("float32") - Float64 = defType("float64") - defType("int8") - defType("int16") - defType("int32") - defType("int64") - String = defType("string") - defType("uint8") - defType("uint16") - defType("uint32") - defType("uint64") - Int = defType("int") - defType("uint") - defType("uintptr") - - defConst("true") - defConst("false") - defConst("iota") - defConst("nil") - - defFun("append") - defFun("cap") - defFun("close") - defFun("complex") - defFun("copy") - defFun("delete") - defFun("imag") - defFun("len") - defFun("make") - defFun("new") - defFun("panic") - defFun("print") - defFun("println") - defFun("real") - defFun("recover") - - scope = ast.NewScope(nil) - Unsafe = ast.NewObj(ast.Pkg, "unsafe") - Unsafe.Data = scope - - defType("Pointer") - - defFun("Alignof") - defFun("Offsetof") - defFun("Sizeof") -} diff --git a/src/pkg/exp/utf8string/string.go b/src/pkg/exp/utf8string/string.go deleted file mode 100644 index da1e2de1ea..0000000000 --- a/src/pkg/exp/utf8string/string.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package utf8string provides an efficient way to index strings by rune rather than by byte. -package utf8string - -import ( - "errors" - "unicode/utf8" -) - -// String wraps a regular string with a small structure that provides more -// efficient indexing by code point index, as opposed to byte index. -// Scanning incrementally forwards or backwards is O(1) per index operation -// (although not as fast a range clause going forwards). Random access is -// O(N) in the length of the string, but the overhead is less than always -// scanning from the beginning. -// If the string is ASCII, random access is O(1). -// Unlike the built-in string type, String has internal mutable state and -// is not thread-safe. -type String struct { - str string - numRunes int - // If width > 0, the rune at runePos starts at bytePos and has the specified width. - width int - bytePos int - runePos int - nonASCII int // byte index of the first non-ASCII rune. -} - -// NewString returns a new UTF-8 string with the provided contents. -func NewString(contents string) *String { - return new(String).Init(contents) -} - -// Init initializes an existing String to hold the provided contents. -// It returns a pointer to the initialized String. -func (s *String) Init(contents string) *String { - s.str = contents - s.bytePos = 0 - s.runePos = 0 - for i := 0; i < len(contents); i++ { - if contents[i] >= utf8.RuneSelf { - // Not ASCII. - s.numRunes = utf8.RuneCountInString(contents) - _, s.width = utf8.DecodeRuneInString(contents) - s.nonASCII = i - return s - } - } - // ASCII is simple. Also, the empty string is ASCII. - s.numRunes = len(contents) - s.width = 0 - s.nonASCII = len(contents) - return s -} - -// String returns the contents of the String. This method also means the -// String is directly printable by fmt.Print. -func (s *String) String() string { - return s.str -} - -// RuneCount returns the number of runes (Unicode code points) in the String. -func (s *String) RuneCount() int { - return s.numRunes -} - -// IsASCII returns a boolean indicating whether the String contains only ASCII bytes. -func (s *String) IsASCII() bool { - return s.width == 0 -} - -// Slice returns the string sliced at rune positions [i:j]. -func (s *String) Slice(i, j int) string { - // ASCII is easy. Let the compiler catch the indexing error if there is one. - if j < s.nonASCII { - return s.str[i:j] - } - if i < 0 || j > s.numRunes || i > j { - panic(sliceOutOfRange) - } - if i == j { - return "" - } - // For non-ASCII, after At(i), bytePos is always the position of the indexed character. - var low, high int - switch { - case i < s.nonASCII: - low = i - case i == s.numRunes: - low = len(s.str) - default: - s.At(i) - low = s.bytePos - } - switch { - case j == s.numRunes: - high = len(s.str) - default: - s.At(j) - high = s.bytePos - } - return s.str[low:high] -} - -// At returns the rune with index i in the String. The sequence of runes is the same -// as iterating over the contents with a "for range" clause. -func (s *String) At(i int) rune { - // ASCII is easy. Let the compiler catch the indexing error if there is one. - if i < s.nonASCII { - return rune(s.str[i]) - } - - // Now we do need to know the index is valid. - if i < 0 || i >= s.numRunes { - panic(outOfRange) - } - - var r rune - - // Five easy common cases: within 1 spot of bytePos/runePos, or the beginning, or the end. - // With these cases, all scans from beginning or end work in O(1) time per rune. - switch { - - case i == s.runePos-1: // backing up one rune - r, s.width = utf8.DecodeLastRuneInString(s.str[0:s.bytePos]) - s.runePos = i - s.bytePos -= s.width - return r - case i == s.runePos+1: // moving ahead one rune - s.runePos = i - s.bytePos += s.width - fallthrough - case i == s.runePos: - r, s.width = utf8.DecodeRuneInString(s.str[s.bytePos:]) - return r - case i == 0: // start of string - r, s.width = utf8.DecodeRuneInString(s.str) - s.runePos = 0 - s.bytePos = 0 - return r - - case i == s.numRunes-1: // last rune in string - r, s.width = utf8.DecodeLastRuneInString(s.str) - s.runePos = i - s.bytePos = len(s.str) - s.width - return r - } - - // We need to do a linear scan. There are three places to start from: - // 1) The beginning - // 2) bytePos/runePos. - // 3) The end - // Choose the closest in rune count, scanning backwards if necessary. - forward := true - if i < s.runePos { - // Between beginning and pos. Which is closer? - // Since both i and runePos are guaranteed >= nonASCII, that's the - // lowest location we need to start from. - if i < (s.runePos-s.nonASCII)/2 { - // Scan forward from beginning - s.bytePos, s.runePos = s.nonASCII, s.nonASCII - } else { - // Scan backwards from where we are - forward = false - } - } else { - // Between pos and end. Which is closer? - if i-s.runePos < (s.numRunes-s.runePos)/2 { - // Scan forward from pos - } else { - // Scan backwards from end - s.bytePos, s.runePos = len(s.str), s.numRunes - forward = false - } - } - if forward { - // TODO: Is it much faster to use a range loop for this scan? - for { - r, s.width = utf8.DecodeRuneInString(s.str[s.bytePos:]) - if s.runePos == i { - break - } - s.runePos++ - s.bytePos += s.width - } - } else { - for { - r, s.width = utf8.DecodeLastRuneInString(s.str[0:s.bytePos]) - s.runePos-- - s.bytePos -= s.width - if s.runePos == i { - break - } - } - } - return r -} - -var outOfRange = errors.New("utf8.String: index out of range") -var sliceOutOfRange = errors.New("utf8.String: slice index out of range") diff --git a/src/pkg/exp/utf8string/string_test.go b/src/pkg/exp/utf8string/string_test.go deleted file mode 100644 index 28511b2f5f..0000000000 --- a/src/pkg/exp/utf8string/string_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package utf8string - -import ( - "math/rand" - "testing" - "unicode/utf8" -) - -var testStrings = []string{ - "", - "abcd", - "☺☻☹", - "日a本b語ç日ð本Ê語þ日¥本¼語i日©", - "日a本b語ç日ð本Ê語þ日¥本¼語i日©日a本b語ç日ð本Ê語þ日¥本¼語i日©日a本b語ç日ð本Ê語þ日¥本¼語i日©", - "\x80\x80\x80\x80", -} - -func TestScanForwards(t *testing.T) { - for _, s := range testStrings { - runes := []rune(s) - str := NewString(s) - if str.RuneCount() != len(runes) { - t.Errorf("%s: expected %d runes; got %d", s, len(runes), str.RuneCount()) - break - } - for i, expect := range runes { - got := str.At(i) - if got != expect { - t.Errorf("%s[%d]: expected %c (%U); got %c (%U)", s, i, expect, expect, got, got) - } - } - } -} - -func TestScanBackwards(t *testing.T) { - for _, s := range testStrings { - runes := []rune(s) - str := NewString(s) - if str.RuneCount() != len(runes) { - t.Errorf("%s: expected %d runes; got %d", s, len(runes), str.RuneCount()) - break - } - for i := len(runes) - 1; i >= 0; i-- { - expect := runes[i] - got := str.At(i) - if got != expect { - t.Errorf("%s[%d]: expected %c (%U); got %c (%U)", s, i, expect, expect, got, got) - } - } - } -} - -func randCount() int { - if testing.Short() { - return 100 - } - return 100000 -} - -func TestRandomAccess(t *testing.T) { - for _, s := range testStrings { - if len(s) == 0 { - continue - } - runes := []rune(s) - str := NewString(s) - if str.RuneCount() != len(runes) { - t.Errorf("%s: expected %d runes; got %d", s, len(runes), str.RuneCount()) - break - } - for j := 0; j < randCount(); j++ { - i := rand.Intn(len(runes)) - expect := runes[i] - got := str.At(i) - if got != expect { - t.Errorf("%s[%d]: expected %c (%U); got %c (%U)", s, i, expect, expect, got, got) - } - } - } -} - -func TestRandomSliceAccess(t *testing.T) { - for _, s := range testStrings { - if len(s) == 0 || s[0] == '\x80' { // the bad-UTF-8 string fools this simple test - continue - } - runes := []rune(s) - str := NewString(s) - if str.RuneCount() != len(runes) { - t.Errorf("%s: expected %d runes; got %d", s, len(runes), str.RuneCount()) - break - } - for k := 0; k < randCount(); k++ { - i := rand.Intn(len(runes)) - j := rand.Intn(len(runes) + 1) - if i > j { // include empty strings - continue - } - expect := string(runes[i:j]) - got := str.Slice(i, j) - if got != expect { - t.Errorf("%s[%d:%d]: expected %q got %q", s, i, j, expect, got) - } - } - } -} - -func TestLimitSliceAccess(t *testing.T) { - for _, s := range testStrings { - str := NewString(s) - if str.Slice(0, 0) != "" { - t.Error("failure with empty slice at beginning") - } - nr := utf8.RuneCountInString(s) - if str.Slice(nr, nr) != "" { - t.Error("failure with empty slice at end") - } - } -} diff --git a/src/pkg/exp/winfsnotify/winfsnotify.go b/src/pkg/exp/winfsnotify/winfsnotify.go deleted file mode 100644 index a6e3a6a8fb..0000000000 --- a/src/pkg/exp/winfsnotify/winfsnotify.go +++ /dev/null @@ -1,572 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Package winfsnotify allows the user to receive -// file system event notifications on Windows. -package winfsnotify - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "runtime" - "syscall" - "unsafe" -) - -// Event is the type of the notification messages -// received on the watcher's Event channel. -type Event struct { - Mask uint32 // Mask of events - Cookie uint32 // Unique cookie associating related events (for rename) - Name string // File name (optional) -} - -const ( - opAddWatch = iota - opRemoveWatch -) - -const ( - provisional uint64 = 1 << (32 + iota) -) - -type input struct { - op int - path string - flags uint32 - reply chan error -} - -type inode struct { - handle syscall.Handle - volume uint32 - index uint64 -} - -type watch struct { - ov syscall.Overlapped - ino *inode // i-number - path string // Directory path - mask uint64 // Directory itself is being watched with these notify flags - names map[string]uint64 // Map of names being watched and their notify flags - rename string // Remembers the old name while renaming a file - buf [4096]byte -} - -type indexMap map[uint64]*watch -type watchMap map[uint32]indexMap - -// A Watcher waits for and receives event notifications -// for a specific set of files and directories. -type Watcher struct { - port syscall.Handle // Handle to completion port - watches watchMap // Map of watches (key: i-number) - input chan *input // Inputs to the reader are sent on this channel - Event chan *Event // Events are returned on this channel - Error chan error // Errors are sent on this channel - isClosed bool // Set to true when Close() is first called - quit chan chan<- error - cookie uint32 -} - -// NewWatcher creates and returns a Watcher. -func NewWatcher() (*Watcher, error) { - port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) - if e != nil { - return nil, os.NewSyscallError("CreateIoCompletionPort", e) - } - w := &Watcher{ - port: port, - watches: make(watchMap), - input: make(chan *input, 1), - Event: make(chan *Event, 50), - Error: make(chan error), - quit: make(chan chan<- error, 1), - } - go w.readEvents() - return w, nil -} - -// Close closes a Watcher. -// It sends a message to the reader goroutine to quit and removes all watches -// associated with the watcher. -func (w *Watcher) Close() error { - if w.isClosed { - return nil - } - w.isClosed = true - - // Send "quit" message to the reader goroutine - ch := make(chan error) - w.quit <- ch - if err := w.wakeupReader(); err != nil { - return err - } - return <-ch -} - -// AddWatch adds path to the watched file set. -func (w *Watcher) AddWatch(path string, flags uint32) error { - if w.isClosed { - return errors.New("watcher already closed") - } - in := &input{ - op: opAddWatch, - path: filepath.Clean(path), - flags: flags, - reply: make(chan error), - } - w.input <- in - if err := w.wakeupReader(); err != nil { - return err - } - return <-in.reply -} - -// Watch adds path to the watched file set, watching all events. -func (w *Watcher) Watch(path string) error { - return w.AddWatch(path, FS_ALL_EVENTS) -} - -// RemoveWatch removes path from the watched file set. -func (w *Watcher) RemoveWatch(path string) error { - in := &input{ - op: opRemoveWatch, - path: filepath.Clean(path), - reply: make(chan error), - } - w.input <- in - if err := w.wakeupReader(); err != nil { - return err - } - return <-in.reply -} - -func (w *Watcher) wakeupReader() error { - e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) - if e != nil { - return os.NewSyscallError("PostQueuedCompletionStatus", e) - } - return nil -} - -func getDir(pathname string) (dir string, err error) { - attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) - if e != nil { - return "", os.NewSyscallError("GetFileAttributes", e) - } - if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { - dir = pathname - } else { - dir, _ = filepath.Split(pathname) - dir = filepath.Clean(dir) - } - return -} - -func getIno(path string) (ino *inode, err error) { - h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), - syscall.FILE_LIST_DIRECTORY, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - nil, syscall.OPEN_EXISTING, - syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) - if e != nil { - return nil, os.NewSyscallError("CreateFile", e) - } - var fi syscall.ByHandleFileInformation - if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { - syscall.CloseHandle(h) - return nil, os.NewSyscallError("GetFileInformationByHandle", e) - } - ino = &inode{ - handle: h, - volume: fi.VolumeSerialNumber, - index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), - } - return ino, nil -} - -// Must run within the I/O thread. -func (m watchMap) get(ino *inode) *watch { - if i := m[ino.volume]; i != nil { - return i[ino.index] - } - return nil -} - -// Must run within the I/O thread. -func (m watchMap) set(ino *inode, watch *watch) { - i := m[ino.volume] - if i == nil { - i = make(indexMap) - m[ino.volume] = i - } - i[ino.index] = watch -} - -// Must run within the I/O thread. -func (w *Watcher) addWatch(pathname string, flags uint64) error { - dir, err := getDir(pathname) - if err != nil { - return err - } - if flags&FS_ONLYDIR != 0 && pathname != dir { - return nil - } - ino, err := getIno(dir) - if err != nil { - return err - } - watchEntry := w.watches.get(ino) - if watchEntry == nil { - if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { - syscall.CloseHandle(ino.handle) - return os.NewSyscallError("CreateIoCompletionPort", e) - } - watchEntry = &watch{ - ino: ino, - path: dir, - names: make(map[string]uint64), - } - w.watches.set(ino, watchEntry) - flags |= provisional - } else { - syscall.CloseHandle(ino.handle) - } - if pathname == dir { - watchEntry.mask |= flags - } else { - watchEntry.names[filepath.Base(pathname)] |= flags - } - if err = w.startRead(watchEntry); err != nil { - return err - } - if pathname == dir { - watchEntry.mask &= ^provisional - } else { - watchEntry.names[filepath.Base(pathname)] &= ^provisional - } - return nil -} - -// Must run within the I/O thread. -func (w *Watcher) removeWatch(pathname string) error { - dir, err := getDir(pathname) - if err != nil { - return err - } - ino, err := getIno(dir) - if err != nil { - return err - } - watch := w.watches.get(ino) - if watch == nil { - return fmt.Errorf("can't remove non-existent watch for: %s", pathname) - } - if pathname == dir { - w.sendEvent(watch.path, watch.mask&FS_IGNORED) - watch.mask = 0 - } else { - name := filepath.Base(pathname) - w.sendEvent(watch.path+"/"+name, watch.names[name]&FS_IGNORED) - delete(watch.names, name) - } - return w.startRead(watch) -} - -// Must run within the I/O thread. -func (w *Watcher) deleteWatch(watch *watch) { - for name, mask := range watch.names { - if mask&provisional == 0 { - w.sendEvent(watch.path+"/"+name, mask&FS_IGNORED) - } - delete(watch.names, name) - } - if watch.mask != 0 { - if watch.mask&provisional == 0 { - w.sendEvent(watch.path, watch.mask&FS_IGNORED) - } - watch.mask = 0 - } -} - -// Must run within the I/O thread. -func (w *Watcher) startRead(watch *watch) error { - if e := syscall.CancelIo(watch.ino.handle); e != nil { - w.Error <- os.NewSyscallError("CancelIo", e) - w.deleteWatch(watch) - } - mask := toWindowsFlags(watch.mask) - for _, m := range watch.names { - mask |= toWindowsFlags(m) - } - if mask == 0 { - if e := syscall.CloseHandle(watch.ino.handle); e != nil { - w.Error <- os.NewSyscallError("CloseHandle", e) - } - delete(w.watches[watch.ino.volume], watch.ino.index) - return nil - } - e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], - uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) - if e != nil { - err := os.NewSyscallError("ReadDirectoryChanges", e) - if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { - // Watched directory was probably removed - if w.sendEvent(watch.path, watch.mask&FS_DELETE_SELF) { - if watch.mask&FS_ONESHOT != 0 { - watch.mask = 0 - } - } - err = nil - } - w.deleteWatch(watch) - w.startRead(watch) - return err - } - return nil -} - -// readEvents reads from the I/O completion port, converts the -// received events into Event objects and sends them via the Event channel. -// Entry point to the I/O thread. -func (w *Watcher) readEvents() { - var ( - n, key uint32 - ov *syscall.Overlapped - ) - runtime.LockOSThread() - - for { - e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) - watch := (*watch)(unsafe.Pointer(ov)) - - if watch == nil { - select { - case ch := <-w.quit: - for _, index := range w.watches { - for _, watch := range index { - w.deleteWatch(watch) - w.startRead(watch) - } - } - var err error - if e := syscall.CloseHandle(w.port); e != nil { - err = os.NewSyscallError("CloseHandle", e) - } - close(w.Event) - close(w.Error) - ch <- err - return - case in := <-w.input: - switch in.op { - case opAddWatch: - in.reply <- w.addWatch(in.path, uint64(in.flags)) - case opRemoveWatch: - in.reply <- w.removeWatch(in.path) - } - default: - } - continue - } - - switch e { - case syscall.ERROR_ACCESS_DENIED: - // Watched directory was probably removed - w.sendEvent(watch.path, watch.mask&FS_DELETE_SELF) - w.deleteWatch(watch) - w.startRead(watch) - continue - case syscall.ERROR_OPERATION_ABORTED: - // CancelIo was called on this handle - continue - default: - w.Error <- os.NewSyscallError("GetQueuedCompletionPort", e) - continue - case nil: - } - - var offset uint32 - for { - if n == 0 { - w.Event <- &Event{Mask: FS_Q_OVERFLOW} - w.Error <- errors.New("short read in readEvents()") - break - } - - // Point "raw" to the event in the buffer - raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) - buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName)) - name := syscall.UTF16ToString(buf[:raw.FileNameLength/2]) - fullname := watch.path + "/" + name - - var mask uint64 - switch raw.Action { - case syscall.FILE_ACTION_REMOVED: - mask = FS_DELETE_SELF - case syscall.FILE_ACTION_MODIFIED: - mask = FS_MODIFY - case syscall.FILE_ACTION_RENAMED_OLD_NAME: - watch.rename = name - case syscall.FILE_ACTION_RENAMED_NEW_NAME: - if watch.names[watch.rename] != 0 { - watch.names[name] |= watch.names[watch.rename] - delete(watch.names, watch.rename) - mask = FS_MOVE_SELF - } - } - - sendNameEvent := func() { - if w.sendEvent(fullname, watch.names[name]&mask) { - if watch.names[name]&FS_ONESHOT != 0 { - delete(watch.names, name) - } - } - } - if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { - sendNameEvent() - } - if raw.Action == syscall.FILE_ACTION_REMOVED { - w.sendEvent(fullname, watch.names[name]&FS_IGNORED) - delete(watch.names, name) - } - if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { - if watch.mask&FS_ONESHOT != 0 { - watch.mask = 0 - } - } - if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { - fullname = watch.path + "/" + watch.rename - sendNameEvent() - } - - // Move to the next event in the buffer - if raw.NextEntryOffset == 0 { - break - } - offset += raw.NextEntryOffset - } - - if err := w.startRead(watch); err != nil { - w.Error <- err - } - } -} - -func (w *Watcher) sendEvent(name string, mask uint64) bool { - if mask == 0 { - return false - } - event := &Event{Mask: uint32(mask), Name: name} - if mask&FS_MOVE != 0 { - if mask&FS_MOVED_FROM != 0 { - w.cookie++ - } - event.Cookie = w.cookie - } - select { - case ch := <-w.quit: - w.quit <- ch - case w.Event <- event: - } - return true -} - -// String formats the event e in the form -// "filename: 0xEventMask = FS_ACCESS|FS_ATTRIB_|..." -func (e *Event) String() string { - var events string - m := e.Mask - for _, b := range eventBits { - if m&b.Value != 0 { - m &^= b.Value - events += "|" + b.Name - } - } - if m != 0 { - events += fmt.Sprintf("|%#x", m) - } - if len(events) > 0 { - events = " == " + events[1:] - } - return fmt.Sprintf("%q: %#x%s", e.Name, e.Mask, events) -} - -func toWindowsFlags(mask uint64) uint32 { - var m uint32 - if mask&FS_ACCESS != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS - } - if mask&FS_MODIFY != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE - } - if mask&FS_ATTRIB != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES - } - if mask&(FS_MOVE|FS_CREATE|FS_DELETE) != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME - } - return m -} - -func toFSnotifyFlags(action uint32) uint64 { - switch action { - case syscall.FILE_ACTION_ADDED: - return FS_CREATE - case syscall.FILE_ACTION_REMOVED: - return FS_DELETE - case syscall.FILE_ACTION_MODIFIED: - return FS_MODIFY - case syscall.FILE_ACTION_RENAMED_OLD_NAME: - return FS_MOVED_FROM - case syscall.FILE_ACTION_RENAMED_NEW_NAME: - return FS_MOVED_TO - } - return 0 -} - -const ( - // Options for AddWatch - FS_ONESHOT = 0x80000000 - FS_ONLYDIR = 0x1000000 - - // Events - FS_ACCESS = 0x1 - FS_ALL_EVENTS = 0xfff - FS_ATTRIB = 0x4 - FS_CLOSE = 0x18 - FS_CREATE = 0x100 - FS_DELETE = 0x200 - FS_DELETE_SELF = 0x400 - FS_MODIFY = 0x2 - FS_MOVE = 0xc0 - FS_MOVED_FROM = 0x40 - FS_MOVED_TO = 0x80 - FS_MOVE_SELF = 0x800 - - // Special events - FS_IGNORED = 0x8000 - FS_Q_OVERFLOW = 0x4000 -) - -var eventBits = []struct { - Value uint32 - Name string -}{ - {FS_ACCESS, "FS_ACCESS"}, - {FS_ATTRIB, "FS_ATTRIB"}, - {FS_CREATE, "FS_CREATE"}, - {FS_DELETE, "FS_DELETE"}, - {FS_DELETE_SELF, "FS_DELETE_SELF"}, - {FS_MODIFY, "FS_MODIFY"}, - {FS_MOVED_FROM, "FS_MOVED_FROM"}, - {FS_MOVED_TO, "FS_MOVED_TO"}, - {FS_MOVE_SELF, "FS_MOVE_SELF"}, - {FS_IGNORED, "FS_IGNORED"}, - {FS_Q_OVERFLOW, "FS_Q_OVERFLOW"}, -} diff --git a/src/pkg/exp/winfsnotify/winfsnotify_test.go b/src/pkg/exp/winfsnotify/winfsnotify_test.go deleted file mode 100644 index 4a1929a839..0000000000 --- a/src/pkg/exp/winfsnotify/winfsnotify_test.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package winfsnotify - -import ( - "io/ioutil" - "os" - "testing" - "time" -) - -func expect(t *testing.T, eventstream <-chan *Event, name string, mask uint32) { - t.Logf(`expected: "%s": 0x%x`, name, mask) - select { - case event := <-eventstream: - if event == nil { - t.Fatal("nil event received") - } - t.Logf("received: %s", event) - if event.Name != name || event.Mask != mask { - t.Fatal("did not receive expected event") - } - case <-time.After(1 * time.Second): - t.Fatal("timed out waiting for event") - } -} - -func TestNotifyEvents(t *testing.T) { - watcher, err := NewWatcher() - if err != nil { - t.Fatalf("NewWatcher() failed: %s", err) - } - - testDir := "TestNotifyEvents.testdirectory" - testFile := testDir + "/TestNotifyEvents.testfile" - testFile2 := testFile + ".new" - const mask = FS_ALL_EVENTS & ^(FS_ATTRIB|FS_CLOSE) | FS_IGNORED - - // Add a watch for testDir - os.RemoveAll(testDir) - if err = os.Mkdir(testDir, 0777); err != nil { - t.Fatalf("Failed to create test directory: %s", err) - } - defer os.RemoveAll(testDir) - err = watcher.AddWatch(testDir, mask) - if err != nil { - t.Fatalf("Watcher.Watch() failed: %s", err) - } - - // Receive errors on the error channel on a separate goroutine - go func() { - for err := range watcher.Error { - t.Fatalf("error received: %s", err) - } - }() - - // Create a file - file, err := os.Create(testFile) - if err != nil { - t.Fatalf("creating test file failed: %s", err) - } - expect(t, watcher.Event, testFile, FS_CREATE) - - err = watcher.AddWatch(testFile, mask) - if err != nil { - t.Fatalf("Watcher.Watch() failed: %s", err) - } - - if _, err = file.WriteString("hello, world"); err != nil { - t.Fatalf("failed to write to test file: %s", err) - } - if err = file.Close(); err != nil { - t.Fatalf("failed to close test file: %s", err) - } - expect(t, watcher.Event, testFile, FS_MODIFY) - expect(t, watcher.Event, testFile, FS_MODIFY) - - if err = os.Rename(testFile, testFile2); err != nil { - t.Fatalf("failed to rename test file: %s", err) - } - expect(t, watcher.Event, testFile, FS_MOVED_FROM) - expect(t, watcher.Event, testFile2, FS_MOVED_TO) - expect(t, watcher.Event, testFile, FS_MOVE_SELF) - - if err = os.RemoveAll(testDir); err != nil { - t.Fatalf("failed to remove test directory: %s", err) - } - expect(t, watcher.Event, testFile2, FS_DELETE_SELF) - expect(t, watcher.Event, testFile2, FS_IGNORED) - expect(t, watcher.Event, testFile2, FS_DELETE) - expect(t, watcher.Event, testDir, FS_DELETE_SELF) - expect(t, watcher.Event, testDir, FS_IGNORED) - - t.Log("calling Close()") - if err = watcher.Close(); err != nil { - t.Fatalf("failed to close watcher: %s", err) - } -} - -func TestNotifyClose(t *testing.T) { - watcher, _ := NewWatcher() - watcher.Close() - - done := false - go func() { - watcher.Close() - done = true - }() - - time.Sleep(50 * time.Millisecond) - if !done { - t.Fatal("double Close() test failed: second Close() call didn't return") - } - - dir, err := ioutil.TempDir("", "wininotify") - if err != nil { - t.Fatalf("TempDir failed: %s", err) - } - defer os.RemoveAll(dir) - - err = watcher.Watch(dir) - if err == nil { - t.Fatal("expected error on Watch() after Close(), got nil") - } -} diff --git a/src/pkg/old/netchan/common.go b/src/pkg/old/netchan/common.go deleted file mode 100644 index d0daf53720..0000000000 --- a/src/pkg/old/netchan/common.go +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package netchan - -import ( - "encoding/gob" - "errors" - "io" - "reflect" - "sync" - "time" -) - -// The direction of a connection from the client's perspective. -type Dir int - -const ( - Recv Dir = iota - Send -) - -func (dir Dir) String() string { - switch dir { - case Recv: - return "Recv" - case Send: - return "Send" - } - return "???" -} - -// Payload types -const ( - payRequest = iota // request structure follows - payError // error structure follows - payData // user payload follows - payAck // acknowledgement; no payload - payClosed // channel is now closed - payAckSend // payload has been delivered. -) - -// A header is sent as a prefix to every transmission. It will be followed by -// a request structure, an error structure, or an arbitrary user payload structure. -type header struct { - Id int - PayloadType int - SeqNum int64 -} - -// Sent with a header once per channel from importer to exporter to report -// that it wants to bind to a channel with the specified direction for count -// messages, with space for size buffered values. If count is -1, it means unlimited. -type request struct { - Name string - Count int64 - Size int - Dir Dir -} - -// Sent with a header to report an error. -type error_ struct { - Error string -} - -// Used to unify management of acknowledgements for import and export. -type unackedCounter interface { - unackedCount() int64 - ack() int64 - seq() int64 -} - -// A channel and its direction. -type chanDir struct { - ch reflect.Value - dir Dir -} - -// clientSet contains the objects and methods needed for tracking -// clients of an exporter and draining outstanding messages. -type clientSet struct { - mu sync.Mutex // protects access to channel and client maps - names map[string]*chanDir - clients map[unackedCounter]bool -} - -// Mutex-protected encoder and decoder pair. -type encDec struct { - decLock sync.Mutex - dec *gob.Decoder - encLock sync.Mutex - enc *gob.Encoder -} - -func newEncDec(conn io.ReadWriter) *encDec { - return &encDec{ - dec: gob.NewDecoder(conn), - enc: gob.NewEncoder(conn), - } -} - -// Decode an item from the connection. -func (ed *encDec) decode(value reflect.Value) error { - ed.decLock.Lock() - err := ed.dec.DecodeValue(value) - if err != nil { - // TODO: tear down connection? - } - ed.decLock.Unlock() - return err -} - -// Encode a header and payload onto the connection. -func (ed *encDec) encode(hdr *header, payloadType int, payload interface{}) error { - ed.encLock.Lock() - hdr.PayloadType = payloadType - err := ed.enc.Encode(hdr) - if err == nil { - if payload != nil { - err = ed.enc.Encode(payload) - } - } - if err != nil { - // TODO: tear down connection if there is an error? - } - ed.encLock.Unlock() - return err -} - -// See the comment for Exporter.Drain. -func (cs *clientSet) drain(timeout time.Duration) error { - deadline := time.Now().Add(timeout) - for { - pending := false - cs.mu.Lock() - // Any messages waiting for a client? - for _, chDir := range cs.names { - if chDir.ch.Len() > 0 { - pending = true - } - } - // Any unacknowledged messages? - for client := range cs.clients { - n := client.unackedCount() - if n > 0 { // Check for > rather than != just to be safe. - pending = true - break - } - } - cs.mu.Unlock() - if !pending { - break - } - if timeout > 0 && time.Now().After(deadline) { - return errors.New("timeout") - } - time.Sleep(100 * time.Millisecond) - } - return nil -} - -// See the comment for Exporter.Sync. -func (cs *clientSet) sync(timeout time.Duration) error { - deadline := time.Now().Add(timeout) - // seq remembers the clients and their seqNum at point of entry. - seq := make(map[unackedCounter]int64) - cs.mu.Lock() - for client := range cs.clients { - seq[client] = client.seq() - } - cs.mu.Unlock() - for { - pending := false - cs.mu.Lock() - // Any unacknowledged messages? Look only at clients that existed - // when we started and are still in this client set. - for client := range seq { - if _, ok := cs.clients[client]; ok { - if client.ack() < seq[client] { - pending = true - break - } - } - } - cs.mu.Unlock() - if !pending { - break - } - if timeout > 0 && time.Now().After(deadline) { - return errors.New("timeout") - } - time.Sleep(100 * time.Millisecond) - } - return nil -} - -// A netChan represents a channel imported or exported -// on a single connection. Flow is controlled by the receiving -// side by sending payAckSend messages when values -// are delivered into the local channel. -type netChan struct { - *chanDir - name string - id int - size int // buffer size of channel. - closed bool - - // sender-specific state - ackCh chan bool // buffered with space for all the acks we need - space int // available space. - - // receiver-specific state - sendCh chan reflect.Value // buffered channel of values received from other end. - ed *encDec // so that we can send acks. - count int64 // number of values still to receive. -} - -// Create a new netChan with the given name (only used for -// messages), id, direction, buffer size, and count. -// The connection to the other side is represented by ed. -func newNetChan(name string, id int, ch *chanDir, ed *encDec, size int, count int64) *netChan { - c := &netChan{chanDir: ch, name: name, id: id, size: size, ed: ed, count: count} - if c.dir == Send { - c.ackCh = make(chan bool, size) - c.space = size - } - return c -} - -// Close the channel. -func (nch *netChan) close() { - if nch.closed { - return - } - if nch.dir == Recv { - if nch.sendCh != nil { - // If the sender goroutine is active, close the channel to it. - // It will close nch.ch when it can. - close(nch.sendCh) - } else { - nch.ch.Close() - } - } else { - nch.ch.Close() - close(nch.ackCh) - } - nch.closed = true -} - -// Send message from remote side to local receiver. -func (nch *netChan) send(val reflect.Value) { - if nch.dir != Recv { - panic("send on wrong direction of channel") - } - if nch.sendCh == nil { - // If possible, do local send directly and ack immediately. - if nch.ch.TrySend(val) { - nch.sendAck() - return - } - // Start sender goroutine to manage delayed delivery of values. - nch.sendCh = make(chan reflect.Value, nch.size) - go nch.sender() - } - select { - case nch.sendCh <- val: - // ok - default: - // TODO: should this be more resilient? - panic("netchan: remote sender sent more values than allowed") - } -} - -// sendAck sends an acknowledgment that a message has left -// the channel's buffer. If the messages remaining to be sent -// will fit in the channel's buffer, then we don't -// need to send an ack. -func (nch *netChan) sendAck() { - if nch.count < 0 || nch.count > int64(nch.size) { - nch.ed.encode(&header{Id: nch.id}, payAckSend, nil) - } - if nch.count > 0 { - nch.count-- - } -} - -// The sender process forwards items from the sending queue -// to the destination channel, acknowledging each item. -func (nch *netChan) sender() { - if nch.dir != Recv { - panic("sender on wrong direction of channel") - } - // When Exporter.Hangup is called, the underlying channel is closed, - // and so we may get a "too many operations on closed channel" error - // if there are outstanding messages in sendCh. - // Make sure that this doesn't panic the whole program. - defer func() { - if r := recover(); r != nil { - // TODO check that r is "too many operations", otherwise re-panic. - } - }() - for v := range nch.sendCh { - nch.ch.Send(v) - nch.sendAck() - } - nch.ch.Close() -} - -// Receive value from local side for sending to remote side. -func (nch *netChan) recv() (val reflect.Value, ok bool) { - if nch.dir != Send { - panic("recv on wrong direction of channel") - } - - if nch.space == 0 { - // Wait for buffer space. - <-nch.ackCh - nch.space++ - } - nch.space-- - return nch.ch.Recv() -} - -// acked is called when the remote side indicates that -// a value has been delivered. -func (nch *netChan) acked() { - if nch.dir != Send { - panic("recv on wrong direction of channel") - } - select { - case nch.ackCh <- true: - // ok - default: - // TODO: should this be more resilient? - panic("netchan: remote receiver sent too many acks") - } -} diff --git a/src/pkg/old/netchan/export.go b/src/pkg/old/netchan/export.go deleted file mode 100644 index d94c4b16b2..0000000000 --- a/src/pkg/old/netchan/export.go +++ /dev/null @@ -1,400 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* - Package netchan implements type-safe networked channels: - it allows the two ends of a channel to appear on different - computers connected by a network. It does this by transporting - data sent to a channel on one machine so it can be recovered - by a receive of a channel of the same type on the other. - - An exporter publishes a set of channels by name. An importer - connects to the exporting machine and imports the channels - by name. After importing the channels, the two machines can - use the channels in the usual way. - - Networked channels are not synchronized; they always behave - as if they are buffered channels of at least one element. -*/ -package netchan - -// BUG: can't use range clause to receive when using ImportNValues to limit the count. - -import ( - "errors" - "io" - "log" - "net" - "reflect" - "strconv" - "sync" - "time" -) - -// Export - -// expLog is a logging convenience function. The first argument must be a string. -func expLog(args ...interface{}) { - args[0] = "netchan export: " + args[0].(string) - log.Print(args...) -} - -// An Exporter allows a set of channels to be published on a single -// network port. A single machine may have multiple Exporters -// but they must use different ports. -type Exporter struct { - *clientSet -} - -type expClient struct { - *encDec - exp *Exporter - chans map[int]*netChan // channels in use by client - mu sync.Mutex // protects remaining fields - errored bool // client has been sent an error - seqNum int64 // sequences messages sent to client; has value of highest sent - ackNum int64 // highest sequence number acknowledged - seqLock sync.Mutex // guarantees messages are in sequence, only locked under mu -} - -func newClient(exp *Exporter, conn io.ReadWriter) *expClient { - client := new(expClient) - client.exp = exp - client.encDec = newEncDec(conn) - client.seqNum = 0 - client.ackNum = 0 - client.chans = make(map[int]*netChan) - return client -} - -func (client *expClient) sendError(hdr *header, err string) { - error := &error_{err} - expLog("sending error to client:", error.Error) - client.encode(hdr, payError, error) // ignore any encode error, hope client gets it - client.mu.Lock() - client.errored = true - client.mu.Unlock() -} - -func (client *expClient) newChan(hdr *header, dir Dir, name string, size int, count int64) *netChan { - exp := client.exp - exp.mu.Lock() - ech, ok := exp.names[name] - exp.mu.Unlock() - if !ok { - client.sendError(hdr, "no such channel: "+name) - return nil - } - if ech.dir != dir { - client.sendError(hdr, "wrong direction for channel: "+name) - return nil - } - nch := newNetChan(name, hdr.Id, ech, client.encDec, size, count) - client.chans[hdr.Id] = nch - return nch -} - -func (client *expClient) getChan(hdr *header, dir Dir) *netChan { - nch := client.chans[hdr.Id] - if nch == nil { - return nil - } - if nch.dir != dir { - client.sendError(hdr, "wrong direction for channel: "+nch.name) - } - return nch -} - -// The function run manages sends and receives for a single client. For each -// (client Recv) request, this will launch a serveRecv goroutine to deliver -// the data for that channel, while (client Send) requests are handled as -// data arrives from the client. -func (client *expClient) run() { - hdr := new(header) - hdrValue := reflect.ValueOf(hdr) - req := new(request) - reqValue := reflect.ValueOf(req) - error := new(error_) - for { - *hdr = header{} - if err := client.decode(hdrValue); err != nil { - if err != io.EOF { - expLog("error decoding client header:", err) - } - break - } - switch hdr.PayloadType { - case payRequest: - *req = request{} - if err := client.decode(reqValue); err != nil { - expLog("error decoding client request:", err) - break - } - if req.Size < 1 { - panic("netchan: remote requested " + strconv.Itoa(req.Size) + " values") - } - switch req.Dir { - case Recv: - // look up channel before calling serveRecv to - // avoid a lock around client.chans. - if nch := client.newChan(hdr, Send, req.Name, req.Size, req.Count); nch != nil { - go client.serveRecv(nch, *hdr, req.Count) - } - case Send: - client.newChan(hdr, Recv, req.Name, req.Size, req.Count) - // The actual sends will have payload type payData. - // TODO: manage the count? - default: - error.Error = "request: can't handle channel direction" - expLog(error.Error, req.Dir) - client.encode(hdr, payError, error) - } - case payData: - client.serveSend(*hdr) - case payClosed: - client.serveClosed(*hdr) - case payAck: - client.mu.Lock() - if client.ackNum != hdr.SeqNum-1 { - // Since the sequence number is incremented and the message is sent - // in a single instance of locking client.mu, the messages are guaranteed - // to be sent in order. Therefore receipt of acknowledgement N means - // all messages <=N have been seen by the recipient. We check anyway. - expLog("sequence out of order:", client.ackNum, hdr.SeqNum) - } - if client.ackNum < hdr.SeqNum { // If there has been an error, don't back up the count. - client.ackNum = hdr.SeqNum - } - client.mu.Unlock() - case payAckSend: - if nch := client.getChan(hdr, Send); nch != nil { - nch.acked() - } - default: - log.Fatal("netchan export: unknown payload type", hdr.PayloadType) - } - } - client.exp.delClient(client) -} - -// Send all the data on a single channel to a client asking for a Recv. -// The header is passed by value to avoid issues of overwriting. -func (client *expClient) serveRecv(nch *netChan, hdr header, count int64) { - for { - val, ok := nch.recv() - if !ok { - if err := client.encode(&hdr, payClosed, nil); err != nil { - expLog("error encoding server closed message:", err) - } - break - } - // We hold the lock during transmission to guarantee messages are - // sent in sequence number order. Also, we increment first so the - // value of client.SeqNum is the value of the highest used sequence - // number, not one beyond. - client.mu.Lock() - client.seqNum++ - hdr.SeqNum = client.seqNum - client.seqLock.Lock() // guarantee ordering of messages - client.mu.Unlock() - err := client.encode(&hdr, payData, val.Interface()) - client.seqLock.Unlock() - if err != nil { - expLog("error encoding client response:", err) - client.sendError(&hdr, err.Error()) - break - } - // Negative count means run forever. - if count >= 0 { - if count--; count <= 0 { - break - } - } - } -} - -// Receive and deliver locally one item from a client asking for a Send -// The header is passed by value to avoid issues of overwriting. -func (client *expClient) serveSend(hdr header) { - nch := client.getChan(&hdr, Recv) - if nch == nil { - return - } - // Create a new value for each received item. - val := reflect.New(nch.ch.Type().Elem()).Elem() - if err := client.decode(val); err != nil { - expLog("value decode:", err, "; type ", nch.ch.Type()) - return - } - nch.send(val) -} - -// Report that client has closed the channel that is sending to us. -// The header is passed by value to avoid issues of overwriting. -func (client *expClient) serveClosed(hdr header) { - nch := client.getChan(&hdr, Recv) - if nch == nil { - return - } - nch.close() -} - -func (client *expClient) unackedCount() int64 { - client.mu.Lock() - n := client.seqNum - client.ackNum - client.mu.Unlock() - return n -} - -func (client *expClient) seq() int64 { - client.mu.Lock() - n := client.seqNum - client.mu.Unlock() - return n -} - -func (client *expClient) ack() int64 { - client.mu.Lock() - n := client.seqNum - client.mu.Unlock() - return n -} - -// Serve waits for incoming connections on the listener -// and serves the Exporter's channels on each. -// It blocks until the listener is closed. -func (exp *Exporter) Serve(listener net.Listener) { - for { - conn, err := listener.Accept() - if err != nil { - expLog("listen:", err) - break - } - go exp.ServeConn(conn) - } -} - -// ServeConn exports the Exporter's channels on conn. -// It blocks until the connection is terminated. -func (exp *Exporter) ServeConn(conn io.ReadWriter) { - exp.addClient(conn).run() -} - -// NewExporter creates a new Exporter that exports a set of channels. -func NewExporter() *Exporter { - e := &Exporter{ - clientSet: &clientSet{ - names: make(map[string]*chanDir), - clients: make(map[unackedCounter]bool), - }, - } - return e -} - -// ListenAndServe exports the exporter's channels through the -// given network and local address defined as in net.Listen. -func (exp *Exporter) ListenAndServe(network, localaddr string) error { - listener, err := net.Listen(network, localaddr) - if err != nil { - return err - } - go exp.Serve(listener) - return nil -} - -// addClient creates a new expClient and records its existence -func (exp *Exporter) addClient(conn io.ReadWriter) *expClient { - client := newClient(exp, conn) - exp.mu.Lock() - exp.clients[client] = true - exp.mu.Unlock() - return client -} - -// delClient forgets the client existed -func (exp *Exporter) delClient(client *expClient) { - exp.mu.Lock() - delete(exp.clients, client) - exp.mu.Unlock() -} - -// Drain waits until all messages sent from this exporter/importer, including -// those not yet sent to any client and possibly including those sent while -// Drain was executing, have been received by the importer. In short, it -// waits until all the exporter's messages have been received by a client. -// If the timeout is positive and Drain takes longer than that to complete, -// an error is returned. -func (exp *Exporter) Drain(timeout time.Duration) error { - // This wrapper function is here so the method's comment will appear in godoc. - return exp.clientSet.drain(timeout) -} - -// Sync waits until all clients of the exporter have received the messages -// that were sent at the time Sync was invoked. Unlike Drain, it does not -// wait for messages sent while it is running or messages that have not been -// dispatched to any client. If the timeout is positive and Sync takes longer -// than that to complete, an error is returned. -func (exp *Exporter) Sync(timeout time.Duration) error { - // This wrapper function is here so the method's comment will appear in godoc. - return exp.clientSet.sync(timeout) -} - -func checkChan(chT interface{}, dir Dir) (reflect.Value, error) { - chanType := reflect.TypeOf(chT) - if chanType.Kind() != reflect.Chan { - return reflect.Value{}, errors.New("not a channel") - } - if dir != Send && dir != Recv { - return reflect.Value{}, errors.New("unknown channel direction") - } - switch chanType.ChanDir() { - case reflect.BothDir: - case reflect.SendDir: - if dir != Recv { - return reflect.Value{}, errors.New("to import/export with Send, must provide <-chan") - } - case reflect.RecvDir: - if dir != Send { - return reflect.Value{}, errors.New("to import/export with Recv, must provide chan<-") - } - } - return reflect.ValueOf(chT), nil -} - -// Export exports a channel of a given type and specified direction. The -// channel to be exported is provided in the call and may be of arbitrary -// channel type. -// Despite the literal signature, the effective signature is -// Export(name string, chT chan T, dir Dir) -func (exp *Exporter) Export(name string, chT interface{}, dir Dir) error { - ch, err := checkChan(chT, dir) - if err != nil { - return err - } - exp.mu.Lock() - defer exp.mu.Unlock() - _, present := exp.names[name] - if present { - return errors.New("channel name already being exported:" + name) - } - exp.names[name] = &chanDir{ch, dir} - return nil -} - -// Hangup disassociates the named channel from the Exporter and closes -// the channel. Messages in flight for the channel may be dropped. -func (exp *Exporter) Hangup(name string) error { - exp.mu.Lock() - chDir, ok := exp.names[name] - if ok { - delete(exp.names, name) - } - // TODO drop all instances of channel from client sets - exp.mu.Unlock() - if !ok { - return errors.New("netchan export: hangup: no such channel: " + name) - } - chDir.ch.Close() - return nil -} diff --git a/src/pkg/old/netchan/import.go b/src/pkg/old/netchan/import.go deleted file mode 100644 index 50abaa9fa5..0000000000 --- a/src/pkg/old/netchan/import.go +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package netchan - -import ( - "errors" - "io" - "log" - "net" - "reflect" - "sync" - "time" -) - -// Import - -// impLog is a logging convenience function. The first argument must be a string. -func impLog(args ...interface{}) { - args[0] = "netchan import: " + args[0].(string) - log.Print(args...) -} - -// An Importer allows a set of channels to be imported from a single -// remote machine/network port. A machine may have multiple -// importers, even from the same machine/network port. -type Importer struct { - *encDec - chanLock sync.Mutex // protects access to channel map - names map[string]*netChan - chans map[int]*netChan - errors chan error - maxId int - mu sync.Mutex // protects remaining fields - unacked int64 // number of unacknowledged sends. - seqLock sync.Mutex // guarantees messages are in sequence, only locked under mu -} - -// NewImporter creates a new Importer object to import a set of channels -// from the given connection. The Exporter must be available and serving when -// the Importer is created. -func NewImporter(conn io.ReadWriter) *Importer { - imp := new(Importer) - imp.encDec = newEncDec(conn) - imp.chans = make(map[int]*netChan) - imp.names = make(map[string]*netChan) - imp.errors = make(chan error, 10) - imp.unacked = 0 - go imp.run() - return imp -} - -// Import imports a set of channels from the given network and address. -func Import(network, remoteaddr string) (*Importer, error) { - conn, err := net.Dial(network, remoteaddr) - if err != nil { - return nil, err - } - return NewImporter(conn), nil -} - -// shutdown closes all channels for which we are receiving data from the remote side. -func (imp *Importer) shutdown() { - imp.chanLock.Lock() - for _, ich := range imp.chans { - if ich.dir == Recv { - ich.close() - } - } - imp.chanLock.Unlock() -} - -// Handle the data from a single imported data stream, which will -// have the form -// (response, data)* -// The response identifies by name which channel is transmitting data. -func (imp *Importer) run() { - // Loop on responses; requests are sent by ImportNValues() - hdr := new(header) - hdrValue := reflect.ValueOf(hdr) - ackHdr := new(header) - err := new(error_) - errValue := reflect.ValueOf(err) - for { - *hdr = header{} - if e := imp.decode(hdrValue); e != nil { - if e != io.EOF { - impLog("header:", e) - imp.shutdown() - } - return - } - switch hdr.PayloadType { - case payData: - // done lower in loop - case payError: - if e := imp.decode(errValue); e != nil { - impLog("error:", e) - return - } - if err.Error != "" { - impLog("response error:", err.Error) - select { - case imp.errors <- errors.New(err.Error): - continue // errors are not acknowledged - default: - imp.shutdown() - return - } - } - case payClosed: - nch := imp.getChan(hdr.Id, false) - if nch != nil { - nch.close() - } - continue // closes are not acknowledged. - case payAckSend: - // we can receive spurious acks if the channel is - // hung up, so we ask getChan to ignore any errors. - nch := imp.getChan(hdr.Id, true) - if nch != nil { - nch.acked() - imp.mu.Lock() - imp.unacked-- - imp.mu.Unlock() - } - continue - default: - impLog("unexpected payload type:", hdr.PayloadType) - return - } - nch := imp.getChan(hdr.Id, false) - if nch == nil { - continue - } - if nch.dir != Recv { - impLog("cannot happen: receive from non-Recv channel") - return - } - // Acknowledge receipt - ackHdr.Id = hdr.Id - ackHdr.SeqNum = hdr.SeqNum - imp.encode(ackHdr, payAck, nil) - // Create a new value for each received item. - value := reflect.New(nch.ch.Type().Elem()).Elem() - if e := imp.decode(value); e != nil { - impLog("importer value decode:", e) - return - } - nch.send(value) - } -} - -func (imp *Importer) getChan(id int, errOk bool) *netChan { - imp.chanLock.Lock() - ich := imp.chans[id] - imp.chanLock.Unlock() - if ich == nil { - if !errOk { - impLog("unknown id in netchan request: ", id) - } - return nil - } - return ich -} - -// Errors returns a channel from which transmission and protocol errors -// can be read. Clients of the importer are not required to read the error -// channel for correct execution. However, if too many errors occur -// without being read from the error channel, the importer will shut down. -func (imp *Importer) Errors() chan error { - return imp.errors -} - -// Import imports a channel of the given type, size and specified direction. -// It is equivalent to ImportNValues with a count of -1, meaning unbounded. -func (imp *Importer) Import(name string, chT interface{}, dir Dir, size int) error { - return imp.ImportNValues(name, chT, dir, size, -1) -} - -// ImportNValues imports a channel of the given type and specified -// direction and then receives or transmits up to n values on that -// channel. A value of n==-1 implies an unbounded number of values. The -// channel will have buffer space for size values, or 1 value if size < 1. -// The channel to be bound to the remote site's channel is provided -// in the call and may be of arbitrary channel type. -// Despite the literal signature, the effective signature is -// ImportNValues(name string, chT chan T, dir Dir, size, n int) error -// Example usage: -// imp, err := NewImporter("tcp", "netchanserver.mydomain.com:1234") -// if err != nil { log.Fatal(err) } -// ch := make(chan myType) -// err = imp.ImportNValues("name", ch, Recv, 1, 1) -// if err != nil { log.Fatal(err) } -// fmt.Printf("%+v\n", <-ch) -func (imp *Importer) ImportNValues(name string, chT interface{}, dir Dir, size, n int) error { - ch, err := checkChan(chT, dir) - if err != nil { - return err - } - imp.chanLock.Lock() - defer imp.chanLock.Unlock() - _, present := imp.names[name] - if present { - return errors.New("channel name already being imported:" + name) - } - if size < 1 { - size = 1 - } - id := imp.maxId - imp.maxId++ - nch := newNetChan(name, id, &chanDir{ch, dir}, imp.encDec, size, int64(n)) - imp.names[name] = nch - imp.chans[id] = nch - // Tell the other side about this channel. - hdr := &header{Id: id} - req := &request{Name: name, Count: int64(n), Dir: dir, Size: size} - if err = imp.encode(hdr, payRequest, req); err != nil { - impLog("request encode:", err) - return err - } - if dir == Send { - go func() { - for i := 0; n == -1 || i < n; i++ { - val, ok := nch.recv() - if !ok { - if err = imp.encode(hdr, payClosed, nil); err != nil { - impLog("error encoding client closed message:", err) - } - return - } - // We hold the lock during transmission to guarantee messages are - // sent in order. - imp.mu.Lock() - imp.unacked++ - imp.seqLock.Lock() - imp.mu.Unlock() - if err = imp.encode(hdr, payData, val.Interface()); err != nil { - impLog("error encoding client send:", err) - return - } - imp.seqLock.Unlock() - } - }() - } - return nil -} - -// Hangup disassociates the named channel from the Importer and closes -// the channel. Messages in flight for the channel may be dropped. -func (imp *Importer) Hangup(name string) error { - imp.chanLock.Lock() - defer imp.chanLock.Unlock() - nc := imp.names[name] - if nc == nil { - return errors.New("netchan import: hangup: no such channel: " + name) - } - delete(imp.names, name) - delete(imp.chans, nc.id) - nc.close() - return nil -} - -func (imp *Importer) unackedCount() int64 { - imp.mu.Lock() - n := imp.unacked - imp.mu.Unlock() - return n -} - -// Drain waits until all messages sent from this exporter/importer, including -// those not yet sent to any server and possibly including those sent while -// Drain was executing, have been received by the exporter. In short, it -// waits until all the importer's messages have been received. -// If the timeout (measured in nanoseconds) is positive and Drain takes -// longer than that to complete, an error is returned. -func (imp *Importer) Drain(timeout int64) error { - deadline := time.Now().Add(time.Duration(timeout)) - for imp.unackedCount() > 0 { - if timeout > 0 && time.Now().After(deadline) { - return errors.New("timeout") - } - time.Sleep(100 * time.Millisecond) - } - return nil -} diff --git a/src/pkg/old/netchan/netchan_test.go b/src/pkg/old/netchan/netchan_test.go deleted file mode 100644 index 9a7c076d59..0000000000 --- a/src/pkg/old/netchan/netchan_test.go +++ /dev/null @@ -1,447 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package netchan - -import ( - "net" - "strings" - "testing" - "time" -) - -const count = 10 // number of items in most tests -const closeCount = 5 // number of items when sender closes early - -const base = 23 - -func exportSend(exp *Exporter, n int, t *testing.T, done chan bool) { - ch := make(chan int) - err := exp.Export("exportedSend", ch, Send) - if err != nil { - t.Fatal("exportSend:", err) - } - go func() { - for i := 0; i < n; i++ { - ch <- base + i - } - close(ch) - if done != nil { - done <- true - } - }() -} - -func exportReceive(exp *Exporter, t *testing.T, expDone chan bool) { - ch := make(chan int) - err := exp.Export("exportedRecv", ch, Recv) - expDone <- true - if err != nil { - t.Fatal("exportReceive:", err) - } - for i := 0; i < count; i++ { - v, ok := <-ch - if !ok { - if i != closeCount { - t.Errorf("exportReceive expected close at %d; got one at %d", closeCount, i) - } - break - } - if v != base+i { - t.Errorf("export Receive: bad value: expected %d+%d=%d; got %d", base, i, base+i, v) - } - } -} - -func importSend(imp *Importer, n int, t *testing.T, done chan bool) { - ch := make(chan int) - err := imp.ImportNValues("exportedRecv", ch, Send, 3, -1) - if err != nil { - t.Fatal("importSend:", err) - } - go func() { - for i := 0; i < n; i++ { - ch <- base + i - } - close(ch) - if done != nil { - done <- true - } - }() -} - -func importReceive(imp *Importer, t *testing.T, done chan bool) { - ch := make(chan int) - err := imp.ImportNValues("exportedSend", ch, Recv, 3, count) - if err != nil { - t.Fatal("importReceive:", err) - } - for i := 0; i < count; i++ { - v, ok := <-ch - if !ok { - if i != closeCount { - t.Errorf("importReceive expected close at %d; got one at %d", closeCount, i) - } - break - } - if v != base+i { - t.Errorf("importReceive: bad value: expected %d+%d=%d; got %+d", base, i, base+i, v) - } - } - if done != nil { - done <- true - } -} - -func TestExportSendImportReceive(t *testing.T) { - exp, imp := pair(t) - exportSend(exp, count, t, nil) - importReceive(imp, t, nil) -} - -func TestExportReceiveImportSend(t *testing.T) { - exp, imp := pair(t) - expDone := make(chan bool) - done := make(chan bool) - go func() { - exportReceive(exp, t, expDone) - done <- true - }() - <-expDone - importSend(imp, count, t, nil) - <-done -} - -func TestClosingExportSendImportReceive(t *testing.T) { - exp, imp := pair(t) - exportSend(exp, closeCount, t, nil) - importReceive(imp, t, nil) -} - -func TestClosingImportSendExportReceive(t *testing.T) { - exp, imp := pair(t) - expDone := make(chan bool) - done := make(chan bool) - go func() { - exportReceive(exp, t, expDone) - done <- true - }() - <-expDone - importSend(imp, closeCount, t, nil) - <-done -} - -func TestErrorForIllegalChannel(t *testing.T) { - exp, imp := pair(t) - // Now export a channel. - ch := make(chan int, 1) - err := exp.Export("aChannel", ch, Send) - if err != nil { - t.Fatal("export:", err) - } - ch <- 1234 - close(ch) - // Now try to import a different channel. - ch = make(chan int) - err = imp.Import("notAChannel", ch, Recv, 1) - if err != nil { - t.Fatal("import:", err) - } - // Expect an error now. Start a timeout. - timeout := make(chan bool, 1) // buffered so closure will not hang around. - go func() { - time.Sleep(10 * time.Second) // very long, to give even really slow machines a chance. - timeout <- true - }() - select { - case err = <-imp.Errors(): - if strings.Index(err.Error(), "no such channel") < 0 { - t.Error("wrong error for nonexistent channel:", err) - } - case <-timeout: - t.Error("import of nonexistent channel did not receive an error") - } -} - -// Not a great test but it does at least invoke Drain. -func TestExportDrain(t *testing.T) { - exp, imp := pair(t) - done := make(chan bool) - go func() { - exportSend(exp, closeCount, t, nil) - done <- true - }() - <-done - go importReceive(imp, t, done) - exp.Drain(0) - <-done -} - -// Not a great test but it does at least invoke Drain. -func TestImportDrain(t *testing.T) { - exp, imp := pair(t) - expDone := make(chan bool) - go exportReceive(exp, t, expDone) - <-expDone - importSend(imp, closeCount, t, nil) - imp.Drain(0) -} - -// Not a great test but it does at least invoke Sync. -func TestExportSync(t *testing.T) { - exp, imp := pair(t) - done := make(chan bool) - exportSend(exp, closeCount, t, nil) - go importReceive(imp, t, done) - exp.Sync(0) - <-done -} - -// Test hanging up the send side of an export. -// TODO: test hanging up the receive side of an export. -func TestExportHangup(t *testing.T) { - exp, imp := pair(t) - ech := make(chan int) - err := exp.Export("exportedSend", ech, Send) - if err != nil { - t.Fatal("export:", err) - } - // Prepare to receive two values. We'll actually deliver only one. - ich := make(chan int) - err = imp.ImportNValues("exportedSend", ich, Recv, 1, 2) - if err != nil { - t.Fatal("import exportedSend:", err) - } - // Send one value, receive it. - const Value = 1234 - ech <- Value - v := <-ich - if v != Value { - t.Fatal("expected", Value, "got", v) - } - // Now hang up the channel. Importer should see it close. - exp.Hangup("exportedSend") - v, ok := <-ich - if ok { - t.Fatal("expected channel to be closed; got value", v) - } -} - -// Test hanging up the send side of an import. -// TODO: test hanging up the receive side of an import. -func TestImportHangup(t *testing.T) { - exp, imp := pair(t) - ech := make(chan int) - err := exp.Export("exportedRecv", ech, Recv) - if err != nil { - t.Fatal("export:", err) - } - // Prepare to Send two values. We'll actually deliver only one. - ich := make(chan int) - err = imp.ImportNValues("exportedRecv", ich, Send, 1, 2) - if err != nil { - t.Fatal("import exportedRecv:", err) - } - // Send one value, receive it. - const Value = 1234 - ich <- Value - v := <-ech - if v != Value { - t.Fatal("expected", Value, "got", v) - } - // Now hang up the channel. Exporter should see it close. - imp.Hangup("exportedRecv") - v, ok := <-ech - if ok { - t.Fatal("expected channel to be closed; got value", v) - } -} - -// loop back exportedRecv to exportedSend, -// but receive a value from ctlch before starting the loop. -func exportLoopback(exp *Exporter, t *testing.T) { - inch := make(chan int) - if err := exp.Export("exportedRecv", inch, Recv); err != nil { - t.Fatal("exportRecv") - } - - outch := make(chan int) - if err := exp.Export("exportedSend", outch, Send); err != nil { - t.Fatal("exportSend") - } - - ctlch := make(chan int) - if err := exp.Export("exportedCtl", ctlch, Recv); err != nil { - t.Fatal("exportRecv") - } - - go func() { - <-ctlch - for i := 0; i < count; i++ { - x := <-inch - if x != base+i { - t.Errorf("exportLoopback expected %d; got %d", i, x) - } - outch <- x - } - }() -} - -// This test checks that channel operations can proceed -// even when other concurrent operations are blocked. -func TestIndependentSends(t *testing.T) { - if testing.Short() { - t.Logf("disabled test during -short") - return - } - exp, imp := pair(t) - - exportLoopback(exp, t) - - importSend(imp, count, t, nil) - done := make(chan bool) - go importReceive(imp, t, done) - - // wait for export side to try to deliver some values. - time.Sleep(250 * time.Millisecond) - - ctlch := make(chan int) - if err := imp.ImportNValues("exportedCtl", ctlch, Send, 1, 1); err != nil { - t.Fatal("importSend:", err) - } - ctlch <- 0 - - <-done -} - -// This test cross-connects a pair of exporter/importer pairs. -type value struct { - I int - Source string -} - -func TestCrossConnect(t *testing.T) { - e1, i1 := pair(t) - e2, i2 := pair(t) - - crossExport(e1, e2, t) - crossImport(i1, i2, t) -} - -// Export side of cross-traffic. -func crossExport(e1, e2 *Exporter, t *testing.T) { - s := make(chan value) - err := e1.Export("exportedSend", s, Send) - if err != nil { - t.Fatal("exportSend:", err) - } - - r := make(chan value) - err = e2.Export("exportedReceive", r, Recv) - if err != nil { - t.Fatal("exportReceive:", err) - } - - go crossLoop("export", s, r, t) -} - -// Import side of cross-traffic. -func crossImport(i1, i2 *Importer, t *testing.T) { - s := make(chan value) - err := i2.Import("exportedReceive", s, Send, 2) - if err != nil { - t.Fatal("import of exportedReceive:", err) - } - - r := make(chan value) - err = i1.Import("exportedSend", r, Recv, 2) - if err != nil { - t.Fatal("import of exported Send:", err) - } - - crossLoop("import", s, r, t) -} - -// Cross-traffic: send and receive 'count' numbers. -func crossLoop(name string, s, r chan value, t *testing.T) { - for si, ri := 0, 0; si < count && ri < count; { - select { - case s <- value{si, name}: - si++ - case v := <-r: - if v.I != ri { - t.Errorf("loop: bad value: expected %d, hello; got %+v", ri, v) - } - ri++ - } - } -} - -const flowCount = 100 - -// test flow control from exporter to importer. -func TestExportFlowControl(t *testing.T) { - if testing.Short() { - t.Logf("disabled test during -short") - return - } - exp, imp := pair(t) - - sendDone := make(chan bool, 1) - exportSend(exp, flowCount, t, sendDone) - - ch := make(chan int) - err := imp.ImportNValues("exportedSend", ch, Recv, 20, -1) - if err != nil { - t.Fatal("importReceive:", err) - } - - testFlow(sendDone, ch, flowCount, t) -} - -// test flow control from importer to exporter. -func TestImportFlowControl(t *testing.T) { - if testing.Short() { - t.Logf("disabled test during -short") - return - } - exp, imp := pair(t) - - ch := make(chan int) - err := exp.Export("exportedRecv", ch, Recv) - if err != nil { - t.Fatal("importReceive:", err) - } - - sendDone := make(chan bool, 1) - importSend(imp, flowCount, t, sendDone) - testFlow(sendDone, ch, flowCount, t) -} - -func testFlow(sendDone chan bool, ch <-chan int, N int, t *testing.T) { - go func() { - time.Sleep(500 * time.Millisecond) - sendDone <- false - }() - - if <-sendDone { - t.Fatal("send did not block") - } - n := 0 - for i := range ch { - t.Log("after blocking, got value ", i) - n++ - } - if n != N { - t.Fatalf("expected %d values; got %d", N, n) - } -} - -func pair(t *testing.T) (*Exporter, *Importer) { - c0, c1 := net.Pipe() - exp := NewExporter() - go exp.ServeConn(c0) - imp := NewImporter(c1) - return exp, imp -} diff --git a/src/pkg/old/regexp/all_test.go b/src/pkg/old/regexp/all_test.go deleted file mode 100644 index 180dac4d45..0000000000 --- a/src/pkg/old/regexp/all_test.go +++ /dev/null @@ -1,421 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package regexp - -import ( - "strings" - "testing" -) - -var good_re = []string{ - ``, - `.`, - `^.$`, - `a`, - `a*`, - `a+`, - `a?`, - `a|b`, - `a*|b*`, - `(a*|b)(c*|d)`, - `[a-z]`, - `[a-abc-c\-\]\[]`, - `[a-z]+`, - `[]`, - `[abc]`, - `[^1234]`, - `[^\n]`, - `\!\\`, -} - -type stringError struct { - re string - err error -} - -var bad_re = []stringError{ - {`*`, ErrBareClosure}, - {`+`, ErrBareClosure}, - {`?`, ErrBareClosure}, - {`(abc`, ErrUnmatchedLpar}, - {`abc)`, ErrUnmatchedRpar}, - {`x[a-z`, ErrUnmatchedLbkt}, - {`abc]`, ErrUnmatchedRbkt}, - {`[z-a]`, ErrBadRange}, - {`abc\`, ErrExtraneousBackslash}, - {`a**`, ErrBadClosure}, - {`a*+`, ErrBadClosure}, - {`a??`, ErrBadClosure}, - {`\x`, ErrBadBackslash}, -} - -func compileTest(t *testing.T, expr string, error error) *Regexp { - re, err := Compile(expr) - if err != error { - t.Error("compiling `", expr, "`; unexpected error: ", err.Error()) - } - return re -} - -func TestGoodCompile(t *testing.T) { - for i := 0; i < len(good_re); i++ { - compileTest(t, good_re[i], nil) - } -} - -func TestBadCompile(t *testing.T) { - for i := 0; i < len(bad_re); i++ { - compileTest(t, bad_re[i].re, bad_re[i].err) - } -} - -func matchTest(t *testing.T, test *FindTest) { - re := compileTest(t, test.pat, nil) - if re == nil { - return - } - m := re.MatchString(test.text) - if m != (len(test.matches) > 0) { - t.Errorf("MatchString failure on %s: %t should be %t", test, m, len(test.matches) > 0) - } - // now try bytes - m = re.Match([]byte(test.text)) - if m != (len(test.matches) > 0) { - t.Errorf("Match failure on %s: %t should be %t", test, m, len(test.matches) > 0) - } -} - -func TestMatch(t *testing.T) { - for _, test := range findTests { - matchTest(t, &test) - } -} - -func matchFunctionTest(t *testing.T, test *FindTest) { - m, err := MatchString(test.pat, test.text) - if err == nil { - return - } - if m != (len(test.matches) > 0) { - t.Errorf("Match failure on %s: %t should be %t", test, m, len(test.matches) > 0) - } -} - -func TestMatchFunction(t *testing.T) { - for _, test := range findTests { - matchFunctionTest(t, &test) - } -} - -type ReplaceTest struct { - pattern, replacement, input, output string -} - -var replaceTests = []ReplaceTest{ - // Test empty input and/or replacement, with pattern that matches the empty string. - {"", "", "", ""}, - {"", "x", "", "x"}, - {"", "", "abc", "abc"}, - {"", "x", "abc", "xaxbxcx"}, - - // Test empty input and/or replacement, with pattern that does not match the empty string. - {"b", "", "", ""}, - {"b", "x", "", ""}, - {"b", "", "abc", "ac"}, - {"b", "x", "abc", "axc"}, - {"y", "", "", ""}, - {"y", "x", "", ""}, - {"y", "", "abc", "abc"}, - {"y", "x", "abc", "abc"}, - - // Multibyte characters -- verify that we don't try to match in the middle - // of a character. - {"[a-c]*", "x", "\u65e5", "x\u65e5x"}, - {"[^\u65e5]", "x", "abc\u65e5def", "xxx\u65e5xxx"}, - - // Start and end of a string. - {"^[a-c]*", "x", "abcdabc", "xdabc"}, - {"[a-c]*$", "x", "abcdabc", "abcdx"}, - {"^[a-c]*$", "x", "abcdabc", "abcdabc"}, - {"^[a-c]*", "x", "abc", "x"}, - {"[a-c]*$", "x", "abc", "x"}, - {"^[a-c]*$", "x", "abc", "x"}, - {"^[a-c]*", "x", "dabce", "xdabce"}, - {"[a-c]*$", "x", "dabce", "dabcex"}, - {"^[a-c]*$", "x", "dabce", "dabce"}, - {"^[a-c]*", "x", "", "x"}, - {"[a-c]*$", "x", "", "x"}, - {"^[a-c]*$", "x", "", "x"}, - - {"^[a-c]+", "x", "abcdabc", "xdabc"}, - {"[a-c]+$", "x", "abcdabc", "abcdx"}, - {"^[a-c]+$", "x", "abcdabc", "abcdabc"}, - {"^[a-c]+", "x", "abc", "x"}, - {"[a-c]+$", "x", "abc", "x"}, - {"^[a-c]+$", "x", "abc", "x"}, - {"^[a-c]+", "x", "dabce", "dabce"}, - {"[a-c]+$", "x", "dabce", "dabce"}, - {"^[a-c]+$", "x", "dabce", "dabce"}, - {"^[a-c]+", "x", "", ""}, - {"[a-c]+$", "x", "", ""}, - {"^[a-c]+$", "x", "", ""}, - - // Other cases. - {"abc", "def", "abcdefg", "defdefg"}, - {"bc", "BC", "abcbcdcdedef", "aBCBCdcdedef"}, - {"abc", "", "abcdabc", "d"}, - {"x", "xXx", "xxxXxxx", "xXxxXxxXxXxXxxXxxXx"}, - {"abc", "d", "", ""}, - {"abc", "d", "abc", "d"}, - {".+", "x", "abc", "x"}, - {"[a-c]*", "x", "def", "xdxexfx"}, - {"[a-c]+", "x", "abcbcdcdedef", "xdxdedef"}, - {"[a-c]*", "x", "abcbcdcdedef", "xdxdxexdxexfx"}, -} - -type ReplaceFuncTest struct { - pattern string - replacement func(string) string - input, output string -} - -var replaceFuncTests = []ReplaceFuncTest{ - {"[a-c]", func(s string) string { return "x" + s + "y" }, "defabcdef", "defxayxbyxcydef"}, - {"[a-c]+", func(s string) string { return "x" + s + "y" }, "defabcdef", "defxabcydef"}, - {"[a-c]*", func(s string) string { return "x" + s + "y" }, "defabcdef", "xydxyexyfxabcydxyexyfxy"}, -} - -func TestReplaceAll(t *testing.T) { - for _, tc := range replaceTests { - re, err := Compile(tc.pattern) - if err != nil { - t.Errorf("Unexpected error compiling %q: %v", tc.pattern, err) - continue - } - actual := re.ReplaceAllString(tc.input, tc.replacement) - if actual != tc.output { - t.Errorf("%q.Replace(%q,%q) = %q; want %q", - tc.pattern, tc.input, tc.replacement, actual, tc.output) - } - // now try bytes - actual = string(re.ReplaceAll([]byte(tc.input), []byte(tc.replacement))) - if actual != tc.output { - t.Errorf("%q.Replace(%q,%q) = %q; want %q", - tc.pattern, tc.input, tc.replacement, actual, tc.output) - } - } -} - -func TestReplaceAllFunc(t *testing.T) { - for _, tc := range replaceFuncTests { - re, err := Compile(tc.pattern) - if err != nil { - t.Errorf("Unexpected error compiling %q: %v", tc.pattern, err) - continue - } - actual := re.ReplaceAllStringFunc(tc.input, tc.replacement) - if actual != tc.output { - t.Errorf("%q.ReplaceFunc(%q,%q) = %q; want %q", - tc.pattern, tc.input, tc.replacement, actual, tc.output) - } - // now try bytes - actual = string(re.ReplaceAllFunc([]byte(tc.input), func(s []byte) []byte { return []byte(tc.replacement(string(s))) })) - if actual != tc.output { - t.Errorf("%q.ReplaceFunc(%q,%q) = %q; want %q", - tc.pattern, tc.input, tc.replacement, actual, tc.output) - } - } -} - -type MetaTest struct { - pattern, output, literal string - isLiteral bool -} - -var metaTests = []MetaTest{ - {``, ``, ``, true}, - {`foo`, `foo`, `foo`, true}, - {`foo\.\$`, `foo\\\.\\\$`, `foo.$`, true}, // has meta but no operator - {`foo.\$`, `foo\.\\\$`, `foo`, false}, // has escaped operators and real operators - {`!@#$%^&*()_+-=[{]}\|,<.>/?~`, `!@#\$%\^&\*\(\)_\+-=\[{\]}\\\|,<\.>/\?~`, `!@#`, false}, -} - -func TestQuoteMeta(t *testing.T) { - for _, tc := range metaTests { - // Verify that QuoteMeta returns the expected string. - quoted := QuoteMeta(tc.pattern) - if quoted != tc.output { - t.Errorf("QuoteMeta(`%s`) = `%s`; want `%s`", - tc.pattern, quoted, tc.output) - continue - } - - // Verify that the quoted string is in fact treated as expected - // by Compile -- i.e. that it matches the original, unquoted string. - if tc.pattern != "" { - re, err := Compile(quoted) - if err != nil { - t.Errorf("Unexpected error compiling QuoteMeta(`%s`): %v", tc.pattern, err) - continue - } - src := "abc" + tc.pattern + "def" - repl := "xyz" - replaced := re.ReplaceAllString(src, repl) - expected := "abcxyzdef" - if replaced != expected { - t.Errorf("QuoteMeta(`%s`).Replace(`%s`,`%s`) = `%s`; want `%s`", - tc.pattern, src, repl, replaced, expected) - } - } - } -} - -func TestLiteralPrefix(t *testing.T) { - for _, tc := range metaTests { - // Literal method needs to scan the pattern. - re := MustCompile(tc.pattern) - str, complete := re.LiteralPrefix() - if complete != tc.isLiteral { - t.Errorf("LiteralPrefix(`%s`) = %t; want %t", tc.pattern, complete, tc.isLiteral) - } - if str != tc.literal { - t.Errorf("LiteralPrefix(`%s`) = `%s`; want `%s`", tc.pattern, str, tc.literal) - } - } -} - -type numSubexpCase struct { - input string - expected int -} - -var numSubexpCases = []numSubexpCase{ - {``, 0}, - {`.*`, 0}, - {`abba`, 0}, - {`ab(b)a`, 1}, - {`ab(.*)a`, 1}, - {`(.*)ab(.*)a`, 2}, - {`(.*)(ab)(.*)a`, 3}, - {`(.*)((a)b)(.*)a`, 4}, - {`(.*)(\(ab)(.*)a`, 3}, - {`(.*)(\(a\)b)(.*)a`, 3}, -} - -func TestNumSubexp(t *testing.T) { - for _, c := range numSubexpCases { - re := MustCompile(c.input) - n := re.NumSubexp() - if n != c.expected { - t.Errorf("NumSubexp for %q returned %d, expected %d", c.input, n, c.expected) - } - } -} - -func BenchmarkLiteral(b *testing.B) { - x := strings.Repeat("x", 50) + "y" - b.StopTimer() - re := MustCompile("y") - b.StartTimer() - for i := 0; i < b.N; i++ { - if !re.MatchString(x) { - b.Fatal("no match!") - } - } -} - -func BenchmarkNotLiteral(b *testing.B) { - x := strings.Repeat("x", 50) + "y" - b.StopTimer() - re := MustCompile(".y") - b.StartTimer() - for i := 0; i < b.N; i++ { - if !re.MatchString(x) { - b.Fatal("no match!") - } - } -} - -func BenchmarkMatchClass(b *testing.B) { - b.StopTimer() - x := strings.Repeat("xxxx", 20) + "w" - re := MustCompile("[abcdw]") - b.StartTimer() - for i := 0; i < b.N; i++ { - if !re.MatchString(x) { - b.Fatal("no match!") - } - } -} - -func BenchmarkMatchClass_InRange(b *testing.B) { - b.StopTimer() - // 'b' is between 'a' and 'c', so the charclass - // range checking is no help here. - x := strings.Repeat("bbbb", 20) + "c" - re := MustCompile("[ac]") - b.StartTimer() - for i := 0; i < b.N; i++ { - if !re.MatchString(x) { - b.Fatal("no match!") - } - } -} - -func BenchmarkReplaceAll(b *testing.B) { - x := "abcdefghijklmnopqrstuvwxyz" - b.StopTimer() - re := MustCompile("[cjrw]") - b.StartTimer() - for i := 0; i < b.N; i++ { - re.ReplaceAllString(x, "") - } -} - -func BenchmarkAnchoredLiteralShortNonMatch(b *testing.B) { - b.StopTimer() - x := []byte("abcdefghijklmnopqrstuvwxyz") - re := MustCompile("^zbc(d|e)") - b.StartTimer() - for i := 0; i < b.N; i++ { - re.Match(x) - } -} - -func BenchmarkAnchoredLiteralLongNonMatch(b *testing.B) { - b.StopTimer() - x := []byte("abcdefghijklmnopqrstuvwxyz") - for i := 0; i < 15; i++ { - x = append(x, x...) - } - re := MustCompile("^zbc(d|e)") - b.StartTimer() - for i := 0; i < b.N; i++ { - re.Match(x) - } -} - -func BenchmarkAnchoredShortMatch(b *testing.B) { - b.StopTimer() - x := []byte("abcdefghijklmnopqrstuvwxyz") - re := MustCompile("^.bc(d|e)") - b.StartTimer() - for i := 0; i < b.N; i++ { - re.Match(x) - } -} - -func BenchmarkAnchoredLongMatch(b *testing.B) { - b.StopTimer() - x := []byte("abcdefghijklmnopqrstuvwxyz") - for i := 0; i < 15; i++ { - x = append(x, x...) - } - re := MustCompile("^.bc(d|e)") - b.StartTimer() - for i := 0; i < b.N; i++ { - re.Match(x) - } -} diff --git a/src/pkg/old/regexp/find_test.go b/src/pkg/old/regexp/find_test.go deleted file mode 100644 index 83b249e3ce..0000000000 --- a/src/pkg/old/regexp/find_test.go +++ /dev/null @@ -1,472 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package regexp - -import ( - "fmt" - "strings" - "testing" -) - -// For each pattern/text pair, what is the expected output of each function? -// We can derive the textual results from the indexed results, the non-submatch -// results from the submatched results, the single results from the 'all' results, -// and the byte results from the string results. Therefore the table includes -// only the FindAllStringSubmatchIndex result. -type FindTest struct { - pat string - text string - matches [][]int -} - -func (t FindTest) String() string { - return fmt.Sprintf("pat: %#q text: %#q", t.pat, t.text) -} - -var findTests = []FindTest{ - {``, ``, build(1, 0, 0)}, - {`^abcdefg`, "abcdefg", build(1, 0, 7)}, - {`a+`, "baaab", build(1, 1, 4)}, - {"abcd..", "abcdef", build(1, 0, 6)}, - {`a`, "a", build(1, 0, 1)}, - {`x`, "y", nil}, - {`b`, "abc", build(1, 1, 2)}, - {`.`, "a", build(1, 0, 1)}, - {`.*`, "abcdef", build(1, 0, 6)}, - {`^`, "abcde", build(1, 0, 0)}, - {`$`, "abcde", build(1, 5, 5)}, - {`^abcd$`, "abcd", build(1, 0, 4)}, - {`^bcd'`, "abcdef", nil}, - {`^abcd$`, "abcde", nil}, - {`a+`, "baaab", build(1, 1, 4)}, - {`a*`, "baaab", build(3, 0, 0, 1, 4, 5, 5)}, - {`[a-z]+`, "abcd", build(1, 0, 4)}, - {`[^a-z]+`, "ab1234cd", build(1, 2, 6)}, - {`[a\-\]z]+`, "az]-bcz", build(2, 0, 4, 6, 7)}, - {`[^\n]+`, "abcd\n", build(1, 0, 4)}, - {`[日本語]+`, "日本語日本語", build(1, 0, 18)}, - {`日本語+`, "日本語", build(1, 0, 9)}, - {`日本語+`, "日本語語語語", build(1, 0, 18)}, - {`()`, "", build(1, 0, 0, 0, 0)}, - {`(a)`, "a", build(1, 0, 1, 0, 1)}, - {`(.)(.)`, "日a", build(1, 0, 4, 0, 3, 3, 4)}, - {`(.*)`, "", build(1, 0, 0, 0, 0)}, - {`(.*)`, "abcd", build(1, 0, 4, 0, 4)}, - {`(..)(..)`, "abcd", build(1, 0, 4, 0, 2, 2, 4)}, - {`(([^xyz]*)(d))`, "abcd", build(1, 0, 4, 0, 4, 0, 3, 3, 4)}, - {`((a|b|c)*(d))`, "abcd", build(1, 0, 4, 0, 4, 2, 3, 3, 4)}, - {`(((a|b|c)*)(d))`, "abcd", build(1, 0, 4, 0, 4, 0, 3, 2, 3, 3, 4)}, - {`\a\b\f\n\r\t\v`, "\a\b\f\n\r\t\v", build(1, 0, 7)}, - {`[\a\b\f\n\r\t\v]+`, "\a\b\f\n\r\t\v", build(1, 0, 7)}, - - {`a*(|(b))c*`, "aacc", build(1, 0, 4, 2, 2, -1, -1)}, - {`(.*).*`, "ab", build(1, 0, 2, 0, 2)}, - {`[.]`, ".", build(1, 0, 1)}, - {`/$`, "/abc/", build(1, 4, 5)}, - {`/$`, "/abc", nil}, - - // multiple matches - {`.`, "abc", build(3, 0, 1, 1, 2, 2, 3)}, - {`(.)`, "abc", build(3, 0, 1, 0, 1, 1, 2, 1, 2, 2, 3, 2, 3)}, - {`.(.)`, "abcd", build(2, 0, 2, 1, 2, 2, 4, 3, 4)}, - {`ab*`, "abbaab", build(3, 0, 3, 3, 4, 4, 6)}, - {`a(b*)`, "abbaab", build(3, 0, 3, 1, 3, 3, 4, 4, 4, 4, 6, 5, 6)}, - - // fixed bugs - {`ab$`, "cab", build(1, 1, 3)}, - {`axxb$`, "axxcb", nil}, - {`data`, "daXY data", build(1, 5, 9)}, - {`da(.)a$`, "daXY data", build(1, 5, 9, 7, 8)}, - {`zx+`, "zzx", build(1, 1, 3)}, - - // can backslash-escape any punctuation - {`\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~`, - `!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, build(1, 0, 31)}, - {`[\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~]+`, - `!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, build(1, 0, 31)}, - {"\\`", "`", build(1, 0, 1)}, - {"[\\`]+", "`", build(1, 0, 1)}, - - // long set of matches (longer than startSize) - { - ".", - "qwertyuiopasdfghjklzxcvbnm1234567890", - build(36, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, - 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, - 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, - 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36), - }, -} - -// build is a helper to construct a [][]int by extracting n sequences from x. -// This represents n matches with len(x)/n submatches each. -func build(n int, x ...int) [][]int { - ret := make([][]int, n) - runLength := len(x) / n - j := 0 - for i := range ret { - ret[i] = make([]int, runLength) - copy(ret[i], x[j:]) - j += runLength - if j > len(x) { - panic("invalid build entry") - } - } - return ret -} - -// First the simple cases. - -func TestFind(t *testing.T) { - for _, test := range findTests { - re := MustCompile(test.pat) - if re.String() != test.pat { - t.Errorf("String() = `%s`; should be `%s`", re.String(), test.pat) - } - result := re.Find([]byte(test.text)) - switch { - case len(test.matches) == 0 && len(result) == 0: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case test.matches != nil && result != nil: - expect := test.text[test.matches[0][0]:test.matches[0][1]] - if expect != string(result) { - t.Errorf("expected %q got %q: %s", expect, result, test) - } - } - } -} - -func TestFindString(t *testing.T) { - for _, test := range findTests { - result := MustCompile(test.pat).FindString(test.text) - switch { - case len(test.matches) == 0 && len(result) == 0: - // ok - case test.matches == nil && result != "": - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == "": - // Tricky because an empty result has two meanings: no match or empty match. - if test.matches[0][0] != test.matches[0][1] { - t.Errorf("expected match; got none: %s", test) - } - case test.matches != nil && result != "": - expect := test.text[test.matches[0][0]:test.matches[0][1]] - if expect != result { - t.Errorf("expected %q got %q: %s", expect, result, test) - } - } - } -} - -func testFindIndex(test *FindTest, result []int, t *testing.T) { - switch { - case len(test.matches) == 0 && len(result) == 0: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case test.matches != nil && result != nil: - expect := test.matches[0] - if expect[0] != result[0] || expect[1] != result[1] { - t.Errorf("expected %v got %v: %s", expect, result, test) - } - } -} - -func TestFindIndex(t *testing.T) { - for _, test := range findTests { - testFindIndex(&test, MustCompile(test.pat).FindIndex([]byte(test.text)), t) - } -} - -func TestFindStringIndex(t *testing.T) { - for _, test := range findTests { - testFindIndex(&test, MustCompile(test.pat).FindStringIndex(test.text), t) - } -} - -func TestFindReaderIndex(t *testing.T) { - for _, test := range findTests { - testFindIndex(&test, MustCompile(test.pat).FindReaderIndex(strings.NewReader(test.text)), t) - } -} - -// Now come the simple All cases. - -func TestFindAll(t *testing.T) { - for _, test := range findTests { - result := MustCompile(test.pat).FindAll([]byte(test.text), -1) - switch { - case test.matches == nil && result == nil: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case test.matches != nil && result != nil: - if len(test.matches) != len(result) { - t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) - continue - } - for k, e := range test.matches { - expect := test.text[e[0]:e[1]] - if expect != string(result[k]) { - t.Errorf("match %d: expected %q got %q: %s", k, expect, result[k], test) - } - } - } - } -} - -func TestFindAllString(t *testing.T) { - for _, test := range findTests { - result := MustCompile(test.pat).FindAllString(test.text, -1) - switch { - case test.matches == nil && result == nil: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case test.matches != nil && result != nil: - if len(test.matches) != len(result) { - t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) - continue - } - for k, e := range test.matches { - expect := test.text[e[0]:e[1]] - if expect != result[k] { - t.Errorf("expected %q got %q: %s", expect, result, test) - } - } - } - } -} - -func testFindAllIndex(test *FindTest, result [][]int, t *testing.T) { - switch { - case test.matches == nil && result == nil: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case test.matches != nil && result != nil: - if len(test.matches) != len(result) { - t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) - return - } - for k, e := range test.matches { - if e[0] != result[k][0] || e[1] != result[k][1] { - t.Errorf("match %d: expected %v got %v: %s", k, e, result[k], test) - } - } - } -} - -func TestFindAllIndex(t *testing.T) { - for _, test := range findTests { - testFindAllIndex(&test, MustCompile(test.pat).FindAllIndex([]byte(test.text), -1), t) - } -} - -func TestFindAllStringIndex(t *testing.T) { - for _, test := range findTests { - testFindAllIndex(&test, MustCompile(test.pat).FindAllStringIndex(test.text, -1), t) - } -} - -// Now come the Submatch cases. - -func testSubmatchBytes(test *FindTest, n int, submatches []int, result [][]byte, t *testing.T) { - if len(submatches) != len(result)*2 { - t.Errorf("match %d: expected %d submatches; got %d: %s", n, len(submatches)/2, len(result), test) - return - } - for k := 0; k < len(submatches); k += 2 { - if submatches[k] == -1 { - if result[k/2] != nil { - t.Errorf("match %d: expected nil got %q: %s", n, result, test) - } - continue - } - expect := test.text[submatches[k]:submatches[k+1]] - if expect != string(result[k/2]) { - t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test) - return - } - } -} - -func TestFindSubmatch(t *testing.T) { - for _, test := range findTests { - result := MustCompile(test.pat).FindSubmatch([]byte(test.text)) - switch { - case test.matches == nil && result == nil: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case test.matches != nil && result != nil: - testSubmatchBytes(&test, 0, test.matches[0], result, t) - } - } -} - -func testSubmatchString(test *FindTest, n int, submatches []int, result []string, t *testing.T) { - if len(submatches) != len(result)*2 { - t.Errorf("match %d: expected %d submatches; got %d: %s", n, len(submatches)/2, len(result), test) - return - } - for k := 0; k < len(submatches); k += 2 { - if submatches[k] == -1 { - if result[k/2] != "" { - t.Errorf("match %d: expected nil got %q: %s", n, result, test) - } - continue - } - expect := test.text[submatches[k]:submatches[k+1]] - if expect != result[k/2] { - t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test) - return - } - } -} - -func TestFindStringSubmatch(t *testing.T) { - for _, test := range findTests { - result := MustCompile(test.pat).FindStringSubmatch(test.text) - switch { - case test.matches == nil && result == nil: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case test.matches != nil && result != nil: - testSubmatchString(&test, 0, test.matches[0], result, t) - } - } -} - -func testSubmatchIndices(test *FindTest, n int, expect, result []int, t *testing.T) { - if len(expect) != len(result) { - t.Errorf("match %d: expected %d matches; got %d: %s", n, len(expect)/2, len(result)/2, test) - return - } - for k, e := range expect { - if e != result[k] { - t.Errorf("match %d: submatch error: expected %v got %v: %s", n, expect, result, test) - } - } -} - -func testFindSubmatchIndex(test *FindTest, result []int, t *testing.T) { - switch { - case test.matches == nil && result == nil: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case test.matches != nil && result != nil: - testSubmatchIndices(test, 0, test.matches[0], result, t) - } -} - -func TestFindSubmatchIndex(t *testing.T) { - for _, test := range findTests { - testFindSubmatchIndex(&test, MustCompile(test.pat).FindSubmatchIndex([]byte(test.text)), t) - } -} - -func TestFindStringSubmatchIndex(t *testing.T) { - for _, test := range findTests { - testFindSubmatchIndex(&test, MustCompile(test.pat).FindStringSubmatchIndex(test.text), t) - } -} - -func TestFindReaderSubmatchIndex(t *testing.T) { - for _, test := range findTests { - testFindSubmatchIndex(&test, MustCompile(test.pat).FindReaderSubmatchIndex(strings.NewReader(test.text)), t) - } -} - -// Now come the monster AllSubmatch cases. - -func TestFindAllSubmatch(t *testing.T) { - for _, test := range findTests { - result := MustCompile(test.pat).FindAllSubmatch([]byte(test.text), -1) - switch { - case test.matches == nil && result == nil: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case len(test.matches) != len(result): - t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) - case test.matches != nil && result != nil: - for k, match := range test.matches { - testSubmatchBytes(&test, k, match, result[k], t) - } - } - } -} - -func TestFindAllStringSubmatch(t *testing.T) { - for _, test := range findTests { - result := MustCompile(test.pat).FindAllStringSubmatch(test.text, -1) - switch { - case test.matches == nil && result == nil: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case len(test.matches) != len(result): - t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) - case test.matches != nil && result != nil: - for k, match := range test.matches { - testSubmatchString(&test, k, match, result[k], t) - } - } - } -} - -func testFindAllSubmatchIndex(test *FindTest, result [][]int, t *testing.T) { - switch { - case test.matches == nil && result == nil: - // ok - case test.matches == nil && result != nil: - t.Errorf("expected no match; got one: %s", test) - case test.matches != nil && result == nil: - t.Errorf("expected match; got none: %s", test) - case len(test.matches) != len(result): - t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test) - case test.matches != nil && result != nil: - for k, match := range test.matches { - testSubmatchIndices(test, k, match, result[k], t) - } - } -} - -func TestFindAllSubmatchIndex(t *testing.T) { - for _, test := range findTests { - testFindAllSubmatchIndex(&test, MustCompile(test.pat).FindAllSubmatchIndex([]byte(test.text), -1), t) - } -} - -func TestFindAllStringSubmatchIndex(t *testing.T) { - for _, test := range findTests { - testFindAllSubmatchIndex(&test, MustCompile(test.pat).FindAllStringSubmatchIndex(test.text, -1), t) - } -} diff --git a/src/pkg/old/regexp/regexp.go b/src/pkg/old/regexp/regexp.go deleted file mode 100644 index d3044d0c1d..0000000000 --- a/src/pkg/old/regexp/regexp.go +++ /dev/null @@ -1,1488 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package regexp implements a simple regular expression library. -// -// The syntax of the regular expressions accepted is: -// -// regexp: -// concatenation { '|' concatenation } -// concatenation: -// { closure } -// closure: -// term [ '*' | '+' | '?' ] -// term: -// '^' -// '$' -// '.' -// character -// '[' [ '^' ] { character-range } ']' -// '(' regexp ')' -// character-range: -// character [ '-' character ] -// -// All characters are UTF-8-encoded code points. Backslashes escape special -// characters, including inside character classes. The standard Go character -// escapes are also recognized: \a \b \f \n \r \t \v. -// -// There are 16 methods of Regexp that match a regular expression and identify -// the matched text. Their names are matched by this regular expression: -// -// Find(All)?(String)?(Submatch)?(Index)? -// -// If 'All' is present, the routine matches successive non-overlapping -// matches of the entire expression. Empty matches abutting a preceding -// match are ignored. The return value is a slice containing the successive -// return values of the corresponding non-'All' routine. These routines take -// an extra integer argument, n; if n >= 0, the function returns at most n -// matches/submatches. -// -// If 'String' is present, the argument is a string; otherwise it is a slice -// of bytes; return values are adjusted as appropriate. -// -// If 'Submatch' is present, the return value is a slice identifying the -// successive submatches of the expression. Submatches are matches of -// parenthesized subexpressions within the regular expression, numbered from -// left to right in order of opening parenthesis. Submatch 0 is the match of -// the entire expression, submatch 1 the match of the first parenthesized -// subexpression, and so on. -// -// If 'Index' is present, matches and submatches are identified by byte index -// pairs within the input string: result[2*n:2*n+1] identifies the indexes of -// the nth submatch. The pair for n==0 identifies the match of the entire -// expression. If 'Index' is not present, the match is identified by the -// text of the match/submatch. If an index is negative, it means that -// subexpression did not match any string in the input. -// -// There is also a subset of the methods that can be applied to text read -// from a RuneReader: -// -// MatchReader, FindReaderIndex, FindReaderSubmatchIndex -// -// This set may grow. Note that regular expression matches may need to -// examine text beyond the text returned by a match, so the methods that -// match text from a RuneReader may read arbitrarily far into the input -// before returning. -// -// (There are a few other methods that do not match this pattern.) -// -package regexp - -import ( - "bytes" - "io" - "strings" - "unicode/utf8" -) - -var debug = false - -// Error is the local type for a parsing error. -type Error string - -func (e Error) Error() string { - return string(e) -} - -// Error codes returned by failures to parse an expression. -var ( - ErrInternal = Error("regexp: internal error") - ErrUnmatchedLpar = Error("regexp: unmatched '('") - ErrUnmatchedRpar = Error("regexp: unmatched ')'") - ErrUnmatchedLbkt = Error("regexp: unmatched '['") - ErrUnmatchedRbkt = Error("regexp: unmatched ']'") - ErrBadRange = Error("regexp: bad range in character class") - ErrExtraneousBackslash = Error("regexp: extraneous backslash") - ErrBadClosure = Error("regexp: repeated closure (**, ++, etc.)") - ErrBareClosure = Error("regexp: closure applies to nothing") - ErrBadBackslash = Error("regexp: illegal backslash escape") -) - -const ( - iStart = iota // beginning of program - iEnd // end of program: success - iBOT // '^' beginning of text - iEOT // '$' end of text - iChar // 'a' regular character - iCharClass // [a-z] character class - iAny // '.' any character including newline - iNotNL // [^\n] special case: any character but newline - iBra // '(' parenthesized expression: 2*braNum for left, 2*braNum+1 for right - iAlt // '|' alternation - iNop // do nothing; makes it easy to link without patching -) - -// An instruction executed by the NFA -type instr struct { - kind int // the type of this instruction: iChar, iAny, etc. - index int // used only in debugging; could be eliminated - next *instr // the instruction to execute after this one - // Special fields valid only for some items. - char rune // iChar - braNum int // iBra, iEbra - cclass *charClass // iCharClass - left *instr // iAlt, other branch -} - -func (i *instr) print() { - switch i.kind { - case iStart: - print("start") - case iEnd: - print("end") - case iBOT: - print("bot") - case iEOT: - print("eot") - case iChar: - print("char ", string(i.char)) - case iCharClass: - i.cclass.print() - case iAny: - print("any") - case iNotNL: - print("notnl") - case iBra: - if i.braNum&1 == 0 { - print("bra", i.braNum/2) - } else { - print("ebra", i.braNum/2) - } - case iAlt: - print("alt(", i.left.index, ")") - case iNop: - print("nop") - } -} - -// Regexp is the representation of a compiled regular expression. -// The public interface is entirely through methods. -// A Regexp is safe for concurrent use by multiple goroutines. -type Regexp struct { - expr string // the original expression - prefix string // initial plain text string - prefixBytes []byte // initial plain text bytes - inst []*instr - start *instr // first instruction of machine - prefixStart *instr // where to start if there is a prefix - nbra int // number of brackets in expression, for subexpressions -} - -type charClass struct { - negate bool // is character class negated? ([^a-z]) - // slice of int, stored pairwise: [a-z] is (a,z); x is (x,x): - ranges []rune - cmin, cmax rune -} - -func (cclass *charClass) print() { - print("charclass") - if cclass.negate { - print(" (negated)") - } - for i := 0; i < len(cclass.ranges); i += 2 { - l := cclass.ranges[i] - r := cclass.ranges[i+1] - if l == r { - print(" [", string(l), "]") - } else { - print(" [", string(l), "-", string(r), "]") - } - } -} - -func (cclass *charClass) addRange(a, b rune) { - // range is a through b inclusive - cclass.ranges = append(cclass.ranges, a, b) - if a < cclass.cmin { - cclass.cmin = a - } - if b > cclass.cmax { - cclass.cmax = b - } -} - -func (cclass *charClass) matches(c rune) bool { - if c < cclass.cmin || c > cclass.cmax { - return cclass.negate - } - ranges := cclass.ranges - for i := 0; i < len(ranges); i = i + 2 { - if ranges[i] <= c && c <= ranges[i+1] { - return !cclass.negate - } - } - return cclass.negate -} - -func newCharClass() *instr { - i := &instr{kind: iCharClass} - i.cclass = new(charClass) - i.cclass.ranges = make([]rune, 0, 4) - i.cclass.cmin = 0x10FFFF + 1 // MaxRune + 1 - i.cclass.cmax = -1 - return i -} - -func (re *Regexp) add(i *instr) *instr { - i.index = len(re.inst) - re.inst = append(re.inst, i) - return i -} - -type parser struct { - re *Regexp - nlpar int // number of unclosed lpars - pos int - ch rune -} - -func (p *parser) error(err Error) { - panic(err) -} - -const endOfText = -1 - -func (p *parser) c() rune { return p.ch } - -func (p *parser) nextc() rune { - if p.pos >= len(p.re.expr) { - p.ch = endOfText - } else { - c, w := utf8.DecodeRuneInString(p.re.expr[p.pos:]) - p.ch = c - p.pos += w - } - return p.ch -} - -func newParser(re *Regexp) *parser { - p := new(parser) - p.re = re - p.nextc() // load p.ch - return p -} - -func special(c rune) bool { - for _, r := range `\.+*?()|[]^$` { - if c == r { - return true - } - } - return false -} - -func ispunct(c rune) bool { - for _, r := range "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" { - if c == r { - return true - } - } - return false -} - -var escapes = []byte("abfnrtv") -var escaped = []byte("\a\b\f\n\r\t\v") - -func escape(c rune) int { - for i, b := range escapes { - if rune(b) == c { - return i - } - } - return -1 -} - -func (p *parser) checkBackslash() rune { - c := p.c() - if c == '\\' { - c = p.nextc() - switch { - case c == endOfText: - p.error(ErrExtraneousBackslash) - case ispunct(c): - // c is as delivered - case escape(c) >= 0: - c = rune(escaped[escape(c)]) - default: - p.error(ErrBadBackslash) - } - } - return c -} - -func (p *parser) charClass() *instr { - i := newCharClass() - cc := i.cclass - if p.c() == '^' { - cc.negate = true - p.nextc() - } - left := rune(-1) - for { - switch c := p.c(); c { - case ']', endOfText: - if left >= 0 { - p.error(ErrBadRange) - } - // Is it [^\n]? - if cc.negate && len(cc.ranges) == 2 && - cc.ranges[0] == '\n' && cc.ranges[1] == '\n' { - nl := &instr{kind: iNotNL} - p.re.add(nl) - return nl - } - // Special common case: "[a]" -> "a" - if !cc.negate && len(cc.ranges) == 2 && cc.ranges[0] == cc.ranges[1] { - c := &instr{kind: iChar, char: cc.ranges[0]} - p.re.add(c) - return c - } - p.re.add(i) - return i - case '-': // do this before backslash processing - p.error(ErrBadRange) - default: - c = p.checkBackslash() - p.nextc() - switch { - case left < 0: // first of pair - if p.c() == '-' { // range - p.nextc() - left = c - } else { // single char - cc.addRange(c, c) - } - case left <= c: // second of pair - cc.addRange(left, c) - left = -1 - default: - p.error(ErrBadRange) - } - } - } - panic("unreachable") -} - -func (p *parser) term() (start, end *instr) { - switch c := p.c(); c { - case '|', endOfText: - return nil, nil - case '*', '+', '?': - p.error(ErrBareClosure) - case ')': - if p.nlpar == 0 { - p.error(ErrUnmatchedRpar) - } - return nil, nil - case ']': - p.error(ErrUnmatchedRbkt) - case '^': - p.nextc() - start = p.re.add(&instr{kind: iBOT}) - return start, start - case '$': - p.nextc() - start = p.re.add(&instr{kind: iEOT}) - return start, start - case '.': - p.nextc() - start = p.re.add(&instr{kind: iAny}) - return start, start - case '[': - p.nextc() - start = p.charClass() - if p.c() != ']' { - p.error(ErrUnmatchedLbkt) - } - p.nextc() - return start, start - case '(': - p.nextc() - p.nlpar++ - p.re.nbra++ // increment first so first subexpr is \1 - nbra := p.re.nbra - start, end = p.regexp() - if p.c() != ')' { - p.error(ErrUnmatchedLpar) - } - p.nlpar-- - p.nextc() - bra := &instr{kind: iBra, braNum: 2 * nbra} - p.re.add(bra) - ebra := &instr{kind: iBra, braNum: 2*nbra + 1} - p.re.add(ebra) - if start == nil { - if end == nil { - p.error(ErrInternal) - return - } - start = ebra - } else { - end.next = ebra - } - bra.next = start - return bra, ebra - default: - c = p.checkBackslash() - p.nextc() - start = &instr{kind: iChar, char: c} - p.re.add(start) - return start, start - } - panic("unreachable") -} - -func (p *parser) closure() (start, end *instr) { - start, end = p.term() - if start == nil { - return - } - switch p.c() { - case '*': - // (start,end)*: - alt := &instr{kind: iAlt} - p.re.add(alt) - end.next = alt // after end, do alt - alt.left = start // alternate brach: return to start - start = alt // alt becomes new (start, end) - end = alt - case '+': - // (start,end)+: - alt := &instr{kind: iAlt} - p.re.add(alt) - end.next = alt // after end, do alt - alt.left = start // alternate brach: return to start - end = alt // start is unchanged; end is alt - case '?': - // (start,end)?: - alt := &instr{kind: iAlt} - p.re.add(alt) - nop := &instr{kind: iNop} - p.re.add(nop) - alt.left = start // alternate branch is start - alt.next = nop // follow on to nop - end.next = nop // after end, go to nop - start = alt // start is now alt - end = nop // end is nop pointed to by both branches - default: - return - } - switch p.nextc() { - case '*', '+', '?': - p.error(ErrBadClosure) - } - return -} - -func (p *parser) concatenation() (start, end *instr) { - for { - nstart, nend := p.closure() - switch { - case nstart == nil: // end of this concatenation - if start == nil { // this is the empty string - nop := p.re.add(&instr{kind: iNop}) - return nop, nop - } - return - case start == nil: // this is first element of concatenation - start, end = nstart, nend - default: - end.next = nstart - end = nend - } - } - panic("unreachable") -} - -func (p *parser) regexp() (start, end *instr) { - start, end = p.concatenation() - for { - switch p.c() { - default: - return - case '|': - p.nextc() - nstart, nend := p.concatenation() - alt := &instr{kind: iAlt} - p.re.add(alt) - alt.left = start - alt.next = nstart - nop := &instr{kind: iNop} - p.re.add(nop) - end.next = nop - nend.next = nop - start, end = alt, nop - } - } - panic("unreachable") -} - -func unNop(i *instr) *instr { - for i.kind == iNop { - i = i.next - } - return i -} - -func (re *Regexp) eliminateNops() { - for _, inst := range re.inst { - if inst.kind == iEnd { - continue - } - inst.next = unNop(inst.next) - if inst.kind == iAlt { - inst.left = unNop(inst.left) - } - } -} - -func (re *Regexp) dump() { - print("prefix <", re.prefix, ">\n") - for _, inst := range re.inst { - print(inst.index, ": ") - inst.print() - if inst.kind != iEnd { - print(" -> ", inst.next.index) - } - print("\n") - } -} - -func (re *Regexp) doParse() { - p := newParser(re) - start := &instr{kind: iStart} - re.add(start) - s, e := p.regexp() - start.next = s - re.start = start - e.next = re.add(&instr{kind: iEnd}) - - if debug { - re.dump() - println() - } - - re.eliminateNops() - if debug { - re.dump() - println() - } - re.setPrefix() - if debug { - re.dump() - println() - } -} - -// Extract regular text from the beginning of the pattern, -// possibly after a leading iBOT. -// That text can be used by doExecute to speed up matching. -func (re *Regexp) setPrefix() { - var b []byte - var utf = make([]byte, utf8.UTFMax) - var inst *instr - // First instruction is start; skip that. Also skip any initial iBOT. - inst = re.inst[0].next - for inst.kind == iBOT { - inst = inst.next - } -Loop: - for ; inst.kind != iEnd; inst = inst.next { - // stop if this is not a char - if inst.kind != iChar { - break - } - // stop if this char can be followed by a match for an empty string, - // which includes closures, ^, and $. - switch inst.next.kind { - case iBOT, iEOT, iAlt: - break Loop - } - n := utf8.EncodeRune(utf, inst.char) - b = append(b, utf[0:n]...) - } - // point prefixStart instruction to first non-CHAR after prefix - re.prefixStart = inst - re.prefixBytes = b - re.prefix = string(b) -} - -// String returns the source text used to compile the regular expression. -func (re *Regexp) String() string { - return re.expr -} - -// Compile parses a regular expression and returns, if successful, a Regexp -// object that can be used to match against text. -func Compile(str string) (regexp *Regexp, error error) { - regexp = new(Regexp) - // doParse will panic if there is a parse error. - defer func() { - if e := recover(); e != nil { - regexp = nil - error = e.(Error) // Will re-panic if error was not an Error, e.g. nil-pointer exception - } - }() - regexp.expr = str - regexp.inst = make([]*instr, 0, 10) - regexp.doParse() - return -} - -// MustCompile is like Compile but panics if the expression cannot be parsed. -// It simplifies safe initialization of global variables holding compiled regular -// expressions. -func MustCompile(str string) *Regexp { - regexp, error := Compile(str) - if error != nil { - panic(`regexp: compiling "` + str + `": ` + error.Error()) - } - return regexp -} - -// NumSubexp returns the number of parenthesized subexpressions in this Regexp. -func (re *Regexp) NumSubexp() int { return re.nbra } - -// The match arena allows us to reduce the garbage generated by tossing -// match vectors away as we execute. Matches are ref counted and returned -// to a free list when no longer active. Increases a simple benchmark by 22X. -type matchArena struct { - head *matchVec - len int // length of match vector - pos int - atBOT bool // whether we're at beginning of text - atEOT bool // whether we're at end of text -} - -type matchVec struct { - m []int // pairs of bracketing submatches. 0th is start,end - ref int - next *matchVec -} - -func (a *matchArena) new() *matchVec { - if a.head == nil { - const N = 10 - block := make([]matchVec, N) - for i := 0; i < N; i++ { - b := &block[i] - b.next = a.head - a.head = b - } - } - m := a.head - a.head = m.next - m.ref = 0 - if m.m == nil { - m.m = make([]int, a.len) - } - return m -} - -func (a *matchArena) free(m *matchVec) { - m.ref-- - if m.ref == 0 { - m.next = a.head - a.head = m - } -} - -func (a *matchArena) copy(m *matchVec) *matchVec { - m1 := a.new() - copy(m1.m, m.m) - return m1 -} - -func (a *matchArena) noMatch() *matchVec { - m := a.new() - for i := range m.m { - m.m[i] = -1 // no match seen; catches cases like "a(b)?c" on "ac" - } - m.ref = 1 - return m -} - -type state struct { - inst *instr // next instruction to execute - prefixed bool // this match began with a fixed prefix - match *matchVec -} - -// Append new state to to-do list. Leftmost-longest wins so avoid -// adding a state that's already active. The matchVec will be inc-ref'ed -// if it is assigned to a state. -func (a *matchArena) addState(s []state, inst *instr, prefixed bool, match *matchVec) []state { - switch inst.kind { - case iBOT: - if a.atBOT { - s = a.addState(s, inst.next, prefixed, match) - } - return s - case iEOT: - if a.atEOT { - s = a.addState(s, inst.next, prefixed, match) - } - return s - case iBra: - match.m[inst.braNum] = a.pos - s = a.addState(s, inst.next, prefixed, match) - return s - } - l := len(s) - // States are inserted in order so it's sufficient to see if we have the same - // instruction; no need to see if existing match is earlier (it is). - for i := 0; i < l; i++ { - if s[i].inst == inst { - return s - } - } - s = append(s, state{inst, prefixed, match}) - match.ref++ - if inst.kind == iAlt { - s = a.addState(s, inst.left, prefixed, a.copy(match)) - // give other branch a copy of this match vector - s = a.addState(s, inst.next, prefixed, a.copy(match)) - } - return s -} - -// input abstracts different representations of the input text. It provides -// one-character lookahead. -type input interface { - step(pos int) (r rune, width int) // advance one rune - canCheckPrefix() bool // can we look ahead without losing info? - hasPrefix(re *Regexp) bool - index(re *Regexp, pos int) int -} - -// inputString scans a string. -type inputString struct { - str string -} - -func newInputString(str string) *inputString { - return &inputString{str: str} -} - -func (i *inputString) step(pos int) (rune, int) { - if pos < len(i.str) { - return utf8.DecodeRuneInString(i.str[pos:len(i.str)]) - } - return endOfText, 0 -} - -func (i *inputString) canCheckPrefix() bool { - return true -} - -func (i *inputString) hasPrefix(re *Regexp) bool { - return strings.HasPrefix(i.str, re.prefix) -} - -func (i *inputString) index(re *Regexp, pos int) int { - return strings.Index(i.str[pos:], re.prefix) -} - -// inputBytes scans a byte slice. -type inputBytes struct { - str []byte -} - -func newInputBytes(str []byte) *inputBytes { - return &inputBytes{str: str} -} - -func (i *inputBytes) step(pos int) (rune, int) { - if pos < len(i.str) { - return utf8.DecodeRune(i.str[pos:len(i.str)]) - } - return endOfText, 0 -} - -func (i *inputBytes) canCheckPrefix() bool { - return true -} - -func (i *inputBytes) hasPrefix(re *Regexp) bool { - return bytes.HasPrefix(i.str, re.prefixBytes) -} - -func (i *inputBytes) index(re *Regexp, pos int) int { - return bytes.Index(i.str[pos:], re.prefixBytes) -} - -// inputReader scans a RuneReader. -type inputReader struct { - r io.RuneReader - atEOT bool - pos int -} - -func newInputReader(r io.RuneReader) *inputReader { - return &inputReader{r: r} -} - -func (i *inputReader) step(pos int) (rune, int) { - if !i.atEOT && pos != i.pos { - return endOfText, 0 - - } - r, w, err := i.r.ReadRune() - if err != nil { - i.atEOT = true - return endOfText, 0 - } - i.pos += w - return r, w -} - -func (i *inputReader) canCheckPrefix() bool { - return false -} - -func (i *inputReader) hasPrefix(re *Regexp) bool { - return false -} - -func (i *inputReader) index(re *Regexp, pos int) int { - return -1 -} - -// Search match starting from pos bytes into the input. -func (re *Regexp) doExecute(i input, pos int) []int { - var s [2][]state - s[0] = make([]state, 0, 10) - s[1] = make([]state, 0, 10) - in, out := 0, 1 - var final state - found := false - anchored := re.inst[0].next.kind == iBOT - if anchored && pos > 0 { - return nil - } - // fast check for initial plain substring - if i.canCheckPrefix() && re.prefix != "" { - advance := 0 - if anchored { - if !i.hasPrefix(re) { - return nil - } - } else { - advance = i.index(re, pos) - if advance == -1 { - return nil - } - } - pos += advance - } - // We look one character ahead so we can match $, which checks whether - // we are at EOT. - nextChar, nextWidth := i.step(pos) - arena := &matchArena{ - len: 2 * (re.nbra + 1), - pos: pos, - atBOT: pos == 0, - atEOT: nextChar == endOfText, - } - for c, startPos := rune(0), pos; c != endOfText; { - if !found && (pos == startPos || !anchored) { - // prime the pump if we haven't seen a match yet - match := arena.noMatch() - match.m[0] = pos - s[out] = arena.addState(s[out], re.start.next, false, match) - arena.free(match) // if addState saved it, ref was incremented - } else if len(s[out]) == 0 { - // machine has completed - break - } - in, out = out, in // old out state is new in state - // clear out old state - old := s[out] - for _, state := range old { - arena.free(state.match) - } - s[out] = old[0:0] // truncate state vector - c = nextChar - thisPos := pos - pos += nextWidth - nextChar, nextWidth = i.step(pos) - arena.atEOT = nextChar == endOfText - arena.atBOT = false - arena.pos = pos - for _, st := range s[in] { - switch st.inst.kind { - case iBOT: - case iEOT: - case iChar: - if c == st.inst.char { - s[out] = arena.addState(s[out], st.inst.next, st.prefixed, st.match) - } - case iCharClass: - if st.inst.cclass.matches(c) { - s[out] = arena.addState(s[out], st.inst.next, st.prefixed, st.match) - } - case iAny: - if c != endOfText { - s[out] = arena.addState(s[out], st.inst.next, st.prefixed, st.match) - } - case iNotNL: - if c != endOfText && c != '\n' { - s[out] = arena.addState(s[out], st.inst.next, st.prefixed, st.match) - } - case iBra: - case iAlt: - case iEnd: - // choose leftmost longest - if !found || // first - st.match.m[0] < final.match.m[0] || // leftmost - (st.match.m[0] == final.match.m[0] && thisPos > final.match.m[1]) { // longest - if final.match != nil { - arena.free(final.match) - } - final = st - final.match.ref++ - final.match.m[1] = thisPos - } - found = true - default: - st.inst.print() - panic("unknown instruction in execute") - } - } - } - if final.match == nil { - return nil - } - // if match found, back up start of match by width of prefix. - if final.prefixed && len(final.match.m) > 0 { - final.match.m[0] -= len(re.prefix) - } - return final.match.m -} - -// LiteralPrefix returns a literal string that must begin any match -// of the regular expression re. It returns the boolean true if the -// literal string comprises the entire regular expression. -func (re *Regexp) LiteralPrefix() (prefix string, complete bool) { - c := make([]rune, len(re.inst)-2) // minus start and end. - // First instruction is start; skip that. - i := 0 - for inst := re.inst[0].next; inst.kind != iEnd; inst = inst.next { - // stop if this is not a char - if inst.kind != iChar { - return string(c[:i]), false - } - c[i] = inst.char - i++ - } - return string(c[:i]), true -} - -// MatchReader returns whether the Regexp matches the text read by the -// RuneReader. The return value is a boolean: true for match, false for no -// match. -func (re *Regexp) MatchReader(r io.RuneReader) bool { - return len(re.doExecute(newInputReader(r), 0)) > 0 -} - -// MatchString returns whether the Regexp matches the string s. -// The return value is a boolean: true for match, false for no match. -func (re *Regexp) MatchString(s string) bool { return len(re.doExecute(newInputString(s), 0)) > 0 } - -// Match returns whether the Regexp matches the byte slice b. -// The return value is a boolean: true for match, false for no match. -func (re *Regexp) Match(b []byte) bool { return len(re.doExecute(newInputBytes(b), 0)) > 0 } - -// MatchReader checks whether a textual regular expression matches the text -// read by the RuneReader. More complicated queries need to use Compile and -// the full Regexp interface. -func MatchReader(pattern string, r io.RuneReader) (matched bool, error error) { - re, err := Compile(pattern) - if err != nil { - return false, err - } - return re.MatchReader(r), nil -} - -// MatchString checks whether a textual regular expression -// matches a string. More complicated queries need -// to use Compile and the full Regexp interface. -func MatchString(pattern string, s string) (matched bool, error error) { - re, err := Compile(pattern) - if err != nil { - return false, err - } - return re.MatchString(s), nil -} - -// Match checks whether a textual regular expression -// matches a byte slice. More complicated queries need -// to use Compile and the full Regexp interface. -func Match(pattern string, b []byte) (matched bool, error error) { - re, err := Compile(pattern) - if err != nil { - return false, err - } - return re.Match(b), nil -} - -// ReplaceAllString returns a copy of src in which all matches for the Regexp -// have been replaced by repl. No support is provided for expressions -// (e.g. \1 or $1) in the replacement string. -func (re *Regexp) ReplaceAllString(src, repl string) string { - return re.ReplaceAllStringFunc(src, func(string) string { return repl }) -} - -// ReplaceAllStringFunc returns a copy of src in which all matches for the -// Regexp have been replaced by the return value of of function repl (whose -// first argument is the matched string). No support is provided for -// expressions (e.g. \1 or $1) in the replacement string. -func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string { - lastMatchEnd := 0 // end position of the most recent match - searchPos := 0 // position where we next look for a match - buf := new(bytes.Buffer) - for searchPos <= len(src) { - a := re.doExecute(newInputString(src), searchPos) - if len(a) == 0 { - break // no more matches - } - - // Copy the unmatched characters before this match. - io.WriteString(buf, src[lastMatchEnd:a[0]]) - - // Now insert a copy of the replacement string, but not for a - // match of the empty string immediately after another match. - // (Otherwise, we get double replacement for patterns that - // match both empty and nonempty strings.) - if a[1] > lastMatchEnd || a[0] == 0 { - io.WriteString(buf, repl(src[a[0]:a[1]])) - } - lastMatchEnd = a[1] - - // Advance past this match; always advance at least one character. - _, width := utf8.DecodeRuneInString(src[searchPos:]) - if searchPos+width > a[1] { - searchPos += width - } else if searchPos+1 > a[1] { - // This clause is only needed at the end of the input - // string. In that case, DecodeRuneInString returns width=0. - searchPos++ - } else { - searchPos = a[1] - } - } - - // Copy the unmatched characters after the last match. - io.WriteString(buf, src[lastMatchEnd:]) - - return buf.String() -} - -// ReplaceAll returns a copy of src in which all matches for the Regexp -// have been replaced by repl. No support is provided for expressions -// (e.g. \1 or $1) in the replacement text. -func (re *Regexp) ReplaceAll(src, repl []byte) []byte { - return re.ReplaceAllFunc(src, func([]byte) []byte { return repl }) -} - -// ReplaceAllFunc returns a copy of src in which all matches for the -// Regexp have been replaced by the return value of of function repl (whose -// first argument is the matched []byte). No support is provided for -// expressions (e.g. \1 or $1) in the replacement string. -func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte { - lastMatchEnd := 0 // end position of the most recent match - searchPos := 0 // position where we next look for a match - buf := new(bytes.Buffer) - for searchPos <= len(src) { - a := re.doExecute(newInputBytes(src), searchPos) - if len(a) == 0 { - break // no more matches - } - - // Copy the unmatched characters before this match. - buf.Write(src[lastMatchEnd:a[0]]) - - // Now insert a copy of the replacement string, but not for a - // match of the empty string immediately after another match. - // (Otherwise, we get double replacement for patterns that - // match both empty and nonempty strings.) - if a[1] > lastMatchEnd || a[0] == 0 { - buf.Write(repl(src[a[0]:a[1]])) - } - lastMatchEnd = a[1] - - // Advance past this match; always advance at least one character. - _, width := utf8.DecodeRune(src[searchPos:]) - if searchPos+width > a[1] { - searchPos += width - } else if searchPos+1 > a[1] { - // This clause is only needed at the end of the input - // string. In that case, DecodeRuneInString returns width=0. - searchPos++ - } else { - searchPos = a[1] - } - } - - // Copy the unmatched characters after the last match. - buf.Write(src[lastMatchEnd:]) - - return buf.Bytes() -} - -// QuoteMeta returns a string that quotes all regular expression metacharacters -// inside the argument text; the returned string is a regular expression matching -// the literal text. For example, QuoteMeta(`[foo]`) returns `\[foo\]`. -func QuoteMeta(s string) string { - b := make([]byte, 2*len(s)) - - // A byte loop is correct because all metacharacters are ASCII. - j := 0 - for i := 0; i < len(s); i++ { - if special(rune(s[i])) { - b[j] = '\\' - j++ - } - b[j] = s[i] - j++ - } - return string(b[0:j]) -} - -// Find matches in slice b if b is non-nil, otherwise find matches in string s. -func (re *Regexp) allMatches(s string, b []byte, n int, deliver func([]int)) { - var end int - if b == nil { - end = len(s) - } else { - end = len(b) - } - - for pos, i, prevMatchEnd := 0, 0, -1; i < n && pos <= end; { - var in input - if b == nil { - in = newInputString(s) - } else { - in = newInputBytes(b) - } - matches := re.doExecute(in, pos) - if len(matches) == 0 { - break - } - - accept := true - if matches[1] == pos { - // We've found an empty match. - if matches[0] == prevMatchEnd { - // We don't allow an empty match right - // after a previous match, so ignore it. - accept = false - } - var width int - // TODO: use step() - if b == nil { - _, width = utf8.DecodeRuneInString(s[pos:end]) - } else { - _, width = utf8.DecodeRune(b[pos:end]) - } - if width > 0 { - pos += width - } else { - pos = end + 1 - } - } else { - pos = matches[1] - } - prevMatchEnd = matches[1] - - if accept { - deliver(matches) - i++ - } - } -} - -// Find returns a slice holding the text of the leftmost match in b of the regular expression. -// A return value of nil indicates no match. -func (re *Regexp) Find(b []byte) []byte { - a := re.doExecute(newInputBytes(b), 0) - if a == nil { - return nil - } - return b[a[0]:a[1]] -} - -// FindIndex returns a two-element slice of integers defining the location of -// the leftmost match in b of the regular expression. The match itself is at -// b[loc[0]:loc[1]]. -// A return value of nil indicates no match. -func (re *Regexp) FindIndex(b []byte) (loc []int) { - a := re.doExecute(newInputBytes(b), 0) - if a == nil { - return nil - } - return a[0:2] -} - -// FindString returns a string holding the text of the leftmost match in s of the regular -// expression. If there is no match, the return value is an empty string, -// but it will also be empty if the regular expression successfully matches -// an empty string. Use FindStringIndex or FindStringSubmatch if it is -// necessary to distinguish these cases. -func (re *Regexp) FindString(s string) string { - a := re.doExecute(newInputString(s), 0) - if a == nil { - return "" - } - return s[a[0]:a[1]] -} - -// FindStringIndex returns a two-element slice of integers defining the -// location of the leftmost match in s of the regular expression. The match -// itself is at s[loc[0]:loc[1]]. -// A return value of nil indicates no match. -func (re *Regexp) FindStringIndex(s string) []int { - a := re.doExecute(newInputString(s), 0) - if a == nil { - return nil - } - return a[0:2] -} - -// FindReaderIndex returns a two-element slice of integers defining the -// location of the leftmost match of the regular expression in text read from -// the RuneReader. The match itself is at s[loc[0]:loc[1]]. A return -// value of nil indicates no match. -func (re *Regexp) FindReaderIndex(r io.RuneReader) []int { - a := re.doExecute(newInputReader(r), 0) - if a == nil { - return nil - } - return a[0:2] -} - -// FindSubmatch returns a slice of slices holding the text of the leftmost -// match of the regular expression in b and the matches, if any, of its -// subexpressions, as defined by the 'Submatch' descriptions in the package -// comment. -// A return value of nil indicates no match. -func (re *Regexp) FindSubmatch(b []byte) [][]byte { - a := re.doExecute(newInputBytes(b), 0) - if a == nil { - return nil - } - ret := make([][]byte, len(a)/2) - for i := range ret { - if a[2*i] >= 0 { - ret[i] = b[a[2*i]:a[2*i+1]] - } - } - return ret -} - -// FindSubmatchIndex returns a slice holding the index pairs identifying the -// leftmost match of the regular expression in b and the matches, if any, of -// its subexpressions, as defined by the 'Submatch' and 'Index' descriptions -// in the package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindSubmatchIndex(b []byte) []int { - return re.doExecute(newInputBytes(b), 0) -} - -// FindStringSubmatch returns a slice of strings holding the text of the -// leftmost match of the regular expression in s and the matches, if any, of -// its subexpressions, as defined by the 'Submatch' description in the -// package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindStringSubmatch(s string) []string { - a := re.doExecute(newInputString(s), 0) - if a == nil { - return nil - } - ret := make([]string, len(a)/2) - for i := range ret { - if a[2*i] >= 0 { - ret[i] = s[a[2*i]:a[2*i+1]] - } - } - return ret -} - -// FindStringSubmatchIndex returns a slice holding the index pairs -// identifying the leftmost match of the regular expression in s and the -// matches, if any, of its subexpressions, as defined by the 'Submatch' and -// 'Index' descriptions in the package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindStringSubmatchIndex(s string) []int { - return re.doExecute(newInputString(s), 0) -} - -// FindReaderSubmatchIndex returns a slice holding the index pairs -// identifying the leftmost match of the regular expression of text read by -// the RuneReader, and the matches, if any, of its subexpressions, as defined -// by the 'Submatch' and 'Index' descriptions in the package comment. A -// return value of nil indicates no match. -func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int { - return re.doExecute(newInputReader(r), 0) -} - -const startSize = 10 // The size at which to start a slice in the 'All' routines. - -// FindAll is the 'All' version of Find; it returns a slice of all successive -// matches of the expression, as defined by the 'All' description in the -// package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindAll(b []byte, n int) [][]byte { - if n < 0 { - n = len(b) + 1 - } - result := make([][]byte, 0, startSize) - re.allMatches("", b, n, func(match []int) { - result = append(result, b[match[0]:match[1]]) - }) - if len(result) == 0 { - return nil - } - return result -} - -// FindAllIndex is the 'All' version of FindIndex; it returns a slice of all -// successive matches of the expression, as defined by the 'All' description -// in the package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindAllIndex(b []byte, n int) [][]int { - if n < 0 { - n = len(b) + 1 - } - result := make([][]int, 0, startSize) - re.allMatches("", b, n, func(match []int) { - result = append(result, match[0:2]) - }) - if len(result) == 0 { - return nil - } - return result -} - -// FindAllString is the 'All' version of FindString; it returns a slice of all -// successive matches of the expression, as defined by the 'All' description -// in the package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindAllString(s string, n int) []string { - if n < 0 { - n = len(s) + 1 - } - result := make([]string, 0, startSize) - re.allMatches(s, nil, n, func(match []int) { - result = append(result, s[match[0]:match[1]]) - }) - if len(result) == 0 { - return nil - } - return result -} - -// FindAllStringIndex is the 'All' version of FindStringIndex; it returns a -// slice of all successive matches of the expression, as defined by the 'All' -// description in the package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindAllStringIndex(s string, n int) [][]int { - if n < 0 { - n = len(s) + 1 - } - result := make([][]int, 0, startSize) - re.allMatches(s, nil, n, func(match []int) { - result = append(result, match[0:2]) - }) - if len(result) == 0 { - return nil - } - return result -} - -// FindAllSubmatch is the 'All' version of FindSubmatch; it returns a slice -// of all successive matches of the expression, as defined by the 'All' -// description in the package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte { - if n < 0 { - n = len(b) + 1 - } - result := make([][][]byte, 0, startSize) - re.allMatches("", b, n, func(match []int) { - slice := make([][]byte, len(match)/2) - for j := range slice { - if match[2*j] >= 0 { - slice[j] = b[match[2*j]:match[2*j+1]] - } - } - result = append(result, slice) - }) - if len(result) == 0 { - return nil - } - return result -} - -// FindAllSubmatchIndex is the 'All' version of FindSubmatchIndex; it returns -// a slice of all successive matches of the expression, as defined by the -// 'All' description in the package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int { - if n < 0 { - n = len(b) + 1 - } - result := make([][]int, 0, startSize) - re.allMatches("", b, n, func(match []int) { - result = append(result, match) - }) - if len(result) == 0 { - return nil - } - return result -} - -// FindAllStringSubmatch is the 'All' version of FindStringSubmatch; it -// returns a slice of all successive matches of the expression, as defined by -// the 'All' description in the package comment. -// A return value of nil indicates no match. -func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string { - if n < 0 { - n = len(s) + 1 - } - result := make([][]string, 0, startSize) - re.allMatches(s, nil, n, func(match []int) { - slice := make([]string, len(match)/2) - for j := range slice { - if match[2*j] >= 0 { - slice[j] = s[match[2*j]:match[2*j+1]] - } - } - result = append(result, slice) - }) - if len(result) == 0 { - return nil - } - return result -} - -// FindAllStringSubmatchIndex is the 'All' version of -// FindStringSubmatchIndex; it returns a slice of all successive matches of -// the expression, as defined by the 'All' description in the package -// comment. -// A return value of nil indicates no match. -func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int { - if n < 0 { - n = len(s) + 1 - } - result := make([][]int, 0, startSize) - re.allMatches(s, nil, n, func(match []int) { - result = append(result, match) - }) - if len(result) == 0 { - return nil - } - return result -} diff --git a/src/pkg/old/template/doc.go b/src/pkg/old/template/doc.go deleted file mode 100644 index e778d801da..0000000000 --- a/src/pkg/old/template/doc.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* - Package template implements data-driven templates for generating textual - output such as HTML. - - Templates are executed by applying them to a data structure. - Annotations in the template refer to elements of the data - structure (typically a field of a struct or a key in a map) - to control execution and derive values to be displayed. - The template walks the structure as it executes and the - "cursor" @ represents the value at the current location - in the structure. - - Data items may be values or pointers; the interface hides the - indirection. - - In the following, 'Field' is one of several things, according to the data. - - - The name of a field of a struct (result = data.Field), - - The value stored in a map under that key (result = data["Field"]), or - - The result of invoking a niladic single-valued method with that name - (result = data.Field()) - - If Field is a struct field or method name, it must be an exported - (capitalized) name. - - Major constructs ({} are the default delimiters for template actions; - [] are the notation in this comment for optional elements): - - {# comment } - - A one-line comment. - - {.section field} XXX [ {.or} YYY ] {.end} - - Set @ to the value of the field. It may be an explicit @ - to stay at the same point in the data. If the field is nil - or empty, execute YYY; otherwise execute XXX. - - {.repeated section field} XXX [ {.alternates with} ZZZ ] [ {.or} YYY ] {.end} - - Like .section, but field must be an array or slice. XXX - is executed for each element. If the array is nil or empty, - YYY is executed instead. If the {.alternates with} marker - is present, ZZZ is executed between iterations of XXX. - - {field} - {field1 field2 ...} - {field|formatter} - {field1 field2...|formatter} - {field|formatter1|formatter2} - - Insert the value of the fields into the output. Each field is - first looked for in the cursor, as in .section and .repeated. - If it is not found, the search continues in outer sections - until the top level is reached. - - If the field value is a pointer, leading asterisks indicate - that the value to be inserted should be evaluated through the - pointer. For example, if x.p is of type *int, {x.p} will - insert the value of the pointer but {*x.p} will insert the - value of the underlying integer. If the value is nil or not a - pointer, asterisks have no effect. - - If a formatter is specified, it must be named in the formatter - map passed to the template set up routines or in the default - set ("html","str","") and is used to process the data for - output. The formatter function has signature - func(wr io.Writer, formatter string, data ...interface{}) - where wr is the destination for output, data holds the field - values at the instantiation, and formatter is its name at - the invocation site. The default formatter just concatenates - the string representations of the fields. - - Multiple formatters separated by the pipeline character | are - executed sequentially, with each formatter receiving the bytes - emitted by the one to its left. - - As well as field names, one may use literals with Go syntax. - Integer, floating-point, and string literals are supported. - Raw strings may not span newlines. - - The delimiter strings get their default value, "{" and "}", from - JSON-template. They may be set to any non-empty, space-free - string using the SetDelims method. Their value can be printed - in the output using {.meta-left} and {.meta-right}. -*/ -package template diff --git a/src/pkg/old/template/execute.go b/src/pkg/old/template/execute.go deleted file mode 100644 index 464b620c98..0000000000 --- a/src/pkg/old/template/execute.go +++ /dev/null @@ -1,346 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code to execute a parsed template. - -package template - -import ( - "bytes" - "io" - "reflect" - "strings" -) - -// Internal state for executing a Template. As we evaluate the struct, -// the data item descends into the fields associated with sections, etc. -// Parent is used to walk upwards to find variables higher in the tree. -type state struct { - parent *state // parent in hierarchy - data reflect.Value // the driver data for this section etc. - wr io.Writer // where to send output - buf [2]bytes.Buffer // alternating buffers used when chaining formatters -} - -func (parent *state) clone(data reflect.Value) *state { - return &state{parent: parent, data: data, wr: parent.wr} -} - -// Evaluate interfaces and pointers looking for a value that can look up the name, via a -// struct field, method, or map key, and return the result of the lookup. -func (t *Template) lookup(st *state, v reflect.Value, name string) reflect.Value { - for v.IsValid() { - typ := v.Type() - if n := v.Type().NumMethod(); n > 0 { - for i := 0; i < n; i++ { - m := typ.Method(i) - mtyp := m.Type - if m.Name == name && mtyp.NumIn() == 1 && mtyp.NumOut() == 1 { - if !isExported(name) { - t.execError(st, t.linenum, "name not exported: %s in type %s", name, st.data.Type()) - } - return v.Method(i).Call(nil)[0] - } - } - } - switch av := v; av.Kind() { - case reflect.Ptr: - v = av.Elem() - case reflect.Interface: - v = av.Elem() - case reflect.Struct: - if !isExported(name) { - t.execError(st, t.linenum, "name not exported: %s in type %s", name, st.data.Type()) - } - return av.FieldByName(name) - case reflect.Map: - if v := av.MapIndex(reflect.ValueOf(name)); v.IsValid() { - return v - } - return reflect.Zero(typ.Elem()) - default: - return reflect.Value{} - } - } - return v -} - -// indirectPtr returns the item numLevels levels of indirection below the value. -// It is forgiving: if the value is not a pointer, it returns it rather than giving -// an error. If the pointer is nil, it is returned as is. -func indirectPtr(v reflect.Value, numLevels int) reflect.Value { - for i := numLevels; v.IsValid() && i > 0; i++ { - if p := v; p.Kind() == reflect.Ptr { - if p.IsNil() { - return v - } - v = p.Elem() - } else { - break - } - } - return v -} - -// Walk v through pointers and interfaces, extracting the elements within. -func indirect(v reflect.Value) reflect.Value { -loop: - for v.IsValid() { - switch av := v; av.Kind() { - case reflect.Ptr: - v = av.Elem() - case reflect.Interface: - v = av.Elem() - default: - break loop - } - } - return v -} - -// If the data for this template is a struct, find the named variable. -// Names of the form a.b.c are walked down the data tree. -// The special name "@" (the "cursor") denotes the current data. -// The value coming in (st.data) might need indirecting to reach -// a struct while the return value is not indirected - that is, -// it represents the actual named field. Leading stars indicate -// levels of indirection to be applied to the value. -func (t *Template) findVar(st *state, s string) reflect.Value { - data := st.data - flattenedName := strings.TrimLeft(s, "*") - numStars := len(s) - len(flattenedName) - s = flattenedName - if s == "@" { - return indirectPtr(data, numStars) - } - for _, elem := range strings.Split(s, ".") { - // Look up field; data must be a struct or map. - data = t.lookup(st, data, elem) - if !data.IsValid() { - return reflect.Value{} - } - } - return indirectPtr(data, numStars) -} - -// Is there no data to look at? -func empty(v reflect.Value) bool { - v = indirect(v) - if !v.IsValid() { - return true - } - switch v.Kind() { - case reflect.Bool: - return v.Bool() == false - case reflect.String: - return v.String() == "" - case reflect.Struct: - return false - case reflect.Map: - return false - case reflect.Array: - return v.Len() == 0 - case reflect.Slice: - return v.Len() == 0 - } - return false -} - -// Look up a variable or method, up through the parent if necessary. -func (t *Template) varValue(name string, st *state) reflect.Value { - field := t.findVar(st, name) - if !field.IsValid() { - if st.parent == nil { - t.execError(st, t.linenum, "name not found: %s in type %s", name, st.data.Type()) - } - return t.varValue(name, st.parent) - } - return field -} - -func (t *Template) format(wr io.Writer, fmt string, val []interface{}, v *variableElement, st *state) { - fn := t.formatter(fmt) - if fn == nil { - t.execError(st, v.linenum, "missing formatter %s for variable", fmt) - } - fn(wr, fmt, val...) -} - -// Evaluate a variable, looking up through the parent if necessary. -// If it has a formatter attached ({var|formatter}) run that too. -func (t *Template) writeVariable(v *variableElement, st *state) { - // Resolve field names - val := make([]interface{}, len(v.args)) - for i, arg := range v.args { - if name, ok := arg.(fieldName); ok { - val[i] = t.varValue(string(name), st).Interface() - } else { - val[i] = arg - } - } - for i, fmt := range v.fmts[:len(v.fmts)-1] { - b := &st.buf[i&1] - b.Reset() - t.format(b, fmt, val, v, st) - val = val[0:1] - val[0] = b.Bytes() - } - t.format(st.wr, v.fmts[len(v.fmts)-1], val, v, st) -} - -// Execute element i. Return next index to execute. -func (t *Template) executeElement(i int, st *state) int { - switch elem := t.elems[i].(type) { - case *textElement: - st.wr.Write(elem.text) - return i + 1 - case *literalElement: - st.wr.Write(elem.text) - return i + 1 - case *variableElement: - t.writeVariable(elem, st) - return i + 1 - case *sectionElement: - t.executeSection(elem, st) - return elem.end - case *repeatedElement: - t.executeRepeated(elem, st) - return elem.end - } - e := t.elems[i] - t.execError(st, 0, "internal error: bad directive in execute: %v %T\n", reflect.ValueOf(e).Interface(), e) - return 0 -} - -// Execute the template. -func (t *Template) execute(start, end int, st *state) { - for i := start; i < end; { - i = t.executeElement(i, st) - } -} - -// Execute a .section -func (t *Template) executeSection(s *sectionElement, st *state) { - // Find driver data for this section. It must be in the current struct. - field := t.varValue(s.field, st) - if !field.IsValid() { - t.execError(st, s.linenum, ".section: cannot find field %s in %s", s.field, st.data.Type()) - } - st = st.clone(field) - start, end := s.start, s.or - if !empty(field) { - // Execute the normal block. - if end < 0 { - end = s.end - } - } else { - // Execute the .or block. If it's missing, do nothing. - start, end = s.or, s.end - if start < 0 { - return - } - } - for i := start; i < end; { - i = t.executeElement(i, st) - } -} - -// Return the result of calling the Iter method on v, or nil. -func iter(v reflect.Value) reflect.Value { - for j := 0; j < v.Type().NumMethod(); j++ { - mth := v.Type().Method(j) - fv := v.Method(j) - ft := fv.Type() - // TODO(rsc): NumIn() should return 0 here, because ft is from a curried FuncValue. - if mth.Name != "Iter" || ft.NumIn() != 1 || ft.NumOut() != 1 { - continue - } - ct := ft.Out(0) - if ct.Kind() != reflect.Chan || - ct.ChanDir()&reflect.RecvDir == 0 { - continue - } - return fv.Call(nil)[0] - } - return reflect.Value{} -} - -// Execute a .repeated section -func (t *Template) executeRepeated(r *repeatedElement, st *state) { - // Find driver data for this section. It must be in the current struct. - field := t.varValue(r.field, st) - if !field.IsValid() { - t.execError(st, r.linenum, ".repeated: cannot find field %s in %s", r.field, st.data.Type()) - } - field = indirect(field) - - start, end := r.start, r.or - if end < 0 { - end = r.end - } - if r.altstart >= 0 { - end = r.altstart - } - first := true - - // Code common to all the loops. - loopBody := func(newst *state) { - // .alternates between elements - if !first && r.altstart >= 0 { - for i := r.altstart; i < r.altend; { - i = t.executeElement(i, newst) - } - } - first = false - for i := start; i < end; { - i = t.executeElement(i, newst) - } - } - - if array := field; array.Kind() == reflect.Array || array.Kind() == reflect.Slice { - for j := 0; j < array.Len(); j++ { - loopBody(st.clone(array.Index(j))) - } - } else if m := field; m.Kind() == reflect.Map { - for _, key := range m.MapKeys() { - loopBody(st.clone(m.MapIndex(key))) - } - } else if ch := iter(field); ch.IsValid() { - for { - e, ok := ch.Recv() - if !ok { - break - } - loopBody(st.clone(e)) - } - } else { - t.execError(st, r.linenum, ".repeated: cannot repeat %s (type %s)", - r.field, field.Type()) - } - - if first { - // Empty. Execute the .or block, once. If it's missing, do nothing. - start, end := r.or, r.end - if start >= 0 { - newst := st.clone(field) - for i := start; i < end; { - i = t.executeElement(i, newst) - } - } - return - } -} - -// A valid delimiter must contain no space and be non-empty. -func validDelim(d []byte) bool { - if len(d) == 0 { - return false - } - for _, c := range d { - if isSpace(c) { - return false - } - } - return true -} diff --git a/src/pkg/old/template/format.go b/src/pkg/old/template/format.go deleted file mode 100644 index 9156b08081..0000000000 --- a/src/pkg/old/template/format.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Template library: default formatters - -package template - -import ( - "bytes" - "fmt" - "io" -) - -// StringFormatter formats into the default string representation. -// It is stored under the name "str" and is the default formatter. -// You can override the default formatter by storing your default -// under the name "" in your custom formatter map. -func StringFormatter(w io.Writer, format string, value ...interface{}) { - if len(value) == 1 { - if b, ok := value[0].([]byte); ok { - w.Write(b) - return - } - } - fmt.Fprint(w, value...) -} - -var ( - esc_quot = []byte(""") // shorter than """ - esc_apos = []byte("'") // shorter than "'" - esc_amp = []byte("&") - esc_lt = []byte("<") - esc_gt = []byte(">") -) - -// HTMLEscape writes to w the properly escaped HTML equivalent -// of the plain text data s. -func HTMLEscape(w io.Writer, s []byte) { - var esc []byte - last := 0 - for i, c := range s { - switch c { - case '"': - esc = esc_quot - case '\'': - esc = esc_apos - case '&': - esc = esc_amp - case '<': - esc = esc_lt - case '>': - esc = esc_gt - default: - continue - } - w.Write(s[last:i]) - w.Write(esc) - last = i + 1 - } - w.Write(s[last:]) -} - -// HTMLFormatter formats arbitrary values for HTML -func HTMLFormatter(w io.Writer, format string, value ...interface{}) { - ok := false - var b []byte - if len(value) == 1 { - b, ok = value[0].([]byte) - } - if !ok { - var buf bytes.Buffer - fmt.Fprint(&buf, value...) - b = buf.Bytes() - } - HTMLEscape(w, b) -} diff --git a/src/pkg/old/template/parse.go b/src/pkg/old/template/parse.go deleted file mode 100644 index e1bfa47249..0000000000 --- a/src/pkg/old/template/parse.go +++ /dev/null @@ -1,742 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code to parse a template. - -package template - -import ( - "fmt" - "io" - "io/ioutil" - "reflect" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -// Errors returned during parsing and execution. Users may extract the information and reformat -// if they desire. -type Error struct { - Line int - Msg string -} - -func (e *Error) Error() string { return fmt.Sprintf("line %d: %s", e.Line, e.Msg) } - -// checkError is a deferred function to turn a panic with type *Error into a plain error return. -// Other panics are unexpected and so are re-enabled. -func checkError(error *error) { - if v := recover(); v != nil { - if e, ok := v.(*Error); ok { - *error = e - } else { - // runtime errors should crash - panic(v) - } - } -} - -// Most of the literals are aces. -var lbrace = []byte{'{'} -var rbrace = []byte{'}'} -var space = []byte{' '} -var tab = []byte{'\t'} - -// The various types of "tokens", which are plain text or (usually) brace-delimited descriptors -const ( - tokAlternates = iota - tokComment - tokEnd - tokLiteral - tokOr - tokRepeated - tokSection - tokText - tokVariable -) - -// FormatterMap is the type describing the mapping from formatter -// names to the functions that implement them. -type FormatterMap map[string]func(io.Writer, string, ...interface{}) - -// Built-in formatters. -var builtins = FormatterMap{ - "html": HTMLFormatter, - "str": StringFormatter, - "": StringFormatter, -} - -// The parsed state of a template is a vector of xxxElement structs. -// Sections have line numbers so errors can be reported better during execution. - -// Plain text. -type textElement struct { - text []byte -} - -// A literal such as .meta-left or .meta-right -type literalElement struct { - text []byte -} - -// A variable invocation to be evaluated -type variableElement struct { - linenum int - args []interface{} // The fields and literals in the invocation. - fmts []string // Names of formatters to apply. len(fmts) > 0 -} - -// A variableElement arg to be evaluated as a field name -type fieldName string - -// A .section block, possibly with a .or -type sectionElement struct { - linenum int // of .section itself - field string // cursor field for this block - start int // first element - or int // first element of .or block - end int // one beyond last element -} - -// A .repeated block, possibly with a .or and a .alternates -type repeatedElement struct { - sectionElement // It has the same structure... - altstart int // ... except for alternates - altend int -} - -// Template is the type that represents a template definition. -// It is unchanged after parsing. -type Template struct { - fmap FormatterMap // formatters for variables - // Used during parsing: - ldelim, rdelim []byte // delimiters; default {} - buf []byte // input text to process - p int // position in buf - linenum int // position in input - // Parsed results: - elems []interface{} -} - -// New creates a new template with the specified formatter map (which -// may be nil) to define auxiliary functions for formatting variables. -func New(fmap FormatterMap) *Template { - t := new(Template) - t.fmap = fmap - t.ldelim = lbrace - t.rdelim = rbrace - t.elems = make([]interface{}, 0, 16) - return t -} - -// Report error and stop executing. The line number must be provided explicitly. -func (t *Template) execError(st *state, line int, err string, args ...interface{}) { - panic(&Error{line, fmt.Sprintf(err, args...)}) -} - -// Report error, panic to terminate parsing. -// The line number comes from the template state. -func (t *Template) parseError(err string, args ...interface{}) { - panic(&Error{t.linenum, fmt.Sprintf(err, args...)}) -} - -// Is this an exported - upper case - name? -func isExported(name string) bool { - r, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(r) -} - -// -- Lexical analysis - -// Is c a space character? -func isSpace(c uint8) bool { return c == ' ' || c == '\t' || c == '\r' || c == '\n' } - -// Safely, does s[n:n+len(t)] == t? -func equal(s []byte, n int, t []byte) bool { - b := s[n:] - if len(t) > len(b) { // not enough space left for a match. - return false - } - for i, c := range t { - if c != b[i] { - return false - } - } - return true -} - -// isQuote returns true if c is a string- or character-delimiting quote character. -func isQuote(c byte) bool { - return c == '"' || c == '`' || c == '\'' -} - -// endQuote returns the end quote index for the quoted string that -// starts at n, or -1 if no matching end quote is found before the end -// of the line. -func endQuote(s []byte, n int) int { - quote := s[n] - for n++; n < len(s); n++ { - switch s[n] { - case '\\': - if quote == '"' || quote == '\'' { - n++ - } - case '\n': - return -1 - case quote: - return n - } - } - return -1 -} - -// nextItem returns the next item from the input buffer. If the returned -// item is empty, we are at EOF. The item will be either a -// delimited string or a non-empty string between delimited -// strings. Tokens stop at (but include, if plain text) a newline. -// Action tokens on a line by themselves drop any space on -// either side, up to and including the newline. -func (t *Template) nextItem() []byte { - startOfLine := t.p == 0 || t.buf[t.p-1] == '\n' - start := t.p - var i int - newline := func() { - t.linenum++ - i++ - } - // Leading space up to but not including newline - for i = start; i < len(t.buf); i++ { - if t.buf[i] == '\n' || !isSpace(t.buf[i]) { - break - } - } - leadingSpace := i > start - // What's left is nothing, newline, delimited string, or plain text - switch { - case i == len(t.buf): - // EOF; nothing to do - case t.buf[i] == '\n': - newline() - case equal(t.buf, i, t.ldelim): - left := i // Start of left delimiter. - right := -1 // Will be (immediately after) right delimiter. - haveText := false // Delimiters contain text. - i += len(t.ldelim) - // Find the end of the action. - for ; i < len(t.buf); i++ { - if t.buf[i] == '\n' { - break - } - if isQuote(t.buf[i]) { - i = endQuote(t.buf, i) - if i == -1 { - t.parseError("unmatched quote") - return nil - } - continue - } - if equal(t.buf, i, t.rdelim) { - i += len(t.rdelim) - right = i - break - } - haveText = true - } - if right < 0 { - t.parseError("unmatched opening delimiter") - return nil - } - // Is this a special action (starts with '.' or '#') and the only thing on the line? - if startOfLine && haveText { - firstChar := t.buf[left+len(t.ldelim)] - if firstChar == '.' || firstChar == '#' { - // It's special and the first thing on the line. Is it the last? - for j := right; j < len(t.buf) && isSpace(t.buf[j]); j++ { - if t.buf[j] == '\n' { - // Yes it is. Drop the surrounding space and return the {.foo} - t.linenum++ - t.p = j + 1 - return t.buf[left:right] - } - } - } - } - // No it's not. If there's leading space, return that. - if leadingSpace { - // not trimming space: return leading space if there is some. - t.p = left - return t.buf[start:left] - } - // Return the word, leave the trailing space. - start = left - break - default: - for ; i < len(t.buf); i++ { - if t.buf[i] == '\n' { - newline() - break - } - if equal(t.buf, i, t.ldelim) { - break - } - } - } - item := t.buf[start:i] - t.p = i - return item -} - -// Turn a byte array into a space-split array of strings, -// taking into account quoted strings. -func words(buf []byte) []string { - s := make([]string, 0, 5) - for i := 0; i < len(buf); { - // One word per loop - for i < len(buf) && isSpace(buf[i]) { - i++ - } - if i == len(buf) { - break - } - // Got a word - start := i - if isQuote(buf[i]) { - i = endQuote(buf, i) - if i < 0 { - i = len(buf) - } else { - i++ - } - } - // Even with quotes, break on space only. This handles input - // such as {""|} and catches quoting mistakes. - for i < len(buf) && !isSpace(buf[i]) { - i++ - } - s = append(s, string(buf[start:i])) - } - return s -} - -// Analyze an item and return its token type and, if it's an action item, an array of -// its constituent words. -func (t *Template) analyze(item []byte) (tok int, w []string) { - // item is known to be non-empty - if !equal(item, 0, t.ldelim) { // doesn't start with left delimiter - tok = tokText - return - } - if !equal(item, len(item)-len(t.rdelim), t.rdelim) { // doesn't end with right delimiter - t.parseError("internal error: unmatched opening delimiter") // lexing should prevent this - return - } - if len(item) <= len(t.ldelim)+len(t.rdelim) { // no contents - t.parseError("empty directive") - return - } - // Comment - if item[len(t.ldelim)] == '#' { - tok = tokComment - return - } - // Split into words - w = words(item[len(t.ldelim) : len(item)-len(t.rdelim)]) // drop final delimiter - if len(w) == 0 { - t.parseError("empty directive") - return - } - first := w[0] - if first[0] != '.' { - tok = tokVariable - return - } - if len(first) > 1 && first[1] >= '0' && first[1] <= '9' { - // Must be a float. - tok = tokVariable - return - } - switch first { - case ".meta-left", ".meta-right", ".space", ".tab": - tok = tokLiteral - return - case ".or": - tok = tokOr - return - case ".end": - tok = tokEnd - return - case ".section": - if len(w) != 2 { - t.parseError("incorrect fields for .section: %s", item) - return - } - tok = tokSection - return - case ".repeated": - if len(w) != 3 || w[1] != "section" { - t.parseError("incorrect fields for .repeated: %s", item) - return - } - tok = tokRepeated - return - case ".alternates": - if len(w) != 2 || w[1] != "with" { - t.parseError("incorrect fields for .alternates: %s", item) - return - } - tok = tokAlternates - return - } - t.parseError("bad directive: %s", item) - return -} - -// formatter returns the Formatter with the given name in the Template, or nil if none exists. -func (t *Template) formatter(name string) func(io.Writer, string, ...interface{}) { - if t.fmap != nil { - if fn := t.fmap[name]; fn != nil { - return fn - } - } - return builtins[name] -} - -// -- Parsing - -// newVariable allocates a new variable-evaluation element. -func (t *Template) newVariable(words []string) *variableElement { - formatters := extractFormatters(words) - args := make([]interface{}, len(words)) - - // Build argument list, processing any literals - for i, word := range words { - var lerr error - switch word[0] { - case '"', '`', '\'': - v, err := strconv.Unquote(word) - if err == nil && word[0] == '\'' { - args[i], _ = utf8.DecodeRuneInString(v) - } else { - args[i], lerr = v, err - } - - case '.', '+', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - v, err := strconv.ParseInt(word, 0, 64) - if err == nil { - args[i] = v - } else { - v, err := strconv.ParseFloat(word, 64) - args[i], lerr = v, err - } - - default: - args[i] = fieldName(word) - } - if lerr != nil { - t.parseError("invalid literal: %q: %s", word, lerr) - } - } - - // We could remember the function address here and avoid the lookup later, - // but it's more dynamic to let the user change the map contents underfoot. - // We do require the name to be present, though. - - // Is it in user-supplied map? - for _, f := range formatters { - if t.formatter(f) == nil { - t.parseError("unknown formatter: %q", f) - } - } - - return &variableElement{t.linenum, args, formatters} -} - -// extractFormatters extracts a list of formatters from words. -// After the final space-separated argument in a variable, formatters may be -// specified separated by pipe symbols. For example: {a b c|d|e} -// The words parameter still has the formatters joined by '|' in the last word. -// extractFormatters splits formatters, replaces the last word with the content -// found before the first '|' within it, and returns the formatters obtained. -// If no formatters are found in words, the default formatter is returned. -func extractFormatters(words []string) (formatters []string) { - // "" is the default formatter. - formatters = []string{""} - if len(words) == 0 { - return - } - var bar int - lastWord := words[len(words)-1] - if isQuote(lastWord[0]) { - end := endQuote([]byte(lastWord), 0) - if end < 0 || end+1 == len(lastWord) || lastWord[end+1] != '|' { - return - } - bar = end + 1 - } else { - bar = strings.IndexRune(lastWord, '|') - if bar < 0 { - return - } - } - words[len(words)-1] = lastWord[0:bar] - formatters = strings.Split(lastWord[bar+1:], "|") - return -} - -// Grab the next item. If it's simple, just append it to the template. -// Otherwise return its details. -func (t *Template) parseSimple(item []byte) (done bool, tok int, w []string) { - tok, w = t.analyze(item) - done = true // assume for simplicity - switch tok { - case tokComment: - return - case tokText: - t.elems = append(t.elems, &textElement{item}) - return - case tokLiteral: - switch w[0] { - case ".meta-left": - t.elems = append(t.elems, &literalElement{t.ldelim}) - case ".meta-right": - t.elems = append(t.elems, &literalElement{t.rdelim}) - case ".space": - t.elems = append(t.elems, &literalElement{space}) - case ".tab": - t.elems = append(t.elems, &literalElement{tab}) - default: - t.parseError("internal error: unknown literal: %s", w[0]) - } - return - case tokVariable: - t.elems = append(t.elems, t.newVariable(w)) - return - } - return false, tok, w -} - -// parseRepeated and parseSection are mutually recursive - -func (t *Template) parseRepeated(words []string) *repeatedElement { - r := new(repeatedElement) - t.elems = append(t.elems, r) - r.linenum = t.linenum - r.field = words[2] - // Scan section, collecting true and false (.or) blocks. - r.start = len(t.elems) - r.or = -1 - r.altstart = -1 - r.altend = -1 -Loop: - for { - item := t.nextItem() - if len(item) == 0 { - t.parseError("missing .end for .repeated section") - break - } - done, tok, w := t.parseSimple(item) - if done { - continue - } - switch tok { - case tokEnd: - break Loop - case tokOr: - if r.or >= 0 { - t.parseError("extra .or in .repeated section") - break Loop - } - r.altend = len(t.elems) - r.or = len(t.elems) - case tokSection: - t.parseSection(w) - case tokRepeated: - t.parseRepeated(w) - case tokAlternates: - if r.altstart >= 0 { - t.parseError("extra .alternates in .repeated section") - break Loop - } - if r.or >= 0 { - t.parseError(".alternates inside .or block in .repeated section") - break Loop - } - r.altstart = len(t.elems) - default: - t.parseError("internal error: unknown repeated section item: %s", item) - break Loop - } - } - if r.altend < 0 { - r.altend = len(t.elems) - } - r.end = len(t.elems) - return r -} - -func (t *Template) parseSection(words []string) *sectionElement { - s := new(sectionElement) - t.elems = append(t.elems, s) - s.linenum = t.linenum - s.field = words[1] - // Scan section, collecting true and false (.or) blocks. - s.start = len(t.elems) - s.or = -1 -Loop: - for { - item := t.nextItem() - if len(item) == 0 { - t.parseError("missing .end for .section") - break - } - done, tok, w := t.parseSimple(item) - if done { - continue - } - switch tok { - case tokEnd: - break Loop - case tokOr: - if s.or >= 0 { - t.parseError("extra .or in .section") - break Loop - } - s.or = len(t.elems) - case tokSection: - t.parseSection(w) - case tokRepeated: - t.parseRepeated(w) - case tokAlternates: - t.parseError(".alternates not in .repeated") - default: - t.parseError("internal error: unknown section item: %s", item) - } - } - s.end = len(t.elems) - return s -} - -func (t *Template) parse() { - for { - item := t.nextItem() - if len(item) == 0 { - break - } - done, tok, w := t.parseSimple(item) - if done { - continue - } - switch tok { - case tokOr, tokEnd, tokAlternates: - t.parseError("unexpected %s", w[0]) - case tokSection: - t.parseSection(w) - case tokRepeated: - t.parseRepeated(w) - default: - t.parseError("internal error: bad directive in parse: %s", item) - } - } -} - -// -- Execution - -// -- Public interface - -// Parse initializes a Template by parsing its definition. The string -// s contains the template text. If any errors occur, Parse returns -// the error. -func (t *Template) Parse(s string) (err error) { - if t.elems == nil { - return &Error{1, "template not allocated with New"} - } - if !validDelim(t.ldelim) || !validDelim(t.rdelim) { - return &Error{1, fmt.Sprintf("bad delimiter strings %q %q", t.ldelim, t.rdelim)} - } - defer checkError(&err) - t.buf = []byte(s) - t.p = 0 - t.linenum = 1 - t.parse() - return nil -} - -// ParseFile is like Parse but reads the template definition from the -// named file. -func (t *Template) ParseFile(filename string) (err error) { - b, err := ioutil.ReadFile(filename) - if err != nil { - return err - } - return t.Parse(string(b)) -} - -// Execute applies a parsed template to the specified data object, -// generating output to wr. -func (t *Template) Execute(wr io.Writer, data interface{}) (err error) { - // Extract the driver data. - val := reflect.ValueOf(data) - defer checkError(&err) - t.p = 0 - t.execute(0, len(t.elems), &state{parent: nil, data: val, wr: wr}) - return nil -} - -// SetDelims sets the left and right delimiters for operations in the -// template. They are validated during parsing. They could be -// validated here but it's better to keep the routine simple. The -// delimiters are very rarely invalid and Parse has the necessary -// error-handling interface already. -func (t *Template) SetDelims(left, right string) { - t.ldelim = []byte(left) - t.rdelim = []byte(right) -} - -// Parse creates a Template with default parameters (such as {} for -// metacharacters). The string s contains the template text while -// the formatter map fmap, which may be nil, defines auxiliary functions -// for formatting variables. The template is returned. If any errors -// occur, err will be non-nil. -func Parse(s string, fmap FormatterMap) (t *Template, err error) { - t = New(fmap) - err = t.Parse(s) - if err != nil { - t = nil - } - return -} - -// ParseFile is a wrapper function that creates a Template with default -// parameters (such as {} for metacharacters). The filename identifies -// a file containing the template text, while the formatter map fmap, which -// may be nil, defines auxiliary functions for formatting variables. -// The template is returned. If any errors occur, err will be non-nil. -func ParseFile(filename string, fmap FormatterMap) (t *Template, err error) { - b, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return Parse(string(b), fmap) -} - -// MustParse is like Parse but panics if the template cannot be parsed. -func MustParse(s string, fmap FormatterMap) *Template { - t, err := Parse(s, fmap) - if err != nil { - panic("template.MustParse error: " + err.Error()) - } - return t -} - -// MustParseFile is like ParseFile but panics if the file cannot be read -// or the template cannot be parsed. -func MustParseFile(filename string, fmap FormatterMap) *Template { - b, err := ioutil.ReadFile(filename) - if err != nil { - panic("template.MustParseFile error: " + err.Error()) - } - return MustParse(string(b), fmap) -} diff --git a/src/pkg/old/template/template_test.go b/src/pkg/old/template/template_test.go deleted file mode 100644 index 854a548e5a..0000000000 --- a/src/pkg/old/template/template_test.go +++ /dev/null @@ -1,810 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package template - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "strings" - "testing" -) - -type Test struct { - in, out, err string -} - -type T struct { - Item string - Value string -} - -type U struct { - Mp map[string]int -} - -type S struct { - Header string - HeaderPtr *string - Integer int - IntegerPtr *int - NilPtr *int - InnerT T - InnerPointerT *T - Data []T - Pdata []*T - Empty []*T - Emptystring string - Null []*T - Vec []interface{} - True bool - False bool - Mp map[string]string - JSON interface{} - Innermap U - Stringmap map[string]string - Ptrmap map[string]*string - Iface interface{} - Ifaceptr interface{} -} - -func (s *S) PointerMethod() string { return "ptrmethod!" } - -func (s S) ValueMethod() string { return "valmethod!" } - -var t1 = T{"ItemNumber1", "ValueNumber1"} -var t2 = T{"ItemNumber2", "ValueNumber2"} - -func uppercase(v interface{}) string { - s := v.(string) - t := "" - for i := 0; i < len(s); i++ { - c := s[i] - if 'a' <= c && c <= 'z' { - c = c + 'A' - 'a' - } - t += string(c) - } - return t -} - -func plus1(v interface{}) string { - i := v.(int) - return fmt.Sprint(i + 1) -} - -func writer(f func(interface{}) string) func(io.Writer, string, ...interface{}) { - return func(w io.Writer, format string, v ...interface{}) { - if len(v) != 1 { - panic("test writer expected one arg") - } - io.WriteString(w, f(v[0])) - } -} - -func multiword(w io.Writer, format string, value ...interface{}) { - for _, v := range value { - fmt.Fprintf(w, "<%v>", v) - } -} - -func printf(w io.Writer, format string, v ...interface{}) { - io.WriteString(w, fmt.Sprintf(v[0].(string), v[1:]...)) -} - -var formatters = FormatterMap{ - "uppercase": writer(uppercase), - "+1": writer(plus1), - "multiword": multiword, - "printf": printf, -} - -var tests = []*Test{ - // Simple - {"", "", ""}, - {"abc", "abc", ""}, - {"abc\ndef\n", "abc\ndef\n", ""}, - {" {.meta-left} \n", "{", ""}, - {" {.meta-right} \n", "}", ""}, - {" {.space} \n", " ", ""}, - {" {.tab} \n", "\t", ""}, - {" {#comment} \n", "", ""}, - {"\tSome Text\t\n", "\tSome Text\t\n", ""}, - {" {.meta-right} {.meta-right} {.meta-right} \n", " } } } \n", ""}, - - // Variables at top level - { - in: "{Header}={Integer}\n", - - out: "Header=77\n", - }, - - { - in: "Pointers: {*HeaderPtr}={*IntegerPtr}\n", - - out: "Pointers: Header=77\n", - }, - - { - in: "Stars but not pointers: {*Header}={*Integer}\n", - - out: "Stars but not pointers: Header=77\n", - }, - - { - in: "nil pointer: {*NilPtr}={*Integer}\n", - - out: "nil pointer: <nil>=77\n", - }, - - { - in: `{"Strings" ":"} {""} {"|"} {"\t\u0123 \x23\\"} {"\"}{\\"}`, - - out: "Strings: | \t\u0123 \x23\\ \"}{\\", - }, - - { - in: "{`Raw strings` `:`} {``} {`|`} {`\\t\\u0123 \\x23\\`} {`}{\\`}", - - out: "Raw strings: | \\t\\u0123 \\x23\\ }{\\", - }, - - { - in: "Characters: {'a'} {'\\u0123'} {' '} {'{'} {'|'} {'}'}", - - out: "Characters: 97 291 32 123 124 125", - }, - - { - in: "Integers: {1} {-2} {+42} {0777} {0x0a}", - - out: "Integers: 1 -2 42 511 10", - }, - - { - in: "Floats: {.5} {-.5} {1.1} {-2.2} {+42.1} {1e10} {1.2e-3} {1.2e3} {-1.2e3}", - - out: "Floats: 0.5 -0.5 1.1 -2.2 42.1 1e+10 0.0012 1200 -1200", - }, - - // Method at top level - { - in: "ptrmethod={PointerMethod}\n", - - out: "ptrmethod=ptrmethod!\n", - }, - - { - in: "valmethod={ValueMethod}\n", - - out: "valmethod=valmethod!\n", - }, - - // Section - { - in: "{.section Data }\n" + - "some text for the section\n" + - "{.end}\n", - - out: "some text for the section\n", - }, - { - in: "{.section Data }\n" + - "{Header}={Integer}\n" + - "{.end}\n", - - out: "Header=77\n", - }, - { - in: "{.section Pdata }\n" + - "{Header}={Integer}\n" + - "{.end}\n", - - out: "Header=77\n", - }, - { - in: "{.section Pdata }\n" + - "data present\n" + - "{.or}\n" + - "data not present\n" + - "{.end}\n", - - out: "data present\n", - }, - { - in: "{.section Empty }\n" + - "data present\n" + - "{.or}\n" + - "data not present\n" + - "{.end}\n", - - out: "data not present\n", - }, - { - in: "{.section Null }\n" + - "data present\n" + - "{.or}\n" + - "data not present\n" + - "{.end}\n", - - out: "data not present\n", - }, - { - in: "{.section Pdata }\n" + - "{Header}={Integer}\n" + - "{.section @ }\n" + - "{Header}={Integer}\n" + - "{.end}\n" + - "{.end}\n", - - out: "Header=77\n" + - "Header=77\n", - }, - - { - in: "{.section Data}{.end} {Header}\n", - - out: " Header\n", - }, - - { - in: "{.section Integer}{@}{.end}", - - out: "77", - }, - - // Repeated - { - in: "{.section Pdata }\n" + - "{.repeated section @ }\n" + - "{Item}={Value}\n" + - "{.end}\n" + - "{.end}\n", - - out: "ItemNumber1=ValueNumber1\n" + - "ItemNumber2=ValueNumber2\n", - }, - { - in: "{.section Pdata }\n" + - "{.repeated section @ }\n" + - "{Item}={Value}\n" + - "{.or}\n" + - "this should not appear\n" + - "{.end}\n" + - "{.end}\n", - - out: "ItemNumber1=ValueNumber1\n" + - "ItemNumber2=ValueNumber2\n", - }, - { - in: "{.section @ }\n" + - "{.repeated section Empty }\n" + - "{Item}={Value}\n" + - "{.or}\n" + - "this should appear: empty field\n" + - "{.end}\n" + - "{.end}\n", - - out: "this should appear: empty field\n", - }, - { - in: "{.repeated section Pdata }\n" + - "{Item}\n" + - "{.alternates with}\n" + - "is\nover\nmultiple\nlines\n" + - "{.end}\n", - - out: "ItemNumber1\n" + - "is\nover\nmultiple\nlines\n" + - "ItemNumber2\n", - }, - { - in: "{.repeated section Pdata }\n" + - "{Item}\n" + - "{.alternates with}\n" + - "is\nover\nmultiple\nlines\n" + - " {.end}\n", - - out: "ItemNumber1\n" + - "is\nover\nmultiple\nlines\n" + - "ItemNumber2\n", - }, - { - in: "{.section Pdata }\n" + - "{.repeated section @ }\n" + - "{Item}={Value}\n" + - "{.alternates with}DIVIDER\n" + - "{.or}\n" + - "this should not appear\n" + - "{.end}\n" + - "{.end}\n", - - out: "ItemNumber1=ValueNumber1\n" + - "DIVIDER\n" + - "ItemNumber2=ValueNumber2\n", - }, - { - in: "{.repeated section Vec }\n" + - "{@}\n" + - "{.end}\n", - - out: "elt1\n" + - "elt2\n", - }, - // Same but with a space before {.end}: was a bug. - { - in: "{.repeated section Vec }\n" + - "{@} {.end}\n", - - out: "elt1 elt2 \n", - }, - { - in: "{.repeated section Integer}{.end}", - - err: "line 1: .repeated: cannot repeat Integer (type int)", - }, - - // Nested names - { - in: "{.section @ }\n" + - "{InnerT.Item}={InnerT.Value}\n" + - "{.end}", - - out: "ItemNumber1=ValueNumber1\n", - }, - { - in: "{.section @ }\n" + - "{InnerT.Item}={.section InnerT}{.section Value}{@}{.end}{.end}\n" + - "{.end}", - - out: "ItemNumber1=ValueNumber1\n", - }, - - { - in: "{.section Emptystring}emptystring{.end}\n" + - "{.section Header}header{.end}\n", - - out: "\nheader\n", - }, - - { - in: "{.section True}1{.or}2{.end}\n" + - "{.section False}3{.or}4{.end}\n", - - out: "1\n4\n", - }, - - // Maps - - { - in: "{Mp.mapkey}\n", - - out: "Ahoy!\n", - }, - { - in: "{Innermap.Mp.innerkey}\n", - - out: "55\n", - }, - { - in: "{.section Innermap}{.section Mp}{innerkey}{.end}{.end}\n", - - out: "55\n", - }, - { - in: "{.section JSON}{.repeated section maps}{a}{b}{.end}{.end}\n", - - out: "1234\n", - }, - { - in: "{Stringmap.stringkey1}\n", - - out: "stringresult\n", - }, - { - in: "{.repeated section Stringmap}\n" + - "{@}\n" + - "{.end}", - - out: "stringresult\n" + - "stringresult\n", - }, - { - in: "{.repeated section Stringmap}\n" + - "\t{@}\n" + - "{.end}", - - out: "\tstringresult\n" + - "\tstringresult\n", - }, - { - in: "{*Ptrmap.stringkey1}\n", - - out: "pointedToString\n", - }, - { - in: "{.repeated section Ptrmap}\n" + - "{*@}\n" + - "{.end}", - - out: "pointedToString\n" + - "pointedToString\n", - }, - - // Interface values - - { - in: "{Iface}", - - out: "[1 2 3]", - }, - { - in: "{.repeated section Iface}{@}{.alternates with} {.end}", - - out: "1 2 3", - }, - { - in: "{.section Iface}{@}{.end}", - - out: "[1 2 3]", - }, - { - in: "{.section Ifaceptr}{Item} {Value}{.end}", - - out: "Item Value", - }, -} - -func TestAll(t *testing.T) { - // Parse - testAll(t, func(test *Test) (*Template, error) { return Parse(test.in, formatters) }) - // ParseFile - f, err := ioutil.TempFile("", "template-test") - if err != nil { - t.Fatal(err) - } - defer func() { - name := f.Name() - f.Close() - os.Remove(name) - }() - testAll(t, func(test *Test) (*Template, error) { - err := ioutil.WriteFile(f.Name(), []byte(test.in), 0600) - if err != nil { - t.Error("unexpected write error:", err) - return nil, err - } - return ParseFile(f.Name(), formatters) - }) - // tmpl.ParseFile - testAll(t, func(test *Test) (*Template, error) { - err := ioutil.WriteFile(f.Name(), []byte(test.in), 0600) - if err != nil { - t.Error("unexpected write error:", err) - return nil, err - } - tmpl := New(formatters) - return tmpl, tmpl.ParseFile(f.Name()) - }) -} - -func testAll(t *testing.T, parseFunc func(*Test) (*Template, error)) { - s := new(S) - // initialized by hand for clarity. - s.Header = "Header" - s.HeaderPtr = &s.Header - s.Integer = 77 - s.IntegerPtr = &s.Integer - s.InnerT = t1 - s.Data = []T{t1, t2} - s.Pdata = []*T{&t1, &t2} - s.Empty = []*T{} - s.Null = nil - s.Vec = []interface{}{"elt1", "elt2"} - s.True = true - s.False = false - s.Mp = make(map[string]string) - s.Mp["mapkey"] = "Ahoy!" - json.Unmarshal([]byte(`{"maps":[{"a":1,"b":2},{"a":3,"b":4}]}`), &s.JSON) - s.Innermap.Mp = make(map[string]int) - s.Innermap.Mp["innerkey"] = 55 - s.Stringmap = make(map[string]string) - s.Stringmap["stringkey1"] = "stringresult" // the same value so repeated section is order-independent - s.Stringmap["stringkey2"] = "stringresult" - s.Ptrmap = make(map[string]*string) - x := "pointedToString" - s.Ptrmap["stringkey1"] = &x // the same value so repeated section is order-independent - s.Ptrmap["stringkey2"] = &x - s.Iface = []int{1, 2, 3} - s.Ifaceptr = &T{"Item", "Value"} - - var buf bytes.Buffer - for _, test := range tests { - buf.Reset() - tmpl, err := parseFunc(test) - if err != nil { - t.Error("unexpected parse error: ", err) - continue - } - err = tmpl.Execute(&buf, s) - if test.err == "" { - if err != nil { - t.Error("unexpected execute error:", err) - } - } else { - if err == nil { - t.Errorf("expected execute error %q, got nil", test.err) - } else if err.Error() != test.err { - t.Errorf("expected execute error %q, got %q", test.err, err.Error()) - } - } - if buf.String() != test.out { - t.Errorf("for %q: expected %q got %q", test.in, test.out, buf.String()) - } - } -} - -func TestMapDriverType(t *testing.T) { - mp := map[string]string{"footer": "Ahoy!"} - tmpl, err := Parse("template: {footer}", nil) - if err != nil { - t.Error("unexpected parse error:", err) - } - var b bytes.Buffer - err = tmpl.Execute(&b, mp) - if err != nil { - t.Error("unexpected execute error:", err) - } - s := b.String() - expect := "template: Ahoy!" - if s != expect { - t.Errorf("failed passing string as data: expected %q got %q", expect, s) - } -} - -func TestMapNoEntry(t *testing.T) { - mp := make(map[string]int) - tmpl, err := Parse("template: {notthere}!", nil) - if err != nil { - t.Error("unexpected parse error:", err) - } - var b bytes.Buffer - err = tmpl.Execute(&b, mp) - if err != nil { - t.Error("unexpected execute error:", err) - } - s := b.String() - expect := "template: 0!" - if s != expect { - t.Errorf("failed passing string as data: expected %q got %q", expect, s) - } -} - -func TestStringDriverType(t *testing.T) { - tmpl, err := Parse("template: {@}", nil) - if err != nil { - t.Error("unexpected parse error:", err) - } - var b bytes.Buffer - err = tmpl.Execute(&b, "hello") - if err != nil { - t.Error("unexpected execute error:", err) - } - s := b.String() - expect := "template: hello" - if s != expect { - t.Errorf("failed passing string as data: expected %q got %q", expect, s) - } -} - -func TestTwice(t *testing.T) { - tmpl, err := Parse("template: {@}", nil) - if err != nil { - t.Error("unexpected parse error:", err) - } - var b bytes.Buffer - err = tmpl.Execute(&b, "hello") - if err != nil { - t.Error("unexpected parse error:", err) - } - s := b.String() - expect := "template: hello" - if s != expect { - t.Errorf("failed passing string as data: expected %q got %q", expect, s) - } - err = tmpl.Execute(&b, "hello") - if err != nil { - t.Error("unexpected parse error:", err) - } - s = b.String() - expect += expect - if s != expect { - t.Errorf("failed passing string as data: expected %q got %q", expect, s) - } -} - -func TestCustomDelims(t *testing.T) { - // try various lengths. zero should catch error. - for i := 0; i < 7; i++ { - for j := 0; j < 7; j++ { - tmpl := New(nil) - // first two chars deliberately the same to test equal left and right delims - ldelim := "$!#$%^&"[0:i] - rdelim := "$*&^%$!"[0:j] - tmpl.SetDelims(ldelim, rdelim) - // if braces, this would be template: {@}{.meta-left}{.meta-right} - text := "template: " + - ldelim + "@" + rdelim + - ldelim + ".meta-left" + rdelim + - ldelim + ".meta-right" + rdelim - err := tmpl.Parse(text) - if err != nil { - if i == 0 || j == 0 { // expected - continue - } - t.Error("unexpected parse error:", err) - } else if i == 0 || j == 0 { - t.Errorf("expected parse error for empty delimiter: %d %d %q %q", i, j, ldelim, rdelim) - continue - } - var b bytes.Buffer - err = tmpl.Execute(&b, "hello") - s := b.String() - if s != "template: hello"+ldelim+rdelim { - t.Errorf("failed delim check(%q %q) %q got %q", ldelim, rdelim, text, s) - } - } - } -} - -// Test that a variable evaluates to the field itself and does not further indirection -func TestVarIndirection(t *testing.T) { - s := new(S) - // initialized by hand for clarity. - s.InnerPointerT = &t1 - - var buf bytes.Buffer - input := "{.section @}{InnerPointerT}{.end}" - tmpl, err := Parse(input, nil) - if err != nil { - t.Fatal("unexpected parse error:", err) - } - err = tmpl.Execute(&buf, s) - if err != nil { - t.Fatal("unexpected execute error:", err) - } - expect := fmt.Sprintf("%v", &t1) // output should be hex address of t1 - if buf.String() != expect { - t.Errorf("for %q: expected %q got %q", input, expect, buf.String()) - } -} - -func TestHTMLFormatterWithByte(t *testing.T) { - s := "Test string." - b := []byte(s) - var buf bytes.Buffer - HTMLFormatter(&buf, "", b) - bs := buf.String() - if bs != s { - t.Errorf("munged []byte, expected: %s got: %s", s, bs) - } -} - -type UF struct { - I int - s string -} - -func TestReferenceToUnexported(t *testing.T) { - u := &UF{3, "hello"} - var buf bytes.Buffer - input := "{.section @}{I}{s}{.end}" - tmpl, err := Parse(input, nil) - if err != nil { - t.Fatal("unexpected parse error:", err) - } - err = tmpl.Execute(&buf, u) - if err == nil { - t.Fatal("expected execute error, got none") - } - if strings.Index(err.Error(), "not exported") < 0 { - t.Fatal("expected unexported error; got", err) - } -} - -var formatterTests = []Test{ - { - in: "{Header|uppercase}={Integer|+1}\n" + - "{Header|html}={Integer|str}\n", - - out: "HEADER=78\n" + - "Header=77\n", - }, - - { - in: "{Header|uppercase}={Integer Header|multiword}\n" + - "{Header|html}={Header Integer|multiword}\n" + - "{Header|html}={Header Integer}\n", - - out: "HEADER=<77><Header>\n" + - "Header=<Header><77>\n" + - "Header=Header77\n", - }, - { - in: "{Raw}\n" + - "{Raw|html}\n", - - out: "a <&> b\n" + - "a <&> b\n", - }, - { - in: "{Bytes}", - out: "hello", - }, - { - in: "{Raw|uppercase|html|html}", - out: "A &lt;&amp;&gt; B", - }, - { - in: "{Header Integer|multiword|html}", - out: "<Header><77>", - }, - { - in: "{Integer|no_formatter|html}", - err: `unknown formatter: "no_formatter"`, - }, - { - in: "{Integer|||||}", // empty string is a valid formatter - out: "77", - }, - { - in: `{"%.02f 0x%02X" 1.1 10|printf}`, - out: "1.10 0x0A", - }, - { - in: `{""|}{""||}{""|printf}`, // Issue #1896. - out: "", - }, -} - -func TestFormatters(t *testing.T) { - data := map[string]interface{}{ - "Header": "Header", - "Integer": 77, - "Raw": "a <&> b", - "Bytes": []byte("hello"), - } - for _, c := range formatterTests { - tmpl, err := Parse(c.in, formatters) - if err != nil { - if c.err == "" { - t.Error("unexpected parse error:", err) - continue - } - if strings.Index(err.Error(), c.err) < 0 { - t.Errorf("unexpected error: expected %q, got %q", c.err, err.Error()) - continue - } - } else { - if c.err != "" { - t.Errorf("For %q, expected error, got none.", c.in) - continue - } - var buf bytes.Buffer - err = tmpl.Execute(&buf, data) - if err != nil { - t.Error("unexpected Execute error: ", err) - continue - } - actual := buf.String() - if actual != c.out { - t.Errorf("for %q: expected %q but got %q.", c.in, c.out, actual) - } - } - } -} |