diff --git a/Makefile b/Makefile index be684c1f..b4b173e7 100644 --- a/Makefile +++ b/Makefile @@ -106,7 +106,9 @@ go_vendor_dependencies: $(GOGETTER) github.com/mozilla/masche/memsearch $(GOGETTER) github.com/mozilla/masche/process $(GOGETTER) github.com/mozilla/scribe/src/scribe - $(GOGETTER) github.com/oschwald/geoip2-golang + # go 1.5 vendoring and submodules don't work well, so comment this deps out + # https://github.com/oschwald/geoip2-golang/issues/13 + #$(GOGETTER) github.com/oschwald/geoip2-golang $(GOGETTER) github.com/streadway/amqp $(GOGETTER) github.com/gorhill/cronexpr $(GOGETTER) golang.org/x/crypto/openpgp diff --git a/vendor/github.com/golang/sys/unix/mkerrors.sh b/vendor/github.com/golang/sys/unix/mkerrors.sh index 77c48048..785855f0 100755 --- a/vendor/github.com/golang/sys/unix/mkerrors.sh +++ b/vendor/github.com/golang/sys/unix/mkerrors.sh @@ -12,11 +12,16 @@ export LC_ALL=C export LC_CTYPE=C if test -z "$GOARCH" -o -z "$GOOS"; then - echo 1>&2 "GOARCH or GOOS not defined in environment" - exit 1 + echo 1>&2 "GOARCH or GOOS not defined in environment" + exit 1 fi -CC=${CC:-gcc} +CC=${CC:-cc} + +if [[ "$GOOS" -eq "solaris" ]]; then + # Assumes GNU versions of utilities in PATH. + export PATH=/usr/gnu/bin:$PATH +fi uname=$(uname) @@ -200,6 +205,7 @@ includes_OpenBSD=' ' includes_SunOS=' +#include #include #include #include @@ -303,6 +309,9 @@ ccflags="$@" $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || $2 ~ /^SIOC/ || $2 ~ /^TIOC/ || + $2 ~ /^TCGET/ || + $2 ~ /^TCSET/ || + $2 ~ /^TC(FLSH|SBRK|XONC)$/ || $2 !~ "RTF_BITS" && $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || $2 ~ /^BIOC/ || diff --git a/vendor/github.com/golang/sys/unix/mksyscall_solaris.pl b/vendor/github.com/golang/sys/unix/mksyscall_solaris.pl index f17b6125..06bade76 100755 --- a/vendor/github.com/golang/sys/unix/mksyscall_solaris.pl +++ b/vendor/github.com/golang/sys/unix/mksyscall_solaris.pl @@ -110,9 +110,9 @@ while(<>) { $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. # Runtime import of function to allow cross-platform builds. - $dynimports .= "//go:cgo_import_dynamic ${modname}_${sysname} ${sysname} \"$modname.so\"\n"; + $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; # Link symbol to proc address variable. - $linknames .= "//go:linkname ${sysvarname} ${modname}_${sysname}\n"; + $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; # Library proc address variable. push @vars, $sysvarname; diff --git a/vendor/github.com/golang/sys/unix/sockcmsg_unix.go b/vendor/github.com/golang/sys/unix/sockcmsg_unix.go index 6668bec7..70af5a72 100644 --- a/vendor/github.com/golang/sys/unix/sockcmsg_unix.go +++ b/vendor/github.com/golang/sys/unix/sockcmsg_unix.go @@ -77,10 +77,10 @@ func UnixRights(fds ...int) []byte { h.Level = SOL_SOCKET h.Type = SCM_RIGHTS h.SetLen(CmsgLen(datalen)) - data := uintptr(cmsgData(h)) + data := cmsgData(h) for _, fd := range fds { - *(*int32)(unsafe.Pointer(data)) = int32(fd) - data += 4 + *(*int32)(data) = int32(fd) + data = unsafe.Pointer(uintptr(data) + 4) } return b } diff --git a/vendor/github.com/golang/sys/unix/syscall_bsd.go b/vendor/github.com/golang/sys/unix/syscall_bsd.go index 9679dec8..e9671764 100644 --- a/vendor/github.com/golang/sys/unix/syscall_bsd.go +++ b/vendor/github.com/golang/sys/unix/syscall_bsd.go @@ -450,16 +450,34 @@ func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err e //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL -func Sysctl(name string) (value string, err error) { +// sysctlmib translates name to mib number and appends any additional args. +func sysctlmib(name string, args ...int) ([]_C_int, error) { // Translate name to mib number. mib, err := nametomib(name) + if err != nil { + return nil, err + } + + for _, a := range args { + mib = append(mib, _C_int(a)) + } + + return mib, nil +} + +func Sysctl(name string) (string, error) { + return SysctlArgs(name) +} + +func SysctlArgs(name string, args ...int) (string, error) { + mib, err := sysctlmib(name, args...) if err != nil { return "", err } // Find size. n := uintptr(0) - if err = sysctl(mib, nil, &n, nil, 0); err != nil { + if err := sysctl(mib, nil, &n, nil, 0); err != nil { return "", err } if n == 0 { @@ -468,7 +486,7 @@ func Sysctl(name string) (value string, err error) { // Read into buffer of that size. buf := make([]byte, n) - if err = sysctl(mib, &buf[0], &n, nil, 0); err != nil { + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { return "", err } @@ -479,17 +497,19 @@ func Sysctl(name string) (value string, err error) { return string(buf[0:n]), nil } -func SysctlUint32(name string) (value uint32, err error) { - // Translate name to mib number. - mib, err := nametomib(name) +func SysctlUint32(name string) (uint32, error) { + return SysctlUint32Args(name) +} + +func SysctlUint32Args(name string, args ...int) (uint32, error) { + mib, err := sysctlmib(name, args...) if err != nil { return 0, err } - // Read into buffer of that size. n := uintptr(4) buf := make([]byte, 4) - if err = sysctl(mib, &buf[0], &n, nil, 0); err != nil { + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { return 0, err } if n != 4 { @@ -498,6 +518,49 @@ func SysctlUint32(name string) (value uint32, err error) { return *(*uint32)(unsafe.Pointer(&buf[0])), nil } +func SysctlUint64(name string, args ...int) (uint64, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(8) + buf := make([]byte, 8) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 8 { + return 0, EIO + } + return *(*uint64)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlRaw(name string, args ...int) ([]byte, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return nil, err + } + + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Read into buffer of that size. + buf := make([]byte, n) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return nil, err + } + + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n], nil +} + //sys utimes(path string, timeval *[2]Timeval) (err error) func Utimes(path string, tv []Timeval) error { diff --git a/vendor/github.com/golang/sys/unix/syscall_bsd_test.go b/vendor/github.com/golang/sys/unix/syscall_bsd_test.go index 55d88430..0bcd741f 100644 --- a/vendor/github.com/golang/sys/unix/syscall_bsd_test.go +++ b/vendor/github.com/golang/sys/unix/syscall_bsd_test.go @@ -33,3 +33,10 @@ func TestGetfsstat(t *testing.T) { } } } + +func TestSysctlRaw(t *testing.T) { + _, err := unix.SysctlRaw("kern.proc.pid", unix.Getpid()) + if err != nil { + t.Fatal(err) + } +} diff --git a/vendor/github.com/golang/sys/unix/syscall_freebsd_test.go b/vendor/github.com/golang/sys/unix/syscall_freebsd_test.go new file mode 100644 index 00000000..6171a017 --- /dev/null +++ b/vendor/github.com/golang/sys/unix/syscall_freebsd_test.go @@ -0,0 +1,20 @@ +// Copyright 2014 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 freebsd + +package unix_test + +import ( + "testing" + + "golang.org/x/sys/unix" +) + +func TestSysctUint64(t *testing.T) { + _, err := unix.SysctlUint64("vm.max_kernel_address") + if err != nil { + t.Fatal(err) + } +} diff --git a/vendor/github.com/golang/sys/unix/syscall_linux.go b/vendor/github.com/golang/sys/unix/syscall_linux.go index 9df71957..d3ee5d2c 100644 --- a/vendor/github.com/golang/sys/unix/syscall_linux.go +++ b/vendor/github.com/golang/sys/unix/syscall_linux.go @@ -886,6 +886,7 @@ func Getpgrp() (pid int) { //sys Pause() (err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT //sysnb prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) = SYS_PRLIMIT64 +//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) @@ -1022,7 +1023,6 @@ func Munmap(b []byte) (err error) { // Personality // Poll // Ppoll -// Prctl // Pselect6 // Ptrace // Putpmsg diff --git a/vendor/github.com/golang/sys/unix/syscall_solaris.go b/vendor/github.com/golang/sys/unix/syscall_solaris.go index ab54718f..00837326 100644 --- a/vendor/github.com/golang/sys/unix/syscall_solaris.go +++ b/vendor/github.com/golang/sys/unix/syscall_solaris.go @@ -13,6 +13,7 @@ package unix import ( + "sync/atomic" "syscall" "unsafe" ) @@ -138,6 +139,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { return unsafe.Pointer(&sa.raw), sl, nil } +//sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname + func Getsockname(fd int) (sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny @@ -147,12 +150,23 @@ func Getsockname(fd int) (sa Sockaddr, err error) { return anyToSockaddr(&rsa) } -// The const provides a compile-time constant so clients -// can adjust to whether there is a working Getwd and avoid -// even linking this function into the binary. See ../os/getwd.go. -const ImplementsGetwd = false +const ImplementsGetwd = true -func Getwd() (string, error) { return "", ENOTSUP } +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + // Getcwd will return an error if it failed for any reason. + _, err = Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} /* * Wrapped @@ -163,21 +177,20 @@ func Getwd() (string, error) { return "", ENOTSUP } func Getgroups() (gids []int, err error) { n, err := getgroups(0, nil) - if err != nil { - return nil, err - } - if n == 0 { - return nil, nil - } - - // Sanity check group count. Max is 16 on BSD. - if n < 0 || n > 1000 { + // Check for error and sanity check group count. Newer versions of + // Solaris allow up to 1024 (NGROUPS_MAX). + if n < 0 || n > 1024 { + if err != nil { + return nil, err + } return nil, EINVAL + } else if n == 0 { + return nil, nil } a := make([]_Gid_t, n) n, err = getgroups(n, &a[0]) - if err != nil { + if n == -1 { return nil, err } gids = make([]int, n) @@ -276,19 +289,38 @@ func Gethostname() (name string, err error) { return name, err } +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) (err error) { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) + func UtimesNano(path string, ts []Timespec) error { if ts == nil { - return Utimes(path, nil) + return utimensat(AT_FDCWD, path, nil, 0) } if len(ts) != 2 { return EINVAL } - var tv [2]Timeval - for i := 0; i < 2; i++ { - tv[i].Sec = ts[i].Sec - tv[i].Usec = ts[i].Nsec / 1000 + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) } - return Utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) } //sys fcntl(fd int, cmd int, arg int) (val int, err error) @@ -302,6 +334,35 @@ func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { return nil } +//sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +// Solaris doesn't have an futimes function because it allows NULL to be +// specified as the path for futimesat. However, Go doesn't like +// NULL-style string interfaces, so this simple wrapper is provided. +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimesat(fd, nil, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_UNIX: @@ -350,7 +411,7 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny nfd, err = accept(fd, &rsa, &len) - if err != nil { + if nfd == -1 { return } sa, err = anyToSockaddr(&rsa) @@ -361,6 +422,8 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { return } +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.recvmsg + func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { var msg Msghdr var rsa RawSockaddrAny @@ -382,7 +445,7 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from } msg.Iov = &iov msg.Iovlen = 1 - if n, err = recvmsg(fd, &msg, flags); err != nil { + if n, err = recvmsg(fd, &msg, flags); n == -1 { return } oobn = int(msg.Accrightslen) @@ -437,6 +500,67 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) return n, nil } +//sys acct(path *byte) (err error) + +func Acct(path string) (err error) { + if len(path) == 0 { + // Assume caller wants to disable accounting. + return acct(nil) + } + + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + return acct(pathp) +} + +/* + * Expose the ioctl function + */ + +//sys ioctl(fd int, req int, arg uintptr) (err error) + +func IoctlSetInt(fd int, req int, value int) (err error) { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req int, value *Winsize) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req int, value *Termios) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermio(fd int, req int, value *Termio) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlGetInt(fd int, req int) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req int) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req int) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermio(fd int, req int) (*Termio, error) { + var value Termio + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + /* * Exposed directly */ @@ -447,21 +571,29 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) //sys Chown(path string, uid int, gid int) (err error) //sys Chroot(path string) (err error) //sys Close(fd int) (err error) +//sys Creat(path string, mode uint32) (fd int, err error) //sys Dup(fd int) (nfd int, err error) +//sys Dup2(oldfd int, newfd int) (err error) //sys Exit(code int) //sys Fchdir(fd int) (err error) //sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Fdatasync(fd int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) //sysnb Getgid() (gid int) //sysnb Getpid() (pid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgid int, err error) //sys Geteuid() (euid int) //sys Getegid() (egid int) //sys Getppid() (ppid int) //sys Getpriority(which int, who int) (n int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Getuid() (uid int) //sys Kill(pid int, signum syscall.Signal) (err error) @@ -471,20 +603,33 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Madvise(b []byte, advice int) (err error) //sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mkfifoat(dirfd int, path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) +//sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek //sysnb Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) +//sys Sethostname(p []byte) (err error) //sysnb Setpgid(pid int, pgid int) (err error) //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) @@ -496,12 +641,17 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Symlink(path string, link string) (err error) //sys Sync() (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) //sys Truncate(path string, length int64) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) -//sys Umask(newmask int) (oldmask int) +//sys Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = libc.umount //sys Unlink(path string) (err error) -//sys Utimes(path string, times *[2]Timeval) (err error) +//sys Unlinkat(dirfd int, path string) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys Utime(path string, buf *Utimbuf) (err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.bind //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.connect //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) @@ -512,10 +662,8 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) //sys write(fd int, p []byte) (n int, err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.getsockopt //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername -//sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom -//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.recvmsg func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) @@ -548,3 +696,18 @@ func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, e func Munmap(b []byte) (err error) { return mapper.Munmap(b) } + +//sys sysconf(name int) (n int64, err error) + +// pageSize caches the value of Getpagesize, since it can't change +// once the system is booted. +var pageSize int64 // accessed atomically + +func Getpagesize() int { + n := atomic.LoadInt64(&pageSize) + if n == 0 { + n, _ = sysconf(_SC_PAGESIZE) + atomic.StoreInt64(&pageSize, n) + } + return int(n) +} diff --git a/vendor/github.com/golang/sys/unix/syscall_solaris_amd64.go b/vendor/github.com/golang/sys/unix/syscall_solaris_amd64.go index 9c173cd5..2e44630c 100644 --- a/vendor/github.com/golang/sys/unix/syscall_solaris_amd64.go +++ b/vendor/github.com/golang/sys/unix/syscall_solaris_amd64.go @@ -6,8 +6,6 @@ package unix -func Getpagesize() int { return 4096 } - func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } func NsecToTimespec(nsec int64) (ts Timespec) { diff --git a/vendor/github.com/golang/sys/unix/types_solaris.go b/vendor/github.com/golang/sys/unix/types_solaris.go index 753c7996..6ad50eab 100644 --- a/vendor/github.com/golang/sys/unix/types_solaris.go +++ b/vendor/github.com/golang/sys/unix/types_solaris.go @@ -15,10 +15,17 @@ package unix /* #define KERNEL +// These defines ensure that builds done on newer versions of Solaris are +// backwards-compatible with older versions of Solaris and +// OpenSolaris-based derivatives. +#define __USE_SUNOS_SOCKETS__ // msghdr +#define __USE_LEGACY_PROTOTYPES__ // iovec #include #include +#include #include #include +#include #include #include #include @@ -30,7 +37,9 @@ package unix #include #include #include +#include #include +#include #include #include #include @@ -40,6 +49,8 @@ package unix #include #include #include +#include +#include enum { sizeofPtr = sizeof(void*), @@ -69,6 +80,7 @@ const ( sizeofInt = C.sizeof_int sizeofLong = C.sizeof_long sizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX ) // Basic types @@ -88,6 +100,10 @@ type Timeval C.struct_timeval type Timeval32 C.struct_timeval32 +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + // Processes type Rusage C.struct_rusage @@ -175,6 +191,20 @@ const ( type FdSet C.fd_set +// Misc + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_EACCESS = C.AT_EACCESS +) + // Routing and interface messages const ( @@ -217,6 +247,14 @@ type BpfTimeval C.struct_bpf_timeval type BpfHdr C.struct_bpf_hdr +// sysconf information + +const _SC_PAGESIZE = C._SC_PAGESIZE + // Terminal handling type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize diff --git a/vendor/github.com/golang/sys/unix/zerrors_freebsd_386.go b/vendor/github.com/golang/sys/unix/zerrors_freebsd_386.go index 3c2a5bfc..7b95751c 100644 --- a/vendor/github.com/golang/sys/unix/zerrors_freebsd_386.go +++ b/vendor/github.com/golang/sys/unix/zerrors_freebsd_386.go @@ -225,6 +225,20 @@ const ( BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 diff --git a/vendor/github.com/golang/sys/unix/zerrors_freebsd_amd64.go b/vendor/github.com/golang/sys/unix/zerrors_freebsd_amd64.go index 3b3f7a9d..e48e7799 100644 --- a/vendor/github.com/golang/sys/unix/zerrors_freebsd_amd64.go +++ b/vendor/github.com/golang/sys/unix/zerrors_freebsd_amd64.go @@ -225,6 +225,20 @@ const ( BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 diff --git a/vendor/github.com/golang/sys/unix/zerrors_solaris_amd64.go b/vendor/github.com/golang/sys/unix/zerrors_solaris_amd64.go index afdf7c56..a08922b9 100644 --- a/vendor/github.com/golang/sys/unix/zerrors_solaris_amd64.go +++ b/vendor/github.com/golang/sys/unix/zerrors_solaris_amd64.go @@ -161,6 +161,14 @@ const ( BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x800 + CLOCK_HIGHRES = 0x4 + CLOCK_LEVEL = 0xa + CLOCK_MONOTONIC = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x5 + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x3 + CLOCK_THREAD_CPUTIME_ID = 0x2 + CLOCK_VIRTUAL = 0x1 CREAD = 0x80 CS5 = 0x0 CS6 = 0x10 @@ -168,6 +176,7 @@ const ( CS8 = 0x30 CSIZE = 0x30 CSTART = 0x11 + CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a @@ -757,9 +766,7 @@ const ( SIOCDARP = -0x7fdb96e0 SIOCDELMULTI = -0x7fdf96ce SIOCDELRT = -0x7fcf8df5 - SIOCDIPSECONFIG = -0x7ffb9669 SIOCDXARP = -0x7fff9658 - SIOCFIPSECONFIG = -0x7ffb966b SIOCGARP = -0x3fdb96e1 SIOCGDSTINFO = -0x3fff965c SIOCGENADDR = -0x3fdf96ab @@ -821,7 +828,6 @@ const ( SIOCLIFGETND = -0x3f879672 SIOCLIFREMOVEIF = -0x7f879692 SIOCLIFSETND = -0x7f879671 - SIOCLIPSECONFIG = -0x7ffb9668 SIOCLOWER = -0x7fdf96d7 SIOCSARP = -0x7fdb96e2 SIOCSCTPGOPT = -0x3fef9653 @@ -844,7 +850,6 @@ const ( SIOCSIFNETMASK = -0x7fdf96e6 SIOCSIP6ADDRPOLICY = -0x7fff965d SIOCSIPMSFILTER = -0x7ffb964b - SIOCSIPSECONFIG = -0x7ffb966a SIOCSLGETREQ = -0x3fdf96b9 SIOCSLIFADDR = -0x7f879690 SIOCSLIFBRDADDR = -0x7f879684 @@ -951,6 +956,8 @@ const ( SO_VRRP = 0x1017 SO_WROFF = 0x2 TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d TCIFLUSH = 0x0 TCIOFLUSH = 0x2 TCOFLUSH = 0x1 @@ -977,6 +984,14 @@ const ( TCP_RTO_MAX = 0x1b TCP_RTO_MIN = 0x1a TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETSF = 0x5410 + TCSETSW = 0x540f + TCXONC = 0x5406 TIOC = 0x5400 TIOCCBRK = 0x747a TIOCCDTR = 0x7478 @@ -1052,6 +1067,7 @@ const ( VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 + VSTATUS = 0x10 VSTOP = 0x9 VSUSP = 0xa VSWTCH = 0x7 @@ -1215,6 +1231,7 @@ const ( SIGFREEZE = syscall.Signal(0x22) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x29) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x16) SIGIOT = syscall.Signal(0x6) @@ -1415,4 +1432,5 @@ var signals = [...]string{ 38: "resource Control Exceeded", 39: "reserved for JVM 1", 40: "reserved for JVM 2", + 41: "information Request", } diff --git a/vendor/github.com/golang/sys/unix/zsyscall_linux_386.go b/vendor/github.com/golang/sys/unix/zsyscall_linux_386.go index 81ae498a..ff6c39dc 100644 --- a/vendor/github.com/golang/sys/unix/zsyscall_linux_386.go +++ b/vendor/github.com/golang/sys/unix/zsyscall_linux_386.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/github.com/golang/sys/unix/zsyscall_linux_amd64.go b/vendor/github.com/golang/sys/unix/zsyscall_linux_amd64.go index 2adb9284..c2438522 100644 --- a/vendor/github.com/golang/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/github.com/golang/sys/unix/zsyscall_linux_amd64.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/github.com/golang/sys/unix/zsyscall_linux_arm.go b/vendor/github.com/golang/sys/unix/zsyscall_linux_arm.go index ca00ed3d..dd66c975 100644 --- a/vendor/github.com/golang/sys/unix/zsyscall_linux_arm.go +++ b/vendor/github.com/golang/sys/unix/zsyscall_linux_arm.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/github.com/golang/sys/unix/zsyscall_linux_arm64.go b/vendor/github.com/golang/sys/unix/zsyscall_linux_arm64.go index 8eafcebc..d0a6ed82 100644 --- a/vendor/github.com/golang/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/github.com/golang/sys/unix/zsyscall_linux_arm64.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/github.com/golang/sys/unix/zsyscall_linux_ppc64.go b/vendor/github.com/golang/sys/unix/zsyscall_linux_ppc64.go index 008a5263..f58a3ff2 100644 --- a/vendor/github.com/golang/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/github.com/golang/sys/unix/zsyscall_linux_ppc64.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/github.com/golang/sys/unix/zsyscall_linux_ppc64le.go b/vendor/github.com/golang/sys/unix/zsyscall_linux_ppc64le.go index d91f763a..22fc7a45 100644 --- a/vendor/github.com/golang/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/github.com/golang/sys/unix/zsyscall_linux_ppc64le.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/github.com/golang/sys/unix/zsyscall_solaris_amd64.go b/vendor/github.com/golang/sys/unix/zsyscall_solaris_amd64.go index 95cb1f65..8d2a8365 100644 --- a/vendor/github.com/golang/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/github.com/golang/sys/unix/zsyscall_solaris_amd64.go @@ -10,11 +10,19 @@ import ( "unsafe" ) +//go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" //go:cgo_import_dynamic libc_getgroups getgroups "libc.so" //go:cgo_import_dynamic libc_setgroups setgroups "libc.so" +//go:cgo_import_dynamic libc_utimes utimes "libc.so" +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" //go:cgo_import_dynamic libc_fcntl fcntl "libc.so" -//go:cgo_import_dynamic libsocket_accept accept "libsocket.so" -//go:cgo_import_dynamic libsocket_sendmsg sendmsg "libsocket.so" +//go:cgo_import_dynamic libc_futimesat futimesat "libc.so" +//go:cgo_import_dynamic libc_accept accept "libsocket.so" +//go:cgo_import_dynamic libc_recvmsg recvmsg "libsocket.so" +//go:cgo_import_dynamic libc_sendmsg sendmsg "libsocket.so" +//go:cgo_import_dynamic libc_acct acct "libc.so" +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" //go:cgo_import_dynamic libc_access access "libc.so" //go:cgo_import_dynamic libc_adjtime adjtime "libc.so" //go:cgo_import_dynamic libc_chdir chdir "libc.so" @@ -22,44 +30,65 @@ import ( //go:cgo_import_dynamic libc_chown chown "libc.so" //go:cgo_import_dynamic libc_chroot chroot "libc.so" //go:cgo_import_dynamic libc_close close "libc.so" +//go:cgo_import_dynamic libc_creat creat "libc.so" //go:cgo_import_dynamic libc_dup dup "libc.so" +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" //go:cgo_import_dynamic libc_exit exit "libc.so" //go:cgo_import_dynamic libc_fchdir fchdir "libc.so" //go:cgo_import_dynamic libc_fchmod fchmod "libc.so" +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" //go:cgo_import_dynamic libc_fchown fchown "libc.so" +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" +//go:cgo_import_dynamic libc_fdatasync fdatasync "libc.so" //go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" //go:cgo_import_dynamic libc_fstat fstat "libc.so" //go:cgo_import_dynamic libc_getdents getdents "libc.so" //go:cgo_import_dynamic libc_getgid getgid "libc.so" //go:cgo_import_dynamic libc_getpid getpid "libc.so" +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" //go:cgo_import_dynamic libc_geteuid geteuid "libc.so" //go:cgo_import_dynamic libc_getegid getegid "libc.so" //go:cgo_import_dynamic libc_getppid getppid "libc.so" //go:cgo_import_dynamic libc_getpriority getpriority "libc.so" //go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" //go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" //go:cgo_import_dynamic libc_getuid getuid "libc.so" //go:cgo_import_dynamic libc_kill kill "libc.so" //go:cgo_import_dynamic libc_lchown lchown "libc.so" //go:cgo_import_dynamic libc_link link "libc.so" -//go:cgo_import_dynamic libsocket_listen listen "libsocket.so" +//go:cgo_import_dynamic libc_listen listen "libsocket.so" //go:cgo_import_dynamic libc_lstat lstat "libc.so" //go:cgo_import_dynamic libc_madvise madvise "libc.so" //go:cgo_import_dynamic libc_mkdir mkdir "libc.so" +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" //go:cgo_import_dynamic libc_mknod mknod "libc.so" +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" +//go:cgo_import_dynamic libc_mlock mlock "libc.so" +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" +//go:cgo_import_dynamic libc_munlock munlock "libc.so" +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" //go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" //go:cgo_import_dynamic libc_open open "libc.so" +//go:cgo_import_dynamic libc_openat openat "libc.so" //go:cgo_import_dynamic libc_pathconf pathconf "libc.so" +//go:cgo_import_dynamic libc_pause pause "libc.so" //go:cgo_import_dynamic libc_pread pread "libc.so" //go:cgo_import_dynamic libc_pwrite pwrite "libc.so" //go:cgo_import_dynamic libc_read read "libc.so" //go:cgo_import_dynamic libc_readlink readlink "libc.so" //go:cgo_import_dynamic libc_rename rename "libc.so" +//go:cgo_import_dynamic libc_renameat renameat "libc.so" //go:cgo_import_dynamic libc_rmdir rmdir "libc.so" //go:cgo_import_dynamic libc_lseek lseek "libc.so" //go:cgo_import_dynamic libc_setegid setegid "libc.so" //go:cgo_import_dynamic libc_seteuid seteuid "libc.so" //go:cgo_import_dynamic libc_setgid setgid "libc.so" +//go:cgo_import_dynamic libc_sethostname sethostname "libc.so" //go:cgo_import_dynamic libc_setpgid setpgid "libc.so" //go:cgo_import_dynamic libc_setpriority setpriority "libc.so" //go:cgo_import_dynamic libc_setregid setregid "libc.so" @@ -67,36 +96,48 @@ import ( //go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" //go:cgo_import_dynamic libc_setsid setsid "libc.so" //go:cgo_import_dynamic libc_setuid setuid "libc.so" -//go:cgo_import_dynamic libsocket_shutdown shutdown "libsocket.so" +//go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" //go:cgo_import_dynamic libc_stat stat "libc.so" //go:cgo_import_dynamic libc_symlink symlink "libc.so" //go:cgo_import_dynamic libc_sync sync "libc.so" +//go:cgo_import_dynamic libc_times times "libc.so" //go:cgo_import_dynamic libc_truncate truncate "libc.so" //go:cgo_import_dynamic libc_fsync fsync "libc.so" //go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" //go:cgo_import_dynamic libc_umask umask "libc.so" +//go:cgo_import_dynamic libc_uname uname "libc.so" +//go:cgo_import_dynamic libc_umount umount "libc.so" //go:cgo_import_dynamic libc_unlink unlink "libc.so" -//go:cgo_import_dynamic libc_utimes utimes "libc.so" -//go:cgo_import_dynamic libsocket_bind bind "libsocket.so" -//go:cgo_import_dynamic libsocket_connect connect "libsocket.so" +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" +//go:cgo_import_dynamic libc_ustat ustat "libc.so" +//go:cgo_import_dynamic libc_utime utime "libc.so" +//go:cgo_import_dynamic libc_bind bind "libsocket.so" +//go:cgo_import_dynamic libc_connect connect "libsocket.so" //go:cgo_import_dynamic libc_mmap mmap "libc.so" //go:cgo_import_dynamic libc_munmap munmap "libc.so" -//go:cgo_import_dynamic libsocket_sendto sendto "libsocket.so" -//go:cgo_import_dynamic libsocket_socket socket "libsocket.so" -//go:cgo_import_dynamic libsocket_socketpair socketpair "libsocket.so" +//go:cgo_import_dynamic libc_sendto sendto "libsocket.so" +//go:cgo_import_dynamic libc_socket socket "libsocket.so" +//go:cgo_import_dynamic libc_socketpair socketpair "libsocket.so" //go:cgo_import_dynamic libc_write write "libc.so" -//go:cgo_import_dynamic libsocket_getsockopt getsockopt "libsocket.so" -//go:cgo_import_dynamic libsocket_getpeername getpeername "libsocket.so" -//go:cgo_import_dynamic libsocket_getsockname getsockname "libsocket.so" -//go:cgo_import_dynamic libsocket_setsockopt setsockopt "libsocket.so" -//go:cgo_import_dynamic libsocket_recvfrom recvfrom "libsocket.so" -//go:cgo_import_dynamic libsocket_recvmsg recvmsg "libsocket.so" +//go:cgo_import_dynamic libc_getsockopt getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" +//go:cgo_import_dynamic libc_sysconf sysconf "libc.so" +//go:linkname procgetsockname libc_getsockname +//go:linkname procGetcwd libc_getcwd //go:linkname procgetgroups libc_getgroups //go:linkname procsetgroups libc_setgroups +//go:linkname procutimes libc_utimes +//go:linkname procutimensat libc_utimensat //go:linkname procfcntl libc_fcntl -//go:linkname procaccept libsocket_accept -//go:linkname procsendmsg libsocket_sendmsg +//go:linkname procfutimesat libc_futimesat +//go:linkname procaccept libc_accept +//go:linkname procrecvmsg libc_recvmsg +//go:linkname procsendmsg libc_sendmsg +//go:linkname procacct libc_acct +//go:linkname procioctl libc_ioctl //go:linkname procAccess libc_access //go:linkname procAdjtime libc_adjtime //go:linkname procChdir libc_chdir @@ -104,44 +145,65 @@ import ( //go:linkname procChown libc_chown //go:linkname procChroot libc_chroot //go:linkname procClose libc_close +//go:linkname procCreat libc_creat //go:linkname procDup libc_dup +//go:linkname procDup2 libc_dup2 //go:linkname procExit libc_exit //go:linkname procFchdir libc_fchdir //go:linkname procFchmod libc_fchmod +//go:linkname procFchmodat libc_fchmodat //go:linkname procFchown libc_fchown +//go:linkname procFchownat libc_fchownat +//go:linkname procFdatasync libc_fdatasync //go:linkname procFpathconf libc_fpathconf //go:linkname procFstat libc_fstat //go:linkname procGetdents libc_getdents //go:linkname procGetgid libc_getgid //go:linkname procGetpid libc_getpid +//go:linkname procGetpgid libc_getpgid +//go:linkname procGetpgrp libc_getpgrp //go:linkname procGeteuid libc_geteuid //go:linkname procGetegid libc_getegid //go:linkname procGetppid libc_getppid //go:linkname procGetpriority libc_getpriority //go:linkname procGetrlimit libc_getrlimit +//go:linkname procGetrusage libc_getrusage //go:linkname procGettimeofday libc_gettimeofday //go:linkname procGetuid libc_getuid //go:linkname procKill libc_kill //go:linkname procLchown libc_lchown //go:linkname procLink libc_link -//go:linkname proclisten libsocket_listen +//go:linkname proclisten libc_listen //go:linkname procLstat libc_lstat //go:linkname procMadvise libc_madvise //go:linkname procMkdir libc_mkdir +//go:linkname procMkdirat libc_mkdirat +//go:linkname procMkfifo libc_mkfifo +//go:linkname procMkfifoat libc_mkfifoat //go:linkname procMknod libc_mknod +//go:linkname procMknodat libc_mknodat +//go:linkname procMlock libc_mlock +//go:linkname procMlockall libc_mlockall +//go:linkname procMprotect libc_mprotect +//go:linkname procMunlock libc_munlock +//go:linkname procMunlockall libc_munlockall //go:linkname procNanosleep libc_nanosleep //go:linkname procOpen libc_open +//go:linkname procOpenat libc_openat //go:linkname procPathconf libc_pathconf +//go:linkname procPause libc_pause //go:linkname procPread libc_pread //go:linkname procPwrite libc_pwrite //go:linkname procread libc_read //go:linkname procReadlink libc_readlink //go:linkname procRename libc_rename +//go:linkname procRenameat libc_renameat //go:linkname procRmdir libc_rmdir //go:linkname proclseek libc_lseek //go:linkname procSetegid libc_setegid //go:linkname procSeteuid libc_seteuid //go:linkname procSetgid libc_setgid +//go:linkname procSethostname libc_sethostname //go:linkname procSetpgid libc_setpgid //go:linkname procSetpriority libc_setpriority //go:linkname procSetregid libc_setregid @@ -149,37 +211,49 @@ import ( //go:linkname procSetrlimit libc_setrlimit //go:linkname procSetsid libc_setsid //go:linkname procSetuid libc_setuid -//go:linkname procshutdown libsocket_shutdown +//go:linkname procshutdown libc_shutdown //go:linkname procStat libc_stat //go:linkname procSymlink libc_symlink //go:linkname procSync libc_sync +//go:linkname procTimes libc_times //go:linkname procTruncate libc_truncate //go:linkname procFsync libc_fsync //go:linkname procFtruncate libc_ftruncate //go:linkname procUmask libc_umask +//go:linkname procUname libc_uname +//go:linkname procumount libc_umount //go:linkname procUnlink libc_unlink -//go:linkname procUtimes libc_utimes -//go:linkname procbind libsocket_bind -//go:linkname procconnect libsocket_connect +//go:linkname procUnlinkat libc_unlinkat +//go:linkname procUstat libc_ustat +//go:linkname procUtime libc_utime +//go:linkname procbind libc_bind +//go:linkname procconnect libc_connect //go:linkname procmmap libc_mmap //go:linkname procmunmap libc_munmap -//go:linkname procsendto libsocket_sendto -//go:linkname procsocket libsocket_socket -//go:linkname procsocketpair libsocket_socketpair +//go:linkname procsendto libc_sendto +//go:linkname procsocket libc_socket +//go:linkname procsocketpair libc_socketpair //go:linkname procwrite libc_write -//go:linkname procgetsockopt libsocket_getsockopt -//go:linkname procgetpeername libsocket_getpeername -//go:linkname procgetsockname libsocket_getsockname -//go:linkname procsetsockopt libsocket_setsockopt -//go:linkname procrecvfrom libsocket_recvfrom -//go:linkname procrecvmsg libsocket_recvmsg +//go:linkname procgetsockopt libc_getsockopt +//go:linkname procgetpeername libc_getpeername +//go:linkname procsetsockopt libc_setsockopt +//go:linkname procrecvfrom libc_recvfrom +//go:linkname procsysconf libc_sysconf var ( + procgetsockname, + procGetcwd, procgetgroups, procsetgroups, + procutimes, + procutimensat, procfcntl, + procfutimesat, procaccept, + procrecvmsg, procsendmsg, + procacct, + procioctl, procAccess, procAdjtime, procChdir, @@ -187,21 +261,29 @@ var ( procChown, procChroot, procClose, + procCreat, procDup, + procDup2, procExit, procFchdir, procFchmod, + procFchmodat, procFchown, + procFchownat, + procFdatasync, procFpathconf, procFstat, procGetdents, procGetgid, procGetpid, + procGetpgid, + procGetpgrp, procGeteuid, procGetegid, procGetppid, procGetpriority, procGetrlimit, + procGetrusage, procGettimeofday, procGetuid, procKill, @@ -211,20 +293,33 @@ var ( procLstat, procMadvise, procMkdir, + procMkdirat, + procMkfifo, + procMkfifoat, procMknod, + procMknodat, + procMlock, + procMlockall, + procMprotect, + procMunlock, + procMunlockall, procNanosleep, procOpen, + procOpenat, procPathconf, + procPause, procPread, procPwrite, procread, procReadlink, procRename, + procRenameat, procRmdir, proclseek, procSetegid, procSeteuid, procSetgid, + procSethostname, procSetpgid, procSetpriority, procSetregid, @@ -236,12 +331,17 @@ var ( procStat, procSymlink, procSync, + procTimes, procTruncate, procFsync, procFtruncate, procUmask, + procUname, + procumount, procUnlink, - procUtimes, + procUnlinkat, + procUstat, + procUtime, procbind, procconnect, procmmap, @@ -252,12 +352,32 @@ var ( procwrite, procgetsockopt, procgetpeername, - procgetsockname, procsetsockopt, procrecvfrom, - procrecvmsg syscallFunc + procsysconf syscallFunc ) +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getcwd(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) n = int(r0) @@ -275,6 +395,34 @@ func setgroups(ngid int, gid *_Gid_t) (err error) { return } +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) val = int(r0) @@ -284,6 +432,14 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { return } +func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) fd = int(r0) @@ -293,6 +449,15 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) @@ -302,6 +467,22 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +func acct(path *byte) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func ioctl(fd int, req int, arg uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -388,6 +569,21 @@ func Close(fd int) (err error) { return } +func Creat(path string, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func Dup(fd int) (nfd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) nfd = int(r0) @@ -397,6 +593,14 @@ func Dup(fd int) (nfd int, err error) { return } +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Exit(code int) { sysvicall6(uintptr(unsafe.Pointer(&procExit)), 1, uintptr(code), 0, 0, 0, 0, 0) return @@ -418,6 +622,20 @@ func Fchmod(fd int, mode uint32) (err error) { return } +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { @@ -426,6 +644,28 @@ func Fchown(fd int, uid int, gid int) (err error) { return } +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Fdatasync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) val = int(r0) @@ -468,6 +708,24 @@ func Getpid() (pid int) { return } +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getpgrp() (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func Geteuid() (euid int) { r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGeteuid)), 0, 0, 0, 0, 0, 0, 0) euid = int(r0) @@ -503,6 +761,14 @@ func Getrlimit(which int, lim *Rlimit) (err error) { return } +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) if e1 != 0 { @@ -607,6 +873,48 @@ func Mkdir(path string, mode uint32) (err error) { return } +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -621,6 +929,72 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mlockall(flags int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mprotect(b []byte, prot int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlockall() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) if e1 != 0 { @@ -644,6 +1018,21 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -659,6 +1048,14 @@ func Pathconf(path string, name int) (val int, err error) { return } +func Pause() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { @@ -737,6 +1134,26 @@ func Rename(from string, to string) (err error) { return } +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = e1 + } + return +} + func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -784,6 +1201,18 @@ func Setgid(gid int) (err error) { return } +func Sethostname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Setpgid(pid int, pgid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) if e1 != 0 { @@ -891,6 +1320,15 @@ func Sync() (err error) { return } +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -921,12 +1359,34 @@ func Ftruncate(fd int, length int64) (err error) { return } -func Umask(newmask int) (oldmask int) { - r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(newmask), 0, 0, 0, 0, 0) +func Umask(mask int) (oldmask int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(mask), 0, 0, 0, 0, 0) oldmask = int(r0) return } +func Uname(buf *Utsname) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -941,13 +1401,35 @@ func Unlink(path string) (err error) { return } -func Utimes(path string, times *[2]Timeval) (err error) { +func Unlinkat(dirfd int, path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 @@ -1046,14 +1528,6 @@ func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { return } -func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) - if e1 != 0 { - err = e1 - } - return -} - func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { @@ -1075,9 +1549,9 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } -func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) - n = int(r0) +func sysconf(name int) (n int64, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsysconf)), 1, uintptr(name), 0, 0, 0, 0, 0) + n = int64(r0) if e1 != 0 { err = e1 } diff --git a/vendor/github.com/golang/sys/unix/ztypes_freebsd_386.go b/vendor/github.com/golang/sys/unix/ztypes_freebsd_386.go index 330c0e63..8cf30947 100644 --- a/vendor/github.com/golang/sys/unix/ztypes_freebsd_386.go +++ b/vendor/github.com/golang/sys/unix/ztypes_freebsd_386.go @@ -1,8 +1,7 @@ +// +build 386,freebsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs types_freebsd.go -// +build 386,freebsd - package unix const ( @@ -140,6 +139,15 @@ type Fsid struct { Val [2]int32 } +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + type RawSockaddrInet4 struct { Len uint8 Family uint8 diff --git a/vendor/github.com/golang/sys/unix/ztypes_freebsd_amd64.go b/vendor/github.com/golang/sys/unix/ztypes_freebsd_amd64.go index 93395924..e5feb207 100644 --- a/vendor/github.com/golang/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/github.com/golang/sys/unix/ztypes_freebsd_amd64.go @@ -1,8 +1,7 @@ +// +build amd64,freebsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs types_freebsd.go -// +build amd64,freebsd - package unix const ( @@ -140,6 +139,15 @@ type Fsid struct { Val [2]int32 } +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + type RawSockaddrInet4 struct { Len uint8 Family uint8 diff --git a/vendor/github.com/golang/sys/unix/ztypes_solaris_amd64.go b/vendor/github.com/golang/sys/unix/ztypes_solaris_amd64.go index 45e9f422..b3b928a5 100644 --- a/vendor/github.com/golang/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/github.com/golang/sys/unix/ztypes_solaris_amd64.go @@ -1,8 +1,7 @@ +// +build amd64,solaris // Created by cgo -godefs - DO NOT EDIT // cgo -godefs types_solaris.go -// +build amd64,solaris - package unix const ( @@ -11,6 +10,7 @@ const ( sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 + PathMax = 0x400 ) type ( @@ -35,6 +35,18 @@ type Timeval32 struct { Usec int32 } +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + type Rusage struct { Utime Timeval Stime Timeval @@ -230,6 +242,30 @@ type FdSet struct { Bits [1024]int64 } +type Utsname struct { + Sysname [257]int8 + Nodename [257]int8 + Release [257]int8 + Version [257]int8 + Machine [257]int8 +} + +type Ustat_t struct { + Tfree int64 + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_0 [4]byte +} + +const ( + AT_FDCWD = 0xffd19553 + AT_SYMLINK_NOFOLLOW = 0x1000 + AT_SYMLINK_FOLLOW = 0x2000 + AT_REMOVEDIR = 0x1 + AT_EACCESS = 0x4 +) + const ( SizeofIfMsghdr = 0x54 SizeofIfData = 0x44 @@ -357,6 +393,8 @@ type BpfHdr struct { Pad_cgo_0 [2]byte } +const _SC_PAGESIZE = 0xb + type Termios struct { Iflag uint32 Oflag uint32 @@ -365,3 +403,20 @@ type Termios struct { Cc [19]uint8 Pad_cgo_0 [1]byte } + +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line int8 + Cc [8]uint8 + Pad_cgo_0 [1]byte +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} diff --git a/vendor/github.com/gorilla/mux/.travis.yml b/vendor/github.com/gorilla/mux/.travis.yml index f983b60c..83ab8f59 100644 --- a/vendor/github.com/gorilla/mux/.travis.yml +++ b/vendor/github.com/gorilla/mux/.travis.yml @@ -1,8 +1,14 @@ language: go sudo: false - go: - 1.3 - 1.4 - 1.5 - tip +install: + - go get golang.org/x/tools/cmd/vet +script: + - go get -t -v ./... + - diff -u <(echo -n) <(gofmt -d -s .) + - go tool vet . + - go test -v -race ./... diff --git a/vendor/github.com/gorilla/mux/mux.go b/vendor/github.com/gorilla/mux/mux.go index 002051fc..68c4ea5d 100644 --- a/vendor/github.com/gorilla/mux/mux.go +++ b/vendor/github.com/gorilla/mux/mux.go @@ -70,7 +70,7 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { // Clean path to canonical form and redirect. if p := cleanPath(req.URL.Path); p != req.URL.Path { - // Added 3 lines (Philip Schlump) - It was droping the query string and #whatever from query. + // Added 3 lines (Philip Schlump) - It was dropping the query string and #whatever from query. // This matches with fix in go 1.2 r.c. 4 for same problem. Go Issue: // http://code.google.com/p/go/issues/detail?id=5252 url := *req.URL @@ -365,6 +365,8 @@ func uniqueVars(s1, s2 []string) error { return nil } +// checkPairs returns the count of strings passed in, and an error if +// the count is not an even number. func checkPairs(pairs ...string) (int, error) { length := len(pairs) if length%2 != 0 { @@ -374,7 +376,8 @@ func checkPairs(pairs ...string) (int, error) { return length, nil } -// mapFromPairs converts variadic string parameters to a string map. +// mapFromPairsToString converts variadic string parameters to a +// string to string map. func mapFromPairsToString(pairs ...string) (map[string]string, error) { length, err := checkPairs(pairs...) if err != nil { @@ -387,6 +390,8 @@ func mapFromPairsToString(pairs ...string) (map[string]string, error) { return m, nil } +// mapFromPairsToRegex converts variadic string paramers to a +// string to regex map. func mapFromPairsToRegex(pairs ...string) (map[string]*regexp.Regexp, error) { length, err := checkPairs(pairs...) if err != nil { diff --git a/vendor/github.com/gorilla/mux/mux_test.go b/vendor/github.com/gorilla/mux/mux_test.go index 5732d2da..d1eae926 100644 --- a/vendor/github.com/gorilla/mux/mux_test.go +++ b/vendor/github.com/gorilla/mux/mux_test.go @@ -1077,7 +1077,7 @@ func TestWalkSingleDepth(t *testing.T) { return SkipRouter } if len(ancestors) != depths[i] { - t.Errorf(`Expected depth of %d at i = %d; got "%s"`, depths[i], i, len(ancestors)) + t.Errorf(`Expected depth of %d at i = %d; got "%d"`, depths[i], i, len(ancestors)) } if matcher.template != "/"+paths[i] { t.Errorf(`Expected "/%s" at i = %d; got "%s"`, paths[i], i, matcher.template) diff --git a/vendor/github.com/lib/pq/.travis.yml b/vendor/github.com/lib/pq/.travis.yml index 9bf68373..6b8eb405 100644 --- a/vendor/github.com/lib/pq/.travis.yml +++ b/vendor/github.com/lib/pq/.travis.yml @@ -5,6 +5,7 @@ go: - 1.2 - 1.3 - 1.4 + - 1.5 - tip before_install: diff --git a/vendor/github.com/lib/pq/copy.go b/vendor/github.com/lib/pq/copy.go index e44fa48a..101f1113 100644 --- a/vendor/github.com/lib/pq/copy.go +++ b/vendor/github.com/lib/pq/copy.go @@ -215,9 +215,7 @@ func (ci *copyin) Exec(v []driver.Value) (r driver.Result, err error) { } if len(v) == 0 { - err = ci.Close() - ci.closed = true - return nil, err + return nil, ci.Close() } numValues := len(v) @@ -240,9 +238,10 @@ func (ci *copyin) Exec(v []driver.Value) (r driver.Result, err error) { } func (ci *copyin) Close() (err error) { - if ci.closed { - return errCopyInClosed + if ci.closed { // Don't do anything, we're already closed + return nil } + ci.closed = true if ci.cn.bad { return driver.ErrBadConn diff --git a/vendor/github.com/mozilla/scribe/Makefile b/vendor/github.com/mozilla/scribe/Makefile index 7e69d58b..2b3f6f67 100644 --- a/vendor/github.com/mozilla/scribe/Makefile +++ b/vendor/github.com/mozilla/scribe/Makefile @@ -1,10 +1,16 @@ -PROJS = scribe scribecmd evrtest +PROJS = scribe scribecmd evrtest ubuntu-cve-tracker parse-nasltokens GO = GOPATH=$(shell pwd):$(shell go env GOROOT)/bin go export SCRIBECMD = $(shell pwd)/bin/scribecmd export EVRTESTCMD = $(shell pwd)/bin/evrtest all: $(PROJS) +ubuntu-cve-tracker: + $(GO) install ubuntu-cve-tracker + +parse-nasltokens: + $(GO) install parse-nasltokens + evrtest: $(GO) install evrtest diff --git a/vendor/github.com/mozilla/scribe/src/parse-nasltokens/main.go b/vendor/github.com/mozilla/scribe/src/parse-nasltokens/main.go new file mode 100644 index 00000000..8d7e8008 --- /dev/null +++ b/vendor/github.com/mozilla/scribe/src/parse-nasltokens/main.go @@ -0,0 +1,174 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Contributor: +// - Aaron Meihm ameihm@mozilla.com + +// Parse the output of nasltokens to generate scribe checks +package main + +import ( + "bufio" + "encoding/json" + "flag" + "fmt" + "os" + "scribe" + "strings" +) + +type checkEntry struct { + dist string + pkgname string + version string + op string +} + +type releaseProfile struct { + fdir string + fname string + expression string +} + +var rProfileUbuntu = releaseProfile{ + fdir: "/etc", + fname: "lsb-release", + expression: "DISTRIB_RELEASE=(\\d{1,2}\\.\\d{1,2})", +} + +var rProfileRedHat = releaseProfile{ + fdir: "/etc", + fname: "redhat-release", + expression: "release (\\d)\\.", +} + +type releaseInformation struct { + nasldist string + identifier string + lsbmatch string + defid string + profile *releaseProfile +} + +var releaseList = []releaseInformation{ + {"UBUNTU14.10", "utopic", "14.10", "", &rProfileUbuntu}, + {"UBUNTU15.04", "vivid", "15.04", "", &rProfileUbuntu}, + {"UBUNTU14.04 LTS", "trusty", "14.04", "", &rProfileUbuntu}, + {"UBUNTU12.04 LTS", "precise", "12.04", "", &rProfileUbuntu}, + {"UBUNTU10.04 LTS", "lucid", "10.04", "", &rProfileUbuntu}, + {"RHENT_7", "rh7", "7", "", &rProfileRedHat}, + {"RHENT_6", "rh6", "6", "", &rProfileRedHat}, + {"RHENT_5", "rh5", "5", "", &rProfileRedHat}, +} + +func addReleaseDefinition(o *scribe.Document, rinfo *releaseInformation) { + identifier := fmt.Sprintf("reldef-%v", rinfo.identifier) + rinfo.defid = identifier + + obj := scribe.Object{} + obj.Object = identifier + "-object" + obj.FileContent.Path = rinfo.profile.fdir + obj.FileContent.File = rinfo.profile.fname + obj.FileContent.Expression = rinfo.profile.expression + + test := scribe.Test{} + test.TestID = identifier + "-test" + test.Object = obj.Object + test.EMatch.Value = rinfo.lsbmatch + + o.Tests = append(o.Tests, test) + o.Objects = append(o.Objects, obj) +} + +func addReleaseDefinitions(o *scribe.Document) { + for x := range releaseList { + addReleaseDefinition(o, &releaseList[x]) + } +} + +func getReleaseDefinition(nasldist string) string { + for _, x := range releaseList { + if nasldist == x.nasldist { + return x.defid + } + } + return "" +} + +func addDefinition(o *scribe.Document, prefix string, check checkEntry) { + // Don't create a definition for anything that is not in our release + // list. + reldefid := getReleaseDefinition(check.dist) + if reldefid == "" { + return + } + + // Create an object definition for the package + objid := fmt.Sprintf("%v-object", prefix) + obj := scribe.Object{} + obj.Object = objid + obj.Package.Name = check.pkgname + + // Create a test + testid := fmt.Sprintf("%v-test", prefix) + test := scribe.Test{} + test.TestID = testid + test.Object = obj.Object + test.EVR.Value = check.version + test.EVR.Operation = check.op + disttestref := fmt.Sprintf("%v-test", reldefid) + test.If = append(test.If, disttestref) + + o.Tests = append(o.Tests, test) + o.Objects = append(o.Objects, obj) +} + +func processEntries(fpath string) { + root := scribe.Document{} + + addReleaseDefinitions(&root) + + fd, err := os.Open(fpath) + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + defer fd.Close() + + scanner := bufio.NewScanner(fd) + lv := 0 + for scanner.Scan() { + lv++ + tokens := strings.Split(scanner.Text(), "|") + ce := checkEntry{} + ce.dist = strings.Trim(tokens[0], "\"") + ce.pkgname = strings.Trim(tokens[1], "\"") + ce.op = tokens[2] + ce.version = strings.Trim(tokens[3], "\"") + prefix := fmt.Sprintf("%v-%v", lv, ce.pkgname) + addDefinition(&root, prefix, ce) + } + if err = scanner.Err(); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + + buf, err := json.MarshalIndent(&root, "", " ") + if err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } + fmt.Fprintf(os.Stdout, "%v\n", string(buf)) +} + +func main() { + flag.Parse() + args := flag.Args() + if len(args) < 1 { + fmt.Fprintf(os.Stderr, "specify path to nasltokens output\n") + os.Exit(1) + } + + processEntries(args[0]) +} diff --git a/vendor/github.com/mozilla/scribe/src/scribe/document.go b/vendor/github.com/mozilla/scribe/src/scribe/document.go index 3122ecc8..4cedb0a1 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/document.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/document.go @@ -14,9 +14,9 @@ import ( // A scribe document. Contains all tests and other information used to execute // the document. type Document struct { - Variables []variable `json:"variables"` - Objects []object `json:"objects"` - Tests []test `json:"tests"` + Variables []Variable `json:"variables,omitempty"` + Objects []Object `json:"objects,omitempty"` + Tests []Test `json:"tests,omitempty"` } // Validate a scribe document for consistency. This identifies any errors in @@ -71,7 +71,7 @@ func (d *Document) prepareObjects() error { } func (d *Document) objectPrepared(obj string) (bool, error) { - var objptr *object + var objptr *Object for i := range d.Objects { if d.Objects[i].Object == obj { objptr = &d.Objects[i] @@ -98,7 +98,7 @@ func (d *Document) runTests() error { } // Return a pointer to a test instance of the test whose identifier matches -func (d *Document) getTest(testid string) (*test, error) { +func (d *Document) getTest(testid string) (*Test, error) { for i := range d.Tests { if d.Tests[i].TestID == testid { return &d.Tests[i], nil diff --git a/vendor/github.com/mozilla/scribe/src/scribe/evr.go b/vendor/github.com/mozilla/scribe/src/scribe/evr.go index 4cbd2363..e42ce902 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/evr.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/evr.go @@ -11,12 +11,12 @@ import ( "fmt" ) -type evrtest struct { - Operation string `json:"operation"` - Value string `json:"value"` +type EVRTest struct { + Operation string `json:"operation,omitempty"` + Value string `json:"value,omitempty"` } -func (e *evrtest) evaluate(c evaluationCriteria) (ret evaluationResult, err error) { +func (e *EVRTest) evaluate(c evaluationCriteria) (ret evaluationResult, err error) { debugPrint("evaluate(): evr %v \"%v\", %v \"%v\"\n", c.identifier, c.testValue, e.Operation, e.Value) evrop := evrLookupOperation(e.Operation) if evrop == EVROP_UNKNOWN { diff --git a/vendor/github.com/mozilla/scribe/src/scribe/exactmatch.go b/vendor/github.com/mozilla/scribe/src/scribe/exactmatch.go index 61496e20..8441d572 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/exactmatch.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/exactmatch.go @@ -7,11 +7,11 @@ package scribe -type exactmatch struct { - Value string `json:"value"` +type ExactMatch struct { + Value string `json:"value,omitempty"` } -func (e *exactmatch) evaluate(c evaluationCriteria) (ret evaluationResult, err error) { +func (e *ExactMatch) evaluate(c evaluationCriteria) (ret evaluationResult, err error) { debugPrint("evaluate(): exactmatch %v \"%v\", \"%v\"\n", c.identifier, c.testValue, e.Value) ret.criteria = c if c.testValue == e.Value { diff --git a/vendor/github.com/mozilla/scribe/src/scribe/filecontent.go b/vendor/github.com/mozilla/scribe/src/scribe/filecontent.go index 47ff0db2..6304f0f2 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/filecontent.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/filecontent.go @@ -18,13 +18,13 @@ import ( "regexp" ) -type filecontent struct { - Path string `json:"path"` - File string `json:"file"` - Expression string `json:"expression"` - Concat string `json:"concat"` +type FileContent struct { + Path string `json:"path,omitempty"` + File string `json:"file,omitempty"` + Expression string `json:"expression,omitempty"` + Concat string `json:"concat,omitempty"` - ImportChain []string `json:"import-chain"` + ImportChain []string `json:"import-chain,omitempty"` matches []contentMatch } @@ -39,7 +39,7 @@ type matchLine struct { groups []string } -func (f *filecontent) validate(d *Document) error { +func (f *FileContent) validate(d *Document) error { if len(f.Path) == 0 { return fmt.Errorf("filecontent path must be set") } @@ -64,7 +64,7 @@ func (f *filecontent) validate(d *Document) error { return nil } -func (f *filecontent) fireChains(d *Document) ([]evaluationCriteria, error) { +func (f *FileContent) fireChains(d *Document) ([]evaluationCriteria, error) { if len(f.ImportChain) == 0 { return nil, nil } @@ -85,12 +85,12 @@ func (f *filecontent) fireChains(d *Document) ([]evaluationCriteria, error) { } ret := make([]evaluationCriteria, 0) for _, x := range uids { - varlist := make([]variable, 0) + varlist := make([]Variable, 0) debugPrint("fireChains(): run for \"%v\"\n", x) // Build our variable list for the filecontent chain import. dirent, _ := path.Split(x) - newvar := variable{Key: "chain_root", Value: dirent} + newvar := Variable{Key: "chain_root", Value: dirent} varlist = append(varlist, newvar) // Execute each chain entry in order for each identifier. @@ -121,7 +121,7 @@ func (f *filecontent) fireChains(d *Document) ([]evaluationCriteria, error) { return ret, nil } -func (f *filecontent) mergeCriteria(c []evaluationCriteria) { +func (f *FileContent) mergeCriteria(c []evaluationCriteria) { for _, x := range c { nml := matchLine{} nml.groups = make([]string, 0) @@ -133,19 +133,19 @@ func (f *filecontent) mergeCriteria(c []evaluationCriteria) { } } -func (f *filecontent) isChain() bool { +func (f *FileContent) isChain() bool { if hasChainVariables(f.Path) { return true } return false } -func (f *filecontent) expandVariables(v []variable) { +func (f *FileContent) expandVariables(v []Variable) { f.Path = variableExpansion(v, f.Path) f.File = variableExpansion(v, f.File) } -func (f *filecontent) getCriteria() (ret []evaluationCriteria) { +func (f *FileContent) getCriteria() (ret []evaluationCriteria) { for _, x := range f.matches { for _, y := range x.matches { for _, z := range y.groups { @@ -162,7 +162,7 @@ func (f *filecontent) getCriteria() (ret []evaluationCriteria) { return ret } -func (f *filecontent) prepare() error { +func (f *FileContent) prepare() error { debugPrint("prepare(): analyzing file system, path %v, file \"%v\"\n", f.Path, f.File) sfl := newSimpleFileLocator() diff --git a/vendor/github.com/mozilla/scribe/src/scribe/filename.go b/vendor/github.com/mozilla/scribe/src/scribe/filename.go index 60b94272..1477f178 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/filename.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/filename.go @@ -13,9 +13,9 @@ import ( "regexp" ) -type filename struct { - Path string `json:"path"` - File string `json:"file"` +type FileName struct { + Path string `json:"path,omitempty"` + File string `json:"file,omitempty"` matches []nameMatch } @@ -25,18 +25,18 @@ type nameMatch struct { match string } -func (f *filename) isChain() bool { +func (f *FileName) isChain() bool { return false } -func (f *filename) fireChains(d *Document) ([]evaluationCriteria, error) { +func (f *FileName) fireChains(d *Document) ([]evaluationCriteria, error) { return nil, nil } -func (f *filename) mergeCriteria(c []evaluationCriteria) { +func (f *FileName) mergeCriteria(c []evaluationCriteria) { } -func (f *filename) validate(d *Document) error { +func (f *FileName) validate(d *Document) error { if len(f.Path) == 0 { return fmt.Errorf("filename path must be set") } @@ -46,11 +46,11 @@ func (f *filename) validate(d *Document) error { return nil } -func (f *filename) expandVariables(v []variable) { +func (f *FileName) expandVariables(v []Variable) { f.Path = variableExpansion(v, f.Path) } -func (f *filename) getCriteria() (ret []evaluationCriteria) { +func (f *FileName) getCriteria() (ret []evaluationCriteria) { for _, x := range f.matches { n := evaluationCriteria{} n.identifier = x.path @@ -60,7 +60,7 @@ func (f *filename) getCriteria() (ret []evaluationCriteria) { return ret } -func (f *filename) prepare() error { +func (f *FileName) prepare() error { debugPrint("prepare(): analyzing file system, path %v, file \"%v\"\n", f.Path, f.File) sfl := newSimpleFileLocator() diff --git a/vendor/github.com/mozilla/scribe/src/scribe/hasline.go b/vendor/github.com/mozilla/scribe/src/scribe/hasline.go index b0b7a506..53075b0b 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/hasline.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/hasline.go @@ -12,10 +12,10 @@ import ( "regexp" ) -type hasline struct { - Path string `json:"path"` - File string `json:"file"` - Expression string `json:"expression"` +type HasLine struct { + Path string `json:"path,omitempty"` + File string `json:"file,omitempty"` + Expression string `json:"expression,omitempty"` matches []haslineStatus } @@ -25,7 +25,7 @@ type haslineStatus struct { found bool } -func (h *hasline) validate(d *Document) error { +func (h *HasLine) validate(d *Document) error { if len(h.Path) == 0 { return fmt.Errorf("hasline path must be set") } @@ -46,23 +46,23 @@ func (h *hasline) validate(d *Document) error { return nil } -func (h *hasline) mergeCriteria(c []evaluationCriteria) { +func (h *HasLine) mergeCriteria(c []evaluationCriteria) { } -func (h *hasline) fireChains(d *Document) ([]evaluationCriteria, error) { +func (h *HasLine) fireChains(d *Document) ([]evaluationCriteria, error) { return nil, nil } -func (h *hasline) isChain() bool { +func (h *HasLine) isChain() bool { return false } -func (h *hasline) expandVariables(v []variable) { +func (h *HasLine) expandVariables(v []Variable) { h.Path = variableExpansion(v, h.Path) h.File = variableExpansion(v, h.File) } -func (h *hasline) getCriteria() (ret []evaluationCriteria) { +func (h *HasLine) getCriteria() (ret []evaluationCriteria) { for _, x := range h.matches { n := evaluationCriteria{} n.identifier = x.path @@ -72,7 +72,7 @@ func (h *hasline) getCriteria() (ret []evaluationCriteria) { return ret } -func (h *hasline) prepare() error { +func (h *HasLine) prepare() error { debugPrint("prepare(): analyzing file system, path %v, file \"%v\"\n", h.Path, h.File) sfl := newSimpleFileLocator() diff --git a/vendor/github.com/mozilla/scribe/src/scribe/object.go b/vendor/github.com/mozilla/scribe/src/scribe/object.go index d646e2df..c2c7fa96 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/object.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/object.go @@ -11,13 +11,13 @@ import ( "fmt" ) -type object struct { +type Object struct { Object string `json:"object"` - FileContent filecontent `json:"filecontent"` - FileName filename `json:"filename"` - Package pkg `json:"package"` - Raw raw `json:"raw"` - HasLine hasline `json:"hasline"` + FileContent FileContent `json:"filecontent"` + FileName FileName `json:"filename"` + Package Pkg `json:"package"` + Raw Raw `json:"raw"` + HasLine HasLine `json:"hasline"` isChain bool // True if object is part of an import chain. prepared bool // True if object has been prepared. @@ -28,13 +28,13 @@ type genericSource interface { prepare() error getCriteria() []evaluationCriteria isChain() bool - expandVariables([]variable) + expandVariables([]Variable) validate(d *Document) error mergeCriteria([]evaluationCriteria) fireChains(*Document) ([]evaluationCriteria, error) } -func (o *object) validate(d *Document) error { +func (o *Object) validate(d *Document) error { if len(o.Object) == 0 { return fmt.Errorf("an object in document has no identifier") } @@ -49,11 +49,11 @@ func (o *object) validate(d *Document) error { return nil } -func (o *object) markChain() { +func (o *Object) markChain() { o.isChain = o.getSourceInterface().isChain() } -func (o *object) getSourceInterface() genericSource { +func (o *Object) getSourceInterface() genericSource { if o.Package.Name != "" { return &o.Package } else if o.FileContent.Path != "" { @@ -68,7 +68,7 @@ func (o *object) getSourceInterface() genericSource { return nil } -func (o *object) fireChains(d *Document) error { +func (o *Object) fireChains(d *Document) error { si := o.getSourceInterface() // We only fire chains on root object types, not on chain entries // themselves. @@ -92,7 +92,7 @@ func (o *object) fireChains(d *Document) error { return nil } -func (o *object) prepare(d *Document) error { +func (o *Object) prepare(d *Document) error { if o.isChain { debugPrint("prepare(): skipping chain object \"%v\"\n", o.Object) return nil diff --git a/vendor/github.com/mozilla/scribe/src/scribe/package.go b/vendor/github.com/mozilla/scribe/src/scribe/package.go index d65352fa..6846956d 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/package.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/package.go @@ -11,8 +11,8 @@ import ( "fmt" ) -type pkg struct { - Name string `json:"name"` +type Pkg struct { + Name string `json:"name,omitempty"` pkgInfo []packageInfo } @@ -21,25 +21,25 @@ type packageInfo struct { Version string } -func (p *pkg) isChain() bool { +func (p *Pkg) isChain() bool { return false } -func (p *pkg) validate(d *Document) error { +func (p *Pkg) validate(d *Document) error { if len(p.Name) == 0 { return fmt.Errorf("package must specify name") } return nil } -func (p *pkg) fireChains(d *Document) ([]evaluationCriteria, error) { +func (p *Pkg) fireChains(d *Document) ([]evaluationCriteria, error) { return nil, nil } -func (p *pkg) mergeCriteria(c []evaluationCriteria) { +func (p *Pkg) mergeCriteria(c []evaluationCriteria) { } -func (p *pkg) getCriteria() (ret []evaluationCriteria) { +func (p *Pkg) getCriteria() (ret []evaluationCriteria) { for _, x := range p.pkgInfo { n := evaluationCriteria{} n.identifier = x.Name @@ -49,7 +49,7 @@ func (p *pkg) getCriteria() (ret []evaluationCriteria) { return ret } -func (p *pkg) prepare() error { +func (p *Pkg) prepare() error { debugPrint("prepare(): preparing information for package \"%v\"\n", p.Name) p.pkgInfo = make([]packageInfo, 0) ret := getPackage(p.Name) @@ -62,6 +62,6 @@ func (p *pkg) prepare() error { return nil } -func (p *pkg) expandVariables(v []variable) { +func (p *Pkg) expandVariables(v []Variable) { p.Name = variableExpansion(v, p.Name) } diff --git a/vendor/github.com/mozilla/scribe/src/scribe/raw.go b/vendor/github.com/mozilla/scribe/src/scribe/raw.go index 43f8f8d7..7e731bb6 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/raw.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/raw.go @@ -11,27 +11,27 @@ import ( "fmt" ) -type raw struct { - Identifiers []rawIdentifiers `json:"identifiers"` +type Raw struct { + Identifiers []RawIdentifiers `json:"identifiers,omitempty"` } -type rawIdentifiers struct { - Identifier string `json:"identifier"` - Value string `json:"value"` +type RawIdentifiers struct { + Identifier string `json:"identifier,omitempty"` + Value string `json:"value,omitempty"` } -func (r *raw) isChain() bool { +func (r *Raw) isChain() bool { return false } -func (r *raw) fireChains(d *Document) ([]evaluationCriteria, error) { +func (r *Raw) fireChains(d *Document) ([]evaluationCriteria, error) { return nil, nil } -func (r *raw) mergeCriteria(c []evaluationCriteria) { +func (r *Raw) mergeCriteria(c []evaluationCriteria) { } -func (r *raw) validate(d *Document) error { +func (r *Raw) validate(d *Document) error { if len(r.Identifiers) == 0 { return fmt.Errorf("at least one identifier must be present") } @@ -43,7 +43,7 @@ func (r *raw) validate(d *Document) error { return nil } -func (r *raw) getCriteria() []evaluationCriteria { +func (r *Raw) getCriteria() []evaluationCriteria { ret := make([]evaluationCriteria, 0) for _, x := range r.Identifiers { nc := evaluationCriteria{} @@ -54,9 +54,9 @@ func (r *raw) getCriteria() []evaluationCriteria { return ret } -func (r *raw) prepare() error { +func (r *Raw) prepare() error { return nil } -func (r *raw) expandVariables(v []variable) { +func (r *Raw) expandVariables(v []Variable) { } diff --git a/vendor/github.com/mozilla/scribe/src/scribe/regexp.go b/vendor/github.com/mozilla/scribe/src/scribe/regexp.go index ee65c976..5a55afa8 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/regexp.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/regexp.go @@ -11,11 +11,11 @@ import ( "regexp" ) -type regex struct { - Value string `json:"value"` +type Regex struct { + Value string `json:"value,omitempty"` } -func (r *regex) evaluate(c evaluationCriteria) (ret evaluationResult, err error) { +func (r *Regex) evaluate(c evaluationCriteria) (ret evaluationResult, err error) { var re *regexp.Regexp debugPrint("evaluate(): regexp %v \"%v\", \"%v\"\n", c.identifier, c.testValue, r.Value) re, err = regexp.Compile(r.Value) diff --git a/vendor/github.com/mozilla/scribe/src/scribe/result.go b/vendor/github.com/mozilla/scribe/src/scribe/result.go index 6aeed8ea..57b4ab29 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/result.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/result.go @@ -16,7 +16,8 @@ import ( // Describes the results of a test. The type can be marshaled into a JSON // string as required. type TestResult struct { - TestID string `json:"testid"` // The identifier for the test. + TestID string `json:"testid"` // The identifier for the test. + Tags []string `json:"tags,omitempty"` // Tags for the test. IsError bool `json:"iserror"` // True of error is encountered during evaluation. Error string `json:"error"` // Error associated with test. @@ -44,6 +45,7 @@ func GetResults(d *Document, name string) (TestResult, error) { } ret := TestResult{} ret.TestID = t.TestID + ret.Tags = t.Tags if t.err != nil { ret.Error = fmt.Sprintf("%v", t.err) ret.IsError = true @@ -75,6 +77,18 @@ func (r *TestResult) SingleLineResults() []string { } } buf := fmt.Sprintf("master %v name:\"%v\" hastrue:%v error:\"%v\"", rs, r.TestID, r.HasTrueResults, r.Error) + if len(r.Tags) > 0 { + buf += " tags:[" + f := false + for _, x := range r.Tags { + if f { + buf += "," + } + buf += fmt.Sprintf("\"%v\"", x) + f = true + } + buf += "]" + } lns = append(lns, buf) for _, x := range r.Results { @@ -113,6 +127,11 @@ func (r *TestResult) String() string { } lns = append(lns, buf) } + if len(r.Tags) > 0 { + for _, x := range r.Tags { + lns = append(lns, fmt.Sprintf("\ttag: %v", x)) + } + } if r.IsError { buf := fmt.Sprintf("\t[error] error: %v", r.Error) lns = append(lns, buf) diff --git a/vendor/github.com/mozilla/scribe/src/scribe/test.go b/vendor/github.com/mozilla/scribe/src/scribe/test.go index 5364ef60..04943de3 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/test.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/test.go @@ -9,17 +9,20 @@ package scribe import ( "fmt" + "strings" ) -type test struct { +type Test struct { TestID string `json:"test"` // The ID for this test. Object string `json:"object"` // The object this test references. Description string `json:"description,omitempty"` // Evaluators - EVR evrtest `json:"evr,omitempty"` // EVR version comparison - Regexp regex `json:"regexp,omitempty"` // Regular expression comparison - EMatch exactmatch `json:"exactmatch,omitempty"` // Exact string match + EVR EVRTest `json:"evr,omitempty"` // EVR version comparison + Regexp Regex `json:"regexp,omitempty"` // Regular expression comparison + EMatch ExactMatch `json:"exactmatch,omitempty"` // Exact string match + + Tags []string `json:"tags,omitempty"` // Tags associated with the test If []string `json:"if,omitempty"` // Slice of test names for dependencies @@ -67,7 +70,7 @@ type genericEvaluator interface { evaluate(evaluationCriteria) (evaluationResult, error) } -func (t *test) validate(d *Document) error { +func (t *Test) validate(d *Document) error { if len(t.TestID) == 0 { return fmt.Errorf("a test in document has no identifier") } @@ -83,10 +86,16 @@ func (t *test) validate(d *Document) error { return fmt.Errorf("%v: test cannot reference itself", t.TestID) } } + // Ensure the tags only contain valid characters + for _, x := range t.Tags { + if strings.ContainsRune(x, '"') { + return fmt.Errorf("%v: test tag cannot contain quote", t.TestID) + } + } return nil } -func (t *test) getEvaluationInterface() genericEvaluator { +func (t *Test) getEvaluationInterface() genericEvaluator { if t.EVR.Value != "" { return &t.EVR } else if t.Regexp.Value != "" { @@ -100,7 +109,7 @@ func (t *test) getEvaluationInterface() genericEvaluator { return &noop{} } -func (t *test) errorHandler(d *Document) error { +func (t *Test) errorHandler(d *Document) error { if sRuntime.excall == nil { return t.err } @@ -114,7 +123,7 @@ func (t *test) errorHandler(d *Document) error { return t.err } -func (t *test) runTest(d *Document) error { +func (t *Test) runTest(d *Document) error { if t.evaluated { return nil } diff --git a/vendor/github.com/mozilla/scribe/src/scribe/variable.go b/vendor/github.com/mozilla/scribe/src/scribe/variable.go index 0f6e8435..876d935e 100644 --- a/vendor/github.com/mozilla/scribe/src/scribe/variable.go +++ b/vendor/github.com/mozilla/scribe/src/scribe/variable.go @@ -11,12 +11,12 @@ import ( "regexp" ) -type variable struct { +type Variable struct { Key string `json:"key"` Value string `json:"value"` } -func variableExpansion(v []variable, in string) string { +func variableExpansion(v []Variable, in string) string { res := in for _, x := range v { s := "\\$\\{" + x.Key + "\\}" diff --git a/vendor/github.com/mozilla/scribe/src/ubuntu-cve-tracker/main.go b/vendor/github.com/mozilla/scribe/src/ubuntu-cve-tracker/main.go new file mode 100644 index 00000000..1a0cbcbe --- /dev/null +++ b/vendor/github.com/mozilla/scribe/src/ubuntu-cve-tracker/main.go @@ -0,0 +1,288 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Contributor: +// - Aaron Meihm ameihm@mozilla.com + +// Generate scribe policy checks using data in the Ubuntu CVE tracker +// repository. +package main + +import ( + "bufio" + "encoding/json" + "flag" + "fmt" + "io/ioutil" + "os" + "path" + "regexp" + "scribe" + "strings" + "unicode" +) + +type distPatchInfo map[string]string + +type cveEntry struct { + cveID string + pkgMap map[string]distPatchInfo +} + +type releaseInformation struct { + identifier string + lsbmatch string + defid string +} + +var releaseList = []releaseInformation{ + {"utopic", "14.10", ""}, + {"vivid", "15.04", ""}, + {"trusty", "14.04", ""}, + {"precise", "12.04", ""}, + {"lucid", "10.04", ""}, +} + +var entries []cveEntry +var matchFilter *regexp.Regexp + +// The hackTranslate* functions perform conversion on name and version +// strings if the package name is either "linux" or begins with "linux-". If +// this is the case, linux in the package name is translated to be +// "linux-image-generic". Additionally, the upload revision element if +// present in the version string is removed. This allows a comparison of +// the version to occur against a known package name (linux-image-generic), +// instead of requiring resolution of whatever the most recent installed +// kernel image package is which will be named linux-image--generic. +func hackTranslateName(pkgname string) string { + if pkgname != "linux" && !strings.HasPrefix(pkgname, "linux-") { + return pkgname + } + return strings.Replace(pkgname, "linux", "linux-image-generic", 1) +} + +func hackTranslateVersion(pkgname string, ver string) string { + if !strings.HasPrefix(pkgname, "linux-image-generic") { + return ver + } + + ffunc := func(c rune) bool { + if c == '-' { + return true + } + return false + } + f := strings.FieldsFunc(ver, ffunc) + if len(f) != 2 { + return ver + } + ret := f[1] + idx := strings.Index(ret, ".") + if idx == -1 { + return ver + } + idx2 := idx + 1 + for _, c := range ret[idx2:] { + if !unicode.IsDigit(c) { + break + } + idx2++ + } + ret = f[0] + "." + ret[:idx] + ret[idx2:] + + return ret +} + +func addReleaseDefinition(o *scribe.Document, rinfo *releaseInformation) { + identifier := fmt.Sprintf("reldef-%v", rinfo.identifier) + rinfo.defid = identifier + + obj := scribe.Object{} + obj.Object = identifier + "-object" + obj.FileContent.Path = "/etc" + obj.FileContent.File = "^lsb-release$" + obj.FileContent.Expression = "DISTRIB_RELEASE=(\\d{1,2}\\.\\d{1,2})" + + test := scribe.Test{} + test.TestID = identifier + "-test" + test.Object = obj.Object + test.EMatch.Value = rinfo.lsbmatch + + o.Tests = append(o.Tests, test) + o.Objects = append(o.Objects, obj) +} + +func addReleaseDefinitions(o *scribe.Document) { + for x := range releaseList { + addReleaseDefinition(o, &releaseList[x]) + } +} + +func getReleaseDefinition(dist string) string { + for _, x := range releaseList { + if dist == x.identifier { + return x.defid + } + } + return "" +} + +func parseEntryFile(fpath string) (ret cveEntry) { + const ( + _ = iota + INNER_NONE + INNER_PATCH + ) + fd, err := os.Open(fpath) + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + defer func() { + fd.Close() + }() + + scanner := bufio.NewScanner(fd) + parserMode := INNER_NONE + curPkgName := "" + ret.cveID = path.Base(fpath) + ret.pkgMap = make(map[string]distPatchInfo) + for scanner.Scan() { + tokens := strings.Fields(scanner.Text()) + if len(tokens) == 0 { + parserMode = INNER_NONE + curPkgName = "" + continue + } + + if strings.HasPrefix(tokens[0], "Patches_") { + parserMode = INNER_PATCH + curPkgName = strings.TrimPrefix(tokens[0], "Patches_") + curPkgName = strings.TrimRight(curPkgName, ":") + curPkgName = hackTranslateName(curPkgName) + ret.pkgMap[curPkgName] = make(map[string]string) + continue + } + + if parserMode == INNER_PATCH { + if len(tokens) < 2 { + continue + } + idx := strings.Index(tokens[0], "_") + if idx == -1 { + continue + } + distname := tokens[0][:idx] + if tokens[1] == "released" && len(tokens) > 2 { + patchver := tokens[2] + patchver = strings.Trim(patchver, "()") + patchver = hackTranslateVersion(curPkgName, patchver) + ret.pkgMap[curPkgName][distname] = patchver + } + } + } + if err = scanner.Err(); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + + return +} + +func loadEntries(dirpath string) { + dirents, err := ioutil.ReadDir(dirpath) + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + for _, i := range dirents { + if !strings.HasPrefix(i.Name(), "CVE-") { + continue + } + if matchFilter != nil { + if !matchFilter.MatchString(i.Name()) { + continue + } + } + fname := path.Join(dirpath, i.Name()) + entries = append(entries, parseEntryFile(fname)) + } +} + +func addDefinition(o *scribe.Document, prefix string, pkgname string, dist string, cve cveEntry) { + // Don't create a definition for anything that is not in our release + // list. + reldefid := getReleaseDefinition(dist) + if reldefid == "" { + return + } + + // Create an object definition for the package + objid := fmt.Sprintf("%v-object", prefix) + obj := scribe.Object{} + obj.Object = objid + obj.Package.Name = pkgname + + // Create a test + testid := fmt.Sprintf("%v-test", prefix) + test := scribe.Test{} + test.TestID = testid + test.Object = obj.Object + test.EVR.Value = cve.pkgMap[pkgname][dist] + test.EVR.Operation = "<" + disttestref := fmt.Sprintf("reldef-%v-test", dist) + test.If = append(test.If, disttestref) + + o.Tests = append(o.Tests, test) + o.Objects = append(o.Objects, obj) +} + +func processEntries() { + root := scribe.Document{} + + addReleaseDefinitions(&root) + + for i, ent := range entries { + for x := range ent.pkgMap { + for y := range ent.pkgMap[x] { + prefix := fmt.Sprintf("ubuntu-%v-%v-%v", i, x, y) + addDefinition(&root, prefix, x, y, ent) + } + } + } + + buf, err := json.MarshalIndent(&root, "", " ") + if err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } + fmt.Fprintf(os.Stdout, "%v\n", string(buf)) +} + +func main() { + var fMatch string + + flag.StringVar(&fMatch, "i", "", "filter regexp") + flag.Parse() + args := flag.Args() + if len(args) < 1 { + fmt.Fprintf(os.Stderr, "specify path to ubuntu-cve-tracker directory\n") + os.Exit(1) + } + + fm, err := regexp.Compile(fMatch) + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + matchFilter = fm + + entries = make([]cveEntry, 0) + + procdir := path.Join(args[0], "active") + loadEntries(procdir) + procdir = path.Join(args[0], "retired") + loadEntries(procdir) + processEntries() +} diff --git a/vendor/github.com/mozilla/scribe/test/Makefile b/vendor/github.com/mozilla/scribe/test/Makefile index edfee863..13307646 100644 --- a/vendor/github.com/mozilla/scribe/test/Makefile +++ b/vendor/github.com/mozilla/scribe/test/Makefile @@ -1,4 +1,5 @@ -TESTDIRS = filecontent filename package concat raw import-chain hasline evrtest +TESTDIRS = filecontent filename package concat raw import-chain hasline tags \ + evrtest all: diff --git a/vendor/github.com/mozilla/scribe/test/tags/Makefile b/vendor/github.com/mozilla/scribe/test/tags/Makefile new file mode 100644 index 00000000..df69fd41 --- /dev/null +++ b/vendor/github.com/mozilla/scribe/test/tags/Makefile @@ -0,0 +1,13 @@ +all: + +runtests: test.json +ifndef SCRIBECMD + $(error SCRIBECMD is undefined, tests must be ran from the root of the repository) +endif + $(SCRIBECMD) -e -f test.json; \ + +test.json: test-template.json + cat test-template.json | sed 's,REPLACE_IN_MAKEFILE,$(shell pwd),' > test.json + +clean: + rm -f test.json diff --git a/vendor/github.com/mozilla/scribe/test/tags/data/file0.txt b/vendor/github.com/mozilla/scribe/test/tags/data/file0.txt new file mode 100644 index 00000000..9daeafb9 --- /dev/null +++ b/vendor/github.com/mozilla/scribe/test/tags/data/file0.txt @@ -0,0 +1 @@ +test diff --git a/vendor/github.com/mozilla/scribe/test/tags/data/file1.txt b/vendor/github.com/mozilla/scribe/test/tags/data/file1.txt new file mode 100644 index 00000000..9daeafb9 --- /dev/null +++ b/vendor/github.com/mozilla/scribe/test/tags/data/file1.txt @@ -0,0 +1 @@ +test diff --git a/vendor/github.com/mozilla/scribe/test/tags/data/file2.txt b/vendor/github.com/mozilla/scribe/test/tags/data/file2.txt new file mode 100644 index 00000000..ad3e35e3 --- /dev/null +++ b/vendor/github.com/mozilla/scribe/test/tags/data/file2.txt @@ -0,0 +1,2 @@ + +data diff --git a/vendor/github.com/mozilla/scribe/test/tags/test-template.json b/vendor/github.com/mozilla/scribe/test/tags/test-template.json new file mode 100644 index 00000000..71960c2f --- /dev/null +++ b/vendor/github.com/mozilla/scribe/test/tags/test-template.json @@ -0,0 +1,31 @@ +{ + "variables": [ + { "key": "root", "value": "REPLACE_IN_MAKEFILE" } + ], + + "objects": [ + { + "object": "file-hasline", + "hasline": { + "path": "${root}", + "file": ".*\\.txt", + "expression": ".*test.*" + } + } + ], + + "tests": [ + { + "test": "files-without-line", + "tags": [ + "tag1", + "Another tag with spaces" + ], + "expectedresult": true, + "object": "file-hasline", + "exactmatch": { + "value": "false" + } + } + ] +} diff --git a/vendor/github.com/oschwald/geoip2-golang/.travis.yml b/vendor/github.com/oschwald/geoip2-golang/.travis.yml index 7e1922fe..0d69d894 100644 --- a/vendor/github.com/oschwald/geoip2-golang/.travis.yml +++ b/vendor/github.com/oschwald/geoip2-golang/.travis.yml @@ -10,6 +10,8 @@ go: - tip install: - - go get github.com/oschwald/maxminddb-golang - - go get launchpad.net/gocheck + - go get -v ./... + # "go get" on 1.1 doesn't get test dependencies apparently. + - go get gopkg.in/check.v1 +sudo: false diff --git a/vendor/github.com/oschwald/geoip2-golang/README.md b/vendor/github.com/oschwald/geoip2-golang/README.md index 1aeddfda..7a3c22a0 100644 --- a/vendor/github.com/oschwald/geoip2-golang/README.md +++ b/vendor/github.com/oschwald/geoip2-golang/README.md @@ -87,4 +87,4 @@ with your changes. ## License ## -This is free software, licensed under the Apache License, Version 2.0. +This is free software, licensed under the ISC license. diff --git a/vendor/github.com/oschwald/geoip2-golang/reader.go b/vendor/github.com/oschwald/geoip2-golang/reader.go index b245031f..45d642be 100644 --- a/vendor/github.com/oschwald/geoip2-golang/reader.go +++ b/vendor/github.com/oschwald/geoip2-golang/reader.go @@ -88,6 +88,16 @@ type Country struct { } `maxminddb:"traits"` } +// The AnonymousIP structure corresponds to the data in the GeoIP2 +// Anonymous IP database. +type AnonymousIP struct { + IsAnonymous bool `maxminddb:"is_anonymous"` + IsAnonymousVPN bool `maxminddb:"is_anonymous_vpn"` + IsHostingProvider bool `maxminddb:"is_hosting_provider"` + IsPublicProxy bool `maxminddb:"is_public_proxy"` + IsTorExitNode bool `maxminddb:"is_tor_exit_node"` +} + // The ConnectionType structure corresponds to the data in the GeoIP2 // Connection-Type database. type ConnectionType struct { @@ -147,6 +157,14 @@ func (r *Reader) Country(ipAddress net.IP) (*Country, error) { return &country, err } +// AnonymousIP takes an IP address as a net.IP struct and returns a +// AnonymousIP struct and/or an error. +func (r *Reader) AnonymousIP(ipAddress net.IP) (*AnonymousIP, error) { + var anonIP AnonymousIP + err := r.mmdbReader.Lookup(ipAddress, &anonIP) + return &anonIP, err +} + // ConnectionType takes an IP address as a net.IP struct and returns a // ConnectionType struct and/or an error func (r *Reader) ConnectionType(ipAddress net.IP) (*ConnectionType, error) { @@ -172,13 +190,13 @@ func (r *Reader) ISP(ipAddress net.IP) (*ISP, error) { } // Metadata takes no arguments and returns a struct containing metadata about -// the Maxmind database in use by the Reader. +// the MaxMind database in use by the Reader. func (r *Reader) Metadata() maxminddb.Metadata { return r.mmdbReader.Metadata } // Close unmaps the database file from virtual memory and returns the // resources to the system. -func (r *Reader) Close() { - r.mmdbReader.Close() +func (r *Reader) Close() error { + return r.mmdbReader.Close() } diff --git a/vendor/github.com/oschwald/geoip2-golang/reader_test.go b/vendor/github.com/oschwald/geoip2-golang/reader_test.go index 05f8bbd1..51d28eaf 100644 --- a/vendor/github.com/oschwald/geoip2-golang/reader_test.go +++ b/vendor/github.com/oschwald/geoip2-golang/reader_test.go @@ -2,11 +2,12 @@ package geoip2 import ( "fmt" - . "launchpad.net/gocheck" "math/rand" "net" "testing" "time" + + . "gopkg.in/check.v1" ) func TestGeoIP2(t *testing.T) { TestingT(t) } @@ -32,15 +33,15 @@ func (s *MySuite) TestReader(c *C) { m := reader.Metadata() c.Assert(m.BinaryFormatMajorVersion, Equals, uint(2)) c.Assert(m.BinaryFormatMinorVersion, Equals, uint(0)) - c.Assert(m.BuildEpoch, Equals, uint(1403110838)) - c.Assert(m.DatabaseType, Equals, "GeoIP2 City") + c.Assert(m.BuildEpoch, Equals, uint(1436981935)) + c.Assert(m.DatabaseType, Equals, "GeoIP2-City") c.Assert(m.Description, DeepEquals, map[string]string{ "en": "GeoIP2 City Test Database (a small sample of real GeoIP2 data)", "zh": "小型数据库", }) c.Assert(m.IPVersion, Equals, uint(6)) c.Assert(m.Languages, DeepEquals, []string{"en", "zh"}) - c.Assert(m.NodeCount, Equals, uint(1218)) + c.Assert(m.NodeCount, Equals, uint(1240)) c.Assert(m.RecordSize, Equals, uint(28)) c.Assert(record.City.GeoNameID, Equals, uint(2643743)) @@ -179,6 +180,29 @@ func (s *MySuite) TestISP(c *C) { } +func (s *MySuite) TestAnonymousIP(c *C) { + reader, err := Open("test-data/test-data/GeoIP2-Anonymous-IP-Test.mmdb") + if err != nil { + c.Log(err) + c.Fail() + } + defer reader.Close() + + record, err := reader.AnonymousIP(net.ParseIP("1.2.0.0")) + if err != nil { + c.Log(err) + c.Fail() + } + + c.Assert(record.IsAnonymous, Equals, true) + + c.Assert(record.IsAnonymousVPN, Equals, true) + c.Assert(record.IsHostingProvider, Equals, false) + c.Assert(record.IsPublicProxy, Equals, false) + c.Assert(record.IsTorExitNode, Equals, false) + +} + func BenchmarkMaxMindDB(b *testing.B) { db, err := Open("GeoLite2-City.mmdb") if err != nil { diff --git a/vendor/github.com/streadway/amqp/README.md b/vendor/github.com/streadway/amqp/README.md index c4291fb6..7869af81 100644 --- a/vendor/github.com/streadway/amqp/README.md +++ b/vendor/github.com/streadway/amqp/README.md @@ -14,7 +14,7 @@ enhancements. # Goals -Provide an functional interface that closely represents the AMQP 0.9.1 model +Provide a functional interface that closely represents the AMQP 0.9.1 model targeted to RabbitMQ as a server. This includes the minimum necessary to interact the semantics of the protocol. diff --git a/vendor/github.com/streadway/amqp/_examples/pubsub/pubsub.go b/vendor/github.com/streadway/amqp/_examples/pubsub/pubsub.go index 109af240..29b4a53a 100644 --- a/vendor/github.com/streadway/amqp/_examples/pubsub/pubsub.go +++ b/vendor/github.com/streadway/amqp/_examples/pubsub/pubsub.go @@ -91,7 +91,7 @@ func publish(sessions chan chan session, messages <-chan message) { running bool reading = messages pending = make(chan message, 1) - confirm = make(amqp.Confirmation, 1) + confirm = make(chan amqp.Confirmation, 1) ) for session := range sessions { diff --git a/vendor/github.com/streadway/amqp/channel.go b/vendor/github.com/streadway/amqp/channel.go index 9cf93b4d..8976fa90 100644 --- a/vendor/github.com/streadway/amqp/channel.go +++ b/vendor/github.com/streadway/amqp/channel.go @@ -197,7 +197,15 @@ func (me *Channel) sendOpen(msg message) (err error) { if content, ok := msg.(messageWithContent); ok { props, body := content.getContent() class, _ := content.id() - size := me.connection.Config.FrameSize - frameHeaderSize + + // catch client max frame size==0 and server max frame size==0 + // set size to length of what we're trying to publish + var size int + if me.connection.Config.FrameSize > 0 { + size = me.connection.Config.FrameSize - frameHeaderSize + } else { + size = len(body) + } if err = me.connection.send(&methodFrame{ ChannelId: me.id, @@ -215,6 +223,7 @@ func (me *Channel) sendOpen(msg message) (err error) { return } + // chunk body into size (max frame size - frame header size) for i, j := 0, size; i < len(body); i, j = j, j+size { if j > len(body) { j = len(body) diff --git a/vendor/github.com/streadway/amqp/client_test.go b/vendor/github.com/streadway/amqp/client_test.go index be816bc3..23acc974 100644 --- a/vendor/github.com/streadway/amqp/client_test.go +++ b/vendor/github.com/streadway/amqp/client_test.go @@ -527,6 +527,50 @@ func TestPublishBodySliceIssue74(t *testing.T) { <-done } +// Should not panic when server and client have frame_size of 0 +func TestPublishZeroFrameSizeIssue161(t *testing.T) { + rwc, srv := newSession(t) + defer rwc.Close() + + const frameSize = 0 + const publishings = 1 + done := make(chan bool) + + go func() { + srv.connectionOpen() + srv.channelOpen(1) + + for i := 0; i < publishings; i++ { + srv.recv(1, &basicPublish{}) + } + + done <- true + }() + + cfg := defaultConfig() + cfg.FrameSize = frameSize + + c, err := Open(rwc, cfg) + + // override the tuned framesize with a hard 0, as would happen when rabbit is configured with 0 + c.Config.FrameSize = frameSize + + if err != nil { + t.Fatalf("could not create connection: %v (%s)", c, err) + } + + ch, err := c.Channel() + if err != nil { + t.Fatalf("could not open channel: %v (%s)", ch, err) + } + + for i := 0; i < publishings; i++ { + go ch.Publish("", "q", false, false, Publishing{Body: []byte("anything")}) + } + + <-done +} + func TestPublishAndShutdownDeadlockIssue84(t *testing.T) { rwc, srv := newSession(t) defer rwc.Close() diff --git a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go b/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go index 7dff6552..4b1105b6 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go @@ -22,20 +22,17 @@ const maxSessionKeySizeInBytes = 64 // 4880, section 5.3. type SymmetricKeyEncrypted struct { CipherFunc CipherFunction - Encrypted bool - Key []byte // Empty unless Encrypted is false. s2k func(out, in []byte) encryptedKey []byte } const symmetricKeyEncryptedVersion = 4 -func (ske *SymmetricKeyEncrypted) parse(r io.Reader) (err error) { +func (ske *SymmetricKeyEncrypted) parse(r io.Reader) error { // RFC 4880, section 5.3. var buf [2]byte - _, err = readFull(r, buf[:]) - if err != nil { - return + if _, err := readFull(r, buf[:]); err != nil { + return err } if buf[0] != symmetricKeyEncryptedVersion { return errors.UnsupportedError("SymmetricKeyEncrypted version") @@ -46,9 +43,10 @@ func (ske *SymmetricKeyEncrypted) parse(r io.Reader) (err error) { return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(buf[1]))) } + var err error ske.s2k, err = s2k.Parse(r) if err != nil { - return + return err } encryptedKey := make([]byte, maxSessionKeySizeInBytes) @@ -56,9 +54,9 @@ func (ske *SymmetricKeyEncrypted) parse(r io.Reader) (err error) { // out. If it exists then we limit it to maxSessionKeySizeInBytes. n, err := readFull(r, encryptedKey) if err != nil && err != io.ErrUnexpectedEOF { - return + return err } - err = nil + if n != 0 { if n == maxSessionKeySizeInBytes { return errors.UnsupportedError("oversized encrypted session key") @@ -66,42 +64,35 @@ func (ske *SymmetricKeyEncrypted) parse(r io.Reader) (err error) { ske.encryptedKey = encryptedKey[:n] } - ske.Encrypted = true - - return + return nil } -// Decrypt attempts to decrypt an encrypted session key. If it returns nil, -// ske.Key will contain the session key. -func (ske *SymmetricKeyEncrypted) Decrypt(passphrase []byte) error { - if !ske.Encrypted { - return nil - } - +// Decrypt attempts to decrypt an encrypted session key and returns the key and +// the cipher to use when decrypting a subsequent Symmetrically Encrypted Data +// packet. +func (ske *SymmetricKeyEncrypted) Decrypt(passphrase []byte) ([]byte, CipherFunction, error) { key := make([]byte, ske.CipherFunc.KeySize()) ske.s2k(key, passphrase) if len(ske.encryptedKey) == 0 { - ske.Key = key - } else { - // the IV is all zeros - iv := make([]byte, ske.CipherFunc.blockSize()) - c := cipher.NewCFBDecrypter(ske.CipherFunc.new(key), iv) - c.XORKeyStream(ske.encryptedKey, ske.encryptedKey) - ske.CipherFunc = CipherFunction(ske.encryptedKey[0]) - if ske.CipherFunc.blockSize() == 0 { - return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(ske.CipherFunc))) - } - ske.CipherFunc = CipherFunction(ske.encryptedKey[0]) - ske.Key = ske.encryptedKey[1:] - if len(ske.Key)%ske.CipherFunc.blockSize() != 0 { - ske.Key = nil - return errors.StructuralError("length of decrypted key not a multiple of block size") - } + return key, ske.CipherFunc, nil } - ske.Encrypted = false - return nil + // the IV is all zeros + iv := make([]byte, ske.CipherFunc.blockSize()) + c := cipher.NewCFBDecrypter(ske.CipherFunc.new(key), iv) + plaintextKey := make([]byte, len(ske.encryptedKey)) + c.XORKeyStream(plaintextKey, ske.encryptedKey) + cipherFunc := CipherFunction(plaintextKey[0]) + if cipherFunc.blockSize() == 0 { + return nil, ske.CipherFunc, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) + } + plaintextKey = plaintextKey[1:] + if l := len(plaintextKey); l == 0 || l%cipherFunc.blockSize() != 0 { + return nil, cipherFunc, errors.StructuralError("length of decrypted key not a multiple of block size") + } + + return plaintextKey, cipherFunc, nil } // SerializeSymmetricKeyEncrypted serializes a symmetric key packet to w. The diff --git a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted_test.go b/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted_test.go index dd983cb3..19538df7 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted_test.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted_test.go @@ -24,7 +24,7 @@ func TestSymmetricKeyEncrypted(t *testing.T) { t.Error("didn't find SymmetricKeyEncrypted packet") return } - err = ske.Decrypt([]byte("password")) + key, cipherFunc, err := ske.Decrypt([]byte("password")) if err != nil { t.Error(err) return @@ -40,7 +40,7 @@ func TestSymmetricKeyEncrypted(t *testing.T) { t.Error("didn't find SymmetricallyEncrypted packet") return } - r, err := se.Decrypt(ske.CipherFunc, ske.Key) + r, err := se.Decrypt(cipherFunc, key) if err != nil { t.Error(err) return @@ -64,8 +64,9 @@ const symmetricallyEncryptedContentsHex = "cb1062004d14c4df636f6e74656e74732e0a" func TestSerializeSymmetricKeyEncrypted(t *testing.T) { buf := bytes.NewBuffer(nil) passphrase := []byte("testing") + const cipherFunc = CipherAES128 config := &Config{ - DefaultCipher: CipherAES128, + DefaultCipher: cipherFunc, } key, err := SerializeSymmetricKeyEncrypted(buf, passphrase, config) @@ -85,18 +86,18 @@ func TestSerializeSymmetricKeyEncrypted(t *testing.T) { return } - if !ske.Encrypted { - t.Errorf("SKE not encrypted but should be") - } if ske.CipherFunc != config.DefaultCipher { t.Errorf("SKE cipher function is %d (expected %d)", ske.CipherFunc, config.DefaultCipher) } - err = ske.Decrypt(passphrase) + parsedKey, parsedCipherFunc, err := ske.Decrypt(passphrase) if err != nil { t.Errorf("failed to decrypt reparsed SKE: %s", err) return } - if !bytes.Equal(key, ske.Key) { - t.Errorf("keys don't match after Decrpyt: %x (original) vs %x (parsed)", key, ske.Key) + if !bytes.Equal(key, parsedKey) { + t.Errorf("keys don't match after Decrypt: %x (original) vs %x (parsed)", key, parsedKey) + } + if parsedCipherFunc != cipherFunc { + t.Errorf("cipher function doesn't match after Decrypt: %d (original) vs %d (parsed)", cipherFunc, parsedCipherFunc) } } diff --git a/vendor/golang.org/x/crypto/openpgp/read.go b/vendor/golang.org/x/crypto/openpgp/read.go index a6cecc52..dfffc398 100644 --- a/vendor/golang.org/x/crypto/openpgp/read.go +++ b/vendor/golang.org/x/crypto/openpgp/read.go @@ -196,9 +196,9 @@ FindKey: // Try the symmetric passphrase first if len(symKeys) != 0 && passphrase != nil { for _, s := range symKeys { - err = s.Decrypt(passphrase) - if err == nil && !s.Encrypted { - decrypted, err = se.Decrypt(s.CipherFunc, s.Key) + key, cipherFunc, err := s.Decrypt(passphrase) + if err == nil { + decrypted, err = se.Decrypt(cipherFunc, key) if err != nil && err != errors.ErrKeyIncorrect { return nil, err } diff --git a/vendor/golang.org/x/crypto/openpgp/read_test.go b/vendor/golang.org/x/crypto/openpgp/read_test.go index 52f942c7..7524a02e 100644 --- a/vendor/golang.org/x/crypto/openpgp/read_test.go +++ b/vendor/golang.org/x/crypto/openpgp/read_test.go @@ -243,7 +243,7 @@ func TestUnspecifiedRecipient(t *testing.T) { } func TestSymmetricallyEncrypted(t *testing.T) { - expected := "Symmetrically encrypted.\n" + firstTimeCalled := true prompt := func(keys []Key, symmetric bool) ([]byte, error) { if len(keys) != 0 { @@ -254,6 +254,11 @@ func TestSymmetricallyEncrypted(t *testing.T) { t.Errorf("symmetric is not set") } + if firstTimeCalled { + firstTimeCalled = false + return []byte("wrongpassword"), nil + } + return []byte("password"), nil } @@ -273,6 +278,7 @@ func TestSymmetricallyEncrypted(t *testing.T) { t.Errorf("LiteralData.Time is %d, want %d", md.LiteralData.Time, expectedCreationTime) } + const expected = "Symmetrically encrypted.\n" if string(contents) != expected { t.Errorf("contents got: %s want: %s", string(contents), expected) } diff --git a/vendor/golang.org/x/crypto/otr/otr.go b/vendor/golang.org/x/crypto/otr/otr.go index 0d18a60d..f872a9d7 100644 --- a/vendor/golang.org/x/crypto/otr/otr.go +++ b/vendor/golang.org/x/crypto/otr/otr.go @@ -417,12 +417,11 @@ func (c *Conversation) Receive(in []byte) (out []byte, encrypted bool, change Se change = SMPSecretNeeded c.smp.saved = &inTLV return - } else if err == smpFailureError { + } + if err == smpFailureError { err = nil change = SMPFailed - return - } - if complete { + } else if complete { change = SMPComplete } if reply.typ != 0 { diff --git a/vendor/golang.org/x/crypto/pkcs12/bmp-string.go b/vendor/golang.org/x/crypto/pkcs12/bmp-string.go new file mode 100644 index 00000000..284d2a68 --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/bmp-string.go @@ -0,0 +1,50 @@ +// Copyright 2015 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 pkcs12 + +import ( + "errors" + "unicode/utf16" +) + +// bmpString returns s encoded in UCS-2 with a zero terminator. +func bmpString(s string) ([]byte, error) { + // References: + // https://tools.ietf.org/html/rfc7292#appendix-B.1 + // http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane + // - non-BMP characters are encoded in UTF 16 by using a surrogate pair of 16-bit codes + // EncodeRune returns 0xfffd if the rune does not need special encoding + // - the above RFC provides the info that BMPStrings are NULL terminated. + + ret := make([]byte, 0, 2*len(s)+2) + + for _, r := range s { + if t, _ := utf16.EncodeRune(r); t != 0xfffd { + return nil, errors.New("pkcs12: string contains characters that cannot be encoded in UCS-2") + } + ret = append(ret, byte(r/256), byte(r%256)) + } + + return append(ret, 0, 0), nil +} + +func decodeBMPString(bmpString []byte) (string, error) { + if len(bmpString)%2 != 0 { + return "", errors.New("pkcs12: odd-length BMP string") + } + + // strip terminator if present + if l := len(bmpString); l >= 2 && bmpString[l-1] == 0 && bmpString[l-2] == 0 { + bmpString = bmpString[:l-2] + } + + s := make([]uint16, 0, len(bmpString)/2) + for len(bmpString) > 0 { + s = append(s, uint16(bmpString[0])<<8+uint16(bmpString[1])) + bmpString = bmpString[2:] + } + + return string(utf16.Decode(s)), nil +} diff --git a/vendor/golang.org/x/crypto/pkcs12/bmp-string_test.go b/vendor/golang.org/x/crypto/pkcs12/bmp-string_test.go new file mode 100644 index 00000000..7fca55f4 --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/bmp-string_test.go @@ -0,0 +1,63 @@ +// Copyright 2015 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 pkcs12 + +import ( + "bytes" + "encoding/hex" + "testing" +) + +var bmpStringTests = []struct { + in string + expectedHex string + shouldFail bool +}{ + {"", "0000", false}, + // Example from https://tools.ietf.org/html/rfc7292#appendix-B. + {"Beavis", "0042006500610076006900730000", false}, + // Some characters from the "Letterlike Symbols Unicode block". + {"\u2115 - Double-struck N", "21150020002d00200044006f00750062006c0065002d00730074007200750063006b0020004e0000", false}, + // any character outside the BMP should trigger an error. + {"\U0001f000 East wind (Mahjong)", "", true}, +} + +func TestBMPString(t *testing.T) { + for i, test := range bmpStringTests { + expected, err := hex.DecodeString(test.expectedHex) + if err != nil { + t.Fatalf("#%d: failed to decode expectation", i) + } + + out, err := bmpString(test.in) + if err == nil && test.shouldFail { + t.Errorf("#%d: expected to fail, but produced %x", i, out) + continue + } + + if err != nil && !test.shouldFail { + t.Errorf("#%d: failed unexpectedly: %s", i, err) + continue + } + + if !test.shouldFail { + if !bytes.Equal(out, expected) { + t.Errorf("#%d: expected %s, got %x", i, test.expectedHex, out) + continue + } + + roundTrip, err := decodeBMPString(out) + if err != nil { + t.Errorf("#%d: decoding output gave an error: %s", i, err) + continue + } + + if roundTrip != test.in { + t.Errorf("#%d: decoding output resulted in %q, but it should have been %q", i, roundTrip, test.in) + continue + } + } + } +} diff --git a/vendor/golang.org/x/crypto/pkcs12/crypto.go b/vendor/golang.org/x/crypto/pkcs12/crypto.go new file mode 100644 index 00000000..4bd4470e --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/crypto.go @@ -0,0 +1,131 @@ +// Copyright 2015 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 pkcs12 + +import ( + "bytes" + "crypto/cipher" + "crypto/des" + "crypto/x509/pkix" + "encoding/asn1" + "errors" + + "golang.org/x/crypto/pkcs12/internal/rc2" +) + +var ( + oidPBEWithSHAAnd3KeyTripleDESCBC = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 1, 3}) + oidPBEWithSHAAnd40BitRC2CBC = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 1, 6}) +) + +// pbeCipher is an abstraction of a PKCS#12 cipher. +type pbeCipher interface { + // create returns a cipher.Block given a key. + create(key []byte) (cipher.Block, error) + // deriveKey returns a key derived from the given password and salt. + deriveKey(salt, password []byte, iterations int) []byte + // deriveKey returns an IV derived from the given password and salt. + deriveIV(salt, password []byte, iterations int) []byte +} + +type shaWithTripleDESCBC struct{} + +func (shaWithTripleDESCBC) create(key []byte) (cipher.Block, error) { + return des.NewTripleDESCipher(key) +} + +func (shaWithTripleDESCBC) deriveKey(salt, password []byte, iterations int) []byte { + return pbkdf(sha1Sum, 20, 64, salt, password, iterations, 1, 24) +} + +func (shaWithTripleDESCBC) deriveIV(salt, password []byte, iterations int) []byte { + return pbkdf(sha1Sum, 20, 64, salt, password, iterations, 2, 8) +} + +type shaWith40BitRC2CBC struct{} + +func (shaWith40BitRC2CBC) create(key []byte) (cipher.Block, error) { + return rc2.New(key, len(key)*8) +} + +func (shaWith40BitRC2CBC) deriveKey(salt, password []byte, iterations int) []byte { + return pbkdf(sha1Sum, 20, 64, salt, password, iterations, 1, 5) +} + +func (shaWith40BitRC2CBC) deriveIV(salt, password []byte, iterations int) []byte { + return pbkdf(sha1Sum, 20, 64, salt, password, iterations, 2, 8) +} + +type pbeParams struct { + Salt []byte + Iterations int +} + +func pbDecrypterFor(algorithm pkix.AlgorithmIdentifier, password []byte) (cipher.BlockMode, int, error) { + var cipherType pbeCipher + + switch { + case algorithm.Algorithm.Equal(oidPBEWithSHAAnd3KeyTripleDESCBC): + cipherType = shaWithTripleDESCBC{} + case algorithm.Algorithm.Equal(oidPBEWithSHAAnd40BitRC2CBC): + cipherType = shaWith40BitRC2CBC{} + default: + return nil, 0, NotImplementedError("algorithm " + algorithm.Algorithm.String() + " is not supported") + } + + var params pbeParams + if err := unmarshal(algorithm.Parameters.FullBytes, ¶ms); err != nil { + return nil, 0, err + } + + key := cipherType.deriveKey(params.Salt, password, params.Iterations) + iv := cipherType.deriveIV(params.Salt, password, params.Iterations) + + block, err := cipherType.create(key) + if err != nil { + return nil, 0, err + } + + return cipher.NewCBCDecrypter(block, iv), block.BlockSize(), nil +} + +func pbDecrypt(info decryptable, password []byte) (decrypted []byte, err error) { + cbc, blockSize, err := pbDecrypterFor(info.Algorithm(), password) + if err != nil { + return nil, err + } + + encrypted := info.Data() + if len(encrypted) == 0 { + return nil, errors.New("pkcs12: empty encrypted data") + } + if len(encrypted)%blockSize != 0 { + return nil, errors.New("pkcs12: input is not a multiple of the block size") + } + decrypted = make([]byte, len(encrypted)) + cbc.CryptBlocks(decrypted, encrypted) + + psLen := int(decrypted[len(decrypted)-1]) + if psLen == 0 || psLen > blockSize { + return nil, ErrDecryption + } + + if len(decrypted) < psLen { + return nil, ErrDecryption + } + ps := decrypted[len(decrypted)-psLen:] + decrypted = decrypted[:len(decrypted)-psLen] + if bytes.Compare(ps, bytes.Repeat([]byte{byte(psLen)}, psLen)) != 0 { + return nil, ErrDecryption + } + + return +} + +// decryptable abstracts a object that contains ciphertext. +type decryptable interface { + Algorithm() pkix.AlgorithmIdentifier + Data() []byte +} diff --git a/vendor/golang.org/x/crypto/pkcs12/crypto_test.go b/vendor/golang.org/x/crypto/pkcs12/crypto_test.go new file mode 100644 index 00000000..eb4dae8f --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/crypto_test.go @@ -0,0 +1,125 @@ +// Copyright 2015 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 pkcs12 + +import ( + "bytes" + "crypto/x509/pkix" + "encoding/asn1" + "testing" +) + +var sha1WithTripleDES = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 1, 3}) + +func TestPbDecrypterFor(t *testing.T) { + params, _ := asn1.Marshal(pbeParams{ + Salt: []byte{1, 2, 3, 4, 5, 6, 7, 8}, + Iterations: 2048, + }) + alg := pkix.AlgorithmIdentifier{ + Algorithm: asn1.ObjectIdentifier([]int{1, 2, 3}), + Parameters: asn1.RawValue{ + FullBytes: params, + }, + } + + pass, _ := bmpString("Sesame open") + + _, _, err := pbDecrypterFor(alg, pass) + if _, ok := err.(NotImplementedError); !ok { + t.Errorf("expected not implemented error, got: %T %s", err, err) + } + + alg.Algorithm = sha1WithTripleDES + cbc, blockSize, err := pbDecrypterFor(alg, pass) + if err != nil { + t.Errorf("unexpected error from pbDecrypterFor %v", err) + } + if blockSize != 8 { + t.Errorf("unexpected block size %d, wanted 8", blockSize) + } + + plaintext := []byte{1, 2, 3, 4, 5, 6, 7, 8} + expectedCiphertext := []byte{185, 73, 135, 249, 137, 1, 122, 247} + ciphertext := make([]byte, len(plaintext)) + cbc.CryptBlocks(ciphertext, plaintext) + + if bytes.Compare(ciphertext, expectedCiphertext) != 0 { + t.Errorf("bad ciphertext, got %x but wanted %x", ciphertext, expectedCiphertext) + } +} + +var pbDecryptTests = []struct { + in []byte + expected []byte + expectedError error +}{ + { + []byte("\x33\x73\xf3\x9f\xda\x49\xae\xfc\xa0\x9a\xdf\x5a\x58\xa0\xea\x46"), // 7 padding bytes + []byte("A secret!"), + nil, + }, + { + []byte("\x33\x73\xf3\x9f\xda\x49\xae\xfc\x96\x24\x2f\x71\x7e\x32\x3f\xe7"), // 8 padding bytes + []byte("A secret"), + nil, + }, + { + []byte("\x35\x0c\xc0\x8d\xab\xa9\x5d\x30\x7f\x9a\xec\x6a\xd8\x9b\x9c\xd9"), // 9 padding bytes, incorrect + nil, + ErrDecryption, + }, + { + []byte("\xb2\xf9\x6e\x06\x60\xae\x20\xcf\x08\xa0\x7b\xd9\x6b\x20\xef\x41"), // incorrect padding bytes: [ ... 0x04 0x02 ] + nil, + ErrDecryption, + }, +} + +func TestPbDecrypt(t *testing.T) { + for i, test := range pbDecryptTests { + decryptable := testDecryptable{ + data: test.in, + algorithm: pkix.AlgorithmIdentifier{ + Algorithm: sha1WithTripleDES, + Parameters: pbeParams{ + Salt: []byte("\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8"), + Iterations: 4096, + }.RawASN1(), + }, + } + password, _ := bmpString("sesame") + + plaintext, err := pbDecrypt(decryptable, password) + if err != test.expectedError { + t.Errorf("#%d: got error %q, but wanted %q", i, err, test.expectedError) + continue + } + + if !bytes.Equal(plaintext, test.expected) { + t.Errorf("#%d: got %x, but wanted %x", i, plaintext, test.expected) + } + } +} + +type testDecryptable struct { + data []byte + algorithm pkix.AlgorithmIdentifier +} + +func (d testDecryptable) Algorithm() pkix.AlgorithmIdentifier { return d.algorithm } +func (d testDecryptable) Data() []byte { return d.data } + +func (params pbeParams) RawASN1() (raw asn1.RawValue) { + asn1Bytes, err := asn1.Marshal(params) + if err != nil { + panic(err) + } + _, err = asn1.Unmarshal(asn1Bytes, &raw) + if err != nil { + panic(err) + } + return +} diff --git a/vendor/golang.org/x/crypto/pkcs12/errors.go b/vendor/golang.org/x/crypto/pkcs12/errors.go new file mode 100644 index 00000000..7377ce6f --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/errors.go @@ -0,0 +1,23 @@ +// Copyright 2015 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 pkcs12 + +import "errors" + +var ( + // ErrDecryption represents a failure to decrypt the input. + ErrDecryption = errors.New("pkcs12: decryption error, incorrect padding") + + // ErrIncorrectPassword is returned when an incorrect password is detected. + // Usually, P12/PFX data is signed to be able to verify the password. + ErrIncorrectPassword = errors.New("pkcs12: decryption password incorrect") +) + +// NotImplementedError indicates that the input is not currently supported. +type NotImplementedError string + +func (e NotImplementedError) Error() string { + return "pkcs12: " + string(e) +} diff --git a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/bench_test.go b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/bench_test.go new file mode 100644 index 00000000..3347f338 --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/bench_test.go @@ -0,0 +1,27 @@ +// Copyright 2015 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 rc2 + +import ( + "testing" +) + +func BenchmarkEncrypt(b *testing.B) { + r, _ := New([]byte{0, 0, 0, 0, 0, 0, 0, 0}, 64) + b.ResetTimer() + var src [8]byte + for i := 0; i < b.N; i++ { + r.Encrypt(src[:], src[:]) + } +} + +func BenchmarkDecrypt(b *testing.B) { + r, _ := New([]byte{0, 0, 0, 0, 0, 0, 0, 0}, 64) + b.ResetTimer() + var src [8]byte + for i := 0; i < b.N; i++ { + r.Decrypt(src[:], src[:]) + } +} diff --git a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2.go b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2.go new file mode 100644 index 00000000..8c709025 --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2.go @@ -0,0 +1,274 @@ +// Copyright 2015 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 rc2 implements the RC2 cipher +/* +https://www.ietf.org/rfc/rfc2268.txt +http://people.csail.mit.edu/rivest/pubs/KRRR98.pdf + +This code is licensed under the MIT license. +*/ +package rc2 + +import ( + "crypto/cipher" + "encoding/binary" +) + +// The rc2 block size in bytes +const BlockSize = 8 + +type rc2Cipher struct { + k [64]uint16 +} + +// New returns a new rc2 cipher with the given key and effective key length t1 +func New(key []byte, t1 int) (cipher.Block, error) { + // TODO(dgryski): error checking for key length + return &rc2Cipher{ + k: expandKey(key, t1), + }, nil +} + +func (*rc2Cipher) BlockSize() int { return BlockSize } + +var piTable = [256]byte{ + 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, + 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, + 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32, + 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, + 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, + 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, + 0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x03, + 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, + 0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, + 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec, + 0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, + 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, + 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, + 0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9, + 0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, + 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0x0a, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad, +} + +func expandKey(key []byte, t1 int) [64]uint16 { + + l := make([]byte, 128) + copy(l, key) + + var t = len(key) + var t8 = (t1 + 7) / 8 + var tm = byte(255 % uint(1<<(8+uint(t1)-8*uint(t8)))) + + for i := len(key); i < 128; i++ { + l[i] = piTable[l[i-1]+l[uint8(i-t)]] + } + + l[128-t8] = piTable[l[128-t8]&tm] + + for i := 127 - t8; i >= 0; i-- { + l[i] = piTable[l[i+1]^l[i+t8]] + } + + var k [64]uint16 + + for i := range k { + k[i] = uint16(l[2*i]) + uint16(l[2*i+1])*256 + } + + return k +} + +func rotl16(x uint16, b uint) uint16 { + return (x >> (16 - b)) | (x << b) +} + +func (c *rc2Cipher) Encrypt(dst, src []byte) { + + r0 := binary.LittleEndian.Uint16(src[0:]) + r1 := binary.LittleEndian.Uint16(src[2:]) + r2 := binary.LittleEndian.Uint16(src[4:]) + r3 := binary.LittleEndian.Uint16(src[6:]) + + var j int + + for j <= 16 { + // mix r0 + r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1) + r0 = rotl16(r0, 1) + j++ + + // mix r1 + r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2) + r1 = rotl16(r1, 2) + j++ + + // mix r2 + r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3) + r2 = rotl16(r2, 3) + j++ + + // mix r3 + r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0) + r3 = rotl16(r3, 5) + j++ + + } + + r0 = r0 + c.k[r3&63] + r1 = r1 + c.k[r0&63] + r2 = r2 + c.k[r1&63] + r3 = r3 + c.k[r2&63] + + for j <= 40 { + + // mix r0 + r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1) + r0 = rotl16(r0, 1) + j++ + + // mix r1 + r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2) + r1 = rotl16(r1, 2) + j++ + + // mix r2 + r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3) + r2 = rotl16(r2, 3) + j++ + + // mix r3 + r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0) + r3 = rotl16(r3, 5) + j++ + + } + + r0 = r0 + c.k[r3&63] + r1 = r1 + c.k[r0&63] + r2 = r2 + c.k[r1&63] + r3 = r3 + c.k[r2&63] + + for j <= 60 { + + // mix r0 + r0 = r0 + c.k[j] + (r3 & r2) + ((^r3) & r1) + r0 = rotl16(r0, 1) + j++ + + // mix r1 + r1 = r1 + c.k[j] + (r0 & r3) + ((^r0) & r2) + r1 = rotl16(r1, 2) + j++ + + // mix r2 + r2 = r2 + c.k[j] + (r1 & r0) + ((^r1) & r3) + r2 = rotl16(r2, 3) + j++ + + // mix r3 + r3 = r3 + c.k[j] + (r2 & r1) + ((^r2) & r0) + r3 = rotl16(r3, 5) + j++ + } + + binary.LittleEndian.PutUint16(dst[0:], r0) + binary.LittleEndian.PutUint16(dst[2:], r1) + binary.LittleEndian.PutUint16(dst[4:], r2) + binary.LittleEndian.PutUint16(dst[6:], r3) +} + +func (c *rc2Cipher) Decrypt(dst, src []byte) { + + r0 := binary.LittleEndian.Uint16(src[0:]) + r1 := binary.LittleEndian.Uint16(src[2:]) + r2 := binary.LittleEndian.Uint16(src[4:]) + r3 := binary.LittleEndian.Uint16(src[6:]) + + j := 63 + + for j >= 44 { + // unmix r3 + r3 = rotl16(r3, 16-5) + r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0) + j-- + + // unmix r2 + r2 = rotl16(r2, 16-3) + r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3) + j-- + + // unmix r1 + r1 = rotl16(r1, 16-2) + r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2) + j-- + + // unmix r0 + r0 = rotl16(r0, 16-1) + r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1) + j-- + } + + r3 = r3 - c.k[r2&63] + r2 = r2 - c.k[r1&63] + r1 = r1 - c.k[r0&63] + r0 = r0 - c.k[r3&63] + + for j >= 20 { + // unmix r3 + r3 = rotl16(r3, 16-5) + r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0) + j-- + + // unmix r2 + r2 = rotl16(r2, 16-3) + r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3) + j-- + + // unmix r1 + r1 = rotl16(r1, 16-2) + r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2) + j-- + + // unmix r0 + r0 = rotl16(r0, 16-1) + r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1) + j-- + + } + + r3 = r3 - c.k[r2&63] + r2 = r2 - c.k[r1&63] + r1 = r1 - c.k[r0&63] + r0 = r0 - c.k[r3&63] + + for j >= 0 { + + // unmix r3 + r3 = rotl16(r3, 16-5) + r3 = r3 - c.k[j] - (r2 & r1) - ((^r2) & r0) + j-- + + // unmix r2 + r2 = rotl16(r2, 16-3) + r2 = r2 - c.k[j] - (r1 & r0) - ((^r1) & r3) + j-- + + // unmix r1 + r1 = rotl16(r1, 16-2) + r1 = r1 - c.k[j] - (r0 & r3) - ((^r0) & r2) + j-- + + // unmix r0 + r0 = rotl16(r0, 16-1) + r0 = r0 - c.k[j] - (r3 & r2) - ((^r3) & r1) + j-- + + } + + binary.LittleEndian.PutUint16(dst[0:], r0) + binary.LittleEndian.PutUint16(dst[2:], r1) + binary.LittleEndian.PutUint16(dst[4:], r2) + binary.LittleEndian.PutUint16(dst[6:], r3) +} diff --git a/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2_test.go b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2_test.go new file mode 100644 index 00000000..8a49dfaf --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2_test.go @@ -0,0 +1,93 @@ +// Copyright 2015 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 rc2 + +import ( + "bytes" + "encoding/hex" + "testing" +) + +func TestEncryptDecrypt(t *testing.T) { + + // TODO(dgryski): add the rest of the test vectors from the RFC + var tests = []struct { + key string + plain string + cipher string + t1 int + }{ + { + "0000000000000000", + "0000000000000000", + "ebb773f993278eff", + 63, + }, + { + "ffffffffffffffff", + "ffffffffffffffff", + "278b27e42e2f0d49", + 64, + }, + { + "3000000000000000", + "1000000000000001", + "30649edf9be7d2c2", + 64, + }, + { + "88", + "0000000000000000", + "61a8a244adacccf0", + 64, + }, + { + "88bca90e90875a", + "0000000000000000", + "6ccf4308974c267f", + 64, + }, + { + "88bca90e90875a7f0f79c384627bafb2", + "0000000000000000", + "1a807d272bbe5db1", + 64, + }, + { + "88bca90e90875a7f0f79c384627bafb2", + "0000000000000000", + "2269552ab0f85ca6", + 128, + }, + { + "88bca90e90875a7f0f79c384627bafb216f80a6f85920584c42fceb0be255daf1e", + "0000000000000000", + "5b78d3a43dfff1f1", + 129, + }, + } + + for _, tt := range tests { + k, _ := hex.DecodeString(tt.key) + p, _ := hex.DecodeString(tt.plain) + c, _ := hex.DecodeString(tt.cipher) + + b, _ := New(k, tt.t1) + + var dst [8]byte + + b.Encrypt(dst[:], p) + + if !bytes.Equal(dst[:], c) { + t.Errorf("encrypt failed: got % 2x wanted % 2x\n", dst, c) + } + + b.Decrypt(dst[:], c) + + if !bytes.Equal(dst[:], p) { + t.Errorf("decrypt failed: got % 2x wanted % 2x\n", dst, p) + } + } +} diff --git a/vendor/golang.org/x/crypto/pkcs12/mac.go b/vendor/golang.org/x/crypto/pkcs12/mac.go new file mode 100644 index 00000000..5f38aa7d --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/mac.go @@ -0,0 +1,45 @@ +// Copyright 2015 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 pkcs12 + +import ( + "crypto/hmac" + "crypto/sha1" + "crypto/x509/pkix" + "encoding/asn1" +) + +type macData struct { + Mac digestInfo + MacSalt []byte + Iterations int `asn1:"optional,default:1"` +} + +// from PKCS#7: +type digestInfo struct { + Algorithm pkix.AlgorithmIdentifier + Digest []byte +} + +var ( + oidSHA1 = asn1.ObjectIdentifier([]int{1, 3, 14, 3, 2, 26}) +) + +func verifyMac(macData *macData, message, password []byte) error { + if !macData.Mac.Algorithm.Algorithm.Equal(oidSHA1) { + return NotImplementedError("unknown digest algorithm: " + macData.Mac.Algorithm.Algorithm.String()) + } + + key := pbkdf(sha1Sum, 20, 64, macData.MacSalt, password, macData.Iterations, 3, 20) + + mac := hmac.New(sha1.New, key) + mac.Write(message) + expectedMAC := mac.Sum(nil) + + if !hmac.Equal(macData.Mac.Digest, expectedMAC) { + return ErrIncorrectPassword + } + return nil +} diff --git a/vendor/golang.org/x/crypto/pkcs12/mac_test.go b/vendor/golang.org/x/crypto/pkcs12/mac_test.go new file mode 100644 index 00000000..1ed4ff21 --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/mac_test.go @@ -0,0 +1,42 @@ +// Copyright 2015 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 pkcs12 + +import ( + "encoding/asn1" + "testing" +) + +func TestVerifyMac(t *testing.T) { + td := macData{ + Mac: digestInfo{ + Digest: []byte{0x18, 0x20, 0x3d, 0xff, 0x1e, 0x16, 0xf4, 0x92, 0xf2, 0xaf, 0xc8, 0x91, 0xa9, 0xba, 0xd6, 0xca, 0x9d, 0xee, 0x51, 0x93}, + }, + MacSalt: []byte{1, 2, 3, 4, 5, 6, 7, 8}, + Iterations: 2048, + } + + message := []byte{11, 12, 13, 14, 15} + password, _ := bmpString("") + + td.Mac.Algorithm.Algorithm = asn1.ObjectIdentifier([]int{1, 2, 3}) + err := verifyMac(&td, message, password) + if _, ok := err.(NotImplementedError); !ok { + t.Errorf("err: %v", err) + } + + td.Mac.Algorithm.Algorithm = asn1.ObjectIdentifier([]int{1, 3, 14, 3, 2, 26}) + err = verifyMac(&td, message, password) + if err != ErrIncorrectPassword { + t.Errorf("Expected incorrect password, got err: %v", err) + } + + password, _ = bmpString("Sesame open") + err = verifyMac(&td, message, password) + if err != nil { + t.Errorf("err: %v", err) + } + +} diff --git a/vendor/golang.org/x/crypto/pkcs12/pbkdf.go b/vendor/golang.org/x/crypto/pkcs12/pbkdf.go new file mode 100644 index 00000000..5c419d41 --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/pbkdf.go @@ -0,0 +1,170 @@ +// Copyright 2015 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 pkcs12 + +import ( + "bytes" + "crypto/sha1" + "math/big" +) + +var ( + one = big.NewInt(1) +) + +// sha1Sum returns the SHA-1 hash of in. +func sha1Sum(in []byte) []byte { + sum := sha1.Sum(in) + return sum[:] +} + +// fillWithRepeats returns v*ceiling(len(pattern) / v) bytes consisting of +// repeats of pattern. +func fillWithRepeats(pattern []byte, v int) []byte { + if len(pattern) == 0 { + return nil + } + outputLen := v * ((len(pattern) + v - 1) / v) + return bytes.Repeat(pattern, (outputLen+len(pattern)-1)/len(pattern))[:outputLen] +} + +func pbkdf(hash func([]byte) []byte, u, v int, salt, password []byte, r int, ID byte, size int) (key []byte) { + // implementation of https://tools.ietf.org/html/rfc7292#appendix-B.2 , RFC text verbatim in comments + + // Let H be a hash function built around a compression function f: + + // Z_2^u x Z_2^v -> Z_2^u + + // (that is, H has a chaining variable and output of length u bits, and + // the message input to the compression function of H is v bits). The + // values for u and v are as follows: + + // HASH FUNCTION VALUE u VALUE v + // MD2, MD5 128 512 + // SHA-1 160 512 + // SHA-224 224 512 + // SHA-256 256 512 + // SHA-384 384 1024 + // SHA-512 512 1024 + // SHA-512/224 224 1024 + // SHA-512/256 256 1024 + + // Furthermore, let r be the iteration count. + + // We assume here that u and v are both multiples of 8, as are the + // lengths of the password and salt strings (which we denote by p and s, + // respectively) and the number n of pseudorandom bits required. In + // addition, u and v are of course non-zero. + + // For information on security considerations for MD5 [19], see [25] and + // [1], and on those for MD2, see [18]. + + // The following procedure can be used to produce pseudorandom bits for + // a particular "purpose" that is identified by a byte called "ID". + // This standard specifies 3 different values for the ID byte: + + // 1. If ID=1, then the pseudorandom bits being produced are to be used + // as key material for performing encryption or decryption. + + // 2. If ID=2, then the pseudorandom bits being produced are to be used + // as an IV (Initial Value) for encryption or decryption. + + // 3. If ID=3, then the pseudorandom bits being produced are to be used + // as an integrity key for MACing. + + // 1. Construct a string, D (the "diversifier"), by concatenating v/8 + // copies of ID. + var D []byte + for i := 0; i < v; i++ { + D = append(D, ID) + } + + // 2. Concatenate copies of the salt together to create a string S of + // length v(ceiling(s/v)) bits (the final copy of the salt may be + // truncated to create S). Note that if the salt is the empty + // string, then so is S. + + S := fillWithRepeats(salt, v) + + // 3. Concatenate copies of the password together to create a string P + // of length v(ceiling(p/v)) bits (the final copy of the password + // may be truncated to create P). Note that if the password is the + // empty string, then so is P. + + P := fillWithRepeats(password, v) + + // 4. Set I=S||P to be the concatenation of S and P. + I := append(S, P...) + + // 5. Set c=ceiling(n/u). + c := (size + u - 1) / u + + // 6. For i=1, 2, ..., c, do the following: + A := make([]byte, c*20) + var IjBuf []byte + for i := 0; i < c; i++ { + // A. Set A2=H^r(D||I). (i.e., the r-th hash of D||1, + // H(H(H(... H(D||I)))) + Ai := hash(append(D, I...)) + for j := 1; j < r; j++ { + Ai = hash(Ai) + } + copy(A[i*20:], Ai[:]) + + if i < c-1 { // skip on last iteration + // B. Concatenate copies of Ai to create a string B of length v + // bits (the final copy of Ai may be truncated to create B). + var B []byte + for len(B) < v { + B = append(B, Ai[:]...) + } + B = B[:v] + + // C. Treating I as a concatenation I_0, I_1, ..., I_(k-1) of v-bit + // blocks, where k=ceiling(s/v)+ceiling(p/v), modify I by + // setting I_j=(I_j+B+1) mod 2^v for each j. + { + Bbi := new(big.Int).SetBytes(B) + Ij := new(big.Int) + + for j := 0; j < len(I)/v; j++ { + Ij.SetBytes(I[j*v : (j+1)*v]) + Ij.Add(Ij, Bbi) + Ij.Add(Ij, one) + Ijb := Ij.Bytes() + // We expect Ijb to be exactly v bytes, + // if it is longer or shorter we must + // adjust it accordingly. + if len(Ijb) > v { + Ijb = Ijb[len(Ijb)-v:] + } + if len(Ijb) < v { + if IjBuf == nil { + IjBuf = make([]byte, v) + } + bytesShort := v - len(Ijb) + for i := 0; i < bytesShort; i++ { + IjBuf[i] = 0 + } + copy(IjBuf[bytesShort:], Ijb) + Ijb = IjBuf + } + copy(I[j*v:(j+1)*v], Ijb) + } + } + } + } + // 7. Concatenate A_1, A_2, ..., A_c together to form a pseudorandom + // bit string, A. + + // 8. Use the first n bits of A as the output of this entire process. + return A[:size] + + // If the above process is being used to generate a DES key, the process + // should be used to create 64 random bits, and the key's parity bits + // should be set after the 64 bits have been produced. Similar concerns + // hold for 2-key and 3-key triple-DES keys, for CDMF keys, and for any + // similar keys with parity bits "built into them". +} diff --git a/vendor/golang.org/x/crypto/pkcs12/pbkdf_test.go b/vendor/golang.org/x/crypto/pkcs12/pbkdf_test.go new file mode 100644 index 00000000..262037d7 --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/pbkdf_test.go @@ -0,0 +1,34 @@ +// Copyright 2015 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 pkcs12 + +import ( + "bytes" + "testing" +) + +func TestThatPBKDFWorksCorrectlyForLongKeys(t *testing.T) { + cipherInfo := shaWithTripleDESCBC{} + + salt := []byte("\xff\xff\xff\xff\xff\xff\xff\xff") + password, _ := bmpString("sesame") + key := cipherInfo.deriveKey(salt, password, 2048) + + if expected := []byte("\x7c\xd9\xfd\x3e\x2b\x3b\xe7\x69\x1a\x44\xe3\xbe\xf0\xf9\xea\x0f\xb9\xb8\x97\xd4\xe3\x25\xd9\xd1"); bytes.Compare(key, expected) != 0 { + t.Fatalf("expected key '%x', but found '%x'", expected, key) + } +} + +func TestThatPBKDFHandlesLeadingZeros(t *testing.T) { + // This test triggers a case where I_j (in step 6C) ends up with leading zero + // byte, meaning that len(Ijb) < v (leading zeros get stripped by big.Int). + // This was previously causing bug whereby certain inputs would break the + // derivation and produce the wrong output. + key := pbkdf(sha1Sum, 20, 64, []byte("\xf3\x7e\x05\xb5\x18\x32\x4b\x4b"), []byte("\x00\x00"), 2048, 1, 24) + expected := []byte("\x00\xf7\x59\xff\x47\xd1\x4d\xd0\x36\x65\xd5\x94\x3c\xb3\xc4\xa3\x9a\x25\x55\xc0\x2a\xed\x66\xe1") + if bytes.Compare(key, expected) != 0 { + t.Fatalf("expected key '%x', but found '%x'", expected, key) + } +} diff --git a/vendor/golang.org/x/crypto/pkcs12/pkcs12.go b/vendor/golang.org/x/crypto/pkcs12/pkcs12.go new file mode 100644 index 00000000..e8e17998 --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/pkcs12.go @@ -0,0 +1,342 @@ +// Copyright 2015 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 pkcs12 implements some of PKCS#12. +// +// This implementation is distilled from https://tools.ietf.org/html/rfc7292 +// and referenced documents. It is intended for decoding P12/PFX-stored +// certificates and keys for use with the crypto/tls package. +package pkcs12 + +import ( + "crypto/ecdsa" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "encoding/asn1" + "encoding/hex" + "encoding/pem" + "errors" +) + +var ( + oidDataContentType = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 7, 1}) + oidEncryptedDataContentType = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 7, 6}) + + oidFriendlyName = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 9, 20}) + oidLocalKeyID = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 9, 21}) + oidMicrosoftCSPName = asn1.ObjectIdentifier([]int{1, 3, 6, 1, 4, 1, 311, 17, 1}) +) + +type pfxPdu struct { + Version int + AuthSafe contentInfo + MacData macData `asn1:"optional"` +} + +type contentInfo struct { + ContentType asn1.ObjectIdentifier + Content asn1.RawValue `asn1:"tag:0,explicit,optional"` +} + +type encryptedData struct { + Version int + EncryptedContentInfo encryptedContentInfo +} + +type encryptedContentInfo struct { + ContentType asn1.ObjectIdentifier + ContentEncryptionAlgorithm pkix.AlgorithmIdentifier + EncryptedContent []byte `asn1:"tag:0,optional"` +} + +func (i encryptedContentInfo) Algorithm() pkix.AlgorithmIdentifier { + return i.ContentEncryptionAlgorithm +} + +func (i encryptedContentInfo) Data() []byte { return i.EncryptedContent } + +type safeBag struct { + Id asn1.ObjectIdentifier + Value asn1.RawValue `asn1:"tag:0,explicit"` + Attributes []pkcs12Attribute `asn1:"set,optional"` +} + +type pkcs12Attribute struct { + Id asn1.ObjectIdentifier + Value asn1.RawValue `ans1:"set"` +} + +type encryptedPrivateKeyInfo struct { + AlgorithmIdentifier pkix.AlgorithmIdentifier + EncryptedData []byte +} + +func (i encryptedPrivateKeyInfo) Algorithm() pkix.AlgorithmIdentifier { + return i.AlgorithmIdentifier +} + +func (i encryptedPrivateKeyInfo) Data() []byte { + return i.EncryptedData +} + +// PEM block types +const ( + certificateType = "CERTIFICATE" + privateKeyType = "PRIVATE KEY" +) + +// unmarshal calls asn1.Unmarshal, but also returns an error if there is any +// trailing data after unmarshaling. +func unmarshal(in []byte, out interface{}) error { + trailing, err := asn1.Unmarshal(in, out) + if err != nil { + return err + } + if len(trailing) != 0 { + return errors.New("pkcs12: trailing data found") + } + return nil +} + +// ConvertToPEM converts all "safe bags" contained in pfxData to PEM blocks. +func ToPEM(pfxData []byte, password string) ([]*pem.Block, error) { + encodedPassword, err := bmpString(password) + if err != nil { + return nil, ErrIncorrectPassword + } + + bags, encodedPassword, err := getSafeContents(pfxData, encodedPassword) + + blocks := make([]*pem.Block, 0, len(bags)) + for _, bag := range bags { + block, err := convertBag(&bag, encodedPassword) + if err != nil { + return nil, err + } + blocks = append(blocks, block) + } + + return blocks, nil +} + +func convertBag(bag *safeBag, password []byte) (*pem.Block, error) { + block := &pem.Block{ + Headers: make(map[string]string), + } + + for _, attribute := range bag.Attributes { + k, v, err := convertAttribute(&attribute) + if err != nil { + return nil, err + } + block.Headers[k] = v + } + + switch { + case bag.Id.Equal(oidCertBag): + block.Type = certificateType + certsData, err := decodeCertBag(bag.Value.Bytes) + if err != nil { + return nil, err + } + block.Bytes = certsData + case bag.Id.Equal(oidPKCS8ShroundedKeyBag): + block.Type = privateKeyType + + key, err := decodePkcs8ShroudedKeyBag(bag.Value.Bytes, password) + if err != nil { + return nil, err + } + + switch key := key.(type) { + case *rsa.PrivateKey: + block.Bytes = x509.MarshalPKCS1PrivateKey(key) + case *ecdsa.PrivateKey: + block.Bytes, err = x509.MarshalECPrivateKey(key) + if err != nil { + return nil, err + } + default: + return nil, errors.New("found unknown private key type in PKCS#8 wrapping") + } + default: + return nil, errors.New("don't know how to convert a safe bag of type " + bag.Id.String()) + } + return block, nil +} + +func convertAttribute(attribute *pkcs12Attribute) (key, value string, err error) { + isString := false + + switch { + case attribute.Id.Equal(oidFriendlyName): + key = "friendlyName" + isString = true + case attribute.Id.Equal(oidLocalKeyID): + key = "localKeyId" + case attribute.Id.Equal(oidMicrosoftCSPName): + // This key is chosen to match OpenSSL. + key = "Microsoft CSP Name" + isString = true + default: + return "", "", errors.New("pkcs12: unknown attribute with OID " + attribute.Id.String()) + } + + if isString { + if err := unmarshal(attribute.Value.Bytes, &attribute.Value); err != nil { + return "", "", err + } + if value, err = decodeBMPString(attribute.Value.Bytes); err != nil { + return "", "", err + } + } else { + var id []byte + if err := unmarshal(attribute.Value.Bytes, &id); err != nil { + return "", "", err + } + value = hex.EncodeToString(id) + } + + return key, value, nil +} + +// Decode extracts a certificate and private key from pfxData. This function +// assumes that there is only one certificate and only one private key in the +// pfxData. +func Decode(pfxData []byte, password string) (privateKey interface{}, certificate *x509.Certificate, err error) { + encodedPassword, err := bmpString(password) + if err != nil { + return nil, nil, err + } + + bags, encodedPassword, err := getSafeContents(pfxData, encodedPassword) + if err != nil { + return nil, nil, err + } + + if len(bags) != 2 { + err = errors.New("pkcs12: expected exactly two safe bags in the PFX PDU") + return + } + + for _, bag := range bags { + switch { + case bag.Id.Equal(oidCertBag): + if certificate != nil { + err = errors.New("pkcs12: expected exactly one certificate bag") + } + + certsData, err := decodeCertBag(bag.Value.Bytes) + if err != nil { + return nil, nil, err + } + certs, err := x509.ParseCertificates(certsData) + if err != nil { + return nil, nil, err + } + if len(certs) != 1 { + err = errors.New("pkcs12: expected exactly one certificate in the certBag") + return nil, nil, err + } + certificate = certs[0] + + case bag.Id.Equal(oidPKCS8ShroundedKeyBag): + if privateKey != nil { + err = errors.New("pkcs12: expected exactly one key bag") + } + + if privateKey, err = decodePkcs8ShroudedKeyBag(bag.Value.Bytes, encodedPassword); err != nil { + return nil, nil, err + } + } + } + + if certificate == nil { + return nil, nil, errors.New("pkcs12: certificate missing") + } + if privateKey == nil { + return nil, nil, errors.New("pkcs12: private key missing") + } + + return +} + +func getSafeContents(p12Data, password []byte) (bags []safeBag, updatedPassword []byte, err error) { + pfx := new(pfxPdu) + if err := unmarshal(p12Data, pfx); err != nil { + return nil, nil, errors.New("pkcs12: error reading P12 data: " + err.Error()) + } + + if pfx.Version != 3 { + return nil, nil, NotImplementedError("can only decode v3 PFX PDU's") + } + + if !pfx.AuthSafe.ContentType.Equal(oidDataContentType) { + return nil, nil, NotImplementedError("only password-protected PFX is implemented") + } + + // unmarshal the explicit bytes in the content for type 'data' + if err := unmarshal(pfx.AuthSafe.Content.Bytes, &pfx.AuthSafe.Content); err != nil { + return nil, nil, err + } + + if len(pfx.MacData.Mac.Algorithm.Algorithm) == 0 { + return nil, nil, errors.New("pkcs12: no MAC in data") + } + + if err := verifyMac(&pfx.MacData, pfx.AuthSafe.Content.Bytes, password); err != nil { + if err == ErrIncorrectPassword && len(password) == 2 && password[0] == 0 && password[1] == 0 { + // some implementations use an empty byte array + // for the empty string password try one more + // time with empty-empty password + password = nil + err = verifyMac(&pfx.MacData, pfx.AuthSafe.Content.Bytes, password) + } + if err != nil { + return nil, nil, err + } + } + + var authenticatedSafe []contentInfo + if err := unmarshal(pfx.AuthSafe.Content.Bytes, &authenticatedSafe); err != nil { + return nil, nil, err + } + + if len(authenticatedSafe) != 2 { + return nil, nil, NotImplementedError("expected exactly two items in the authenticated safe") + } + + for _, ci := range authenticatedSafe { + var data []byte + + switch { + case ci.ContentType.Equal(oidDataContentType): + if err := unmarshal(ci.Content.Bytes, &data); err != nil { + return nil, nil, err + } + case ci.ContentType.Equal(oidEncryptedDataContentType): + var encryptedData encryptedData + if err := unmarshal(ci.Content.Bytes, &encryptedData); err != nil { + return nil, nil, err + } + if encryptedData.Version != 0 { + return nil, nil, NotImplementedError("only version 0 of EncryptedData is supported") + } + if data, err = pbDecrypt(encryptedData.EncryptedContentInfo, password); err != nil { + return nil, nil, err + } + default: + return nil, nil, NotImplementedError("only data and encryptedData content types are supported in authenticated safe") + } + + var safeContents []safeBag + if err := unmarshal(data, &safeContents); err != nil { + return nil, nil, err + } + bags = append(bags, safeContents...) + } + + return bags, password, nil +} diff --git a/vendor/golang.org/x/crypto/pkcs12/pkcs12_test.go b/vendor/golang.org/x/crypto/pkcs12/pkcs12_test.go new file mode 100644 index 00000000..14dd2a6c --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/pkcs12_test.go @@ -0,0 +1,138 @@ +// Copyright 2015 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 pkcs12 + +import ( + "crypto/rsa" + "crypto/tls" + "encoding/base64" + "encoding/pem" + "testing" +) + +func TestPfx(t *testing.T) { + for commonName, base64P12 := range testdata { + p12, _ := base64.StdEncoding.DecodeString(base64P12) + + priv, cert, err := Decode(p12, "") + if err != nil { + t.Fatal(err) + } + + if err := priv.(*rsa.PrivateKey).Validate(); err != nil { + t.Errorf("error while validating private key: %v", err) + } + + if cert.Subject.CommonName != commonName { + t.Errorf("expected common name to be %q, but found %q", commonName, cert.Subject.CommonName) + } + } +} + +func TestPEM(t *testing.T) { + for commonName, base64P12 := range testdata { + p12, _ := base64.StdEncoding.DecodeString(base64P12) + + blocks, err := ToPEM(p12, "") + if err != nil { + t.Fatalf("error while converting to PEM: %s", err) + } + + var pemData []byte + for _, b := range blocks { + pemData = append(pemData, pem.EncodeToMemory(b)...) + } + + cert, err := tls.X509KeyPair(pemData, pemData) + if err != nil { + t.Errorf("err while converting to key pair: %v", err) + } + config := tls.Config{ + Certificates: []tls.Certificate{cert}, + } + config.BuildNameToCertificate() + + if _, exists := config.NameToCertificate[commonName]; !exists { + t.Errorf("did not find our cert in PEM?: %v", config.NameToCertificate) + } + } +} + +func ExampleToPEM() { + p12, _ := base64.StdEncoding.DecodeString(`MIIJzgIBAzCCCZQGCS ... CA+gwggPk==`) + + blocks, err := ToPEM(p12, "password") + if err != nil { + panic(err) + } + + var pemData []byte + for _, b := range blocks { + pemData = append(pemData, pem.EncodeToMemory(b)...) + } + + // then use PEM data for tls to construct tls certificate: + cert, err := tls.X509KeyPair(pemData, pemData) + if err != nil { + panic(err) + } + + config := &tls.Config{ + Certificates: []tls.Certificate{cert}, + } + + _ = config +} + +var testdata = map[string]string{ + // 'null' password test case + "Windows Azure Tools": `MIIKDAIBAzCCCcwGCSqGSIb3DQEHAaCCCb0Eggm5MIIJtTCCBe4GCSqGSIb3DQEHAaCCBd8EggXbMIIF1zCCBdMGCyqGSIb3DQEMCgECoIIE7jCCBOowHAYKKoZIhvcNAQwBAzAOBAhStUNnlTGV+gICB9AEggTIJ81JIossF6boFWpPtkiQRPtI6DW6e9QD4/WvHAVrM2bKdpMzSMsCML5NyuddANTKHBVq00Jc9keqGNAqJPKkjhSUebzQFyhe0E1oI9T4zY5UKr/I8JclOeccH4QQnsySzYUG2SnniXnQ+JrG3juetli7EKth9h6jLc6xbubPadY5HMB3wL/eG/kJymiXwU2KQ9Mgd4X6jbcV+NNCE/8jbZHvSTCPeYTJIjxfeX61Sj5kFKUCzERbsnpyevhY3X0eYtEDezZQarvGmXtMMdzf8HJHkWRdk9VLDLgjk8uiJif/+X4FohZ37ig0CpgC2+dP4DGugaZZ51hb8tN9GeCKIsrmWogMXDIVd0OACBp/EjJVmFB6y0kUCXxUE0TZt0XA1tjAGJcjDUpBvTntZjPsnH/4ZySy+s2d9OOhJ6pzRQBRm360TzkFdSwk9DLiLdGfv4pwMMu/vNGBlqjP/1sQtj+jprJiD1sDbCl4AdQZVoMBQHadF2uSD4/o17XG/Ci0r2h6Htc2yvZMAbEY4zMjjIn2a+vqIxD6onexaek1R3zbkS9j19D6EN9EWn8xgz80YRCyW65znZk8xaIhhvlU/mg7sTxeyuqroBZNcq6uDaQTehDpyH7bY2l4zWRpoj10a6JfH2q5shYz8Y6UZC/kOTfuGqbZDNZWro/9pYquvNNW0M847E5t9bsf9VkAAMHRGBbWoVoU9VpI0UnoXSfvpOo+aXa2DSq5sHHUTVY7A9eov3z5IqT+pligx11xcs+YhDWcU8di3BTJisohKvv5Y8WSkm/rloiZd4ig269k0jTRk1olP/vCksPli4wKG2wdsd5o42nX1yL7mFfXocOANZbB+5qMkiwdyoQSk+Vq+C8nAZx2bbKhUq2MbrORGMzOe0Hh0x2a0PeObycN1Bpyv7Mp3ZI9h5hBnONKCnqMhtyQHUj/nNvbJUnDVYNfoOEqDiEqqEwB7YqWzAKz8KW0OIqdlM8uiQ4JqZZlFllnWJUfaiDrdFM3lYSnFQBkzeVlts6GpDOOBjCYd7dcCNS6kq6pZC6p6HN60Twu0JnurZD6RT7rrPkIGE8vAenFt4iGe/yF52fahCSY8Ws4K0UTwN7bAS+4xRHVCWvE8sMRZsRCHizb5laYsVrPZJhE6+hux6OBb6w8kwPYXc+ud5v6UxawUWgt6uPwl8mlAtU9Z7Miw4Nn/wtBkiLL/ke1UI1gqJtcQXgHxx6mzsjh41+nAgTvdbsSEyU6vfOmxGj3Rwc1eOrIhJUqn5YjOWfzzsz/D5DzWKmwXIwdspt1p+u+kol1N3f2wT9fKPnd/RGCb4g/1hc3Aju4DQYgGY782l89CEEdalpQ/35bQczMFk6Fje12HykakWEXd/bGm9Unh82gH84USiRpeOfQvBDYoqEyrY3zkFZzBjhDqa+jEcAj41tcGx47oSfDq3iVYCdL7HSIjtnyEktVXd7mISZLoMt20JACFcMw+mrbjlug+eU7o2GR7T+LwtOp/p4LZqyLa7oQJDwde1BNZtm3TCK2P1mW94QDL0nDUps5KLtr1DaZXEkRbjSJub2ZE9WqDHyU3KA8G84Tq/rN1IoNu/if45jacyPje1Npj9IftUZSP22nV7HMwZtwQ4P4MYHRMBMGCSqGSIb3DQEJFTEGBAQBAAAAMFsGCSqGSIb3DQEJFDFOHkwAewBCADQAQQA0AEYARQBCADAALQBBADEAOABBAC0ANAA0AEIAQgAtAEIANQBGADIALQA0ADkAMQBFAEYAMQA1ADIAQgBBADEANgB9MF0GCSsGAQQBgjcRATFQHk4ATQBpAGMAcgBvAHMAbwBmAHQAIABTAG8AZgB0AHcAYQByAGUAIABLAGUAeQAgAFMAdABvAHIAYQBnAGUAIABQAHIAbwB2AGkAZABlAHIwggO/BgkqhkiG9w0BBwagggOwMIIDrAIBADCCA6UGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEGMA4ECEBk5ZAYpu0WAgIH0ICCA3hik4mQFGpw9Ha8TQPtk+j2jwWdxfF0+sTk6S8PTsEfIhB7wPltjiCK92Uv2tCBQnodBUmatIfkpnRDEySmgmdglmOCzj204lWAMRs94PoALGn3JVBXbO1vIDCbAPOZ7Z0Hd0/1t2hmk8v3//QJGUg+qr59/4y/MuVfIg4qfkPcC2QSvYWcK3oTf6SFi5rv9B1IOWFgN5D0+C+x/9Lb/myPYX+rbOHrwtJ4W1fWKoz9g7wwmGFA9IJ2DYGuH8ifVFbDFT1Vcgsvs8arSX7oBsJVW0qrP7XkuDRe3EqCmKW7rBEwYrFznhxZcRDEpMwbFoSvgSIZ4XhFY9VKYglT+JpNH5iDceYEBOQL4vBLpxNUk3l5jKaBNxVa14AIBxq18bVHJ+STInhLhad4u10v/Xbx7wIL3f9DX1yLAkPrpBYbNHS2/ew6H/ySDJnoIDxkw2zZ4qJ+qUJZ1S0lbZVG+VT0OP5uF6tyOSpbMlcGkdl3z254n6MlCrTifcwkzscysDsgKXaYQw06rzrPW6RDub+t+hXzGny799fS9jhQMLDmOggaQ7+LA4oEZsfT89HLMWxJYDqjo3gIfjciV2mV54R684qLDS+AO09U49e6yEbwGlq8lpmO/pbXCbpGbB1b3EomcQbxdWxW2WEkkEd/VBn81K4M3obmywwXJkw+tPXDXfBmzzaqqCR+onMQ5ME1nMkY8ybnfoCc1bDIupjVWsEL2Wvq752RgI6KqzVNr1ew1IdqV5AWN2fOfek+0vi3Jd9FHF3hx8JMwjJL9dZsETV5kHtYJtE7wJ23J68BnCt2eI0GEuwXcCf5EdSKN/xXCTlIokc4Qk/gzRdIZsvcEJ6B1lGovKG54X4IohikqTjiepjbsMWj38yxDmK3mtENZ9ci8FPfbbvIEcOCZIinuY3qFUlRSbx7VUerEoV1IP3clUwexVQo4lHFee2jd7ocWsdSqSapW7OWUupBtDzRkqVhE7tGria+i1W2d6YLlJ21QTjyapWJehAMO637OdbJCCzDs1cXbodRRE7bsP492ocJy8OX66rKdhYbg8srSFNKdb3pF3UDNbN9jhI/t8iagRhNBhlQtTr1me2E/c86Q18qcRXl4bcXTt6acgCeffK6Y26LcVlrgjlD33AEYRRUeyC+rpxbT0aMjdFderlndKRIyG23mSp0HaUwNzAfMAcGBSsOAwIaBBRlviCbIyRrhIysg2dc/KbLFTc2vQQUg4rfwHMM4IKYRD/fsd1x6dda+wQ=`, + // empty string password test case + "testing@example.com": `MIIJzgIBAzCCCZQGCSqGSIb3DQEHAaCCCYUEggmBMIIJfTCCA/cGCSqGSIb3DQEHBqCCA+gwggPk +AgEAMIID3QYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIIszfRGqcmPcCAggAgIIDsOZ9Eg1L +s5Wx8JhYoV3HAL4aRnkAWvTYB5NISZOgSgIQTssmt/3A7134dibTmaT/93LikkL3cTKLnQzJ4wDf +YZ1bprpVJvUqz+HFT79m27bP9zYXFrvxWBJbxjYKTSjQMgz+h8LAEpXXGajCmxMJ1oCOtdXkhhzc +LdZN6SAYgtmtyFnCdMEDskSggGuLb3fw84QEJ/Sj6FAULXunW/CPaS7Ce0TMsKmNU/jfFWj3yXXw +ro0kwjKiVLpVFlnBlHo2OoVU7hmkm59YpGhLgS7nxLD3n7nBroQ0ID1+8R01NnV9XLGoGzxMm1te +6UyTCkr5mj+kEQ8EP1Ys7g/TC411uhVWySMt/rcpkx7Vz1r9kYEAzJpONAfr6cuEVkPKrxpq4Fh0 +2fzlKBky0i/hrfIEUmngh+ERHUb/Mtv/fkv1j5w9suESbhsMLLiCXAlsP1UWMX+3bNizi3WVMEts +FM2k9byn+p8IUD/A8ULlE4kEaWeoc+2idkCNQkLGuIdGUXUFVm58se0auUkVRoRJx8x4CkMesT8j +b1H831W66YRWoEwwDQp2kK1lA2vQXxdVHWlFevMNxJeromLzj3ayiaFrfByeUXhR2S+Hpm+c0yNR +4UVU9WED2kacsZcpRm9nlEa5sr28mri5JdBrNa/K02OOhvKCxr5ZGmbOVzUQKla2z4w+Ku9k8POm +dfDNU/fGx1b5hcFWtghXe3msWVsSJrQihnN6q1ughzNiYZlJUGcHdZDRtiWwCFI0bR8h/Dmg9uO9 +4rawQQrjIRT7B8yF3UbkZyAqs8Ppb1TsMeNPHh1rxEfGVQknh/48ouJYsmtbnzugTUt3mJCXXiL+ +XcPMV6bBVAUu4aaVKSmg9+yJtY4/VKv10iw88ktv29fViIdBe3t6l/oPuvQgbQ8dqf4T8w0l/uKZ +9lS1Na9jfT1vCoS7F5TRi+tmyj1vL5kr/amEIW6xKEP6oeAMvCMtbPAzVEj38zdJ1R22FfuIBxkh +f0Zl7pdVbmzRxl/SBx9iIBJSqAvcXItiT0FIj8HxQ+0iZKqMQMiBuNWJf5pYOLWGrIyntCWwHuaQ +wrx0sTGuEL9YXLEAsBDrsvzLkx/56E4INGZFrH8G7HBdW6iGqb22IMI4GHltYSyBRKbB0gadYTyv +abPEoqww8o7/85aPSzOTJ/53ozD438Q+d0u9SyDuOb60SzCD/zPuCEd78YgtXJwBYTuUNRT27FaM +3LGMX8Hz+6yPNRnmnA2XKPn7dx/IlaqAjIs8MIIFfgYJKoZIhvcNAQcBoIIFbwSCBWswggVnMIIF +YwYLKoZIhvcNAQwKAQKgggTuMIIE6jAcBgoqhkiG9w0BDAEDMA4ECJr0cClYqOlcAgIIAASCBMhe +OQSiP2s0/46ONXcNeVAkz2ksW3u/+qorhSiskGZ0b3dFa1hhgBU2Q7JVIkc4Hf7OXaT1eVQ8oqND +uhqsNz83/kqYo70+LS8Hocj49jFgWAKrf/yQkdyP1daHa2yzlEw4mkpqOfnIORQHvYCa8nEApspZ +wVu8y6WVuLHKU67mel7db2xwstQp7PRuSAYqGjTfAylElog8ASdaqqYbYIrCXucF8iF9oVgmb/Qo +xrXshJ9aSLO4MuXlTPELmWgj07AXKSb90FKNihE+y0bWb9LPVFY1Sly3AX9PfrtkSXIZwqW3phpv +MxGxQl/R6mr1z+hlTfY9Wdpb5vlKXPKA0L0Rt8d2pOesylFi6esJoS01QgP1kJILjbrV731kvDc0 +Jsd+Oxv4BMwA7ClG8w1EAOInc/GrV1MWFGw/HeEqj3CZ/l/0jv9bwkbVeVCiIhoL6P6lVx9pXq4t +KZ0uKg/tk5TVJmG2vLcMLvezD0Yk3G2ZOMrywtmskrwoF7oAUpO9e87szoH6fEvUZlkDkPVW1NV4 +cZk3DBSQiuA3VOOg8qbo/tx/EE3H59P0axZWno2GSB0wFPWd1aj+b//tJEJHaaNR6qPRj4IWj9ru +Qbc8eRAcVWleHg8uAehSvUXlFpyMQREyrnpvMGddpiTC8N4UMrrBRhV7+UbCOWhxPCbItnInBqgl +1JpSZIP7iUtsIMdu3fEC2cdbXMTRul+4rdzUR7F9OaezV3jjvcAbDvgbK1CpyC+MJ1Mxm/iTgk9V +iUArydhlR8OniN84GyGYoYCW9O/KUwb6ASmeFOu/msx8x6kAsSQHIkKqMKv0TUR3kZnkxUvdpBGP +KTl4YCTvNGX4dYALBqrAETRDhua2KVBD/kEttDHwBNVbN2xi81+Mc7ml461aADfk0c66R/m2sjHB +2tN9+wG12OIWFQjL6wF/UfJMYamxx2zOOExiId29Opt57uYiNVLOO4ourPewHPeH0u8Gz35aero7 +lkt7cZAe1Q0038JUuE/QGlnK4lESK9UkSIQAjSaAlTsrcfwtQxB2EjoOoLhwH5mvxUEmcNGNnXUc +9xj3M5BD3zBz3Ft7G3YMMDwB1+zC2l+0UG0MGVjMVaeoy32VVNvxgX7jk22OXG1iaOB+PY9kdk+O +X+52BGSf/rD6X0EnqY7XuRPkMGgjtpZeAYxRQnFtCZgDY4wYheuxqSSpdF49yNczSPLkgB3CeCfS ++9NTKN7aC6hBbmW/8yYh6OvSiCEwY0lFS/T+7iaVxr1loE4zI1y/FFp4Pe1qfLlLttVlkygga2UU +SCunTQ8UB/M5IXWKkhMOO11dP4niWwb39Y7pCWpau7mwbXOKfRPX96cgHnQJK5uG+BesDD1oYnX0 +6frN7FOnTSHKruRIwuI8KnOQ/I+owmyz71wiv5LMQt+yM47UrEjB/EZa5X8dpEwOZvkdqL7utcyo +l0XH5kWMXdW856LL/FYftAqJIDAmtX1TXF/rbP6mPyN/IlDC0gjP84Uzd/a2UyTIWr+wk49Ek3vQ +/uDamq6QrwAxVmNh5Tset5Vhpc1e1kb7mRMZIzxSP8JcTuYd45oFKi98I8YjvueHVZce1g7OudQP +SbFQoJvdT46iBg1TTatlltpOiH2mFaxWVS0xYjAjBgkqhkiG9w0BCRUxFgQUdA9eVqvETX4an/c8 +p8SsTugkit8wOwYJKoZIhvcNAQkUMS4eLABGAHIAaQBlAG4AZABsAHkAIABuAGEAbQBlACAAZgBv +AHIAIABjAGUAcgB0MDEwITAJBgUrDgMCGgUABBRFsNz3Zd1O1GI8GTuFwCWuDOjEEwQIuBEfIcAy +HQ8CAggA`, +} diff --git a/vendor/golang.org/x/crypto/pkcs12/safebags.go b/vendor/golang.org/x/crypto/pkcs12/safebags.go new file mode 100644 index 00000000..def1f7b9 --- /dev/null +++ b/vendor/golang.org/x/crypto/pkcs12/safebags.go @@ -0,0 +1,57 @@ +// Copyright 2015 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 pkcs12 + +import ( + "crypto/x509" + "encoding/asn1" + "errors" +) + +var ( + // see https://tools.ietf.org/html/rfc7292#appendix-D + oidCertTypeX509Certificate = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 9, 22, 1}) + oidPKCS8ShroundedKeyBag = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 10, 1, 2}) + oidCertBag = asn1.ObjectIdentifier([]int{1, 2, 840, 113549, 1, 12, 10, 1, 3}) +) + +type certBag struct { + Id asn1.ObjectIdentifier + Data []byte `asn1:"tag:0,explicit"` +} + +func decodePkcs8ShroudedKeyBag(asn1Data, password []byte) (privateKey interface{}, err error) { + pkinfo := new(encryptedPrivateKeyInfo) + if err = unmarshal(asn1Data, pkinfo); err != nil { + return nil, errors.New("pkcs12: error decoding PKCS#8 shrouded key bag: " + err.Error()) + } + + pkData, err := pbDecrypt(pkinfo, password) + if err != nil { + return nil, errors.New("pkcs12: error decrypting PKCS#8 shrouded key bag: " + err.Error()) + } + + ret := new(asn1.RawValue) + if err = unmarshal(pkData, ret); err != nil { + return nil, errors.New("pkcs12: error unmarshaling decrypted private key: " + err.Error()) + } + + if privateKey, err = x509.ParsePKCS8PrivateKey(pkData); err != nil { + return nil, errors.New("pkcs12: error parsing PKCS#8 private key: " + err.Error()) + } + + return privateKey, nil +} + +func decodeCertBag(asn1Data []byte) (x509Certificates []byte, err error) { + bag := new(certBag) + if err := unmarshal(asn1Data, bag); err != nil { + return nil, errors.New("pkcs12: error decoding cert bag: " + err.Error()) + } + if !bag.Id.Equal(oidCertTypeX509Certificate) { + return nil, NotImplementedError("only X509 certificates are supported") + } + return bag.Data, nil +} diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go index 3272d7c9..8ce41858 100644 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -267,28 +267,6 @@ func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), crypto.SHA1, digest, sig.Blob) } -type rsaPrivateKey struct { - *rsa.PrivateKey -} - -func (r *rsaPrivateKey) PublicKey() PublicKey { - return (*rsaPublicKey)(&r.PrivateKey.PublicKey) -} - -func (r *rsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { - h := crypto.SHA1.New() - h.Write(data) - digest := h.Sum(nil) - blob, err := rsa.SignPKCS1v15(rand, r.PrivateKey, crypto.SHA1, digest) - if err != nil { - return nil, err - } - return &Signature{ - Format: r.PublicKey().Type(), - Blob: blob, - }, nil -} - type dsaPublicKey dsa.PublicKey func (r *dsaPublicKey) Type() string { @@ -496,72 +474,112 @@ func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { return errors.New("ssh: signature did not verify") } -type ecdsaPrivateKey struct { - *ecdsa.PrivateKey +// NewSignerFromKey takes an *rsa.PrivateKey, *dsa.PrivateKey, +// *ecdsa.PrivateKey or any other crypto.Signer and returns a corresponding +// Signer instance. ECDSA keys must use P-256, P-384 or P-521. +func NewSignerFromKey(key interface{}) (Signer, error) { + switch key := key.(type) { + case crypto.Signer: + return NewSignerFromSigner(key) + case *dsa.PrivateKey: + return &dsaPrivateKey{key}, nil + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } } -func (k *ecdsaPrivateKey) PublicKey() PublicKey { - return (*ecdsaPublicKey)(&k.PrivateKey.PublicKey) +type wrappedSigner struct { + signer crypto.Signer + pubKey PublicKey } -func (k *ecdsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { - h := ecHash(k.PrivateKey.PublicKey.Curve).New() - h.Write(data) - digest := h.Sum(nil) - r, s, err := ecdsa.Sign(rand, k.PrivateKey, digest) +// NewSignerFromSigner takes any crypto.Signer implementation and +// returns a corresponding Signer interface. This can be used, for +// example, with keys kept in hardware modules. +func NewSignerFromSigner(signer crypto.Signer) (Signer, error) { + pubKey, err := NewPublicKey(signer.Public()) if err != nil { return nil, err } - sig := make([]byte, intLength(r)+intLength(s)) - rest := marshalInt(sig, r) - marshalInt(rest, s) + return &wrappedSigner{signer, pubKey}, nil +} + +func (s *wrappedSigner) PublicKey() PublicKey { + return s.pubKey +} + +func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { + var hashFunc crypto.Hash + + switch key := s.pubKey.(type) { + case *rsaPublicKey, *dsaPublicKey: + hashFunc = crypto.SHA1 + case *ecdsaPublicKey: + hashFunc = ecHash(key.Curve) + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } + + h := hashFunc.New() + h.Write(data) + digest := h.Sum(nil) + + signature, err := s.signer.Sign(rand, digest, hashFunc) + if err != nil { + return nil, err + } + + // crypto.Signer.Sign is expected to return an ASN.1-encoded signature + // for ECDSA and DSA, but that's not the encoding expected by SSH, so + // re-encode. + switch s.pubKey.(type) { + case *ecdsaPublicKey, *dsaPublicKey: + type asn1Signature struct { + R, S *big.Int + } + asn1Sig := new(asn1Signature) + _, err := asn1.Unmarshal(signature, asn1Sig) + if err != nil { + return nil, err + } + + switch s.pubKey.(type) { + case *ecdsaPublicKey: + signature = Marshal(asn1Sig) + + case *dsaPublicKey: + signature = make([]byte, 40) + r := asn1Sig.R.Bytes() + s := asn1Sig.S.Bytes() + copy(signature[20-len(r):20], r) + copy(signature[40-len(s):40], s) + } + } + return &Signature{ - Format: k.PublicKey().Type(), - Blob: sig, + Format: s.pubKey.Type(), + Blob: signature, }, nil } -// NewSignerFromKey takes a pointer to rsa, dsa or ecdsa PrivateKey -// returns a corresponding Signer instance. EC keys should use P256, -// P384 or P521. -func NewSignerFromKey(k interface{}) (Signer, error) { - var sshKey Signer - switch t := k.(type) { - case *rsa.PrivateKey: - sshKey = &rsaPrivateKey{t} - case *dsa.PrivateKey: - sshKey = &dsaPrivateKey{t} - case *ecdsa.PrivateKey: - if !supportedEllipticCurve(t.Curve) { - return nil, errors.New("ssh: only P256, P384 and P521 EC keys are supported.") - } - - sshKey = &ecdsaPrivateKey{t} - default: - return nil, fmt.Errorf("ssh: unsupported key type %T", k) - } - return sshKey, nil -} - -// NewPublicKey takes a pointer to rsa, dsa or ecdsa PublicKey -// and returns a corresponding ssh PublicKey instance. EC keys should use P256, P384 or P521. -func NewPublicKey(k interface{}) (PublicKey, error) { - var sshKey PublicKey - switch t := k.(type) { +// NewPublicKey takes an *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey or +// any other crypto.Signer and returns a corresponding Signer instance. ECDSA +// keys must use P-256, P-384 or P-521. +func NewPublicKey(key interface{}) (PublicKey, error) { + switch key := key.(type) { case *rsa.PublicKey: - sshKey = (*rsaPublicKey)(t) + return (*rsaPublicKey)(key), nil case *ecdsa.PublicKey: - if !supportedEllipticCurve(t.Curve) { - return nil, errors.New("ssh: only P256, P384 and P521 EC keys are supported.") + if !supportedEllipticCurve(key.Curve) { + return nil, errors.New("ssh: only P-256, P-384 and P-521 EC keys are supported.") } - sshKey = (*ecdsaPublicKey)(t) + return (*ecdsaPublicKey)(key), nil case *dsa.PublicKey: - sshKey = (*dsaPublicKey)(t) + return (*dsaPublicKey)(key), nil default: - return nil, fmt.Errorf("ssh: unsupported key type %T", k) + return nil, fmt.Errorf("ssh: unsupported key type %T", key) } - return sshKey, nil } // ParsePrivateKey returns a Signer from a PEM encoded private key. It supports diff --git a/vendor/golang.org/x/crypto/ssh/keys_test.go b/vendor/golang.org/x/crypto/ssh/keys_test.go index 36b97ad2..b4cceaff 100644 --- a/vendor/golang.org/x/crypto/ssh/keys_test.go +++ b/vendor/golang.org/x/crypto/ssh/keys_test.go @@ -57,12 +57,12 @@ func TestUnsupportedCurves(t *testing.T) { t.Fatalf("GenerateKey: %v", err) } - if _, err = NewSignerFromKey(raw); err == nil || !strings.Contains(err.Error(), "only P256") { - t.Fatalf("NewPrivateKey should not succeed with P224, got: %v", err) + if _, err = NewSignerFromKey(raw); err == nil || !strings.Contains(err.Error(), "only P-256") { + t.Fatalf("NewPrivateKey should not succeed with P-224, got: %v", err) } - if _, err = NewPublicKey(&raw.PublicKey); err == nil || !strings.Contains(err.Error(), "only P256") { - t.Fatalf("NewPublicKey should not succeed with P224, got: %v", err) + if _, err = NewPublicKey(&raw.PublicKey); err == nil || !strings.Contains(err.Error(), "only P-256") { + t.Fatalf("NewPublicKey should not succeed with P-224, got: %v", err) } } diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index baedf5bb..4781eb78 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -66,9 +66,11 @@ type ServerConfig struct { // attempts. AuthLogCallback func(conn ConnMetadata, method string, err error) - // ServerVersion is the version identification string to - // announce in the public handshake. + // ServerVersion is the version identification string to announce in + // the public handshake. // If empty, a reasonable default is used. + // Note that RFC 4253 section 4.2 requires that this string start with + // "SSH-2.0-". ServerVersion string } diff --git a/vendor/golang.org/x/crypto/ssh/session.go b/vendor/golang.org/x/crypto/ssh/session.go index 3b42b508..fd10cd1a 100644 --- a/vendor/golang.org/x/crypto/ssh/session.go +++ b/vendor/golang.org/x/crypto/ssh/session.go @@ -339,7 +339,7 @@ func (s *Session) Shell() error { ok, err := s.ch.SendRequest("shell", true, nil) if err == nil && !ok { - return fmt.Errorf("ssh: cound not start shell") + return errors.New("ssh: could not start shell") } if err != nil { return err diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go index e7ee376c..77b64d0c 100644 --- a/vendor/golang.org/x/net/context/context.go +++ b/vendor/golang.org/x/net/context/context.go @@ -189,7 +189,7 @@ func Background() Context { } // TODO returns a non-nil, empty Context. Code should use context.TODO when -// it's unclear which Context to use or it's is not yet available (because the +// it's unclear which Context to use or it is not yet available (because the // surrounding function has not yet been extended to accept a Context // parameter). TODO is recognized by static analysis tools that determine // whether Contexts are propagated correctly in a program. diff --git a/vendor/golang.org/x/net/context/context_test.go b/vendor/golang.org/x/net/context/context_test.go index e64afa64..05345fc5 100644 --- a/vendor/golang.org/x/net/context/context_test.go +++ b/vendor/golang.org/x/net/context/context_test.go @@ -536,7 +536,7 @@ func testLayers(t *testing.T, seed int64, testTimeout bool) { if testTimeout { select { case <-ctx.Done(): - case <-time.After(timeout + timeout/10): + case <-time.After(timeout + 100*time.Millisecond): errorf("ctx should have timed out") } checkValues("after timeout") diff --git a/vendor/golang.org/x/net/http2/.gitignore b/vendor/golang.org/x/net/http2/.gitignore new file mode 100644 index 00000000..190f1223 --- /dev/null +++ b/vendor/golang.org/x/net/http2/.gitignore @@ -0,0 +1,2 @@ +*~ +h2i/h2i diff --git a/vendor/golang.org/x/net/http2/Dockerfile b/vendor/golang.org/x/net/http2/Dockerfile new file mode 100644 index 00000000..53fc5257 --- /dev/null +++ b/vendor/golang.org/x/net/http2/Dockerfile @@ -0,0 +1,51 @@ +# +# This Dockerfile builds a recent curl with HTTP/2 client support, using +# a recent nghttp2 build. +# +# See the Makefile for how to tag it. If Docker and that image is found, the +# Go tests use this curl binary for integration tests. +# + +FROM ubuntu:trusty + +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y git-core build-essential wget + +RUN apt-get install -y --no-install-recommends \ + autotools-dev libtool pkg-config zlib1g-dev \ + libcunit1-dev libssl-dev libxml2-dev libevent-dev \ + automake autoconf + +# The list of packages nghttp2 recommends for h2load: +RUN apt-get install -y --no-install-recommends make binutils \ + autoconf automake autotools-dev \ + libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \ + libev-dev libevent-dev libjansson-dev libjemalloc-dev \ + cython python3.4-dev python-setuptools + +# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached: +ENV NGHTTP2_VER 895da9a +RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git + +WORKDIR /root/nghttp2 +RUN git reset --hard $NGHTTP2_VER +RUN autoreconf -i +RUN automake +RUN autoconf +RUN ./configure +RUN make +RUN make install + +WORKDIR /root +RUN wget http://curl.haxx.se/download/curl-7.45.0.tar.gz +RUN tar -zxvf curl-7.45.0.tar.gz +WORKDIR /root/curl-7.45.0 +RUN ./configure --with-ssl --with-nghttp2=/usr/local +RUN make +RUN make install +RUN ldconfig + +CMD ["-h"] +ENTRYPOINT ["/usr/local/bin/curl"] + diff --git a/vendor/golang.org/x/net/http2/Makefile b/vendor/golang.org/x/net/http2/Makefile new file mode 100644 index 00000000..55fd826f --- /dev/null +++ b/vendor/golang.org/x/net/http2/Makefile @@ -0,0 +1,3 @@ +curlimage: + docker build -t gohttp2/curl . + diff --git a/vendor/golang.org/x/net/http2/README b/vendor/golang.org/x/net/http2/README new file mode 100644 index 00000000..360d5aa3 --- /dev/null +++ b/vendor/golang.org/x/net/http2/README @@ -0,0 +1,20 @@ +This is a work-in-progress HTTP/2 implementation for Go. + +It will eventually live in the Go standard library and won't require +any changes to your code to use. It will just be automatic. + +Status: + +* The server support is pretty good. A few things are missing + but are being worked on. +* The client work has just started but shares a lot of code + is coming along much quicker. + +Docs are at https://godoc.org/golang.org/x/net/http2 + +Demo test server at https://http2.golang.org/ + +Help & bug reports welcome! + +Contributing: https://golang.org/doc/contribute.html +Bugs: https://golang.org/issue/new?title=x/net/http2:+ diff --git a/vendor/golang.org/x/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go new file mode 100644 index 00000000..eeac8384 --- /dev/null +++ b/vendor/golang.org/x/net/http2/client_conn_pool.go @@ -0,0 +1,118 @@ +// Copyright 2015 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. + +// Transport code's client connection pooling. + +package http2 + +import ( + "net/http" + "sync" +) + +// ClientConnPool manages a pool of HTTP/2 client connections. +type ClientConnPool interface { + GetClientConn(req *http.Request, addr string) (*ClientConn, error) + MarkDead(*ClientConn) +} + +type clientConnPool struct { + t *Transport + mu sync.Mutex // TODO: switch to RWMutex + // TODO: add support for sharing conns based on cert names + // (e.g. share conn for googleapis.com and appspot.com) + conns map[string][]*ClientConn // key is host:port + keys map[*ClientConn][]string +} + +func (p *clientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) { + return p.getClientConn(req, addr, true) +} + +func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMiss bool) (*ClientConn, error) { + p.mu.Lock() + for _, cc := range p.conns[addr] { + if cc.CanTakeNewRequest() { + p.mu.Unlock() + return cc, nil + } + } + p.mu.Unlock() + if !dialOnMiss { + return nil, ErrNoCachedConn + } + + // TODO(bradfitz): use a singleflight.Group to only lock once per 'key'. + // Probably need to vendor it in as github.com/golang/sync/singleflight + // though, since the net package already uses it? Also lines up with + // sameer, bcmills, et al wanting to open source some sync stuff. + cc, err := p.t.dialClientConn(addr) + if err != nil { + return nil, err + } + p.addConn(addr, cc) + return cc, nil +} + +func (p *clientConnPool) addConn(key string, cc *ClientConn) { + p.mu.Lock() + defer p.mu.Unlock() + if p.conns == nil { + p.conns = make(map[string][]*ClientConn) + } + if p.keys == nil { + p.keys = make(map[*ClientConn][]string) + } + p.conns[key] = append(p.conns[key], cc) + p.keys[cc] = append(p.keys[cc], key) +} + +func (p *clientConnPool) MarkDead(cc *ClientConn) { + p.mu.Lock() + defer p.mu.Unlock() + for _, key := range p.keys[cc] { + vv, ok := p.conns[key] + if !ok { + continue + } + newList := filterOutClientConn(vv, cc) + if len(newList) > 0 { + p.conns[key] = newList + } else { + delete(p.conns, key) + } + } + delete(p.keys, cc) +} + +func (p *clientConnPool) closeIdleConnections() { + p.mu.Lock() + defer p.mu.Unlock() + // TODO: don't close a cc if it was just added to the pool + // milliseconds ago and has never been used. There's currently + // a small race window with the HTTP/1 Transport's integration + // where it can add an idle conn just before using it, and + // somebody else can concurrently call CloseIdleConns and + // break some caller's RoundTrip. + for _, vv := range p.conns { + for _, cc := range vv { + cc.closeIfIdle() + } + } +} + +func filterOutClientConn(in []*ClientConn, exclude *ClientConn) []*ClientConn { + out := in[:0] + for _, v := range in { + if v != exclude { + out = append(out, v) + } + } + // If we filtered it out, zero out the last item to prevent + // the GC from seeing it. + if len(in) != len(out) { + in[len(in)-1] = nil + } + return out +} diff --git a/vendor/golang.org/x/net/http2/configure_transport.go b/vendor/golang.org/x/net/http2/configure_transport.go new file mode 100644 index 00000000..fb8979a7 --- /dev/null +++ b/vendor/golang.org/x/net/http2/configure_transport.go @@ -0,0 +1,78 @@ +// Copyright 2015 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 go1.6 + +package http2 + +import ( + "crypto/tls" + "fmt" + "net/http" +) + +func configureTransport(t1 *http.Transport) error { + connPool := new(clientConnPool) + t2 := &Transport{ConnPool: noDialClientConnPool{connPool}} + if err := registerHTTPSProtocol(t1, noDialH2RoundTripper{t2}); err != nil { + return err + } + if t1.TLSClientConfig == nil { + t1.TLSClientConfig = new(tls.Config) + } + if !strSliceContains(t1.TLSClientConfig.NextProtos, "h2") { + t1.TLSClientConfig.NextProtos = append([]string{"h2"}, t1.TLSClientConfig.NextProtos...) + } + upgradeFn := func(authority string, c *tls.Conn) http.RoundTripper { + cc, err := t2.NewClientConn(c) + if err != nil { + c.Close() + return erringRoundTripper{err} + } + connPool.addConn(authorityAddr(authority), cc) + return t2 + } + if m := t1.TLSNextProto; len(m) == 0 { + t1.TLSNextProto = map[string]func(string, *tls.Conn) http.RoundTripper{ + "h2": upgradeFn, + } + } else { + m["h2"] = upgradeFn + } + return nil +} + +// registerHTTPSProtocol calls Transport.RegisterProtocol but +// convering panics into errors. +func registerHTTPSProtocol(t *http.Transport, rt http.RoundTripper) (err error) { + defer func() { + if e := recover(); e != nil { + err = fmt.Errorf("%v", e) + } + }() + t.RegisterProtocol("https", rt) + return nil +} + +// noDialClientConnPool is an implementation of http2.ClientConnPool +// which never dials. We let the HTTP/1.1 client dial and use its TLS +// connection instead. +type noDialClientConnPool struct{ *clientConnPool } + +func (p noDialClientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) { + const doDial = false + return p.getClientConn(req, addr, doDial) +} + +// noDialH2RoundTripper is a RoundTripper which only tries to complete the request +// if there's already has a cached connection to the host. +type noDialH2RoundTripper struct{ t *Transport } + +func (rt noDialH2RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + res, err := rt.t.RoundTrip(req) + if err == ErrNoCachedConn { + return nil, http.ErrSkipAltProtocol + } + return res, err +} diff --git a/vendor/golang.org/x/net/http2/errors.go b/vendor/golang.org/x/net/http2/errors.go new file mode 100644 index 00000000..1f8de65e --- /dev/null +++ b/vendor/golang.org/x/net/http2/errors.go @@ -0,0 +1,77 @@ +// Copyright 2014 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 http2 + +import "fmt" + +// An ErrCode is an unsigned 32-bit error code as defined in the HTTP/2 spec. +type ErrCode uint32 + +const ( + ErrCodeNo ErrCode = 0x0 + ErrCodeProtocol ErrCode = 0x1 + ErrCodeInternal ErrCode = 0x2 + ErrCodeFlowControl ErrCode = 0x3 + ErrCodeSettingsTimeout ErrCode = 0x4 + ErrCodeStreamClosed ErrCode = 0x5 + ErrCodeFrameSize ErrCode = 0x6 + ErrCodeRefusedStream ErrCode = 0x7 + ErrCodeCancel ErrCode = 0x8 + ErrCodeCompression ErrCode = 0x9 + ErrCodeConnect ErrCode = 0xa + ErrCodeEnhanceYourCalm ErrCode = 0xb + ErrCodeInadequateSecurity ErrCode = 0xc + ErrCodeHTTP11Required ErrCode = 0xd +) + +var errCodeName = map[ErrCode]string{ + ErrCodeNo: "NO_ERROR", + ErrCodeProtocol: "PROTOCOL_ERROR", + ErrCodeInternal: "INTERNAL_ERROR", + ErrCodeFlowControl: "FLOW_CONTROL_ERROR", + ErrCodeSettingsTimeout: "SETTINGS_TIMEOUT", + ErrCodeStreamClosed: "STREAM_CLOSED", + ErrCodeFrameSize: "FRAME_SIZE_ERROR", + ErrCodeRefusedStream: "REFUSED_STREAM", + ErrCodeCancel: "CANCEL", + ErrCodeCompression: "COMPRESSION_ERROR", + ErrCodeConnect: "CONNECT_ERROR", + ErrCodeEnhanceYourCalm: "ENHANCE_YOUR_CALM", + ErrCodeInadequateSecurity: "INADEQUATE_SECURITY", + ErrCodeHTTP11Required: "HTTP_1_1_REQUIRED", +} + +func (e ErrCode) String() string { + if s, ok := errCodeName[e]; ok { + return s + } + return fmt.Sprintf("unknown error code 0x%x", uint32(e)) +} + +// ConnectionError is an error that results in the termination of the +// entire connection. +type ConnectionError ErrCode + +func (e ConnectionError) Error() string { return fmt.Sprintf("connection error: %s", ErrCode(e)) } + +// StreamError is an error that only affects one stream within an +// HTTP/2 connection. +type StreamError struct { + StreamID uint32 + Code ErrCode +} + +func (e StreamError) Error() string { + return fmt.Sprintf("stream error: stream ID %d; %v", e.StreamID, e.Code) +} + +// 6.9.1 The Flow Control Window +// "If a sender receives a WINDOW_UPDATE that causes a flow control +// window to exceed this maximum it MUST terminate either the stream +// or the connection, as appropriate. For streams, [...]; for the +// connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code." +type goAwayFlowError struct{} + +func (goAwayFlowError) Error() string { return "connection exceeded flow control window size" } diff --git a/vendor/golang.org/x/net/http2/errors_test.go b/vendor/golang.org/x/net/http2/errors_test.go new file mode 100644 index 00000000..da5c58c3 --- /dev/null +++ b/vendor/golang.org/x/net/http2/errors_test.go @@ -0,0 +1,24 @@ +// Copyright 2014 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 http2 + +import "testing" + +func TestErrCodeString(t *testing.T) { + tests := []struct { + err ErrCode + want string + }{ + {ErrCodeProtocol, "PROTOCOL_ERROR"}, + {0xd, "HTTP_1_1_REQUIRED"}, + {0xf, "unknown error code 0xf"}, + } + for i, tt := range tests { + got := tt.err.String() + if got != tt.want { + t.Errorf("%d. Error = %q; want %q", i, got, tt.want) + } + } +} diff --git a/vendor/golang.org/x/net/http2/fixed_buffer.go b/vendor/golang.org/x/net/http2/fixed_buffer.go new file mode 100644 index 00000000..47da0f0b --- /dev/null +++ b/vendor/golang.org/x/net/http2/fixed_buffer.go @@ -0,0 +1,60 @@ +// Copyright 2014 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 http2 + +import ( + "errors" +) + +// fixedBuffer is an io.ReadWriter backed by a fixed size buffer. +// It never allocates, but moves old data as new data is written. +type fixedBuffer struct { + buf []byte + r, w int +} + +var ( + errReadEmpty = errors.New("read from empty fixedBuffer") + errWriteFull = errors.New("write on full fixedBuffer") +) + +// Read copies bytes from the buffer into p. +// It is an error to read when no data is available. +func (b *fixedBuffer) Read(p []byte) (n int, err error) { + if b.r == b.w { + return 0, errReadEmpty + } + n = copy(p, b.buf[b.r:b.w]) + b.r += n + if b.r == b.w { + b.r = 0 + b.w = 0 + } + return n, nil +} + +// Len returns the number of bytes of the unread portion of the buffer. +func (b *fixedBuffer) Len() int { + return b.w - b.r +} + +// Write copies bytes from p into the buffer. +// It is an error to write more data than the buffer can hold. +func (b *fixedBuffer) Write(p []byte) (n int, err error) { + // Slide existing data to beginning. + if b.r > 0 && len(p) > len(b.buf)-b.w { + copy(b.buf, b.buf[b.r:b.w]) + b.w -= b.r + b.r = 0 + } + + // Write new data. + n = copy(b.buf[b.w:], p) + b.w += n + if n < len(p) { + err = errWriteFull + } + return n, err +} diff --git a/vendor/golang.org/x/net/http2/fixed_buffer_test.go b/vendor/golang.org/x/net/http2/fixed_buffer_test.go new file mode 100644 index 00000000..f5432f8d --- /dev/null +++ b/vendor/golang.org/x/net/http2/fixed_buffer_test.go @@ -0,0 +1,128 @@ +// Copyright 2014 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 http2 + +import ( + "reflect" + "testing" +) + +var bufferReadTests = []struct { + buf fixedBuffer + read, wn int + werr error + wp []byte + wbuf fixedBuffer +}{ + { + fixedBuffer{[]byte{'a', 0}, 0, 1}, + 5, 1, nil, []byte{'a'}, + fixedBuffer{[]byte{'a', 0}, 0, 0}, + }, + { + fixedBuffer{[]byte{0, 'a'}, 1, 2}, + 5, 1, nil, []byte{'a'}, + fixedBuffer{[]byte{0, 'a'}, 0, 0}, + }, + { + fixedBuffer{[]byte{'a', 'b'}, 0, 2}, + 1, 1, nil, []byte{'a'}, + fixedBuffer{[]byte{'a', 'b'}, 1, 2}, + }, + { + fixedBuffer{[]byte{}, 0, 0}, + 5, 0, errReadEmpty, []byte{}, + fixedBuffer{[]byte{}, 0, 0}, + }, +} + +func TestBufferRead(t *testing.T) { + for i, tt := range bufferReadTests { + read := make([]byte, tt.read) + n, err := tt.buf.Read(read) + if n != tt.wn { + t.Errorf("#%d: wn = %d want %d", i, n, tt.wn) + continue + } + if err != tt.werr { + t.Errorf("#%d: werr = %v want %v", i, err, tt.werr) + continue + } + read = read[:n] + if !reflect.DeepEqual(read, tt.wp) { + t.Errorf("#%d: read = %+v want %+v", i, read, tt.wp) + } + if !reflect.DeepEqual(tt.buf, tt.wbuf) { + t.Errorf("#%d: buf = %+v want %+v", i, tt.buf, tt.wbuf) + } + } +} + +var bufferWriteTests = []struct { + buf fixedBuffer + write, wn int + werr error + wbuf fixedBuffer +}{ + { + buf: fixedBuffer{ + buf: []byte{}, + }, + wbuf: fixedBuffer{ + buf: []byte{}, + }, + }, + { + buf: fixedBuffer{ + buf: []byte{1, 'a'}, + }, + write: 1, + wn: 1, + wbuf: fixedBuffer{ + buf: []byte{0, 'a'}, + w: 1, + }, + }, + { + buf: fixedBuffer{ + buf: []byte{'a', 1}, + r: 1, + w: 1, + }, + write: 2, + wn: 2, + wbuf: fixedBuffer{ + buf: []byte{0, 0}, + w: 2, + }, + }, + { + buf: fixedBuffer{ + buf: []byte{}, + }, + write: 5, + werr: errWriteFull, + wbuf: fixedBuffer{ + buf: []byte{}, + }, + }, +} + +func TestBufferWrite(t *testing.T) { + for i, tt := range bufferWriteTests { + n, err := tt.buf.Write(make([]byte, tt.write)) + if n != tt.wn { + t.Errorf("#%d: wrote %d bytes; want %d", i, n, tt.wn) + continue + } + if err != tt.werr { + t.Errorf("#%d: error = %v; want %v", i, err, tt.werr) + continue + } + if !reflect.DeepEqual(tt.buf, tt.wbuf) { + t.Errorf("#%d: buf = %+v; want %+v", i, tt.buf, tt.wbuf) + } + } +} diff --git a/vendor/golang.org/x/net/http2/flow.go b/vendor/golang.org/x/net/http2/flow.go new file mode 100644 index 00000000..957de254 --- /dev/null +++ b/vendor/golang.org/x/net/http2/flow.go @@ -0,0 +1,50 @@ +// Copyright 2014 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. + +// Flow control + +package http2 + +// flow is the flow control window's size. +type flow struct { + // n is the number of DATA bytes we're allowed to send. + // A flow is kept both on a conn and a per-stream. + n int32 + + // conn points to the shared connection-level flow that is + // shared by all streams on that conn. It is nil for the flow + // that's on the conn directly. + conn *flow +} + +func (f *flow) setConnFlow(cf *flow) { f.conn = cf } + +func (f *flow) available() int32 { + n := f.n + if f.conn != nil && f.conn.n < n { + n = f.conn.n + } + return n +} + +func (f *flow) take(n int32) { + if n > f.available() { + panic("internal error: took too much") + } + f.n -= n + if f.conn != nil { + f.conn.n -= n + } +} + +// add adds n bytes (positive or negative) to the flow control window. +// It returns false if the sum would exceed 2^31-1. +func (f *flow) add(n int32) bool { + remain := (1<<31 - 1) - f.n + if n > remain { + return false + } + f.n += n + return true +} diff --git a/vendor/golang.org/x/net/http2/flow_test.go b/vendor/golang.org/x/net/http2/flow_test.go new file mode 100644 index 00000000..859adf5d --- /dev/null +++ b/vendor/golang.org/x/net/http2/flow_test.go @@ -0,0 +1,53 @@ +// Copyright 2014 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 http2 + +import "testing" + +func TestFlow(t *testing.T) { + var st flow + var conn flow + st.add(3) + conn.add(2) + + if got, want := st.available(), int32(3); got != want { + t.Errorf("available = %d; want %d", got, want) + } + st.setConnFlow(&conn) + if got, want := st.available(), int32(2); got != want { + t.Errorf("after parent setup, available = %d; want %d", got, want) + } + + st.take(2) + if got, want := conn.available(), int32(0); got != want { + t.Errorf("after taking 2, conn = %d; want %d", got, want) + } + if got, want := st.available(), int32(0); got != want { + t.Errorf("after taking 2, stream = %d; want %d", got, want) + } +} + +func TestFlowAdd(t *testing.T) { + var f flow + if !f.add(1) { + t.Fatal("failed to add 1") + } + if !f.add(-1) { + t.Fatal("failed to add -1") + } + if got, want := f.available(), int32(0); got != want { + t.Fatalf("size = %d; want %d", got, want) + } + if !f.add(1<<31 - 1) { + t.Fatal("failed to add 2^31-1") + } + if got, want := f.available(), int32(1<<31-1); got != want { + t.Fatalf("size = %d; want %d", got, want) + } + if f.add(1) { + t.Fatal("adding 1 to max shouldn't be allowed") + } + +} diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go new file mode 100644 index 00000000..6b8a74f0 --- /dev/null +++ b/vendor/golang.org/x/net/http2/frame.go @@ -0,0 +1,1114 @@ +// Copyright 2014 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 http2 + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "sync" +) + +const frameHeaderLen = 9 + +var padZeros = make([]byte, 255) // zeros for padding + +// A FrameType is a registered frame type as defined in +// http://http2.github.io/http2-spec/#rfc.section.11.2 +type FrameType uint8 + +const ( + FrameData FrameType = 0x0 + FrameHeaders FrameType = 0x1 + FramePriority FrameType = 0x2 + FrameRSTStream FrameType = 0x3 + FrameSettings FrameType = 0x4 + FramePushPromise FrameType = 0x5 + FramePing FrameType = 0x6 + FrameGoAway FrameType = 0x7 + FrameWindowUpdate FrameType = 0x8 + FrameContinuation FrameType = 0x9 +) + +var frameName = map[FrameType]string{ + FrameData: "DATA", + FrameHeaders: "HEADERS", + FramePriority: "PRIORITY", + FrameRSTStream: "RST_STREAM", + FrameSettings: "SETTINGS", + FramePushPromise: "PUSH_PROMISE", + FramePing: "PING", + FrameGoAway: "GOAWAY", + FrameWindowUpdate: "WINDOW_UPDATE", + FrameContinuation: "CONTINUATION", +} + +func (t FrameType) String() string { + if s, ok := frameName[t]; ok { + return s + } + return fmt.Sprintf("UNKNOWN_FRAME_TYPE_%d", uint8(t)) +} + +// Flags is a bitmask of HTTP/2 flags. +// The meaning of flags varies depending on the frame type. +type Flags uint8 + +// Has reports whether f contains all (0 or more) flags in v. +func (f Flags) Has(v Flags) bool { + return (f & v) == v +} + +// Frame-specific FrameHeader flag bits. +const ( + // Data Frame + FlagDataEndStream Flags = 0x1 + FlagDataPadded Flags = 0x8 + + // Headers Frame + FlagHeadersEndStream Flags = 0x1 + FlagHeadersEndHeaders Flags = 0x4 + FlagHeadersPadded Flags = 0x8 + FlagHeadersPriority Flags = 0x20 + + // Settings Frame + FlagSettingsAck Flags = 0x1 + + // Ping Frame + FlagPingAck Flags = 0x1 + + // Continuation Frame + FlagContinuationEndHeaders Flags = 0x4 + + FlagPushPromiseEndHeaders Flags = 0x4 + FlagPushPromisePadded Flags = 0x8 +) + +var flagName = map[FrameType]map[Flags]string{ + FrameData: { + FlagDataEndStream: "END_STREAM", + FlagDataPadded: "PADDED", + }, + FrameHeaders: { + FlagHeadersEndStream: "END_STREAM", + FlagHeadersEndHeaders: "END_HEADERS", + FlagHeadersPadded: "PADDED", + FlagHeadersPriority: "PRIORITY", + }, + FrameSettings: { + FlagSettingsAck: "ACK", + }, + FramePing: { + FlagPingAck: "ACK", + }, + FrameContinuation: { + FlagContinuationEndHeaders: "END_HEADERS", + }, + FramePushPromise: { + FlagPushPromiseEndHeaders: "END_HEADERS", + FlagPushPromisePadded: "PADDED", + }, +} + +// a frameParser parses a frame given its FrameHeader and payload +// bytes. The length of payload will always equal fh.Length (which +// might be 0). +type frameParser func(fh FrameHeader, payload []byte) (Frame, error) + +var frameParsers = map[FrameType]frameParser{ + FrameData: parseDataFrame, + FrameHeaders: parseHeadersFrame, + FramePriority: parsePriorityFrame, + FrameRSTStream: parseRSTStreamFrame, + FrameSettings: parseSettingsFrame, + FramePushPromise: parsePushPromise, + FramePing: parsePingFrame, + FrameGoAway: parseGoAwayFrame, + FrameWindowUpdate: parseWindowUpdateFrame, + FrameContinuation: parseContinuationFrame, +} + +func typeFrameParser(t FrameType) frameParser { + if f := frameParsers[t]; f != nil { + return f + } + return parseUnknownFrame +} + +// A FrameHeader is the 9 byte header of all HTTP/2 frames. +// +// See http://http2.github.io/http2-spec/#FrameHeader +type FrameHeader struct { + valid bool // caller can access []byte fields in the Frame + + // Type is the 1 byte frame type. There are ten standard frame + // types, but extension frame types may be written by WriteRawFrame + // and will be returned by ReadFrame (as UnknownFrame). + Type FrameType + + // Flags are the 1 byte of 8 potential bit flags per frame. + // They are specific to the frame type. + Flags Flags + + // Length is the length of the frame, not including the 9 byte header. + // The maximum size is one byte less than 16MB (uint24), but only + // frames up to 16KB are allowed without peer agreement. + Length uint32 + + // StreamID is which stream this frame is for. Certain frames + // are not stream-specific, in which case this field is 0. + StreamID uint32 +} + +// Header returns h. It exists so FrameHeaders can be embedded in other +// specific frame types and implement the Frame interface. +func (h FrameHeader) Header() FrameHeader { return h } + +func (h FrameHeader) String() string { + var buf bytes.Buffer + buf.WriteString("[FrameHeader ") + buf.WriteString(h.Type.String()) + if h.Flags != 0 { + buf.WriteString(" flags=") + set := 0 + for i := uint8(0); i < 8; i++ { + if h.Flags&(1< 1 { + buf.WriteByte('|') + } + name := flagName[h.Type][Flags(1<>24), + byte(streamID>>16), + byte(streamID>>8), + byte(streamID)) +} + +func (f *Framer) endWrite() error { + // Now that we know the final size, fill in the FrameHeader in + // the space previously reserved for it. Abuse append. + length := len(f.wbuf) - frameHeaderLen + if length >= (1 << 24) { + return ErrFrameTooLarge + } + _ = append(f.wbuf[:0], + byte(length>>16), + byte(length>>8), + byte(length)) + n, err := f.w.Write(f.wbuf) + if err == nil && n != len(f.wbuf) { + err = io.ErrShortWrite + } + return err +} + +func (f *Framer) writeByte(v byte) { f.wbuf = append(f.wbuf, v) } +func (f *Framer) writeBytes(v []byte) { f.wbuf = append(f.wbuf, v...) } +func (f *Framer) writeUint16(v uint16) { f.wbuf = append(f.wbuf, byte(v>>8), byte(v)) } +func (f *Framer) writeUint32(v uint32) { + f.wbuf = append(f.wbuf, byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) +} + +const ( + minMaxFrameSize = 1 << 14 + maxFrameSize = 1<<24 - 1 +) + +// NewFramer returns a Framer that writes frames to w and reads them from r. +func NewFramer(w io.Writer, r io.Reader) *Framer { + fr := &Framer{ + w: w, + r: r, + } + fr.getReadBuf = func(size uint32) []byte { + if cap(fr.readBuf) >= int(size) { + return fr.readBuf[:size] + } + fr.readBuf = make([]byte, size) + return fr.readBuf + } + fr.SetMaxReadFrameSize(maxFrameSize) + return fr +} + +// SetMaxReadFrameSize sets the maximum size of a frame +// that will be read by a subsequent call to ReadFrame. +// It is the caller's responsibility to advertise this +// limit with a SETTINGS frame. +func (fr *Framer) SetMaxReadFrameSize(v uint32) { + if v > maxFrameSize { + v = maxFrameSize + } + fr.maxReadSize = v +} + +// ErrFrameTooLarge is returned from Framer.ReadFrame when the peer +// sends a frame that is larger than declared with SetMaxReadFrameSize. +var ErrFrameTooLarge = errors.New("http2: frame too large") + +// ReadFrame reads a single frame. The returned Frame is only valid +// until the next call to ReadFrame. +// If the frame is larger than previously set with SetMaxReadFrameSize, +// the returned error is ErrFrameTooLarge. +func (fr *Framer) ReadFrame() (Frame, error) { + if fr.lastFrame != nil { + fr.lastFrame.invalidate() + } + fh, err := readFrameHeader(fr.headerBuf[:], fr.r) + if err != nil { + return nil, err + } + if fh.Length > fr.maxReadSize { + return nil, ErrFrameTooLarge + } + payload := fr.getReadBuf(fh.Length) + if _, err := io.ReadFull(fr.r, payload); err != nil { + return nil, err + } + f, err := typeFrameParser(fh.Type)(fh, payload) + if err != nil { + return nil, err + } + fr.lastFrame = f + return f, nil +} + +// A DataFrame conveys arbitrary, variable-length sequences of octets +// associated with a stream. +// See http://http2.github.io/http2-spec/#rfc.section.6.1 +type DataFrame struct { + FrameHeader + data []byte +} + +func (f *DataFrame) StreamEnded() bool { + return f.FrameHeader.Flags.Has(FlagDataEndStream) +} + +// Data returns the frame's data octets, not including any padding +// size byte or padding suffix bytes. +// The caller must not retain the returned memory past the next +// call to ReadFrame. +func (f *DataFrame) Data() []byte { + f.checkValid() + return f.data +} + +func parseDataFrame(fh FrameHeader, payload []byte) (Frame, error) { + if fh.StreamID == 0 { + // DATA frames MUST be associated with a stream. If a + // DATA frame is received whose stream identifier + // field is 0x0, the recipient MUST respond with a + // connection error (Section 5.4.1) of type + // PROTOCOL_ERROR. + return nil, ConnectionError(ErrCodeProtocol) + } + f := &DataFrame{ + FrameHeader: fh, + } + var padSize byte + if fh.Flags.Has(FlagDataPadded) { + var err error + payload, padSize, err = readByte(payload) + if err != nil { + return nil, err + } + } + if int(padSize) > len(payload) { + // If the length of the padding is greater than the + // length of the frame payload, the recipient MUST + // treat this as a connection error. + // Filed: https://github.com/http2/http2-spec/issues/610 + return nil, ConnectionError(ErrCodeProtocol) + } + f.data = payload[:len(payload)-int(padSize)] + return f, nil +} + +var errStreamID = errors.New("invalid streamid") + +func validStreamID(streamID uint32) bool { + return streamID != 0 && streamID&(1<<31) == 0 +} + +// WriteData writes a DATA frame. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error { + // TODO: ignoring padding for now. will add when somebody cares. + if !validStreamID(streamID) && !f.AllowIllegalWrites { + return errStreamID + } + var flags Flags + if endStream { + flags |= FlagDataEndStream + } + f.startWrite(FrameData, flags, streamID) + f.wbuf = append(f.wbuf, data...) + return f.endWrite() +} + +// A SettingsFrame conveys configuration parameters that affect how +// endpoints communicate, such as preferences and constraints on peer +// behavior. +// +// See http://http2.github.io/http2-spec/#SETTINGS +type SettingsFrame struct { + FrameHeader + p []byte +} + +func parseSettingsFrame(fh FrameHeader, p []byte) (Frame, error) { + if fh.Flags.Has(FlagSettingsAck) && fh.Length > 0 { + // When this (ACK 0x1) bit is set, the payload of the + // SETTINGS frame MUST be empty. Receipt of a + // SETTINGS frame with the ACK flag set and a length + // field value other than 0 MUST be treated as a + // connection error (Section 5.4.1) of type + // FRAME_SIZE_ERROR. + return nil, ConnectionError(ErrCodeFrameSize) + } + if fh.StreamID != 0 { + // SETTINGS frames always apply to a connection, + // never a single stream. The stream identifier for a + // SETTINGS frame MUST be zero (0x0). If an endpoint + // receives a SETTINGS frame whose stream identifier + // field is anything other than 0x0, the endpoint MUST + // respond with a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR. + return nil, ConnectionError(ErrCodeProtocol) + } + if len(p)%6 != 0 { + // Expecting even number of 6 byte settings. + return nil, ConnectionError(ErrCodeFrameSize) + } + f := &SettingsFrame{FrameHeader: fh, p: p} + if v, ok := f.Value(SettingInitialWindowSize); ok && v > (1<<31)-1 { + // Values above the maximum flow control window size of 2^31 - 1 MUST + // be treated as a connection error (Section 5.4.1) of type + // FLOW_CONTROL_ERROR. + return nil, ConnectionError(ErrCodeFlowControl) + } + return f, nil +} + +func (f *SettingsFrame) IsAck() bool { + return f.FrameHeader.Flags.Has(FlagSettingsAck) +} + +func (f *SettingsFrame) Value(s SettingID) (v uint32, ok bool) { + f.checkValid() + buf := f.p + for len(buf) > 0 { + settingID := SettingID(binary.BigEndian.Uint16(buf[:2])) + if settingID == s { + return binary.BigEndian.Uint32(buf[2:6]), true + } + buf = buf[6:] + } + return 0, false +} + +// ForeachSetting runs fn for each setting. +// It stops and returns the first error. +func (f *SettingsFrame) ForeachSetting(fn func(Setting) error) error { + f.checkValid() + buf := f.p + for len(buf) > 0 { + if err := fn(Setting{ + SettingID(binary.BigEndian.Uint16(buf[:2])), + binary.BigEndian.Uint32(buf[2:6]), + }); err != nil { + return err + } + buf = buf[6:] + } + return nil +} + +// WriteSettings writes a SETTINGS frame with zero or more settings +// specified and the ACK bit not set. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteSettings(settings ...Setting) error { + f.startWrite(FrameSettings, 0, 0) + for _, s := range settings { + f.writeUint16(uint16(s.ID)) + f.writeUint32(s.Val) + } + return f.endWrite() +} + +// WriteSettings writes an empty SETTINGS frame with the ACK bit set. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteSettingsAck() error { + f.startWrite(FrameSettings, FlagSettingsAck, 0) + return f.endWrite() +} + +// A PingFrame is a mechanism for measuring a minimal round trip time +// from the sender, as well as determining whether an idle connection +// is still functional. +// See http://http2.github.io/http2-spec/#rfc.section.6.7 +type PingFrame struct { + FrameHeader + Data [8]byte +} + +func (f *PingFrame) IsAck() bool { return f.Flags.Has(FlagPingAck) } + +func parsePingFrame(fh FrameHeader, payload []byte) (Frame, error) { + if len(payload) != 8 { + return nil, ConnectionError(ErrCodeFrameSize) + } + if fh.StreamID != 0 { + return nil, ConnectionError(ErrCodeProtocol) + } + f := &PingFrame{FrameHeader: fh} + copy(f.Data[:], payload) + return f, nil +} + +func (f *Framer) WritePing(ack bool, data [8]byte) error { + var flags Flags + if ack { + flags = FlagPingAck + } + f.startWrite(FramePing, flags, 0) + f.writeBytes(data[:]) + return f.endWrite() +} + +// A GoAwayFrame informs the remote peer to stop creating streams on this connection. +// See http://http2.github.io/http2-spec/#rfc.section.6.8 +type GoAwayFrame struct { + FrameHeader + LastStreamID uint32 + ErrCode ErrCode + debugData []byte +} + +// DebugData returns any debug data in the GOAWAY frame. Its contents +// are not defined. +// The caller must not retain the returned memory past the next +// call to ReadFrame. +func (f *GoAwayFrame) DebugData() []byte { + f.checkValid() + return f.debugData +} + +func parseGoAwayFrame(fh FrameHeader, p []byte) (Frame, error) { + if fh.StreamID != 0 { + return nil, ConnectionError(ErrCodeProtocol) + } + if len(p) < 8 { + return nil, ConnectionError(ErrCodeFrameSize) + } + return &GoAwayFrame{ + FrameHeader: fh, + LastStreamID: binary.BigEndian.Uint32(p[:4]) & (1<<31 - 1), + ErrCode: ErrCode(binary.BigEndian.Uint32(p[4:8])), + debugData: p[8:], + }, nil +} + +func (f *Framer) WriteGoAway(maxStreamID uint32, code ErrCode, debugData []byte) error { + f.startWrite(FrameGoAway, 0, 0) + f.writeUint32(maxStreamID & (1<<31 - 1)) + f.writeUint32(uint32(code)) + f.writeBytes(debugData) + return f.endWrite() +} + +// An UnknownFrame is the frame type returned when the frame type is unknown +// or no specific frame type parser exists. +type UnknownFrame struct { + FrameHeader + p []byte +} + +// Payload returns the frame's payload (after the header). It is not +// valid to call this method after a subsequent call to +// Framer.ReadFrame, nor is it valid to retain the returned slice. +// The memory is owned by the Framer and is invalidated when the next +// frame is read. +func (f *UnknownFrame) Payload() []byte { + f.checkValid() + return f.p +} + +func parseUnknownFrame(fh FrameHeader, p []byte) (Frame, error) { + return &UnknownFrame{fh, p}, nil +} + +// A WindowUpdateFrame is used to implement flow control. +// See http://http2.github.io/http2-spec/#rfc.section.6.9 +type WindowUpdateFrame struct { + FrameHeader + Increment uint32 // never read with high bit set +} + +func parseWindowUpdateFrame(fh FrameHeader, p []byte) (Frame, error) { + if len(p) != 4 { + return nil, ConnectionError(ErrCodeFrameSize) + } + inc := binary.BigEndian.Uint32(p[:4]) & 0x7fffffff // mask off high reserved bit + if inc == 0 { + // A receiver MUST treat the receipt of a + // WINDOW_UPDATE frame with an flow control window + // increment of 0 as a stream error (Section 5.4.2) of + // type PROTOCOL_ERROR; errors on the connection flow + // control window MUST be treated as a connection + // error (Section 5.4.1). + if fh.StreamID == 0 { + return nil, ConnectionError(ErrCodeProtocol) + } + return nil, StreamError{fh.StreamID, ErrCodeProtocol} + } + return &WindowUpdateFrame{ + FrameHeader: fh, + Increment: inc, + }, nil +} + +// WriteWindowUpdate writes a WINDOW_UPDATE frame. +// The increment value must be between 1 and 2,147,483,647, inclusive. +// If the Stream ID is zero, the window update applies to the +// connection as a whole. +func (f *Framer) WriteWindowUpdate(streamID, incr uint32) error { + // "The legal range for the increment to the flow control window is 1 to 2^31-1 (2,147,483,647) octets." + if (incr < 1 || incr > 2147483647) && !f.AllowIllegalWrites { + return errors.New("illegal window increment value") + } + f.startWrite(FrameWindowUpdate, 0, streamID) + f.writeUint32(incr) + return f.endWrite() +} + +// A HeadersFrame is used to open a stream and additionally carries a +// header block fragment. +type HeadersFrame struct { + FrameHeader + + // Priority is set if FlagHeadersPriority is set in the FrameHeader. + Priority PriorityParam + + headerFragBuf []byte // not owned +} + +func (f *HeadersFrame) HeaderBlockFragment() []byte { + f.checkValid() + return f.headerFragBuf +} + +func (f *HeadersFrame) HeadersEnded() bool { + return f.FrameHeader.Flags.Has(FlagHeadersEndHeaders) +} + +func (f *HeadersFrame) StreamEnded() bool { + return f.FrameHeader.Flags.Has(FlagHeadersEndStream) +} + +func (f *HeadersFrame) HasPriority() bool { + return f.FrameHeader.Flags.Has(FlagHeadersPriority) +} + +func parseHeadersFrame(fh FrameHeader, p []byte) (_ Frame, err error) { + hf := &HeadersFrame{ + FrameHeader: fh, + } + if fh.StreamID == 0 { + // HEADERS frames MUST be associated with a stream. If a HEADERS frame + // is received whose stream identifier field is 0x0, the recipient MUST + // respond with a connection error (Section 5.4.1) of type + // PROTOCOL_ERROR. + return nil, ConnectionError(ErrCodeProtocol) + } + var padLength uint8 + if fh.Flags.Has(FlagHeadersPadded) { + if p, padLength, err = readByte(p); err != nil { + return + } + } + if fh.Flags.Has(FlagHeadersPriority) { + var v uint32 + p, v, err = readUint32(p) + if err != nil { + return nil, err + } + hf.Priority.StreamDep = v & 0x7fffffff + hf.Priority.Exclusive = (v != hf.Priority.StreamDep) // high bit was set + p, hf.Priority.Weight, err = readByte(p) + if err != nil { + return nil, err + } + } + if len(p)-int(padLength) <= 0 { + return nil, StreamError{fh.StreamID, ErrCodeProtocol} + } + hf.headerFragBuf = p[:len(p)-int(padLength)] + return hf, nil +} + +// HeadersFrameParam are the parameters for writing a HEADERS frame. +type HeadersFrameParam struct { + // StreamID is the required Stream ID to initiate. + StreamID uint32 + // BlockFragment is part (or all) of a Header Block. + BlockFragment []byte + + // EndStream indicates that the header block is the last that + // the endpoint will send for the identified stream. Setting + // this flag causes the stream to enter one of "half closed" + // states. + EndStream bool + + // EndHeaders indicates that this frame contains an entire + // header block and is not followed by any + // CONTINUATION frames. + EndHeaders bool + + // PadLength is the optional number of bytes of zeros to add + // to this frame. + PadLength uint8 + + // Priority, if non-zero, includes stream priority information + // in the HEADER frame. + Priority PriorityParam +} + +// WriteHeaders writes a single HEADERS frame. +// +// This is a low-level header writing method. Encoding headers and +// splitting them into any necessary CONTINUATION frames is handled +// elsewhere. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteHeaders(p HeadersFrameParam) error { + if !validStreamID(p.StreamID) && !f.AllowIllegalWrites { + return errStreamID + } + var flags Flags + if p.PadLength != 0 { + flags |= FlagHeadersPadded + } + if p.EndStream { + flags |= FlagHeadersEndStream + } + if p.EndHeaders { + flags |= FlagHeadersEndHeaders + } + if !p.Priority.IsZero() { + flags |= FlagHeadersPriority + } + f.startWrite(FrameHeaders, flags, p.StreamID) + if p.PadLength != 0 { + f.writeByte(p.PadLength) + } + if !p.Priority.IsZero() { + v := p.Priority.StreamDep + if !validStreamID(v) && !f.AllowIllegalWrites { + return errors.New("invalid dependent stream id") + } + if p.Priority.Exclusive { + v |= 1 << 31 + } + f.writeUint32(v) + f.writeByte(p.Priority.Weight) + } + f.wbuf = append(f.wbuf, p.BlockFragment...) + f.wbuf = append(f.wbuf, padZeros[:p.PadLength]...) + return f.endWrite() +} + +// A PriorityFrame specifies the sender-advised priority of a stream. +// See http://http2.github.io/http2-spec/#rfc.section.6.3 +type PriorityFrame struct { + FrameHeader + PriorityParam +} + +// PriorityParam are the stream prioritzation parameters. +type PriorityParam struct { + // StreamDep is a 31-bit stream identifier for the + // stream that this stream depends on. Zero means no + // dependency. + StreamDep uint32 + + // Exclusive is whether the dependency is exclusive. + Exclusive bool + + // Weight is the stream's zero-indexed weight. It should be + // set together with StreamDep, or neither should be set. Per + // the spec, "Add one to the value to obtain a weight between + // 1 and 256." + Weight uint8 +} + +func (p PriorityParam) IsZero() bool { + return p == PriorityParam{} +} + +func parsePriorityFrame(fh FrameHeader, payload []byte) (Frame, error) { + if fh.StreamID == 0 { + return nil, ConnectionError(ErrCodeProtocol) + } + if len(payload) != 5 { + return nil, ConnectionError(ErrCodeFrameSize) + } + v := binary.BigEndian.Uint32(payload[:4]) + streamID := v & 0x7fffffff // mask off high bit + return &PriorityFrame{ + FrameHeader: fh, + PriorityParam: PriorityParam{ + Weight: payload[4], + StreamDep: streamID, + Exclusive: streamID != v, // was high bit set? + }, + }, nil +} + +// WritePriority writes a PRIORITY frame. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WritePriority(streamID uint32, p PriorityParam) error { + if !validStreamID(streamID) && !f.AllowIllegalWrites { + return errStreamID + } + f.startWrite(FramePriority, 0, streamID) + v := p.StreamDep + if p.Exclusive { + v |= 1 << 31 + } + f.writeUint32(v) + f.writeByte(p.Weight) + return f.endWrite() +} + +// A RSTStreamFrame allows for abnormal termination of a stream. +// See http://http2.github.io/http2-spec/#rfc.section.6.4 +type RSTStreamFrame struct { + FrameHeader + ErrCode ErrCode +} + +func parseRSTStreamFrame(fh FrameHeader, p []byte) (Frame, error) { + if len(p) != 4 { + return nil, ConnectionError(ErrCodeFrameSize) + } + if fh.StreamID == 0 { + return nil, ConnectionError(ErrCodeProtocol) + } + return &RSTStreamFrame{fh, ErrCode(binary.BigEndian.Uint32(p[:4]))}, nil +} + +// WriteRSTStream writes a RST_STREAM frame. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteRSTStream(streamID uint32, code ErrCode) error { + if !validStreamID(streamID) && !f.AllowIllegalWrites { + return errStreamID + } + f.startWrite(FrameRSTStream, 0, streamID) + f.writeUint32(uint32(code)) + return f.endWrite() +} + +// A ContinuationFrame is used to continue a sequence of header block fragments. +// See http://http2.github.io/http2-spec/#rfc.section.6.10 +type ContinuationFrame struct { + FrameHeader + headerFragBuf []byte +} + +func parseContinuationFrame(fh FrameHeader, p []byte) (Frame, error) { + return &ContinuationFrame{fh, p}, nil +} + +func (f *ContinuationFrame) StreamEnded() bool { + return f.FrameHeader.Flags.Has(FlagDataEndStream) +} + +func (f *ContinuationFrame) HeaderBlockFragment() []byte { + f.checkValid() + return f.headerFragBuf +} + +func (f *ContinuationFrame) HeadersEnded() bool { + return f.FrameHeader.Flags.Has(FlagContinuationEndHeaders) +} + +// WriteContinuation writes a CONTINUATION frame. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteContinuation(streamID uint32, endHeaders bool, headerBlockFragment []byte) error { + if !validStreamID(streamID) && !f.AllowIllegalWrites { + return errStreamID + } + var flags Flags + if endHeaders { + flags |= FlagContinuationEndHeaders + } + f.startWrite(FrameContinuation, flags, streamID) + f.wbuf = append(f.wbuf, headerBlockFragment...) + return f.endWrite() +} + +// A PushPromiseFrame is used to initiate a server stream. +// See http://http2.github.io/http2-spec/#rfc.section.6.6 +type PushPromiseFrame struct { + FrameHeader + PromiseID uint32 + headerFragBuf []byte // not owned +} + +func (f *PushPromiseFrame) HeaderBlockFragment() []byte { + f.checkValid() + return f.headerFragBuf +} + +func (f *PushPromiseFrame) HeadersEnded() bool { + return f.FrameHeader.Flags.Has(FlagPushPromiseEndHeaders) +} + +func parsePushPromise(fh FrameHeader, p []byte) (_ Frame, err error) { + pp := &PushPromiseFrame{ + FrameHeader: fh, + } + if pp.StreamID == 0 { + // PUSH_PROMISE frames MUST be associated with an existing, + // peer-initiated stream. The stream identifier of a + // PUSH_PROMISE frame indicates the stream it is associated + // with. If the stream identifier field specifies the value + // 0x0, a recipient MUST respond with a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + return nil, ConnectionError(ErrCodeProtocol) + } + // The PUSH_PROMISE frame includes optional padding. + // Padding fields and flags are identical to those defined for DATA frames + var padLength uint8 + if fh.Flags.Has(FlagPushPromisePadded) { + if p, padLength, err = readByte(p); err != nil { + return + } + } + + p, pp.PromiseID, err = readUint32(p) + if err != nil { + return + } + pp.PromiseID = pp.PromiseID & (1<<31 - 1) + + if int(padLength) > len(p) { + // like the DATA frame, error out if padding is longer than the body. + return nil, ConnectionError(ErrCodeProtocol) + } + pp.headerFragBuf = p[:len(p)-int(padLength)] + return pp, nil +} + +// PushPromiseParam are the parameters for writing a PUSH_PROMISE frame. +type PushPromiseParam struct { + // StreamID is the required Stream ID to initiate. + StreamID uint32 + + // PromiseID is the required Stream ID which this + // Push Promises + PromiseID uint32 + + // BlockFragment is part (or all) of a Header Block. + BlockFragment []byte + + // EndHeaders indicates that this frame contains an entire + // header block and is not followed by any + // CONTINUATION frames. + EndHeaders bool + + // PadLength is the optional number of bytes of zeros to add + // to this frame. + PadLength uint8 +} + +// WritePushPromise writes a single PushPromise Frame. +// +// As with Header Frames, This is the low level call for writing +// individual frames. Continuation frames are handled elsewhere. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WritePushPromise(p PushPromiseParam) error { + if !validStreamID(p.StreamID) && !f.AllowIllegalWrites { + return errStreamID + } + var flags Flags + if p.PadLength != 0 { + flags |= FlagPushPromisePadded + } + if p.EndHeaders { + flags |= FlagPushPromiseEndHeaders + } + f.startWrite(FramePushPromise, flags, p.StreamID) + if p.PadLength != 0 { + f.writeByte(p.PadLength) + } + if !validStreamID(p.PromiseID) && !f.AllowIllegalWrites { + return errStreamID + } + f.writeUint32(p.PromiseID) + f.wbuf = append(f.wbuf, p.BlockFragment...) + f.wbuf = append(f.wbuf, padZeros[:p.PadLength]...) + return f.endWrite() +} + +// WriteRawFrame writes a raw frame. This can be used to write +// extension frames unknown to this package. +func (f *Framer) WriteRawFrame(t FrameType, flags Flags, streamID uint32, payload []byte) error { + f.startWrite(t, flags, streamID) + f.writeBytes(payload) + return f.endWrite() +} + +func readByte(p []byte) (remain []byte, b byte, err error) { + if len(p) == 0 { + return nil, 0, io.ErrUnexpectedEOF + } + return p[1:], p[0], nil +} + +func readUint32(p []byte) (remain []byte, v uint32, err error) { + if len(p) < 4 { + return nil, 0, io.ErrUnexpectedEOF + } + return p[4:], binary.BigEndian.Uint32(p[:4]), nil +} + +type streamEnder interface { + StreamEnded() bool +} + +type headersEnder interface { + HeadersEnded() bool +} diff --git a/vendor/golang.org/x/net/http2/frame_test.go b/vendor/golang.org/x/net/http2/frame_test.go new file mode 100644 index 00000000..20027c5f --- /dev/null +++ b/vendor/golang.org/x/net/http2/frame_test.go @@ -0,0 +1,597 @@ +// Copyright 2014 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 http2 + +import ( + "bytes" + "reflect" + "strings" + "testing" + "unsafe" +) + +func testFramer() (*Framer, *bytes.Buffer) { + buf := new(bytes.Buffer) + return NewFramer(buf, buf), buf +} + +func TestFrameSizes(t *testing.T) { + // Catch people rearranging the FrameHeader fields. + if got, want := int(unsafe.Sizeof(FrameHeader{})), 12; got != want { + t.Errorf("FrameHeader size = %d; want %d", got, want) + } +} + +func TestFrameTypeString(t *testing.T) { + tests := []struct { + ft FrameType + want string + }{ + {FrameData, "DATA"}, + {FramePing, "PING"}, + {FrameGoAway, "GOAWAY"}, + {0xf, "UNKNOWN_FRAME_TYPE_15"}, + } + + for i, tt := range tests { + got := tt.ft.String() + if got != tt.want { + t.Errorf("%d. String(FrameType %d) = %q; want %q", i, int(tt.ft), got, tt.want) + } + } +} + +func TestWriteRST(t *testing.T) { + fr, buf := testFramer() + var streamID uint32 = 1<<24 + 2<<16 + 3<<8 + 4 + var errCode uint32 = 7<<24 + 6<<16 + 5<<8 + 4 + fr.WriteRSTStream(streamID, ErrCode(errCode)) + const wantEnc = "\x00\x00\x04\x03\x00\x01\x02\x03\x04\x07\x06\x05\x04" + if buf.String() != wantEnc { + t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc) + } + f, err := fr.ReadFrame() + if err != nil { + t.Fatal(err) + } + want := &RSTStreamFrame{ + FrameHeader: FrameHeader{ + valid: true, + Type: 0x3, + Flags: 0x0, + Length: 0x4, + StreamID: 0x1020304, + }, + ErrCode: 0x7060504, + } + if !reflect.DeepEqual(f, want) { + t.Errorf("parsed back %#v; want %#v", f, want) + } +} + +func TestWriteData(t *testing.T) { + fr, buf := testFramer() + var streamID uint32 = 1<<24 + 2<<16 + 3<<8 + 4 + data := []byte("ABC") + fr.WriteData(streamID, true, data) + const wantEnc = "\x00\x00\x03\x00\x01\x01\x02\x03\x04ABC" + if buf.String() != wantEnc { + t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc) + } + f, err := fr.ReadFrame() + if err != nil { + t.Fatal(err) + } + df, ok := f.(*DataFrame) + if !ok { + t.Fatalf("got %T; want *DataFrame", f) + } + if !bytes.Equal(df.Data(), data) { + t.Errorf("got %q; want %q", df.Data(), data) + } + if f.Header().Flags&1 == 0 { + t.Errorf("didn't see END_STREAM flag") + } +} + +func TestWriteHeaders(t *testing.T) { + tests := []struct { + name string + p HeadersFrameParam + wantEnc string + wantFrame *HeadersFrame + }{ + { + "basic", + HeadersFrameParam{ + StreamID: 42, + BlockFragment: []byte("abc"), + Priority: PriorityParam{}, + }, + "\x00\x00\x03\x01\x00\x00\x00\x00*abc", + &HeadersFrame{ + FrameHeader: FrameHeader{ + valid: true, + StreamID: 42, + Type: FrameHeaders, + Length: uint32(len("abc")), + }, + Priority: PriorityParam{}, + headerFragBuf: []byte("abc"), + }, + }, + { + "basic + end flags", + HeadersFrameParam{ + StreamID: 42, + BlockFragment: []byte("abc"), + EndStream: true, + EndHeaders: true, + Priority: PriorityParam{}, + }, + "\x00\x00\x03\x01\x05\x00\x00\x00*abc", + &HeadersFrame{ + FrameHeader: FrameHeader{ + valid: true, + StreamID: 42, + Type: FrameHeaders, + Flags: FlagHeadersEndStream | FlagHeadersEndHeaders, + Length: uint32(len("abc")), + }, + Priority: PriorityParam{}, + headerFragBuf: []byte("abc"), + }, + }, + { + "with padding", + HeadersFrameParam{ + StreamID: 42, + BlockFragment: []byte("abc"), + EndStream: true, + EndHeaders: true, + PadLength: 5, + Priority: PriorityParam{}, + }, + "\x00\x00\t\x01\r\x00\x00\x00*\x05abc\x00\x00\x00\x00\x00", + &HeadersFrame{ + FrameHeader: FrameHeader{ + valid: true, + StreamID: 42, + Type: FrameHeaders, + Flags: FlagHeadersEndStream | FlagHeadersEndHeaders | FlagHeadersPadded, + Length: uint32(1 + len("abc") + 5), // pad length + contents + padding + }, + Priority: PriorityParam{}, + headerFragBuf: []byte("abc"), + }, + }, + { + "with priority", + HeadersFrameParam{ + StreamID: 42, + BlockFragment: []byte("abc"), + EndStream: true, + EndHeaders: true, + PadLength: 2, + Priority: PriorityParam{ + StreamDep: 15, + Exclusive: true, + Weight: 127, + }, + }, + "\x00\x00\v\x01-\x00\x00\x00*\x02\x80\x00\x00\x0f\u007fabc\x00\x00", + &HeadersFrame{ + FrameHeader: FrameHeader{ + valid: true, + StreamID: 42, + Type: FrameHeaders, + Flags: FlagHeadersEndStream | FlagHeadersEndHeaders | FlagHeadersPadded | FlagHeadersPriority, + Length: uint32(1 + 5 + len("abc") + 2), // pad length + priority + contents + padding + }, + Priority: PriorityParam{ + StreamDep: 15, + Exclusive: true, + Weight: 127, + }, + headerFragBuf: []byte("abc"), + }, + }, + } + for _, tt := range tests { + fr, buf := testFramer() + if err := fr.WriteHeaders(tt.p); err != nil { + t.Errorf("test %q: %v", tt.name, err) + continue + } + if buf.String() != tt.wantEnc { + t.Errorf("test %q: encoded %q; want %q", tt.name, buf.Bytes(), tt.wantEnc) + } + f, err := fr.ReadFrame() + if err != nil { + t.Errorf("test %q: failed to read the frame back: %v", tt.name, err) + continue + } + if !reflect.DeepEqual(f, tt.wantFrame) { + t.Errorf("test %q: mismatch.\n got: %#v\nwant: %#v\n", tt.name, f, tt.wantFrame) + } + } +} + +func TestWriteContinuation(t *testing.T) { + const streamID = 42 + tests := []struct { + name string + end bool + frag []byte + + wantFrame *ContinuationFrame + }{ + { + "not end", + false, + []byte("abc"), + &ContinuationFrame{ + FrameHeader: FrameHeader{ + valid: true, + StreamID: streamID, + Type: FrameContinuation, + Length: uint32(len("abc")), + }, + headerFragBuf: []byte("abc"), + }, + }, + { + "end", + true, + []byte("def"), + &ContinuationFrame{ + FrameHeader: FrameHeader{ + valid: true, + StreamID: streamID, + Type: FrameContinuation, + Flags: FlagContinuationEndHeaders, + Length: uint32(len("def")), + }, + headerFragBuf: []byte("def"), + }, + }, + } + for _, tt := range tests { + fr, _ := testFramer() + if err := fr.WriteContinuation(streamID, tt.end, tt.frag); err != nil { + t.Errorf("test %q: %v", tt.name, err) + continue + } + f, err := fr.ReadFrame() + if err != nil { + t.Errorf("test %q: failed to read the frame back: %v", tt.name, err) + continue + } + if !reflect.DeepEqual(f, tt.wantFrame) { + t.Errorf("test %q: mismatch.\n got: %#v\nwant: %#v\n", tt.name, f, tt.wantFrame) + } + } +} + +func TestWritePriority(t *testing.T) { + const streamID = 42 + tests := []struct { + name string + priority PriorityParam + wantFrame *PriorityFrame + }{ + { + "not exclusive", + PriorityParam{ + StreamDep: 2, + Exclusive: false, + Weight: 127, + }, + &PriorityFrame{ + FrameHeader{ + valid: true, + StreamID: streamID, + Type: FramePriority, + Length: 5, + }, + PriorityParam{ + StreamDep: 2, + Exclusive: false, + Weight: 127, + }, + }, + }, + + { + "exclusive", + PriorityParam{ + StreamDep: 3, + Exclusive: true, + Weight: 77, + }, + &PriorityFrame{ + FrameHeader{ + valid: true, + StreamID: streamID, + Type: FramePriority, + Length: 5, + }, + PriorityParam{ + StreamDep: 3, + Exclusive: true, + Weight: 77, + }, + }, + }, + } + for _, tt := range tests { + fr, _ := testFramer() + if err := fr.WritePriority(streamID, tt.priority); err != nil { + t.Errorf("test %q: %v", tt.name, err) + continue + } + f, err := fr.ReadFrame() + if err != nil { + t.Errorf("test %q: failed to read the frame back: %v", tt.name, err) + continue + } + if !reflect.DeepEqual(f, tt.wantFrame) { + t.Errorf("test %q: mismatch.\n got: %#v\nwant: %#v\n", tt.name, f, tt.wantFrame) + } + } +} + +func TestWriteSettings(t *testing.T) { + fr, buf := testFramer() + settings := []Setting{{1, 2}, {3, 4}} + fr.WriteSettings(settings...) + const wantEnc = "\x00\x00\f\x04\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00\x00\x04" + if buf.String() != wantEnc { + t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc) + } + f, err := fr.ReadFrame() + if err != nil { + t.Fatal(err) + } + sf, ok := f.(*SettingsFrame) + if !ok { + t.Fatalf("Got a %T; want a SettingsFrame", f) + } + var got []Setting + sf.ForeachSetting(func(s Setting) error { + got = append(got, s) + valBack, ok := sf.Value(s.ID) + if !ok || valBack != s.Val { + t.Errorf("Value(%d) = %v, %v; want %v, true", s.ID, valBack, ok, s.Val) + } + return nil + }) + if !reflect.DeepEqual(settings, got) { + t.Errorf("Read settings %+v != written settings %+v", got, settings) + } +} + +func TestWriteSettingsAck(t *testing.T) { + fr, buf := testFramer() + fr.WriteSettingsAck() + const wantEnc = "\x00\x00\x00\x04\x01\x00\x00\x00\x00" + if buf.String() != wantEnc { + t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc) + } +} + +func TestWriteWindowUpdate(t *testing.T) { + fr, buf := testFramer() + const streamID = 1<<24 + 2<<16 + 3<<8 + 4 + const incr = 7<<24 + 6<<16 + 5<<8 + 4 + if err := fr.WriteWindowUpdate(streamID, incr); err != nil { + t.Fatal(err) + } + const wantEnc = "\x00\x00\x04\x08\x00\x01\x02\x03\x04\x07\x06\x05\x04" + if buf.String() != wantEnc { + t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc) + } + f, err := fr.ReadFrame() + if err != nil { + t.Fatal(err) + } + want := &WindowUpdateFrame{ + FrameHeader: FrameHeader{ + valid: true, + Type: 0x8, + Flags: 0x0, + Length: 0x4, + StreamID: 0x1020304, + }, + Increment: 0x7060504, + } + if !reflect.DeepEqual(f, want) { + t.Errorf("parsed back %#v; want %#v", f, want) + } +} + +func TestWritePing(t *testing.T) { testWritePing(t, false) } +func TestWritePingAck(t *testing.T) { testWritePing(t, true) } + +func testWritePing(t *testing.T, ack bool) { + fr, buf := testFramer() + if err := fr.WritePing(ack, [8]byte{1, 2, 3, 4, 5, 6, 7, 8}); err != nil { + t.Fatal(err) + } + var wantFlags Flags + if ack { + wantFlags = FlagPingAck + } + var wantEnc = "\x00\x00\x08\x06" + string(wantFlags) + "\x00\x00\x00\x00" + "\x01\x02\x03\x04\x05\x06\x07\x08" + if buf.String() != wantEnc { + t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc) + } + + f, err := fr.ReadFrame() + if err != nil { + t.Fatal(err) + } + want := &PingFrame{ + FrameHeader: FrameHeader{ + valid: true, + Type: 0x6, + Flags: wantFlags, + Length: 0x8, + StreamID: 0, + }, + Data: [8]byte{1, 2, 3, 4, 5, 6, 7, 8}, + } + if !reflect.DeepEqual(f, want) { + t.Errorf("parsed back %#v; want %#v", f, want) + } +} + +func TestReadFrameHeader(t *testing.T) { + tests := []struct { + in string + want FrameHeader + }{ + {in: "\x00\x00\x00" + "\x00" + "\x00" + "\x00\x00\x00\x00", want: FrameHeader{}}, + {in: "\x01\x02\x03" + "\x04" + "\x05" + "\x06\x07\x08\x09", want: FrameHeader{ + Length: 66051, Type: 4, Flags: 5, StreamID: 101124105, + }}, + // Ignore high bit: + {in: "\xff\xff\xff" + "\xff" + "\xff" + "\xff\xff\xff\xff", want: FrameHeader{ + Length: 16777215, Type: 255, Flags: 255, StreamID: 2147483647}}, + {in: "\xff\xff\xff" + "\xff" + "\xff" + "\x7f\xff\xff\xff", want: FrameHeader{ + Length: 16777215, Type: 255, Flags: 255, StreamID: 2147483647}}, + } + for i, tt := range tests { + got, err := readFrameHeader(make([]byte, 9), strings.NewReader(tt.in)) + if err != nil { + t.Errorf("%d. readFrameHeader(%q) = %v", i, tt.in, err) + continue + } + tt.want.valid = true + if got != tt.want { + t.Errorf("%d. readFrameHeader(%q) = %+v; want %+v", i, tt.in, got, tt.want) + } + } +} + +func TestReadWriteFrameHeader(t *testing.T) { + tests := []struct { + len uint32 + typ FrameType + flags Flags + streamID uint32 + }{ + {len: 0, typ: 255, flags: 1, streamID: 0}, + {len: 0, typ: 255, flags: 1, streamID: 1}, + {len: 0, typ: 255, flags: 1, streamID: 255}, + {len: 0, typ: 255, flags: 1, streamID: 256}, + {len: 0, typ: 255, flags: 1, streamID: 65535}, + {len: 0, typ: 255, flags: 1, streamID: 65536}, + + {len: 0, typ: 1, flags: 255, streamID: 1}, + {len: 255, typ: 1, flags: 255, streamID: 1}, + {len: 256, typ: 1, flags: 255, streamID: 1}, + {len: 65535, typ: 1, flags: 255, streamID: 1}, + {len: 65536, typ: 1, flags: 255, streamID: 1}, + {len: 16777215, typ: 1, flags: 255, streamID: 1}, + } + for _, tt := range tests { + fr, buf := testFramer() + fr.startWrite(tt.typ, tt.flags, tt.streamID) + fr.writeBytes(make([]byte, tt.len)) + fr.endWrite() + fh, err := ReadFrameHeader(buf) + if err != nil { + t.Errorf("ReadFrameHeader(%+v) = %v", tt, err) + continue + } + if fh.Type != tt.typ || fh.Flags != tt.flags || fh.Length != tt.len || fh.StreamID != tt.streamID { + t.Errorf("ReadFrameHeader(%+v) = %+v; mismatch", tt, fh) + } + } + +} + +func TestWriteTooLargeFrame(t *testing.T) { + fr, _ := testFramer() + fr.startWrite(0, 1, 1) + fr.writeBytes(make([]byte, 1<<24)) + err := fr.endWrite() + if err != ErrFrameTooLarge { + t.Errorf("endWrite = %v; want errFrameTooLarge", err) + } +} + +func TestWriteGoAway(t *testing.T) { + const debug = "foo" + fr, buf := testFramer() + if err := fr.WriteGoAway(0x01020304, 0x05060708, []byte(debug)); err != nil { + t.Fatal(err) + } + const wantEnc = "\x00\x00\v\a\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08" + debug + if buf.String() != wantEnc { + t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc) + } + f, err := fr.ReadFrame() + if err != nil { + t.Fatal(err) + } + want := &GoAwayFrame{ + FrameHeader: FrameHeader{ + valid: true, + Type: 0x7, + Flags: 0, + Length: uint32(4 + 4 + len(debug)), + StreamID: 0, + }, + LastStreamID: 0x01020304, + ErrCode: 0x05060708, + debugData: []byte(debug), + } + if !reflect.DeepEqual(f, want) { + t.Fatalf("parsed back:\n%#v\nwant:\n%#v", f, want) + } + if got := string(f.(*GoAwayFrame).DebugData()); got != debug { + t.Errorf("debug data = %q; want %q", got, debug) + } +} + +func TestWritePushPromise(t *testing.T) { + pp := PushPromiseParam{ + StreamID: 42, + PromiseID: 42, + BlockFragment: []byte("abc"), + } + fr, buf := testFramer() + if err := fr.WritePushPromise(pp); err != nil { + t.Fatal(err) + } + const wantEnc = "\x00\x00\x07\x05\x00\x00\x00\x00*\x00\x00\x00*abc" + if buf.String() != wantEnc { + t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc) + } + f, err := fr.ReadFrame() + if err != nil { + t.Fatal(err) + } + _, ok := f.(*PushPromiseFrame) + if !ok { + t.Fatalf("got %T; want *PushPromiseFrame", f) + } + want := &PushPromiseFrame{ + FrameHeader: FrameHeader{ + valid: true, + Type: 0x5, + Flags: 0x0, + Length: 0x7, + StreamID: 42, + }, + PromiseID: 42, + headerFragBuf: []byte("abc"), + } + if !reflect.DeepEqual(f, want) { + t.Fatalf("parsed back:\n%#v\nwant:\n%#v", f, want) + } +} diff --git a/vendor/golang.org/x/net/http2/go15.go b/vendor/golang.org/x/net/http2/go15.go new file mode 100644 index 00000000..dbf6033f --- /dev/null +++ b/vendor/golang.org/x/net/http2/go15.go @@ -0,0 +1,13 @@ +// Copyright 2015 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 !go1.6 + +package http2 + +import "net/http" + +func configureTransport(t1 *http.Transport) error { + return errTransportVersion +} diff --git a/vendor/golang.org/x/net/http2/gotrack.go b/vendor/golang.org/x/net/http2/gotrack.go new file mode 100644 index 00000000..9933c9f8 --- /dev/null +++ b/vendor/golang.org/x/net/http2/gotrack.go @@ -0,0 +1,170 @@ +// Copyright 2014 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. + +// Defensive debug-only utility to track that functions run on the +// goroutine that they're supposed to. + +package http2 + +import ( + "bytes" + "errors" + "fmt" + "os" + "runtime" + "strconv" + "sync" +) + +var DebugGoroutines = os.Getenv("DEBUG_HTTP2_GOROUTINES") == "1" + +type goroutineLock uint64 + +func newGoroutineLock() goroutineLock { + if !DebugGoroutines { + return 0 + } + return goroutineLock(curGoroutineID()) +} + +func (g goroutineLock) check() { + if !DebugGoroutines { + return + } + if curGoroutineID() != uint64(g) { + panic("running on the wrong goroutine") + } +} + +func (g goroutineLock) checkNotOn() { + if !DebugGoroutines { + return + } + if curGoroutineID() == uint64(g) { + panic("running on the wrong goroutine") + } +} + +var goroutineSpace = []byte("goroutine ") + +func curGoroutineID() uint64 { + bp := littleBuf.Get().(*[]byte) + defer littleBuf.Put(bp) + b := *bp + b = b[:runtime.Stack(b, false)] + // Parse the 4707 out of "goroutine 4707 [" + b = bytes.TrimPrefix(b, goroutineSpace) + i := bytes.IndexByte(b, ' ') + if i < 0 { + panic(fmt.Sprintf("No space found in %q", b)) + } + b = b[:i] + n, err := parseUintBytes(b, 10, 64) + if err != nil { + panic(fmt.Sprintf("Failed to parse goroutine ID out of %q: %v", b, err)) + } + return n +} + +var littleBuf = sync.Pool{ + New: func() interface{} { + buf := make([]byte, 64) + return &buf + }, +} + +// parseUintBytes is like strconv.ParseUint, but using a []byte. +func parseUintBytes(s []byte, base int, bitSize int) (n uint64, err error) { + var cutoff, maxVal uint64 + + if bitSize == 0 { + bitSize = int(strconv.IntSize) + } + + s0 := s + switch { + case len(s) < 1: + err = strconv.ErrSyntax + goto Error + + case 2 <= base && base <= 36: + // valid base; nothing to do + + case base == 0: + // Look for octal, hex prefix. + switch { + case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'): + base = 16 + s = s[2:] + if len(s) < 1 { + err = strconv.ErrSyntax + goto Error + } + case s[0] == '0': + base = 8 + default: + base = 10 + } + + default: + err = errors.New("invalid base " + strconv.Itoa(base)) + goto Error + } + + n = 0 + cutoff = cutoff64(base) + maxVal = 1<= base { + n = 0 + err = strconv.ErrSyntax + goto Error + } + + if n >= cutoff { + // n*base overflows + n = 1<<64 - 1 + err = strconv.ErrRange + goto Error + } + n *= uint64(base) + + n1 := n + uint64(v) + if n1 < n || n1 > maxVal { + // n+v overflows + n = 1<<64 - 1 + err = strconv.ErrRange + goto Error + } + n = n1 + } + + return n, nil + +Error: + return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err} +} + +// Return the first number n such that n*base >= 1<<64. +func cutoff64(base int) uint64 { + if base < 2 { + return 0 + } + return (1<<64-1)/uint64(base) + 1 +} diff --git a/vendor/golang.org/x/net/http2/gotrack_test.go b/vendor/golang.org/x/net/http2/gotrack_test.go new file mode 100644 index 00000000..3147cf8c --- /dev/null +++ b/vendor/golang.org/x/net/http2/gotrack_test.go @@ -0,0 +1,30 @@ +// Copyright 2014 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 http2 + +import ( + "fmt" + "strings" + "testing" +) + +func TestGoroutineLock(t *testing.T) { + DebugGoroutines = true + g := newGoroutineLock() + g.check() + + sawPanic := make(chan interface{}) + go func() { + defer func() { sawPanic <- recover() }() + g.check() // should panic + }() + e := <-sawPanic + if e == nil { + t.Fatal("did not see panic from check in other goroutine") + } + if !strings.Contains(fmt.Sprint(e), "wrong goroutine") { + t.Errorf("expected on see panic about running on the wrong goroutine; got %v", e) + } +} diff --git a/vendor/golang.org/x/net/http2/h2demo/.gitignore b/vendor/golang.org/x/net/http2/h2demo/.gitignore new file mode 100644 index 00000000..0de86ddb --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/.gitignore @@ -0,0 +1,5 @@ +h2demo +h2demo.linux +client-id.dat +client-secret.dat +token.dat diff --git a/vendor/golang.org/x/net/http2/h2demo/Makefile b/vendor/golang.org/x/net/http2/h2demo/Makefile new file mode 100644 index 00000000..3a77cf07 --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/Makefile @@ -0,0 +1,5 @@ +h2demo.linux: h2demo.go + GOOS=linux go build --tags=h2demo -o h2demo.linux . + +upload: h2demo.linux + cat h2demo.linux | go run launch.go --write_object=http2-demo-server-tls/h2demo --write_object_is_public diff --git a/vendor/golang.org/x/net/http2/h2demo/README b/vendor/golang.org/x/net/http2/h2demo/README new file mode 100644 index 00000000..212a96f3 --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/README @@ -0,0 +1,16 @@ + +Client: + -- Firefox nightly with about:config network.http.spdy.enabled.http2draft set true + -- Chrome: go to chrome://flags/#enable-spdy4, save and restart (button at bottom) + +Make CA: +$ openssl genrsa -out rootCA.key 2048 +$ openssl req -x509 -new -nodes -key rootCA.key -days 1024 -out rootCA.pem +... install that to Firefox + +Make cert: +$ openssl genrsa -out server.key 2048 +$ openssl req -new -key server.key -out server.csr +$ openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 + + diff --git a/vendor/golang.org/x/net/http2/h2demo/h2demo.go b/vendor/golang.org/x/net/http2/h2demo/h2demo.go new file mode 100644 index 00000000..84b89e2b --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/h2demo.go @@ -0,0 +1,436 @@ +// Copyright 2014 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 h2demo + +package main + +import ( + "bytes" + "crypto/tls" + "flag" + "fmt" + "hash/crc32" + "image" + "image/jpeg" + "io" + "io/ioutil" + "log" + "net" + "net/http" + "path" + "regexp" + "runtime" + "strconv" + "strings" + "sync" + "time" + + "camlistore.org/pkg/googlestorage" + "camlistore.org/pkg/singleflight" + "golang.org/x/net/http2" +) + +var ( + prod = flag.Bool("prod", false, "Whether to configure itself to be the production http2.golang.org server.") + + httpsAddr = flag.String("https_addr", "localhost:4430", "TLS address to listen on ('host:port' or ':port'). Required.") + httpAddr = flag.String("http_addr", "", "Plain HTTP address to listen on ('host:port', or ':port'). Empty means no HTTP.") + + hostHTTP = flag.String("http_host", "", "Optional host or host:port to use for http:// links to this service. By default, this is implied from -http_addr.") + hostHTTPS = flag.String("https_host", "", "Optional host or host:port to use for http:// links to this service. By default, this is implied from -https_addr.") +) + +func homeOldHTTP(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, ` + +

Go + HTTP/2

+

Welcome to the Go language's HTTP/2 demo & interop server.

+

Unfortunately, you're not using HTTP/2 right now. To do so:

+
    +
  • Use Firefox Nightly or go to about:config and enable "network.http.spdy.enabled.http2draft"
  • +
  • Use Google Chrome Canary and/or go to chrome://flags/#enable-spdy4 to Enable SPDY/4 (Chrome's name for HTTP/2)
  • +
+

See code & instructions for connecting at https://github.com/golang/net/tree/master/http2.

+ +`) +} + +func home(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/" { + http.NotFound(w, r) + return + } + io.WriteString(w, ` + +

Go + HTTP/2

+ +

Welcome to the Go language's HTTP/2 demo & interop server.

+ +

Congratulations, you're using HTTP/2 right now.

+ +

This server exists for others in the HTTP/2 community to test their HTTP/2 client implementations and point out flaws in our server.

+ +

The code is currently at golang.org/x/net/http2 +but will move to the Go standard library at some point in the future +(enabled by default, without users needing to change their code).

+ +

Contact info: bradfitz@golang.org, or file a bug.

+ +

Handlers for testing

+
    +
  • GET /reqinfo to dump the request + headers received
  • +
  • GET /clockstream streams the current time every second
  • +
  • GET /gophertiles to see a page with a bunch of images
  • +
  • GET /file/gopher.png for a small file (does If-Modified-Since, Content-Range, etc)
  • +
  • GET /file/go.src.tar.gz for a larger file (~10 MB)
  • +
  • GET /redirect to redirect back to / (this page)
  • +
  • GET /goroutines to see all active goroutines in this server
  • +
  • PUT something to /crc32 to get a count of number of bytes and its CRC-32
  • +
+ +`) +} + +func reqInfoHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "Method: %s\n", r.Method) + fmt.Fprintf(w, "Protocol: %s\n", r.Proto) + fmt.Fprintf(w, "Host: %s\n", r.Host) + fmt.Fprintf(w, "RemoteAddr: %s\n", r.RemoteAddr) + fmt.Fprintf(w, "RequestURI: %q\n", r.RequestURI) + fmt.Fprintf(w, "URL: %#v\n", r.URL) + fmt.Fprintf(w, "Body.ContentLength: %d (-1 means unknown)\n", r.ContentLength) + fmt.Fprintf(w, "Close: %v (relevant for HTTP/1 only)\n", r.Close) + fmt.Fprintf(w, "TLS: %#v\n", r.TLS) + fmt.Fprintf(w, "\nHeaders:\n") + r.Header.Write(w) +} + +func crcHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != "PUT" { + http.Error(w, "PUT required.", 400) + return + } + crc := crc32.NewIEEE() + n, err := io.Copy(crc, r.Body) + if err == nil { + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "bytes=%d, CRC32=%x", n, crc.Sum(nil)) + } +} + +var ( + fsGrp singleflight.Group + fsMu sync.Mutex // guards fsCache + fsCache = map[string]http.Handler{} +) + +// fileServer returns a file-serving handler that proxies URL. +// It lazily fetches URL on the first access and caches its contents forever. +func fileServer(url string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + hi, err := fsGrp.Do(url, func() (interface{}, error) { + fsMu.Lock() + if h, ok := fsCache[url]; ok { + fsMu.Unlock() + return h, nil + } + fsMu.Unlock() + + res, err := http.Get(url) + if err != nil { + return nil, err + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return nil, err + } + + modTime := time.Now() + var h http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.ServeContent(w, r, path.Base(url), modTime, bytes.NewReader(slurp)) + }) + fsMu.Lock() + fsCache[url] = h + fsMu.Unlock() + return h, nil + }) + if err != nil { + http.Error(w, err.Error(), 500) + return + } + hi.(http.Handler).ServeHTTP(w, r) + }) +} + +func clockStreamHandler(w http.ResponseWriter, r *http.Request) { + clientGone := w.(http.CloseNotifier).CloseNotify() + w.Header().Set("Content-Type", "text/plain") + ticker := time.NewTicker(1 * time.Second) + defer ticker.Stop() + fmt.Fprintf(w, "# ~1KB of junk to force browsers to start rendering immediately: \n") + io.WriteString(w, strings.Repeat("# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n", 13)) + + for { + fmt.Fprintf(w, "%v\n", time.Now()) + w.(http.Flusher).Flush() + select { + case <-ticker.C: + case <-clientGone: + log.Printf("Client %v disconnected from the clock", r.RemoteAddr) + return + } + } +} + +func registerHandlers() { + tiles := newGopherTilesHandler() + + mux2 := http.NewServeMux() + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + if r.TLS == nil { + if r.URL.Path == "/gophertiles" { + tiles.ServeHTTP(w, r) + return + } + http.Redirect(w, r, "https://"+httpsHost()+"/", http.StatusFound) + return + } + if r.ProtoMajor == 1 { + if r.URL.Path == "/reqinfo" { + reqInfoHandler(w, r) + return + } + homeOldHTTP(w, r) + return + } + mux2.ServeHTTP(w, r) + }) + mux2.HandleFunc("/", home) + mux2.Handle("/file/gopher.png", fileServer("https://golang.org/doc/gopher/frontpage.png")) + mux2.Handle("/file/go.src.tar.gz", fileServer("https://storage.googleapis.com/golang/go1.4.1.src.tar.gz")) + mux2.HandleFunc("/reqinfo", reqInfoHandler) + mux2.HandleFunc("/crc32", crcHandler) + mux2.HandleFunc("/clockstream", clockStreamHandler) + mux2.Handle("/gophertiles", tiles) + mux2.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) { + http.Redirect(w, r, "/", http.StatusFound) + }) + stripHomedir := regexp.MustCompile(`/(Users|home)/\w+`) + mux2.HandleFunc("/goroutines", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + buf := make([]byte, 2<<20) + w.Write(stripHomedir.ReplaceAll(buf[:runtime.Stack(buf, true)], nil)) + }) +} + +func newGopherTilesHandler() http.Handler { + const gopherURL = "https://blog.golang.org/go-programming-language-turns-two_gophers.jpg" + res, err := http.Get(gopherURL) + if err != nil { + log.Fatal(err) + } + if res.StatusCode != 200 { + log.Fatalf("Error fetching %s: %v", gopherURL, res.Status) + } + slurp, err := ioutil.ReadAll(res.Body) + res.Body.Close() + if err != nil { + log.Fatal(err) + } + im, err := jpeg.Decode(bytes.NewReader(slurp)) + if err != nil { + if len(slurp) > 1024 { + slurp = slurp[:1024] + } + log.Fatalf("Failed to decode gopher image: %v (got %q)", err, slurp) + } + + type subImager interface { + SubImage(image.Rectangle) image.Image + } + const tileSize = 32 + xt := im.Bounds().Max.X / tileSize + yt := im.Bounds().Max.Y / tileSize + var tile [][][]byte // y -> x -> jpeg bytes + for yi := 0; yi < yt; yi++ { + var row [][]byte + for xi := 0; xi < xt; xi++ { + si := im.(subImager).SubImage(image.Rectangle{ + Min: image.Point{xi * tileSize, yi * tileSize}, + Max: image.Point{(xi + 1) * tileSize, (yi + 1) * tileSize}, + }) + buf := new(bytes.Buffer) + if err := jpeg.Encode(buf, si, &jpeg.Options{Quality: 90}); err != nil { + log.Fatal(err) + } + row = append(row, buf.Bytes()) + } + tile = append(tile, row) + } + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ms, _ := strconv.Atoi(r.FormValue("latency")) + const nanosPerMilli = 1e6 + if r.FormValue("x") != "" { + x, _ := strconv.Atoi(r.FormValue("x")) + y, _ := strconv.Atoi(r.FormValue("y")) + if ms <= 1000 { + time.Sleep(time.Duration(ms) * nanosPerMilli) + } + if x >= 0 && x < xt && y >= 0 && y < yt { + http.ServeContent(w, r, "", time.Time{}, bytes.NewReader(tile[y][x])) + return + } + } + io.WriteString(w, "") + fmt.Fprintf(w, "A grid of %d tiled images is below. Compare:

", xt*yt) + for _, ms := range []int{0, 30, 200, 1000} { + d := time.Duration(ms) * nanosPerMilli + fmt.Fprintf(w, "[HTTP/2, %v latency] [HTTP/1, %v latency]
\n", + httpsHost(), ms, d, + httpHost(), ms, d, + ) + } + io.WriteString(w, "

\n") + cacheBust := time.Now().UnixNano() + for y := 0; y < yt; y++ { + for x := 0; x < xt; x++ { + fmt.Fprintf(w, "", + tileSize, tileSize, x, y, cacheBust, ms) + } + io.WriteString(w, "
\n") + } + io.WriteString(w, `

+ +
<< Back to Go HTTP/2 demo server`) + }) +} + +func httpsHost() string { + if *hostHTTPS != "" { + return *hostHTTPS + } + if v := *httpsAddr; strings.HasPrefix(v, ":") { + return "localhost" + v + } else { + return v + } +} + +func httpHost() string { + if *hostHTTP != "" { + return *hostHTTP + } + if v := *httpAddr; strings.HasPrefix(v, ":") { + return "localhost" + v + } else { + return v + } +} + +func serveProdTLS() error { + c, err := googlestorage.NewServiceClient() + if err != nil { + return err + } + slurp := func(key string) ([]byte, error) { + const bucket = "http2-demo-server-tls" + rc, _, err := c.GetObject(&googlestorage.Object{ + Bucket: bucket, + Key: key, + }) + if err != nil { + return nil, fmt.Errorf("Error fetching GCS object %q in bucket %q: %v", key, bucket, err) + } + defer rc.Close() + return ioutil.ReadAll(rc) + } + certPem, err := slurp("http2.golang.org.chained.pem") + if err != nil { + return err + } + keyPem, err := slurp("http2.golang.org.key") + if err != nil { + return err + } + cert, err := tls.X509KeyPair(certPem, keyPem) + if err != nil { + return err + } + srv := &http.Server{ + TLSConfig: &tls.Config{ + Certificates: []tls.Certificate{cert}, + }, + } + http2.ConfigureServer(srv, &http2.Server{}) + ln, err := net.Listen("tcp", ":443") + if err != nil { + return err + } + return srv.Serve(tls.NewListener(tcpKeepAliveListener{ln.(*net.TCPListener)}, srv.TLSConfig)) +} + +type tcpKeepAliveListener struct { + *net.TCPListener +} + +func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) { + tc, err := ln.AcceptTCP() + if err != nil { + return + } + tc.SetKeepAlive(true) + tc.SetKeepAlivePeriod(3 * time.Minute) + return tc, nil +} + +func serveProd() error { + errc := make(chan error, 2) + go func() { errc <- http.ListenAndServe(":80", nil) }() + go func() { errc <- serveProdTLS() }() + return <-errc +} + +func main() { + var srv http.Server + flag.BoolVar(&http2.VerboseLogs, "verbose", false, "Verbose HTTP/2 debugging.") + flag.Parse() + srv.Addr = *httpsAddr + + registerHandlers() + + if *prod { + *hostHTTP = "http2.golang.org" + *hostHTTPS = "http2.golang.org" + log.Fatal(serveProd()) + } + + url := "https://" + httpsHost() + "/" + log.Printf("Listening on " + url) + http2.ConfigureServer(&srv, &http2.Server{}) + + if *httpAddr != "" { + go func() { + log.Printf("Listening on http://" + httpHost() + "/ (for unencrypted HTTP/1)") + log.Fatal(http.ListenAndServe(*httpAddr, nil)) + }() + } + + go func() { + log.Fatal(srv.ListenAndServeTLS("server.crt", "server.key")) + }() + select {} +} diff --git a/vendor/golang.org/x/net/http2/h2demo/launch.go b/vendor/golang.org/x/net/http2/h2demo/launch.go new file mode 100644 index 00000000..74666154 --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/launch.go @@ -0,0 +1,302 @@ +// Copyright 2014 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" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "strings" + "time" + + "golang.org/x/oauth2" + "golang.org/x/oauth2/google" + compute "google.golang.org/api/compute/v1" +) + +var ( + proj = flag.String("project", "symbolic-datum-552", "name of Project") + zone = flag.String("zone", "us-central1-a", "GCE zone") + mach = flag.String("machinetype", "n1-standard-1", "Machine type") + instName = flag.String("instance_name", "http2-demo", "Name of VM instance.") + sshPub = flag.String("ssh_public_key", "", "ssh public key file to authorize. Can modify later in Google's web UI anyway.") + staticIP = flag.String("static_ip", "130.211.116.44", "Static IP to use. If empty, automatic.") + + writeObject = flag.String("write_object", "", "If non-empty, a VM isn't created and the flag value is Google Cloud Storage bucket/object to write. The contents from stdin.") + publicObject = flag.Bool("write_object_is_public", false, "Whether the object created by --write_object should be public.") +) + +func readFile(v string) string { + slurp, err := ioutil.ReadFile(v) + if err != nil { + log.Fatalf("Error reading %s: %v", v, err) + } + return strings.TrimSpace(string(slurp)) +} + +var config = &oauth2.Config{ + // The client-id and secret should be for an "Installed Application" when using + // the CLI. Later we'll use a web application with a callback. + ClientID: readFile("client-id.dat"), + ClientSecret: readFile("client-secret.dat"), + Endpoint: google.Endpoint, + Scopes: []string{ + compute.DevstorageFull_controlScope, + compute.ComputeScope, + "https://www.googleapis.com/auth/sqlservice", + "https://www.googleapis.com/auth/sqlservice.admin", + }, + RedirectURL: "urn:ietf:wg:oauth:2.0:oob", +} + +const baseConfig = `#cloud-config +coreos: + units: + - name: h2demo.service + command: start + content: | + [Unit] + Description=HTTP2 Demo + + [Service] + ExecStartPre=/bin/bash -c 'mkdir -p /opt/bin && curl -s -o /opt/bin/h2demo http://storage.googleapis.com/http2-demo-server-tls/h2demo && chmod +x /opt/bin/h2demo' + ExecStart=/opt/bin/h2demo --prod + RestartSec=5s + Restart=always + Type=simple + + [Install] + WantedBy=multi-user.target +` + +func main() { + flag.Parse() + if *proj == "" { + log.Fatalf("Missing --project flag") + } + prefix := "https://www.googleapis.com/compute/v1/projects/" + *proj + machType := prefix + "/zones/" + *zone + "/machineTypes/" + *mach + + const tokenFileName = "token.dat" + tokenFile := tokenCacheFile(tokenFileName) + tokenSource := oauth2.ReuseTokenSource(nil, tokenFile) + token, err := tokenSource.Token() + if err != nil { + if *writeObject != "" { + log.Fatalf("Can't use --write_object without a valid token.dat file already cached.") + } + log.Printf("Error getting token from %s: %v", tokenFileName, err) + log.Printf("Get auth code from %v", config.AuthCodeURL("my-state")) + fmt.Print("\nEnter auth code: ") + sc := bufio.NewScanner(os.Stdin) + sc.Scan() + authCode := strings.TrimSpace(sc.Text()) + token, err = config.Exchange(oauth2.NoContext, authCode) + if err != nil { + log.Fatalf("Error exchanging auth code for a token: %v", err) + } + if err := tokenFile.WriteToken(token); err != nil { + log.Fatalf("Error writing to %s: %v", tokenFileName, err) + } + tokenSource = oauth2.ReuseTokenSource(token, nil) + } + + oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) + + if *writeObject != "" { + writeCloudStorageObject(oauthClient) + return + } + + computeService, _ := compute.New(oauthClient) + + natIP := *staticIP + if natIP == "" { + // Try to find it by name. + aggAddrList, err := computeService.Addresses.AggregatedList(*proj).Do() + if err != nil { + log.Fatal(err) + } + // http://godoc.org/code.google.com/p/google-api-go-client/compute/v1#AddressAggregatedList + IPLoop: + for _, asl := range aggAddrList.Items { + for _, addr := range asl.Addresses { + if addr.Name == *instName+"-ip" && addr.Status == "RESERVED" { + natIP = addr.Address + break IPLoop + } + } + } + } + + cloudConfig := baseConfig + if *sshPub != "" { + key := strings.TrimSpace(readFile(*sshPub)) + cloudConfig += fmt.Sprintf("\nssh_authorized_keys:\n - %s\n", key) + } + if os.Getenv("USER") == "bradfitz" { + cloudConfig += fmt.Sprintf("\nssh_authorized_keys:\n - %s\n", "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAwks9dwWKlRC+73gRbvYtVg0vdCwDSuIlyt4z6xa/YU/jTDynM4R4W10hm2tPjy8iR1k8XhDv4/qdxe6m07NjG/By1tkmGpm1mGwho4Pr5kbAAy/Qg+NLCSdAYnnE00FQEcFOC15GFVMOW2AzDGKisReohwH9eIzHPzdYQNPRWXE= bradfitz@papag.bradfitz.com") + } + const maxCloudConfig = 32 << 10 // per compute API docs + if len(cloudConfig) > maxCloudConfig { + log.Fatalf("cloud config length of %d bytes is over %d byte limit", len(cloudConfig), maxCloudConfig) + } + + instance := &compute.Instance{ + Name: *instName, + Description: "Go Builder", + MachineType: machType, + Disks: []*compute.AttachedDisk{instanceDisk(computeService)}, + Tags: &compute.Tags{ + Items: []string{"http-server", "https-server"}, + }, + Metadata: &compute.Metadata{ + Items: []*compute.MetadataItems{ + { + Key: "user-data", + Value: cloudConfig, + }, + }, + }, + NetworkInterfaces: []*compute.NetworkInterface{ + &compute.NetworkInterface{ + AccessConfigs: []*compute.AccessConfig{ + &compute.AccessConfig{ + Type: "ONE_TO_ONE_NAT", + Name: "External NAT", + NatIP: natIP, + }, + }, + Network: prefix + "/global/networks/default", + }, + }, + ServiceAccounts: []*compute.ServiceAccount{ + { + Email: "default", + Scopes: []string{ + compute.DevstorageFull_controlScope, + compute.ComputeScope, + }, + }, + }, + } + + log.Printf("Creating instance...") + op, err := computeService.Instances.Insert(*proj, *zone, instance).Do() + if err != nil { + log.Fatalf("Failed to create instance: %v", err) + } + opName := op.Name + log.Printf("Created. Waiting on operation %v", opName) +OpLoop: + for { + time.Sleep(2 * time.Second) + op, err := computeService.ZoneOperations.Get(*proj, *zone, opName).Do() + if err != nil { + log.Fatalf("Failed to get op %s: %v", opName, err) + } + switch op.Status { + case "PENDING", "RUNNING": + log.Printf("Waiting on operation %v", opName) + continue + case "DONE": + if op.Error != nil { + for _, operr := range op.Error.Errors { + log.Printf("Error: %+v", operr) + } + log.Fatalf("Failed to start.") + } + log.Printf("Success. %+v", op) + break OpLoop + default: + log.Fatalf("Unknown status %q: %+v", op.Status, op) + } + } + + inst, err := computeService.Instances.Get(*proj, *zone, *instName).Do() + if err != nil { + log.Fatalf("Error getting instance after creation: %v", err) + } + ij, _ := json.MarshalIndent(inst, "", " ") + log.Printf("Instance: %s", ij) +} + +func instanceDisk(svc *compute.Service) *compute.AttachedDisk { + const imageURL = "https://www.googleapis.com/compute/v1/projects/coreos-cloud/global/images/coreos-stable-444-5-0-v20141016" + diskName := *instName + "-disk" + + return &compute.AttachedDisk{ + AutoDelete: true, + Boot: true, + Type: "PERSISTENT", + InitializeParams: &compute.AttachedDiskInitializeParams{ + DiskName: diskName, + SourceImage: imageURL, + DiskSizeGb: 50, + }, + } +} + +func writeCloudStorageObject(httpClient *http.Client) { + content := os.Stdin + const maxSlurp = 1 << 20 + var buf bytes.Buffer + n, err := io.CopyN(&buf, content, maxSlurp) + if err != nil && err != io.EOF { + log.Fatalf("Error reading from stdin: %v, %v", n, err) + } + contentType := http.DetectContentType(buf.Bytes()) + + req, err := http.NewRequest("PUT", "https://storage.googleapis.com/"+*writeObject, io.MultiReader(&buf, content)) + if err != nil { + log.Fatal(err) + } + req.Header.Set("x-goog-api-version", "2") + if *publicObject { + req.Header.Set("x-goog-acl", "public-read") + } + req.Header.Set("Content-Type", contentType) + res, err := httpClient.Do(req) + if err != nil { + log.Fatal(err) + } + if res.StatusCode != 200 { + res.Write(os.Stderr) + log.Fatalf("Failed.") + } + log.Printf("Success.") + os.Exit(0) +} + +type tokenCacheFile string + +func (f tokenCacheFile) Token() (*oauth2.Token, error) { + slurp, err := ioutil.ReadFile(string(f)) + if err != nil { + return nil, err + } + t := new(oauth2.Token) + if err := json.Unmarshal(slurp, t); err != nil { + return nil, err + } + return t, nil +} + +func (f tokenCacheFile) WriteToken(t *oauth2.Token) error { + jt, err := json.Marshal(t) + if err != nil { + return err + } + return ioutil.WriteFile(string(f), jt, 0600) +} diff --git a/vendor/golang.org/x/net/http2/h2demo/rootCA.key b/vendor/golang.org/x/net/http2/h2demo/rootCA.key new file mode 100644 index 00000000..a15a6aba --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/rootCA.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSSR8Od0+9Q +62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoTZjkUygby +XDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYkJfODVGnV +mr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3mOoLb4yJ +JQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYWcaiW8LWZ +SUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABAoIBAFFHV7JMAqPWnMYA +nezY6J81v9+XN+7xABNWM2Q8uv4WdksbigGLTXR3/680Z2hXqJ7LMeC5XJACFT/e +/Gr0vmpgOCygnCPfjGehGKpavtfksXV3edikUlnCXsOP1C//c1bFL+sMYmFCVgTx +qYdDK8yKzXNGrKYT6q5YG7IglyRNV1rsQa8lM/5taFYiD1Ck/3tQi3YIq8Lcuser +hrxsMABcQ6mi+EIvG6Xr4mfJug0dGJMHG4RG1UGFQn6RXrQq2+q53fC8ZbVUSi0j +NQ918aKFzktwv+DouKU0ME4I9toks03gM860bAL7zCbKGmwR3hfgX/TqzVCWpG9E +LDVfvekCgYEA8fk9N53jbBRmULUGEf4qWypcLGiZnNU0OeXWpbPV9aa3H0VDytA7 +8fCN2dPAVDPqlthMDdVe983NCNwp2Yo8ZimDgowyIAKhdC25s1kejuaiH9OAPj3c +0f8KbriYX4n8zNHxFwK6Ae3pQ6EqOLJVCUsziUaZX9nyKY5aZlyX6xcCgYEAwjws +K62PjC64U5wYddNLp+kNdJ4edx+a7qBb3mEgPvSFT2RO3/xafJyG8kQB30Mfstjd +bRxyUV6N0vtX1zA7VQtRUAvfGCecpMo+VQZzcHXKzoRTnQ7eZg4Lmj5fQ9tOAKAo +QCVBoSW/DI4PZL26CAMDcAba4Pa22ooLapoRIQsCgYA6pIfkkbxLNkpxpt2YwLtt +Kr/590O7UaR9n6k8sW/aQBRDXNsILR1KDl2ifAIxpf9lnXgZJiwE7HiTfCAcW7c1 +nzwDCI0hWuHcMTS/NYsFYPnLsstyyjVZI3FY0h4DkYKV9Q9z3zJLQ2hz/nwoD3gy +b2pHC7giFcTts1VPV4Nt8wKBgHeFn4ihHJweg76vZz3Z78w7VNRWGFklUalVdDK7 +gaQ7w2y/ROn/146mo0OhJaXFIFRlrpvdzVrU3GDf2YXJYDlM5ZRkObwbZADjksev +WInzcgDy3KDg7WnPasRXbTfMU4t/AkW2p1QKbi3DnSVYuokDkbH2Beo45vxDxhKr +C69RAoGBAIyo3+OJenoZmoNzNJl2WPW5MeBUzSh8T/bgyjFTdqFHF5WiYRD/lfHj +x9Glyw2nutuT4hlOqHvKhgTYdDMsF2oQ72fe3v8Q5FU7FuKndNPEAyvKNXZaShVA +hnlhv5DjXKb0wFWnt5PCCiQLtzG0yyHaITrrEme7FikkIcTxaX/Y +-----END RSA PRIVATE KEY----- diff --git a/vendor/golang.org/x/net/http2/h2demo/rootCA.pem b/vendor/golang.org/x/net/http2/h2demo/rootCA.pem new file mode 100644 index 00000000..3a323e77 --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/rootCA.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG +A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3 +DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0 +NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG +cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv +c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS +R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT +ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk +JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3 +mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW +caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G +A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt +hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB +MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES +MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv +bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h +U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao +eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4 +UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD +58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n +sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF +kPe6XoSbiLm/kxk32T0= +-----END CERTIFICATE----- diff --git a/vendor/golang.org/x/net/http2/h2demo/rootCA.srl b/vendor/golang.org/x/net/http2/h2demo/rootCA.srl new file mode 100644 index 00000000..6db38918 --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/rootCA.srl @@ -0,0 +1 @@ +E2CE26BF3285059C diff --git a/vendor/golang.org/x/net/http2/h2demo/server.crt b/vendor/golang.org/x/net/http2/h2demo/server.crt new file mode 100644 index 00000000..c59059bd --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/server.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDPjCCAiYCCQDizia/MoUFnDANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJV +UzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFDASBgNVBAoT +C0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhvc3QxHTAbBgkqhkiG9w0BCQEW +DmJyYWRAZGFuZ2EuY29tMB4XDTE0MDcxNTIwNTAyN1oXDTE1MTEyNzIwNTAyN1ow +RzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQHEwJTRjEeMBwGA1UE +ChMVYnJhZGZpdHogaHR0cDIgc2VydmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAs1Y9CyLFrdL8VQWN1WaifDqaZFnoqjHhCMlc1TfG2zA+InDifx2l +gZD3o8FeNnAcfM2sPlk3+ZleOYw9P/CklFVDlvqmpCv9ss/BEp/dDaWvy1LmJ4c2 +dbQJfmTxn7CV1H3TsVJvKdwFmdoABb41NoBp6+NNO7OtDyhbIMiCI0pL3Nefb3HL +A7hIMo3DYbORTtJLTIH9W8YKrEWL0lwHLrYFx/UdutZnv+HjdmO6vCN4na55mjws +/vjKQUmc7xeY7Xe20xDEG2oDKVkL2eD7FfyrYMS3rO1ExP2KSqlXYG/1S9I/fz88 +F0GK7HX55b5WjZCl2J3ERVdnv/0MQv+sYQIDAQABMA0GCSqGSIb3DQEBBQUAA4IB +AQC0zL+n/YpRZOdulSu9tS8FxrstXqGWoxfe+vIUgqfMZ5+0MkjJ/vW0FqlLDl2R +rn4XaR3e7FmWkwdDVbq/UB6lPmoAaFkCgh9/5oapMaclNVNnfF3fjCJfRr+qj/iD +EmJStTIN0ZuUjAlpiACmfnpEU55PafT5Zx+i1yE4FGjw8bJpFoyD4Hnm54nGjX19 +KeCuvcYFUPnBm3lcL0FalF2AjqV02WTHYNQk7YF/oeO7NKBoEgvGvKG3x+xaOeBI +dwvdq175ZsGul30h+QjrRlXhH/twcuaT3GSdoysDl9cCYE8f1Mk8PD6gan3uBCJU +90p6/CbU71bGbfpM2PHot2fm +-----END CERTIFICATE----- diff --git a/vendor/golang.org/x/net/http2/h2demo/server.key b/vendor/golang.org/x/net/http2/h2demo/server.key new file mode 100644 index 00000000..f329c142 --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2demo/server.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAs1Y9CyLFrdL8VQWN1WaifDqaZFnoqjHhCMlc1TfG2zA+InDi +fx2lgZD3o8FeNnAcfM2sPlk3+ZleOYw9P/CklFVDlvqmpCv9ss/BEp/dDaWvy1Lm +J4c2dbQJfmTxn7CV1H3TsVJvKdwFmdoABb41NoBp6+NNO7OtDyhbIMiCI0pL3Nef +b3HLA7hIMo3DYbORTtJLTIH9W8YKrEWL0lwHLrYFx/UdutZnv+HjdmO6vCN4na55 +mjws/vjKQUmc7xeY7Xe20xDEG2oDKVkL2eD7FfyrYMS3rO1ExP2KSqlXYG/1S9I/ +fz88F0GK7HX55b5WjZCl2J3ERVdnv/0MQv+sYQIDAQABAoIBADQ2spUwbY+bcz4p +3M66ECrNQTBggP40gYl2XyHxGGOu2xhZ94f9ELf1hjRWU2DUKWco1rJcdZClV6q3 +qwmXvcM2Q/SMS8JW0ImkNVl/0/NqPxGatEnj8zY30d/L8hGFb0orzFu/XYA5gCP4 +NbN2WrXgk3ZLeqwcNxHHtSiJWGJ/fPyeDWAu/apy75u9Xf2GlzBZmV6HYD9EfK80 +LTlI60f5FO487CrJnboL7ovPJrIHn+k05xRQqwma4orpz932rTXnTjs9Lg6KtbQN +a7PrqfAntIISgr11a66Mng3IYH1lYqJsWJJwX/xHT4WLEy0EH4/0+PfYemJekz2+ +Co62drECgYEA6O9zVJZXrLSDsIi54cfxA7nEZWm5CAtkYWeAHa4EJ+IlZ7gIf9sL +W8oFcEfFGpvwVqWZ+AsQ70dsjXAv3zXaG0tmg9FtqWp7pzRSMPidifZcQwWkKeTO +gJnFmnVyed8h6GfjTEu4gxo1/S5U0V+mYSha01z5NTnN6ltKx1Or3b0CgYEAxRgm +S30nZxnyg/V7ys61AZhst1DG2tkZXEMcA7dYhabMoXPJAP/EfhlWwpWYYUs/u0gS +Wwmf5IivX5TlYScgmkvb/NYz0u4ZmOXkLTnLPtdKKFXhjXJcHjUP67jYmOxNlJLp +V4vLRnFxTpffAV+OszzRxsXX6fvruwZBANYJeXUCgYBVouLFsFgfWGYp2rpr9XP4 +KK25kvrBqF6JKOIDB1zjxNJ3pUMKrl8oqccCFoCyXa4oTM2kUX0yWxHfleUjrMq4 +yimwQKiOZmV7fVLSSjSw6e/VfBd0h3gb82ygcplZkN0IclkwTY5SNKqwn/3y07V5 +drqdhkrgdJXtmQ6O5YYECQKBgATERcDToQ1USlI4sKrB/wyv1AlG8dg/IebiVJ4e +ZAyvcQmClFzq0qS+FiQUnB/WQw9TeeYrwGs1hxBHuJh16srwhLyDrbMvQP06qh8R +48F8UXXSRec22dV9MQphaROhu2qZdv1AC0WD3tqov6L33aqmEOi+xi8JgbT/PLk5 +c/c1AoGBAI1A/02ryksW6/wc7/6SP2M2rTy4m1sD/GnrTc67EHnRcVBdKO6qH2RY +nqC8YcveC2ZghgPTDsA3VGuzuBXpwY6wTyV99q6jxQJ6/xcrD9/NUG6Uwv/xfCxl +IJLeBYEqQundSSny3VtaAUK8Ul1nxpTvVRNwtcyWTo8RHAAyNPWd +-----END RSA PRIVATE KEY----- diff --git a/vendor/golang.org/x/net/http2/h2i/README.md b/vendor/golang.org/x/net/http2/h2i/README.md new file mode 100644 index 00000000..fb5c5efb --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2i/README.md @@ -0,0 +1,97 @@ +# h2i + +**h2i** is an interactive HTTP/2 ("h2") console debugger. Miss the good ol' +days of telnetting to your HTTP/1.n servers? We're bringing you +back. + +Features: +- send raw HTTP/2 frames + - PING + - SETTINGS + - HEADERS + - etc +- type in HTTP/1.n and have it auto-HPACK/frame-ify it for HTTP/2 +- pretty print all received HTTP/2 frames from the peer (including HPACK decoding) +- tab completion of commands, options + +Not yet features, but soon: +- unnecessary CONTINUATION frames on short boundaries, to test peer implementations +- request bodies (DATA frames) +- send invalid frames for testing server implementations (supported by underlying Framer) + +Later: +- act like a server + +## Installation + +``` +$ go get golang.org/x/net/http2/h2i +$ h2i +``` + +## Demo + +``` +$ h2i +Usage: h2i + + -insecure + Whether to skip TLS cert validation + -nextproto string + Comma-separated list of NPN/ALPN protocol names to negotiate. (default "h2,h2-14") + +$ h2i google.com +Connecting to google.com:443 ... +Connected to 74.125.224.41:443 +Negotiated protocol "h2-14" +[FrameHeader SETTINGS len=18] + [MAX_CONCURRENT_STREAMS = 100] + [INITIAL_WINDOW_SIZE = 1048576] + [MAX_FRAME_SIZE = 16384] +[FrameHeader WINDOW_UPDATE len=4] + Window-Increment = 983041 + +h2i> PING h2iSayHI +[FrameHeader PING flags=ACK len=8] + Data = "h2iSayHI" +h2i> headers +(as HTTP/1.1)> GET / HTTP/1.1 +(as HTTP/1.1)> Host: ip.appspot.com +(as HTTP/1.1)> User-Agent: h2i/brad-n-blake +(as HTTP/1.1)> +Opening Stream-ID 1: + :authority = ip.appspot.com + :method = GET + :path = / + :scheme = https + user-agent = h2i/brad-n-blake +[FrameHeader HEADERS flags=END_HEADERS stream=1 len=77] + :status = "200" + alternate-protocol = "443:quic,p=1" + content-length = "15" + content-type = "text/html" + date = "Fri, 01 May 2015 23:06:56 GMT" + server = "Google Frontend" +[FrameHeader DATA flags=END_STREAM stream=1 len=15] + "173.164.155.78\n" +[FrameHeader PING len=8] + Data = "\x00\x00\x00\x00\x00\x00\x00\x00" +h2i> ping +[FrameHeader PING flags=ACK len=8] + Data = "h2i_ping" +h2i> ping +[FrameHeader PING flags=ACK len=8] + Data = "h2i_ping" +h2i> ping +[FrameHeader GOAWAY len=22] + Last-Stream-ID = 1; Error-Code = PROTOCOL_ERROR (1) + +ReadFrame: EOF +``` + +## Status + +Quick few hour hack. So much yet to do. Feel free to file issues for +bugs or wishlist items, but [@bmizerany](https://github.com/bmizerany/) +and I aren't yet accepting pull requests until things settle down. + diff --git a/vendor/golang.org/x/net/http2/h2i/h2i.go b/vendor/golang.org/x/net/http2/h2i/h2i.go new file mode 100644 index 00000000..f14fd200 --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2i/h2i.go @@ -0,0 +1,499 @@ +// Copyright 2015 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 h2i command is an interactive HTTP/2 console. + +Usage: + $ h2i [flags] + +Interactive commands in the console: (all parts case-insensitive) + + ping [data] + settings ack + settings FOO=n BAR=z + headers (open a new stream by typing HTTP/1.1) +*/ +package main + +import ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "flag" + "fmt" + "io" + "log" + "net" + "net/http" + "os" + "regexp" + "strconv" + "strings" + + "golang.org/x/crypto/ssh/terminal" + "golang.org/x/net/http2" + "golang.org/x/net/http2/hpack" +) + +// Flags +var ( + flagNextProto = flag.String("nextproto", "h2,h2-14", "Comma-separated list of NPN/ALPN protocol names to negotiate.") + flagInsecure = flag.Bool("insecure", false, "Whether to skip TLS cert validation") + flagSettings = flag.String("settings", "empty", "comma-separated list of KEY=value settings for the initial SETTINGS frame. The magic value 'empty' sends an empty initial settings frame, and the magic value 'omit' causes no initial settings frame to be sent.") +) + +type command struct { + run func(*h2i, []string) error // required + + // complete optionally specifies tokens (case-insensitive) which are + // valid for this subcommand. + complete func() []string +} + +var commands = map[string]command{ + "ping": command{run: (*h2i).cmdPing}, + "settings": command{ + run: (*h2i).cmdSettings, + complete: func() []string { + return []string{ + "ACK", + http2.SettingHeaderTableSize.String(), + http2.SettingEnablePush.String(), + http2.SettingMaxConcurrentStreams.String(), + http2.SettingInitialWindowSize.String(), + http2.SettingMaxFrameSize.String(), + http2.SettingMaxHeaderListSize.String(), + } + }, + }, + "quit": command{run: (*h2i).cmdQuit}, + "headers": command{run: (*h2i).cmdHeaders}, +} + +func usage() { + fmt.Fprintf(os.Stderr, "Usage: h2i \n\n") + flag.PrintDefaults() + os.Exit(1) +} + +// withPort adds ":443" if another port isn't already present. +func withPort(host string) string { + if _, _, err := net.SplitHostPort(host); err != nil { + return net.JoinHostPort(host, "443") + } + return host +} + +// h2i is the app's state. +type h2i struct { + host string + tc *tls.Conn + framer *http2.Framer + term *terminal.Terminal + + // owned by the command loop: + streamID uint32 + hbuf bytes.Buffer + henc *hpack.Encoder + + // owned by the readFrames loop: + peerSetting map[http2.SettingID]uint32 + hdec *hpack.Decoder +} + +func main() { + flag.Usage = usage + flag.Parse() + if flag.NArg() != 1 { + usage() + } + log.SetFlags(0) + + host := flag.Arg(0) + app := &h2i{ + host: host, + peerSetting: make(map[http2.SettingID]uint32), + } + app.henc = hpack.NewEncoder(&app.hbuf) + + if err := app.Main(); err != nil { + if app.term != nil { + app.logf("%v\n", err) + } else { + fmt.Fprintf(os.Stderr, "%v\n", err) + } + os.Exit(1) + } + fmt.Fprintf(os.Stdout, "\n") +} + +func (app *h2i) Main() error { + cfg := &tls.Config{ + ServerName: app.host, + NextProtos: strings.Split(*flagNextProto, ","), + InsecureSkipVerify: *flagInsecure, + } + + hostAndPort := withPort(app.host) + log.Printf("Connecting to %s ...", hostAndPort) + tc, err := tls.Dial("tcp", hostAndPort, cfg) + if err != nil { + return fmt.Errorf("Error dialing %s: %v", withPort(app.host), err) + } + log.Printf("Connected to %v", tc.RemoteAddr()) + defer tc.Close() + + if err := tc.Handshake(); err != nil { + return fmt.Errorf("TLS handshake: %v", err) + } + if !*flagInsecure { + if err := tc.VerifyHostname(app.host); err != nil { + return fmt.Errorf("VerifyHostname: %v", err) + } + } + state := tc.ConnectionState() + log.Printf("Negotiated protocol %q", state.NegotiatedProtocol) + if !state.NegotiatedProtocolIsMutual || state.NegotiatedProtocol == "" { + return fmt.Errorf("Could not negotiate protocol mutually") + } + + if _, err := io.WriteString(tc, http2.ClientPreface); err != nil { + return err + } + + app.framer = http2.NewFramer(tc, tc) + + oldState, err := terminal.MakeRaw(0) + if err != nil { + return err + } + defer terminal.Restore(0, oldState) + + var screen = struct { + io.Reader + io.Writer + }{os.Stdin, os.Stdout} + + app.term = terminal.NewTerminal(screen, "h2i> ") + lastWord := regexp.MustCompile(`.+\W(\w+)$`) + app.term.AutoCompleteCallback = func(line string, pos int, key rune) (newLine string, newPos int, ok bool) { + if key != '\t' { + return + } + if pos != len(line) { + // TODO: we're being lazy for now, only supporting tab completion at the end. + return + } + // Auto-complete for the command itself. + if !strings.Contains(line, " ") { + var name string + name, _, ok = lookupCommand(line) + if !ok { + return + } + return name, len(name), true + } + _, c, ok := lookupCommand(line[:strings.IndexByte(line, ' ')]) + if !ok || c.complete == nil { + return + } + if strings.HasSuffix(line, " ") { + app.logf("%s", strings.Join(c.complete(), " ")) + return line, pos, true + } + m := lastWord.FindStringSubmatch(line) + if m == nil { + return line, len(line), true + } + soFar := m[1] + var match []string + for _, cand := range c.complete() { + if len(soFar) > len(cand) || !strings.EqualFold(cand[:len(soFar)], soFar) { + continue + } + match = append(match, cand) + } + if len(match) == 0 { + return + } + if len(match) > 1 { + // TODO: auto-complete any common prefix + app.logf("%s", strings.Join(match, " ")) + return line, pos, true + } + newLine = line[:len(line)-len(soFar)] + match[0] + return newLine, len(newLine), true + + } + + errc := make(chan error, 2) + go func() { errc <- app.readFrames() }() + go func() { errc <- app.readConsole() }() + return <-errc +} + +func (app *h2i) logf(format string, args ...interface{}) { + fmt.Fprintf(app.term, format+"\n", args...) +} + +func (app *h2i) readConsole() error { + if s := *flagSettings; s != "omit" { + var args []string + if s != "empty" { + args = strings.Split(s, ",") + } + _, c, ok := lookupCommand("settings") + if !ok { + panic("settings command not found") + } + c.run(app, args) + } + + for { + line, err := app.term.ReadLine() + if err == io.EOF { + return nil + } + if err != nil { + return fmt.Errorf("terminal.ReadLine: %v", err) + } + f := strings.Fields(line) + if len(f) == 0 { + continue + } + cmd, args := f[0], f[1:] + if _, c, ok := lookupCommand(cmd); ok { + err = c.run(app, args) + } else { + app.logf("Unknown command %q", line) + } + if err == errExitApp { + return nil + } + if err != nil { + return err + } + } +} + +func lookupCommand(prefix string) (name string, c command, ok bool) { + prefix = strings.ToLower(prefix) + if c, ok = commands[prefix]; ok { + return prefix, c, ok + } + + for full, candidate := range commands { + if strings.HasPrefix(full, prefix) { + if c.run != nil { + return "", command{}, false // ambiguous + } + c = candidate + name = full + } + } + return name, c, c.run != nil +} + +var errExitApp = errors.New("internal sentinel error value to quit the console reading loop") + +func (a *h2i) cmdQuit(args []string) error { + if len(args) > 0 { + a.logf("the QUIT command takes no argument") + return nil + } + return errExitApp +} + +func (a *h2i) cmdSettings(args []string) error { + if len(args) == 1 && strings.EqualFold(args[0], "ACK") { + return a.framer.WriteSettingsAck() + } + var settings []http2.Setting + for _, arg := range args { + if strings.EqualFold(arg, "ACK") { + a.logf("Error: ACK must be only argument with the SETTINGS command") + return nil + } + eq := strings.Index(arg, "=") + if eq == -1 { + a.logf("Error: invalid argument %q (expected SETTING_NAME=nnnn)", arg) + return nil + } + sid, ok := settingByName(arg[:eq]) + if !ok { + a.logf("Error: unknown setting name %q", arg[:eq]) + return nil + } + val, err := strconv.ParseUint(arg[eq+1:], 10, 32) + if err != nil { + a.logf("Error: invalid argument %q (expected SETTING_NAME=nnnn)", arg) + return nil + } + settings = append(settings, http2.Setting{ + ID: sid, + Val: uint32(val), + }) + } + a.logf("Sending: %v", settings) + return a.framer.WriteSettings(settings...) +} + +func settingByName(name string) (http2.SettingID, bool) { + for _, sid := range [...]http2.SettingID{ + http2.SettingHeaderTableSize, + http2.SettingEnablePush, + http2.SettingMaxConcurrentStreams, + http2.SettingInitialWindowSize, + http2.SettingMaxFrameSize, + http2.SettingMaxHeaderListSize, + } { + if strings.EqualFold(sid.String(), name) { + return sid, true + } + } + return 0, false +} + +func (app *h2i) cmdPing(args []string) error { + if len(args) > 1 { + app.logf("invalid PING usage: only accepts 0 or 1 args") + return nil // nil means don't end the program + } + var data [8]byte + if len(args) == 1 { + copy(data[:], args[0]) + } else { + copy(data[:], "h2i_ping") + } + return app.framer.WritePing(false, data) +} + +func (app *h2i) cmdHeaders(args []string) error { + if len(args) > 0 { + app.logf("Error: HEADERS doesn't yet take arguments.") + // TODO: flags for restricting window size, to force CONTINUATION + // frames. + return nil + } + var h1req bytes.Buffer + app.term.SetPrompt("(as HTTP/1.1)> ") + defer app.term.SetPrompt("h2i> ") + for { + line, err := app.term.ReadLine() + if err != nil { + return err + } + h1req.WriteString(line) + h1req.WriteString("\r\n") + if line == "" { + break + } + } + req, err := http.ReadRequest(bufio.NewReader(&h1req)) + if err != nil { + app.logf("Invalid HTTP/1.1 request: %v", err) + return nil + } + if app.streamID == 0 { + app.streamID = 1 + } else { + app.streamID += 2 + } + app.logf("Opening Stream-ID %d:", app.streamID) + hbf := app.encodeHeaders(req) + if len(hbf) > 16<<10 { + app.logf("TODO: h2i doesn't yet write CONTINUATION frames. Copy it from transport.go") + return nil + } + return app.framer.WriteHeaders(http2.HeadersFrameParam{ + StreamID: app.streamID, + BlockFragment: hbf, + EndStream: req.Method == "GET" || req.Method == "HEAD", // good enough for now + EndHeaders: true, // for now + }) +} + +func (app *h2i) readFrames() error { + for { + f, err := app.framer.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame: %v", err) + } + app.logf("%v", f) + switch f := f.(type) { + case *http2.PingFrame: + app.logf(" Data = %q", f.Data) + case *http2.SettingsFrame: + f.ForeachSetting(func(s http2.Setting) error { + app.logf(" %v", s) + app.peerSetting[s.ID] = s.Val + return nil + }) + case *http2.WindowUpdateFrame: + app.logf(" Window-Increment = %v\n", f.Increment) + case *http2.GoAwayFrame: + app.logf(" Last-Stream-ID = %d; Error-Code = %v (%d)\n", f.LastStreamID, f.ErrCode, f.ErrCode) + case *http2.DataFrame: + app.logf(" %q", f.Data()) + case *http2.HeadersFrame: + if f.HasPriority() { + app.logf(" PRIORITY = %v", f.Priority) + } + if app.hdec == nil { + // TODO: if the user uses h2i to send a SETTINGS frame advertising + // something larger, we'll need to respect SETTINGS_HEADER_TABLE_SIZE + // and stuff here instead of using the 4k default. But for now: + tableSize := uint32(4 << 10) + app.hdec = hpack.NewDecoder(tableSize, app.onNewHeaderField) + } + app.hdec.Write(f.HeaderBlockFragment()) + } + } +} + +// called from readLoop +func (app *h2i) onNewHeaderField(f hpack.HeaderField) { + if f.Sensitive { + app.logf(" %s = %q (SENSITIVE)", f.Name, f.Value) + } + app.logf(" %s = %q", f.Name, f.Value) +} + +func (app *h2i) encodeHeaders(req *http.Request) []byte { + app.hbuf.Reset() + + // TODO(bradfitz): figure out :authority-vs-Host stuff between http2 and Go + host := req.Host + if host == "" { + host = req.URL.Host + } + + path := req.URL.Path + if path == "" { + path = "/" + } + + app.writeHeader(":authority", host) // probably not right for all sites + app.writeHeader(":method", req.Method) + app.writeHeader(":path", path) + app.writeHeader(":scheme", "https") + + for k, vv := range req.Header { + lowKey := strings.ToLower(k) + if lowKey == "host" { + continue + } + for _, v := range vv { + app.writeHeader(lowKey, v) + } + } + return app.hbuf.Bytes() +} + +func (app *h2i) writeHeader(name, value string) { + app.henc.WriteField(hpack.HeaderField{Name: name, Value: value}) + app.logf(" %s = %s", name, value) +} diff --git a/vendor/golang.org/x/net/http2/headermap.go b/vendor/golang.org/x/net/http2/headermap.go new file mode 100644 index 00000000..014f7896 --- /dev/null +++ b/vendor/golang.org/x/net/http2/headermap.go @@ -0,0 +1,77 @@ +// Copyright 2014 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 http2 + +import ( + "net/http" + "strings" +) + +var ( + commonLowerHeader = map[string]string{} // Go-Canonical-Case -> lower-case + commonCanonHeader = map[string]string{} // lower-case -> Go-Canonical-Case +) + +func init() { + for _, v := range []string{ + "accept", + "accept-charset", + "accept-encoding", + "accept-language", + "accept-ranges", + "age", + "access-control-allow-origin", + "allow", + "authorization", + "cache-control", + "content-disposition", + "content-encoding", + "content-language", + "content-length", + "content-location", + "content-range", + "content-type", + "cookie", + "date", + "etag", + "expect", + "expires", + "from", + "host", + "if-match", + "if-modified-since", + "if-none-match", + "if-unmodified-since", + "last-modified", + "link", + "location", + "max-forwards", + "proxy-authenticate", + "proxy-authorization", + "range", + "referer", + "refresh", + "retry-after", + "server", + "set-cookie", + "strict-transport-security", + "transfer-encoding", + "user-agent", + "vary", + "via", + "www-authenticate", + } { + chk := http.CanonicalHeaderKey(v) + commonLowerHeader[chk] = v + commonCanonHeader[v] = chk + } +} + +func lowerHeader(v string) string { + if s, ok := commonLowerHeader[v]; ok { + return s + } + return strings.ToLower(v) +} diff --git a/vendor/golang.org/x/net/http2/hpack/encode.go b/vendor/golang.org/x/net/http2/hpack/encode.go new file mode 100644 index 00000000..80d621cf --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/encode.go @@ -0,0 +1,251 @@ +// Copyright 2014 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 hpack + +import ( + "io" +) + +const ( + uint32Max = ^uint32(0) + initialHeaderTableSize = 4096 +) + +type Encoder struct { + dynTab dynamicTable + // minSize is the minimum table size set by + // SetMaxDynamicTableSize after the previous Header Table Size + // Update. + minSize uint32 + // maxSizeLimit is the maximum table size this encoder + // supports. This will protect the encoder from too large + // size. + maxSizeLimit uint32 + // tableSizeUpdate indicates whether "Header Table Size + // Update" is required. + tableSizeUpdate bool + w io.Writer + buf []byte +} + +// NewEncoder returns a new Encoder which performs HPACK encoding. An +// encoded data is written to w. +func NewEncoder(w io.Writer) *Encoder { + e := &Encoder{ + minSize: uint32Max, + maxSizeLimit: initialHeaderTableSize, + tableSizeUpdate: false, + w: w, + } + e.dynTab.setMaxSize(initialHeaderTableSize) + return e +} + +// WriteField encodes f into a single Write to e's underlying Writer. +// This function may also produce bytes for "Header Table Size Update" +// if necessary. If produced, it is done before encoding f. +func (e *Encoder) WriteField(f HeaderField) error { + e.buf = e.buf[:0] + + if e.tableSizeUpdate { + e.tableSizeUpdate = false + if e.minSize < e.dynTab.maxSize { + e.buf = appendTableSize(e.buf, e.minSize) + } + e.minSize = uint32Max + e.buf = appendTableSize(e.buf, e.dynTab.maxSize) + } + + idx, nameValueMatch := e.searchTable(f) + if nameValueMatch { + e.buf = appendIndexed(e.buf, idx) + } else { + indexing := e.shouldIndex(f) + if indexing { + e.dynTab.add(f) + } + + if idx == 0 { + e.buf = appendNewName(e.buf, f, indexing) + } else { + e.buf = appendIndexedName(e.buf, f, idx, indexing) + } + } + n, err := e.w.Write(e.buf) + if err == nil && n != len(e.buf) { + err = io.ErrShortWrite + } + return err +} + +// searchTable searches f in both stable and dynamic header tables. +// The static header table is searched first. Only when there is no +// exact match for both name and value, the dynamic header table is +// then searched. If there is no match, i is 0. If both name and value +// match, i is the matched index and nameValueMatch becomes true. If +// only name matches, i points to that index and nameValueMatch +// becomes false. +func (e *Encoder) searchTable(f HeaderField) (i uint64, nameValueMatch bool) { + for idx, hf := range staticTable { + if !constantTimeStringCompare(hf.Name, f.Name) { + continue + } + if i == 0 { + i = uint64(idx + 1) + } + if f.Sensitive { + continue + } + if !constantTimeStringCompare(hf.Value, f.Value) { + continue + } + i = uint64(idx + 1) + nameValueMatch = true + return + } + + j, nameValueMatch := e.dynTab.search(f) + if nameValueMatch || (i == 0 && j != 0) { + i = j + uint64(len(staticTable)) + } + return +} + +// SetMaxDynamicTableSize changes the dynamic header table size to v. +// The actual size is bounded by the value passed to +// SetMaxDynamicTableSizeLimit. +func (e *Encoder) SetMaxDynamicTableSize(v uint32) { + if v > e.maxSizeLimit { + v = e.maxSizeLimit + } + if v < e.minSize { + e.minSize = v + } + e.tableSizeUpdate = true + e.dynTab.setMaxSize(v) +} + +// SetMaxDynamicTableSizeLimit changes the maximum value that can be +// specified in SetMaxDynamicTableSize to v. By default, it is set to +// 4096, which is the same size of the default dynamic header table +// size described in HPACK specification. If the current maximum +// dynamic header table size is strictly greater than v, "Header Table +// Size Update" will be done in the next WriteField call and the +// maximum dynamic header table size is truncated to v. +func (e *Encoder) SetMaxDynamicTableSizeLimit(v uint32) { + e.maxSizeLimit = v + if e.dynTab.maxSize > v { + e.tableSizeUpdate = true + e.dynTab.setMaxSize(v) + } +} + +// shouldIndex reports whether f should be indexed. +func (e *Encoder) shouldIndex(f HeaderField) bool { + return !f.Sensitive && f.size() <= e.dynTab.maxSize +} + +// appendIndexed appends index i, as encoded in "Indexed Header Field" +// representation, to dst and returns the extended buffer. +func appendIndexed(dst []byte, i uint64) []byte { + first := len(dst) + dst = appendVarInt(dst, 7, i) + dst[first] |= 0x80 + return dst +} + +// appendNewName appends f, as encoded in one of "Literal Header field +// - New Name" representation variants, to dst and returns the +// extended buffer. +// +// If f.Sensitive is true, "Never Indexed" representation is used. If +// f.Sensitive is false and indexing is true, "Inremental Indexing" +// representation is used. +func appendNewName(dst []byte, f HeaderField, indexing bool) []byte { + dst = append(dst, encodeTypeByte(indexing, f.Sensitive)) + dst = appendHpackString(dst, f.Name) + return appendHpackString(dst, f.Value) +} + +// appendIndexedName appends f and index i referring indexed name +// entry, as encoded in one of "Literal Header field - Indexed Name" +// representation variants, to dst and returns the extended buffer. +// +// If f.Sensitive is true, "Never Indexed" representation is used. If +// f.Sensitive is false and indexing is true, "Incremental Indexing" +// representation is used. +func appendIndexedName(dst []byte, f HeaderField, i uint64, indexing bool) []byte { + first := len(dst) + var n byte + if indexing { + n = 6 + } else { + n = 4 + } + dst = appendVarInt(dst, n, i) + dst[first] |= encodeTypeByte(indexing, f.Sensitive) + return appendHpackString(dst, f.Value) +} + +// appendTableSize appends v, as encoded in "Header Table Size Update" +// representation, to dst and returns the extended buffer. +func appendTableSize(dst []byte, v uint32) []byte { + first := len(dst) + dst = appendVarInt(dst, 5, uint64(v)) + dst[first] |= 0x20 + return dst +} + +// appendVarInt appends i, as encoded in variable integer form using n +// bit prefix, to dst and returns the extended buffer. +// +// See +// http://http2.github.io/http2-spec/compression.html#integer.representation +func appendVarInt(dst []byte, n byte, i uint64) []byte { + k := uint64((1 << n) - 1) + if i < k { + return append(dst, byte(i)) + } + dst = append(dst, byte(k)) + i -= k + for ; i >= 128; i >>= 7 { + dst = append(dst, byte(0x80|(i&0x7f))) + } + return append(dst, byte(i)) +} + +// appendHpackString appends s, as encoded in "String Literal" +// representation, to dst and returns the the extended buffer. +// +// s will be encoded in Huffman codes only when it produces strictly +// shorter byte string. +func appendHpackString(dst []byte, s string) []byte { + huffmanLength := HuffmanEncodeLength(s) + if huffmanLength < uint64(len(s)) { + first := len(dst) + dst = appendVarInt(dst, 7, huffmanLength) + dst = AppendHuffmanString(dst, s) + dst[first] |= 0x80 + } else { + dst = appendVarInt(dst, 7, uint64(len(s))) + dst = append(dst, s...) + } + return dst +} + +// encodeTypeByte returns type byte. If sensitive is true, type byte +// for "Never Indexed" representation is returned. If sensitive is +// false and indexing is true, type byte for "Incremental Indexing" +// representation is returned. Otherwise, type byte for "Without +// Indexing" is returned. +func encodeTypeByte(indexing, sensitive bool) byte { + if sensitive { + return 0x10 + } + if indexing { + return 0x40 + } + return 0 +} diff --git a/vendor/golang.org/x/net/http2/hpack/encode_test.go b/vendor/golang.org/x/net/http2/hpack/encode_test.go new file mode 100644 index 00000000..92286f3b --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/encode_test.go @@ -0,0 +1,330 @@ +// Copyright 2014 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 hpack + +import ( + "bytes" + "encoding/hex" + "reflect" + "strings" + "testing" +) + +func TestEncoderTableSizeUpdate(t *testing.T) { + tests := []struct { + size1, size2 uint32 + wantHex string + }{ + // Should emit 2 table size updates (2048 and 4096) + {2048, 4096, "3fe10f 3fe11f 82"}, + + // Should emit 1 table size update (2048) + {16384, 2048, "3fe10f 82"}, + } + for _, tt := range tests { + var buf bytes.Buffer + e := NewEncoder(&buf) + e.SetMaxDynamicTableSize(tt.size1) + e.SetMaxDynamicTableSize(tt.size2) + if err := e.WriteField(pair(":method", "GET")); err != nil { + t.Fatal(err) + } + want := removeSpace(tt.wantHex) + if got := hex.EncodeToString(buf.Bytes()); got != want { + t.Errorf("e.SetDynamicTableSize %v, %v = %q; want %q", tt.size1, tt.size2, got, want) + } + } +} + +func TestEncoderWriteField(t *testing.T) { + var buf bytes.Buffer + e := NewEncoder(&buf) + var got []HeaderField + d := NewDecoder(4<<10, func(f HeaderField) { + got = append(got, f) + }) + + tests := []struct { + hdrs []HeaderField + }{ + {[]HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + }}, + {[]HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + pair("cache-control", "no-cache"), + }}, + {[]HeaderField{ + pair(":method", "GET"), + pair(":scheme", "https"), + pair(":path", "/index.html"), + pair(":authority", "www.example.com"), + pair("custom-key", "custom-value"), + }}, + } + for i, tt := range tests { + buf.Reset() + got = got[:0] + for _, hf := range tt.hdrs { + if err := e.WriteField(hf); err != nil { + t.Fatal(err) + } + } + _, err := d.Write(buf.Bytes()) + if err != nil { + t.Errorf("%d. Decoder Write = %v", i, err) + } + if !reflect.DeepEqual(got, tt.hdrs) { + t.Errorf("%d. Decoded %+v; want %+v", i, got, tt.hdrs) + } + } +} + +func TestEncoderSearchTable(t *testing.T) { + e := NewEncoder(nil) + + e.dynTab.add(pair("foo", "bar")) + e.dynTab.add(pair("blake", "miz")) + e.dynTab.add(pair(":method", "GET")) + + tests := []struct { + hf HeaderField + wantI uint64 + wantMatch bool + }{ + // Name and Value match + {pair("foo", "bar"), uint64(len(staticTable) + 3), true}, + {pair("blake", "miz"), uint64(len(staticTable) + 2), true}, + {pair(":method", "GET"), 2, true}, + + // Only name match because Sensitive == true + {HeaderField{":method", "GET", true}, 2, false}, + + // Only Name matches + {pair("foo", "..."), uint64(len(staticTable) + 3), false}, + {pair("blake", "..."), uint64(len(staticTable) + 2), false}, + {pair(":method", "..."), 2, false}, + + // None match + {pair("foo-", "bar"), 0, false}, + } + for _, tt := range tests { + if gotI, gotMatch := e.searchTable(tt.hf); gotI != tt.wantI || gotMatch != tt.wantMatch { + t.Errorf("d.search(%+v) = %v, %v; want %v, %v", tt.hf, gotI, gotMatch, tt.wantI, tt.wantMatch) + } + } +} + +func TestAppendVarInt(t *testing.T) { + tests := []struct { + n byte + i uint64 + want []byte + }{ + // Fits in a byte: + {1, 0, []byte{0}}, + {2, 2, []byte{2}}, + {3, 6, []byte{6}}, + {4, 14, []byte{14}}, + {5, 30, []byte{30}}, + {6, 62, []byte{62}}, + {7, 126, []byte{126}}, + {8, 254, []byte{254}}, + + // Multiple bytes: + {5, 1337, []byte{31, 154, 10}}, + } + for _, tt := range tests { + got := appendVarInt(nil, tt.n, tt.i) + if !bytes.Equal(got, tt.want) { + t.Errorf("appendVarInt(nil, %v, %v) = %v; want %v", tt.n, tt.i, got, tt.want) + } + } +} + +func TestAppendHpackString(t *testing.T) { + tests := []struct { + s, wantHex string + }{ + // Huffman encoded + {"www.example.com", "8c f1e3 c2e5 f23a 6ba0 ab90 f4ff"}, + + // Not Huffman encoded + {"a", "01 61"}, + + // zero length + {"", "00"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendHpackString(nil, tt.s) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendHpackString(nil, %q) = %q; want %q", tt.s, got, want) + } + } +} + +func TestAppendIndexed(t *testing.T) { + tests := []struct { + i uint64 + wantHex string + }{ + // 1 byte + {1, "81"}, + {126, "fe"}, + + // 2 bytes + {127, "ff00"}, + {128, "ff01"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendIndexed(nil, tt.i) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendIndex(nil, %v) = %q; want %q", tt.i, got, want) + } + } +} + +func TestAppendNewName(t *testing.T) { + tests := []struct { + f HeaderField + indexing bool + wantHex string + }{ + // Incremental indexing + {HeaderField{"custom-key", "custom-value", false}, true, "40 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + + // Without indexing + {HeaderField{"custom-key", "custom-value", false}, false, "00 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + + // Never indexed + {HeaderField{"custom-key", "custom-value", true}, true, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + {HeaderField{"custom-key", "custom-value", true}, false, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendNewName(nil, tt.f, tt.indexing) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendNewName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want) + } + } +} + +func TestAppendIndexedName(t *testing.T) { + tests := []struct { + f HeaderField + i uint64 + indexing bool + wantHex string + }{ + // Incremental indexing + {HeaderField{":status", "302", false}, 8, true, "48 82 6402"}, + + // Without indexing + {HeaderField{":status", "302", false}, 8, false, "08 82 6402"}, + + // Never indexed + {HeaderField{":status", "302", true}, 8, true, "18 82 6402"}, + {HeaderField{":status", "302", true}, 8, false, "18 82 6402"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendIndexedName(nil, tt.f, tt.i, tt.indexing) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendIndexedName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want) + } + } +} + +func TestAppendTableSize(t *testing.T) { + tests := []struct { + i uint32 + wantHex string + }{ + // Fits into 1 byte + {30, "3e"}, + + // Extra byte + {31, "3f00"}, + {32, "3f01"}, + } + for _, tt := range tests { + want := removeSpace(tt.wantHex) + buf := appendTableSize(nil, tt.i) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("appendTableSize(nil, %v) = %q; want %q", tt.i, got, want) + } + } +} + +func TestEncoderSetMaxDynamicTableSize(t *testing.T) { + var buf bytes.Buffer + e := NewEncoder(&buf) + tests := []struct { + v uint32 + wantUpdate bool + wantMinSize uint32 + wantMaxSize uint32 + }{ + // Set new table size to 2048 + {2048, true, 2048, 2048}, + + // Set new table size to 16384, but still limited to + // 4096 + {16384, true, 2048, 4096}, + } + for _, tt := range tests { + e.SetMaxDynamicTableSize(tt.v) + if got := e.tableSizeUpdate; tt.wantUpdate != got { + t.Errorf("e.tableSizeUpdate = %v; want %v", got, tt.wantUpdate) + } + if got := e.minSize; tt.wantMinSize != got { + t.Errorf("e.minSize = %v; want %v", got, tt.wantMinSize) + } + if got := e.dynTab.maxSize; tt.wantMaxSize != got { + t.Errorf("e.maxSize = %v; want %v", got, tt.wantMaxSize) + } + } +} + +func TestEncoderSetMaxDynamicTableSizeLimit(t *testing.T) { + e := NewEncoder(nil) + // 4095 < initialHeaderTableSize means maxSize is truncated to + // 4095. + e.SetMaxDynamicTableSizeLimit(4095) + if got, want := e.dynTab.maxSize, uint32(4095); got != want { + t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) + } + if got, want := e.maxSizeLimit, uint32(4095); got != want { + t.Errorf("e.maxSizeLimit = %v; want %v", got, want) + } + if got, want := e.tableSizeUpdate, true; got != want { + t.Errorf("e.tableSizeUpdate = %v; want %v", got, want) + } + // maxSize will be truncated to maxSizeLimit + e.SetMaxDynamicTableSize(16384) + if got, want := e.dynTab.maxSize, uint32(4095); got != want { + t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) + } + // 8192 > current maxSizeLimit, so maxSize does not change. + e.SetMaxDynamicTableSizeLimit(8192) + if got, want := e.dynTab.maxSize, uint32(4095); got != want { + t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) + } + if got, want := e.maxSizeLimit, uint32(8192); got != want { + t.Errorf("e.maxSizeLimit = %v; want %v", got, want) + } +} + +func removeSpace(s string) string { + return strings.Replace(s, " ", "", -1) +} diff --git a/vendor/golang.org/x/net/http2/hpack/hpack.go b/vendor/golang.org/x/net/http2/hpack/hpack.go new file mode 100644 index 00000000..8e9b2f2e --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/hpack.go @@ -0,0 +1,518 @@ +// Copyright 2014 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 hpack implements HPACK, a compression format for +// efficiently representing HTTP header fields in the context of HTTP/2. +// +// See http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-09 +package hpack + +import ( + "bytes" + "errors" + "fmt" +) + +// A DecodingError is something the spec defines as a decoding error. +type DecodingError struct { + Err error +} + +func (de DecodingError) Error() string { + return fmt.Sprintf("decoding error: %v", de.Err) +} + +// An InvalidIndexError is returned when an encoder references a table +// entry before the static table or after the end of the dynamic table. +type InvalidIndexError int + +func (e InvalidIndexError) Error() string { + return fmt.Sprintf("invalid indexed representation index %d", int(e)) +} + +// A HeaderField is a name-value pair. Both the name and value are +// treated as opaque sequences of octets. +type HeaderField struct { + Name, Value string + + // Sensitive means that this header field should never be + // indexed. + Sensitive bool +} + +func (hf *HeaderField) size() uint32 { + // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1 + // "The size of the dynamic table is the sum of the size of + // its entries. The size of an entry is the sum of its name's + // length in octets (as defined in Section 5.2), its value's + // length in octets (see Section 5.2), plus 32. The size of + // an entry is calculated using the length of the name and + // value without any Huffman encoding applied." + + // This can overflow if somebody makes a large HeaderField + // Name and/or Value by hand, but we don't care, because that + // won't happen on the wire because the encoding doesn't allow + // it. + return uint32(len(hf.Name) + len(hf.Value) + 32) +} + +// A Decoder is the decoding context for incremental processing of +// header blocks. +type Decoder struct { + dynTab dynamicTable + emit func(f HeaderField) + + emitEnabled bool // whether calls to emit are enabled + maxStrLen int // 0 means unlimited + + // buf is the unparsed buffer. It's only written to + // saveBuf if it was truncated in the middle of a header + // block. Because it's usually not owned, we can only + // process it under Write. + buf []byte // not owned; only valid during Write + + // saveBuf is previous data passed to Write which we weren't able + // to fully parse before. Unlike buf, we own this data. + saveBuf bytes.Buffer +} + +// NewDecoder returns a new decoder with the provided maximum dynamic +// table size. The emitFunc will be called for each valid field +// parsed, in the same goroutine as calls to Write, before Write returns. +func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decoder { + d := &Decoder{ + emit: emitFunc, + emitEnabled: true, + } + d.dynTab.allowedMaxSize = maxDynamicTableSize + d.dynTab.setMaxSize(maxDynamicTableSize) + return d +} + +// ErrStringLength is returned by Decoder.Write when the max string length +// (as configured by Decoder.SetMaxStringLength) would be violated. +var ErrStringLength = errors.New("hpack: string too long") + +// SetMaxStringLength sets the maximum size of a HeaderField name or +// value string. If a string exceeds this length (even after any +// decompression), Write will return ErrStringLength. +// A value of 0 means unlimited and is the default from NewDecoder. +func (d *Decoder) SetMaxStringLength(n int) { + d.maxStrLen = n +} + +// SetEmitEnabled controls whether the emitFunc provided to NewDecoder +// should be called. The default is true. +// +// This facility exists to let servers enforce MAX_HEADER_LIST_SIZE +// while still decoding and keeping in-sync with decoder state, but +// without doing unnecessary decompression or generating unnecessary +// garbage for header fields past the limit. +func (d *Decoder) SetEmitEnabled(v bool) { d.emitEnabled = v } + +// EmitEnabled reports whether calls to the emitFunc provided to NewDecoder +// are currently enabled. The default is true. +func (d *Decoder) EmitEnabled() bool { return d.emitEnabled } + +// TODO: add method *Decoder.Reset(maxSize, emitFunc) to let callers re-use Decoders and their +// underlying buffers for garbage reasons. + +func (d *Decoder) SetMaxDynamicTableSize(v uint32) { + d.dynTab.setMaxSize(v) +} + +// SetAllowedMaxDynamicTableSize sets the upper bound that the encoded +// stream (via dynamic table size updates) may set the maximum size +// to. +func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) { + d.dynTab.allowedMaxSize = v +} + +type dynamicTable struct { + // ents is the FIFO described at + // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2 + // The newest (low index) is append at the end, and items are + // evicted from the front. + ents []HeaderField + size uint32 + maxSize uint32 // current maxSize + allowedMaxSize uint32 // maxSize may go up to this, inclusive +} + +func (dt *dynamicTable) setMaxSize(v uint32) { + dt.maxSize = v + dt.evict() +} + +// TODO: change dynamicTable to be a struct with a slice and a size int field, +// per http://http2.github.io/http2-spec/compression.html#rfc.section.4.1: +// +// +// Then make add increment the size. maybe the max size should move from Decoder to +// dynamicTable and add should return an ok bool if there was enough space. +// +// Later we'll need a remove operation on dynamicTable. + +func (dt *dynamicTable) add(f HeaderField) { + dt.ents = append(dt.ents, f) + dt.size += f.size() + dt.evict() +} + +// If we're too big, evict old stuff (front of the slice) +func (dt *dynamicTable) evict() { + base := dt.ents // keep base pointer of slice + for dt.size > dt.maxSize { + dt.size -= dt.ents[0].size() + dt.ents = dt.ents[1:] + } + + // Shift slice contents down if we evicted things. + if len(dt.ents) != len(base) { + copy(base, dt.ents) + dt.ents = base[:len(dt.ents)] + } +} + +// constantTimeStringCompare compares string a and b in a constant +// time manner. +func constantTimeStringCompare(a, b string) bool { + if len(a) != len(b) { + return false + } + + c := byte(0) + + for i := 0; i < len(a); i++ { + c |= a[i] ^ b[i] + } + + return c == 0 +} + +// Search searches f in the table. The return value i is 0 if there is +// no name match. If there is name match or name/value match, i is the +// index of that entry (1-based). If both name and value match, +// nameValueMatch becomes true. +func (dt *dynamicTable) search(f HeaderField) (i uint64, nameValueMatch bool) { + l := len(dt.ents) + for j := l - 1; j >= 0; j-- { + ent := dt.ents[j] + if !constantTimeStringCompare(ent.Name, f.Name) { + continue + } + if i == 0 { + i = uint64(l - j) + } + if f.Sensitive { + continue + } + if !constantTimeStringCompare(ent.Value, f.Value) { + continue + } + i = uint64(l - j) + nameValueMatch = true + return + } + return +} + +func (d *Decoder) maxTableIndex() int { + return len(d.dynTab.ents) + len(staticTable) +} + +func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) { + if i < 1 { + return + } + if i > uint64(d.maxTableIndex()) { + return + } + if i <= uint64(len(staticTable)) { + return staticTable[i-1], true + } + dents := d.dynTab.ents + return dents[len(dents)-(int(i)-len(staticTable))], true +} + +// Decode decodes an entire block. +// +// TODO: remove this method and make it incremental later? This is +// easier for debugging now. +func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) { + var hf []HeaderField + saveFunc := d.emit + defer func() { d.emit = saveFunc }() + d.emit = func(f HeaderField) { hf = append(hf, f) } + if _, err := d.Write(p); err != nil { + return nil, err + } + if err := d.Close(); err != nil { + return nil, err + } + return hf, nil +} + +func (d *Decoder) Close() error { + if d.saveBuf.Len() > 0 { + d.saveBuf.Reset() + return DecodingError{errors.New("truncated headers")} + } + return nil +} + +func (d *Decoder) Write(p []byte) (n int, err error) { + if len(p) == 0 { + // Prevent state machine CPU attacks (making us redo + // work up to the point of finding out we don't have + // enough data) + return + } + // Only copy the data if we have to. Optimistically assume + // that p will contain a complete header block. + if d.saveBuf.Len() == 0 { + d.buf = p + } else { + d.saveBuf.Write(p) + d.buf = d.saveBuf.Bytes() + d.saveBuf.Reset() + } + + for len(d.buf) > 0 { + err = d.parseHeaderFieldRepr() + if err == errNeedMore { + // Extra paranoia, making sure saveBuf won't + // get too large. All the varint and string + // reading code earlier should already catch + // overlong things and return ErrStringLength, + // but keep this as a last resort. + const varIntOverhead = 8 // conservative + if d.maxStrLen != 0 && int64(len(d.buf)) > 2*(int64(d.maxStrLen)+varIntOverhead) { + return 0, ErrStringLength + } + d.saveBuf.Write(d.buf) + return len(p), nil + } + if err != nil { + break + } + } + return len(p), err +} + +// errNeedMore is an internal sentinel error value that means the +// buffer is truncated and we need to read more data before we can +// continue parsing. +var errNeedMore = errors.New("need more data") + +type indexType int + +const ( + indexedTrue indexType = iota + indexedFalse + indexedNever +) + +func (v indexType) indexed() bool { return v == indexedTrue } +func (v indexType) sensitive() bool { return v == indexedNever } + +// returns errNeedMore if there isn't enough data available. +// any other error is fatal. +// consumes d.buf iff it returns nil. +// precondition: must be called with len(d.buf) > 0 +func (d *Decoder) parseHeaderFieldRepr() error { + b := d.buf[0] + switch { + case b&128 != 0: + // Indexed representation. + // High bit set? + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.1 + return d.parseFieldIndexed() + case b&192 == 64: + // 6.2.1 Literal Header Field with Incremental Indexing + // 0b10xxxxxx: top two bits are 10 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.1 + return d.parseFieldLiteral(6, indexedTrue) + case b&240 == 0: + // 6.2.2 Literal Header Field without Indexing + // 0b0000xxxx: top four bits are 0000 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.2 + return d.parseFieldLiteral(4, indexedFalse) + case b&240 == 16: + // 6.2.3 Literal Header Field never Indexed + // 0b0001xxxx: top four bits are 0001 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.3 + return d.parseFieldLiteral(4, indexedNever) + case b&224 == 32: + // 6.3 Dynamic Table Size Update + // Top three bits are '001'. + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.3 + return d.parseDynamicTableSizeUpdate() + } + + return DecodingError{errors.New("invalid encoding")} +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseFieldIndexed() error { + buf := d.buf + idx, buf, err := readVarInt(7, buf) + if err != nil { + return err + } + hf, ok := d.at(idx) + if !ok { + return DecodingError{InvalidIndexError(idx)} + } + d.buf = buf + return d.callEmit(HeaderField{Name: hf.Name, Value: hf.Value}) +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error { + buf := d.buf + nameIdx, buf, err := readVarInt(n, buf) + if err != nil { + return err + } + + var hf HeaderField + wantStr := d.emitEnabled || it.indexed() + if nameIdx > 0 { + ihf, ok := d.at(nameIdx) + if !ok { + return DecodingError{InvalidIndexError(nameIdx)} + } + hf.Name = ihf.Name + } else { + hf.Name, buf, err = d.readString(buf, wantStr) + if err != nil { + return err + } + } + hf.Value, buf, err = d.readString(buf, wantStr) + if err != nil { + return err + } + d.buf = buf + if it.indexed() { + d.dynTab.add(hf) + } + hf.Sensitive = it.sensitive() + return d.callEmit(hf) +} + +func (d *Decoder) callEmit(hf HeaderField) error { + if d.maxStrLen != 0 { + if len(hf.Name) > d.maxStrLen || len(hf.Value) > d.maxStrLen { + return ErrStringLength + } + } + if d.emitEnabled { + d.emit(hf) + } + return nil +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseDynamicTableSizeUpdate() error { + buf := d.buf + size, buf, err := readVarInt(5, buf) + if err != nil { + return err + } + if size > uint64(d.dynTab.allowedMaxSize) { + return DecodingError{errors.New("dynamic table size update too large")} + } + d.dynTab.setMaxSize(uint32(size)) + d.buf = buf + return nil +} + +var errVarintOverflow = DecodingError{errors.New("varint integer overflow")} + +// readVarInt reads an unsigned variable length integer off the +// beginning of p. n is the parameter as described in +// http://http2.github.io/http2-spec/compression.html#rfc.section.5.1. +// +// n must always be between 1 and 8. +// +// The returned remain buffer is either a smaller suffix of p, or err != nil. +// The error is errNeedMore if p doesn't contain a complete integer. +func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) { + if n < 1 || n > 8 { + panic("bad n") + } + if len(p) == 0 { + return 0, p, errNeedMore + } + i = uint64(p[0]) + if n < 8 { + i &= (1 << uint64(n)) - 1 + } + if i < (1< 0 { + b := p[0] + p = p[1:] + i += uint64(b&127) << m + if b&128 == 0 { + return i, p, nil + } + m += 7 + if m >= 63 { // TODO: proper overflow check. making this up. + return 0, origP, errVarintOverflow + } + } + return 0, origP, errNeedMore +} + +// readString decodes an hpack string from p. +// +// wantStr is whether s will be used. If false, decompression and +// []byte->string garbage are skipped if s will be ignored +// anyway. This does mean that huffman decoding errors for non-indexed +// strings past the MAX_HEADER_LIST_SIZE are ignored, but the server +// is returning an error anyway, and because they're not indexed, the error +// won't affect the decoding state. +func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) { + if len(p) == 0 { + return "", p, errNeedMore + } + isHuff := p[0]&128 != 0 + strLen, p, err := readVarInt(7, p) + if err != nil { + return "", p, err + } + if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) { + return "", nil, ErrStringLength + } + if uint64(len(p)) < strLen { + return "", p, errNeedMore + } + if !isHuff { + if wantStr { + s = string(p[:strLen]) + } + return s, p[strLen:], nil + } + + if wantStr { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() // don't trust others + defer bufPool.Put(buf) + if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil { + buf.Reset() + return "", nil, err + } + s = buf.String() + buf.Reset() // be nice to GC + } + return s, p[strLen:], nil +} diff --git a/vendor/golang.org/x/net/http2/hpack/hpack_test.go b/vendor/golang.org/x/net/http2/hpack/hpack_test.go new file mode 100644 index 00000000..6dc69f95 --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/hpack_test.go @@ -0,0 +1,813 @@ +// Copyright 2014 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 hpack + +import ( + "bufio" + "bytes" + "encoding/hex" + "fmt" + "math/rand" + "reflect" + "regexp" + "strconv" + "strings" + "testing" + "time" +) + +func TestStaticTable(t *testing.T) { + fromSpec := ` + +-------+-----------------------------+---------------+ + | 1 | :authority | | + | 2 | :method | GET | + | 3 | :method | POST | + | 4 | :path | / | + | 5 | :path | /index.html | + | 6 | :scheme | http | + | 7 | :scheme | https | + | 8 | :status | 200 | + | 9 | :status | 204 | + | 10 | :status | 206 | + | 11 | :status | 304 | + | 12 | :status | 400 | + | 13 | :status | 404 | + | 14 | :status | 500 | + | 15 | accept-charset | | + | 16 | accept-encoding | gzip, deflate | + | 17 | accept-language | | + | 18 | accept-ranges | | + | 19 | accept | | + | 20 | access-control-allow-origin | | + | 21 | age | | + | 22 | allow | | + | 23 | authorization | | + | 24 | cache-control | | + | 25 | content-disposition | | + | 26 | content-encoding | | + | 27 | content-language | | + | 28 | content-length | | + | 29 | content-location | | + | 30 | content-range | | + | 31 | content-type | | + | 32 | cookie | | + | 33 | date | | + | 34 | etag | | + | 35 | expect | | + | 36 | expires | | + | 37 | from | | + | 38 | host | | + | 39 | if-match | | + | 40 | if-modified-since | | + | 41 | if-none-match | | + | 42 | if-range | | + | 43 | if-unmodified-since | | + | 44 | last-modified | | + | 45 | link | | + | 46 | location | | + | 47 | max-forwards | | + | 48 | proxy-authenticate | | + | 49 | proxy-authorization | | + | 50 | range | | + | 51 | referer | | + | 52 | refresh | | + | 53 | retry-after | | + | 54 | server | | + | 55 | set-cookie | | + | 56 | strict-transport-security | | + | 57 | transfer-encoding | | + | 58 | user-agent | | + | 59 | vary | | + | 60 | via | | + | 61 | www-authenticate | | + +-------+-----------------------------+---------------+ +` + bs := bufio.NewScanner(strings.NewReader(fromSpec)) + re := regexp.MustCompile(`\| (\d+)\s+\| (\S+)\s*\| (\S(.*\S)?)?\s+\|`) + for bs.Scan() { + l := bs.Text() + if !strings.Contains(l, "|") { + continue + } + m := re.FindStringSubmatch(l) + if m == nil { + continue + } + i, err := strconv.Atoi(m[1]) + if err != nil { + t.Errorf("Bogus integer on line %q", l) + continue + } + if i < 1 || i > len(staticTable) { + t.Errorf("Bogus index %d on line %q", i, l) + continue + } + if got, want := staticTable[i-1].Name, m[2]; got != want { + t.Errorf("header index %d name = %q; want %q", i, got, want) + } + if got, want := staticTable[i-1].Value, m[3]; got != want { + t.Errorf("header index %d value = %q; want %q", i, got, want) + } + } + if err := bs.Err(); err != nil { + t.Error(err) + } +} + +func (d *Decoder) mustAt(idx int) HeaderField { + if hf, ok := d.at(uint64(idx)); !ok { + panic(fmt.Sprintf("bogus index %d", idx)) + } else { + return hf + } +} + +func TestDynamicTableAt(t *testing.T) { + d := NewDecoder(4096, nil) + at := d.mustAt + if got, want := at(2), (pair(":method", "GET")); got != want { + t.Errorf("at(2) = %v; want %v", got, want) + } + d.dynTab.add(pair("foo", "bar")) + d.dynTab.add(pair("blake", "miz")) + if got, want := at(len(staticTable)+1), (pair("blake", "miz")); got != want { + t.Errorf("at(dyn 1) = %v; want %v", got, want) + } + if got, want := at(len(staticTable)+2), (pair("foo", "bar")); got != want { + t.Errorf("at(dyn 2) = %v; want %v", got, want) + } + if got, want := at(3), (pair(":method", "POST")); got != want { + t.Errorf("at(3) = %v; want %v", got, want) + } +} + +func TestDynamicTableSearch(t *testing.T) { + dt := dynamicTable{} + dt.setMaxSize(4096) + + dt.add(pair("foo", "bar")) + dt.add(pair("blake", "miz")) + dt.add(pair(":method", "GET")) + + tests := []struct { + hf HeaderField + wantI uint64 + wantMatch bool + }{ + // Name and Value match + {pair("foo", "bar"), 3, true}, + {pair(":method", "GET"), 1, true}, + + // Only name match because of Sensitive == true + {HeaderField{"blake", "miz", true}, 2, false}, + + // Only Name matches + {pair("foo", "..."), 3, false}, + {pair("blake", "..."), 2, false}, + {pair(":method", "..."), 1, false}, + + // None match + {pair("foo-", "bar"), 0, false}, + } + for _, tt := range tests { + if gotI, gotMatch := dt.search(tt.hf); gotI != tt.wantI || gotMatch != tt.wantMatch { + t.Errorf("d.search(%+v) = %v, %v; want %v, %v", tt.hf, gotI, gotMatch, tt.wantI, tt.wantMatch) + } + } +} + +func TestDynamicTableSizeEvict(t *testing.T) { + d := NewDecoder(4096, nil) + if want := uint32(0); d.dynTab.size != want { + t.Fatalf("size = %d; want %d", d.dynTab.size, want) + } + add := d.dynTab.add + add(pair("blake", "eats pizza")) + if want := uint32(15 + 32); d.dynTab.size != want { + t.Fatalf("after pizza, size = %d; want %d", d.dynTab.size, want) + } + add(pair("foo", "bar")) + if want := uint32(15 + 32 + 6 + 32); d.dynTab.size != want { + t.Fatalf("after foo bar, size = %d; want %d", d.dynTab.size, want) + } + d.dynTab.setMaxSize(15 + 32 + 1 /* slop */) + if want := uint32(6 + 32); d.dynTab.size != want { + t.Fatalf("after setMaxSize, size = %d; want %d", d.dynTab.size, want) + } + if got, want := d.mustAt(len(staticTable)+1), (pair("foo", "bar")); got != want { + t.Errorf("at(dyn 1) = %v; want %v", got, want) + } + add(pair("long", strings.Repeat("x", 500))) + if want := uint32(0); d.dynTab.size != want { + t.Fatalf("after big one, size = %d; want %d", d.dynTab.size, want) + } +} + +func TestDecoderDecode(t *testing.T) { + tests := []struct { + name string + in []byte + want []HeaderField + wantDynTab []HeaderField // newest entry first + }{ + // C.2.1 Literal Header Field with Indexing + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.1 + {"C.2.1", dehex("400a 6375 7374 6f6d 2d6b 6579 0d63 7573 746f 6d2d 6865 6164 6572"), + []HeaderField{pair("custom-key", "custom-header")}, + []HeaderField{pair("custom-key", "custom-header")}, + }, + + // C.2.2 Literal Header Field without Indexing + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.2 + {"C.2.2", dehex("040c 2f73 616d 706c 652f 7061 7468"), + []HeaderField{pair(":path", "/sample/path")}, + []HeaderField{}}, + + // C.2.3 Literal Header Field never Indexed + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.3 + {"C.2.3", dehex("1008 7061 7373 776f 7264 0673 6563 7265 74"), + []HeaderField{{"password", "secret", true}}, + []HeaderField{}}, + + // C.2.4 Indexed Header Field + // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.4 + {"C.2.4", []byte("\x82"), + []HeaderField{pair(":method", "GET")}, + []HeaderField{}}, + } + for _, tt := range tests { + d := NewDecoder(4096, nil) + hf, err := d.DecodeFull(tt.in) + if err != nil { + t.Errorf("%s: %v", tt.name, err) + continue + } + if !reflect.DeepEqual(hf, tt.want) { + t.Errorf("%s: Got %v; want %v", tt.name, hf, tt.want) + } + gotDynTab := d.dynTab.reverseCopy() + if !reflect.DeepEqual(gotDynTab, tt.wantDynTab) { + t.Errorf("%s: dynamic table after = %v; want %v", tt.name, gotDynTab, tt.wantDynTab) + } + } +} + +func (dt *dynamicTable) reverseCopy() (hf []HeaderField) { + hf = make([]HeaderField, len(dt.ents)) + for i := range hf { + hf[i] = dt.ents[len(dt.ents)-1-i] + } + return +} + +type encAndWant struct { + enc []byte + want []HeaderField + wantDynTab []HeaderField + wantDynSize uint32 +} + +// C.3 Request Examples without Huffman Coding +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.3 +func TestDecodeC3_NoHuffman(t *testing.T) { + testDecodeSeries(t, 4096, []encAndWant{ + {dehex("8286 8441 0f77 7777 2e65 7861 6d70 6c65 2e63 6f6d"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + }, + []HeaderField{ + pair(":authority", "www.example.com"), + }, + 57, + }, + {dehex("8286 84be 5808 6e6f 2d63 6163 6865"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + pair("cache-control", "no-cache"), + }, + []HeaderField{ + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 110, + }, + {dehex("8287 85bf 400a 6375 7374 6f6d 2d6b 6579 0c63 7573 746f 6d2d 7661 6c75 65"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "https"), + pair(":path", "/index.html"), + pair(":authority", "www.example.com"), + pair("custom-key", "custom-value"), + }, + []HeaderField{ + pair("custom-key", "custom-value"), + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 164, + }, + }) +} + +// C.4 Request Examples with Huffman Coding +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.4 +func TestDecodeC4_Huffman(t *testing.T) { + testDecodeSeries(t, 4096, []encAndWant{ + {dehex("8286 8441 8cf1 e3c2 e5f2 3a6b a0ab 90f4 ff"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + }, + []HeaderField{ + pair(":authority", "www.example.com"), + }, + 57, + }, + {dehex("8286 84be 5886 a8eb 1064 9cbf"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "http"), + pair(":path", "/"), + pair(":authority", "www.example.com"), + pair("cache-control", "no-cache"), + }, + []HeaderField{ + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 110, + }, + {dehex("8287 85bf 4088 25a8 49e9 5ba9 7d7f 8925 a849 e95b b8e8 b4bf"), + []HeaderField{ + pair(":method", "GET"), + pair(":scheme", "https"), + pair(":path", "/index.html"), + pair(":authority", "www.example.com"), + pair("custom-key", "custom-value"), + }, + []HeaderField{ + pair("custom-key", "custom-value"), + pair("cache-control", "no-cache"), + pair(":authority", "www.example.com"), + }, + 164, + }, + }) +} + +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.5 +// "This section shows several consecutive header lists, corresponding +// to HTTP responses, on the same connection. The HTTP/2 setting +// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 +// octets, causing some evictions to occur." +func TestDecodeC5_ResponsesNoHuff(t *testing.T) { + testDecodeSeries(t, 256, []encAndWant{ + {dehex(` +4803 3330 3258 0770 7269 7661 7465 611d +4d6f 6e2c 2032 3120 4f63 7420 3230 3133 +2032 303a 3133 3a32 3120 474d 546e 1768 +7474 7073 3a2f 2f77 7777 2e65 7861 6d70 +6c65 2e63 6f6d +`), + []HeaderField{ + pair(":status", "302"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + pair(":status", "302"), + }, + 222, + }, + {dehex("4803 3330 37c1 c0bf"), + []HeaderField{ + pair(":status", "307"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair(":status", "307"), + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + }, + 222, + }, + {dehex(` +88c1 611d 4d6f 6e2c 2032 3120 4f63 7420 +3230 3133 2032 303a 3133 3a32 3220 474d +54c0 5a04 677a 6970 7738 666f 6f3d 4153 +444a 4b48 514b 425a 584f 5157 454f 5049 +5541 5851 5745 4f49 553b 206d 6178 2d61 +6765 3d33 3630 303b 2076 6572 7369 6f6e +3d31 +`), + []HeaderField{ + pair(":status", "200"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + pair("location", "https://www.example.com"), + pair("content-encoding", "gzip"), + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + }, + []HeaderField{ + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + pair("content-encoding", "gzip"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + }, + 215, + }, + }) +} + +// http://http2.github.io/http2-spec/compression.html#rfc.section.C.6 +// "This section shows the same examples as the previous section, but +// using Huffman encoding for the literal values. The HTTP/2 setting +// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 +// octets, causing some evictions to occur. The eviction mechanism +// uses the length of the decoded literal values, so the same +// evictions occurs as in the previous section." +func TestDecodeC6_ResponsesHuffman(t *testing.T) { + testDecodeSeries(t, 256, []encAndWant{ + {dehex(` +4882 6402 5885 aec3 771a 4b61 96d0 7abe +9410 54d4 44a8 2005 9504 0b81 66e0 82a6 +2d1b ff6e 919d 29ad 1718 63c7 8f0b 97c8 +e9ae 82ae 43d3 +`), + []HeaderField{ + pair(":status", "302"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + pair(":status", "302"), + }, + 222, + }, + {dehex("4883 640e ffc1 c0bf"), + []HeaderField{ + pair(":status", "307"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("location", "https://www.example.com"), + }, + []HeaderField{ + pair(":status", "307"), + pair("location", "https://www.example.com"), + pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), + pair("cache-control", "private"), + }, + 222, + }, + {dehex(` +88c1 6196 d07a be94 1054 d444 a820 0595 +040b 8166 e084 a62d 1bff c05a 839b d9ab +77ad 94e7 821d d7f2 e6c7 b335 dfdf cd5b +3960 d5af 2708 7f36 72c1 ab27 0fb5 291f +9587 3160 65c0 03ed 4ee5 b106 3d50 07 +`), + []HeaderField{ + pair(":status", "200"), + pair("cache-control", "private"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + pair("location", "https://www.example.com"), + pair("content-encoding", "gzip"), + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + }, + []HeaderField{ + pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), + pair("content-encoding", "gzip"), + pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), + }, + 215, + }, + }) +} + +func testDecodeSeries(t *testing.T, size uint32, steps []encAndWant) { + d := NewDecoder(size, nil) + for i, step := range steps { + hf, err := d.DecodeFull(step.enc) + if err != nil { + t.Fatalf("Error at step index %d: %v", i, err) + } + if !reflect.DeepEqual(hf, step.want) { + t.Fatalf("At step index %d: Got headers %v; want %v", i, hf, step.want) + } + gotDynTab := d.dynTab.reverseCopy() + if !reflect.DeepEqual(gotDynTab, step.wantDynTab) { + t.Errorf("After step index %d, dynamic table = %v; want %v", i, gotDynTab, step.wantDynTab) + } + if d.dynTab.size != step.wantDynSize { + t.Errorf("After step index %d, dynamic table size = %v; want %v", i, d.dynTab.size, step.wantDynSize) + } + } +} + +func TestHuffmanDecode(t *testing.T) { + tests := []struct { + inHex, want string + }{ + {"f1e3 c2e5 f23a 6ba0 ab90 f4ff", "www.example.com"}, + {"a8eb 1064 9cbf", "no-cache"}, + {"25a8 49e9 5ba9 7d7f", "custom-key"}, + {"25a8 49e9 5bb8 e8b4 bf", "custom-value"}, + {"6402", "302"}, + {"aec3 771a 4b", "private"}, + {"d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff", "Mon, 21 Oct 2013 20:13:21 GMT"}, + {"9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3", "https://www.example.com"}, + {"9bd9 ab", "gzip"}, + {"94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07", + "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"}, + } + for i, tt := range tests { + var buf bytes.Buffer + in, err := hex.DecodeString(strings.Replace(tt.inHex, " ", "", -1)) + if err != nil { + t.Errorf("%d. hex input error: %v", i, err) + continue + } + if _, err := HuffmanDecode(&buf, in); err != nil { + t.Errorf("%d. decode error: %v", i, err) + continue + } + if got := buf.String(); tt.want != got { + t.Errorf("%d. decode = %q; want %q", i, got, tt.want) + } + } +} + +func TestAppendHuffmanString(t *testing.T) { + tests := []struct { + in, want string + }{ + {"www.example.com", "f1e3 c2e5 f23a 6ba0 ab90 f4ff"}, + {"no-cache", "a8eb 1064 9cbf"}, + {"custom-key", "25a8 49e9 5ba9 7d7f"}, + {"custom-value", "25a8 49e9 5bb8 e8b4 bf"}, + {"302", "6402"}, + {"private", "aec3 771a 4b"}, + {"Mon, 21 Oct 2013 20:13:21 GMT", "d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff"}, + {"https://www.example.com", "9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3"}, + {"gzip", "9bd9 ab"}, + {"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", + "94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07"}, + } + for i, tt := range tests { + buf := []byte{} + want := strings.Replace(tt.want, " ", "", -1) + buf = AppendHuffmanString(buf, tt.in) + if got := hex.EncodeToString(buf); want != got { + t.Errorf("%d. encode = %q; want %q", i, got, want) + } + } +} + +func TestHuffmanMaxStrLen(t *testing.T) { + const msg = "Some string" + huff := AppendHuffmanString(nil, msg) + + testGood := func(max int) { + var out bytes.Buffer + if err := huffmanDecode(&out, max, huff); err != nil { + t.Errorf("For maxLen=%d, unexpected error: %v", max, err) + } + if out.String() != msg { + t.Errorf("For maxLen=%d, out = %q; want %q", max, out.String(), msg) + } + } + testGood(0) + testGood(len(msg)) + testGood(len(msg) + 1) + + var out bytes.Buffer + if err := huffmanDecode(&out, len(msg)-1, huff); err != ErrStringLength { + t.Errorf("err = %v; want ErrStringLength", err) + } +} + +func TestHuffmanRoundtripStress(t *testing.T) { + const Len = 50 // of uncompressed string + input := make([]byte, Len) + var output bytes.Buffer + var huff []byte + + n := 5000 + if testing.Short() { + n = 100 + } + seed := time.Now().UnixNano() + t.Logf("Seed = %v", seed) + src := rand.New(rand.NewSource(seed)) + var encSize int64 + for i := 0; i < n; i++ { + for l := range input { + input[l] = byte(src.Intn(256)) + } + huff = AppendHuffmanString(huff[:0], string(input)) + encSize += int64(len(huff)) + output.Reset() + if err := huffmanDecode(&output, 0, huff); err != nil { + t.Errorf("Failed to decode %q -> %q -> error %v", input, huff, err) + continue + } + if !bytes.Equal(output.Bytes(), input) { + t.Errorf("Roundtrip failure on %q -> %q -> %q", input, huff, output.Bytes()) + } + } + t.Logf("Compressed size of original: %0.02f%% (%v -> %v)", 100*(float64(encSize)/(Len*float64(n))), Len*n, encSize) +} + +func TestHuffmanDecodeFuzz(t *testing.T) { + const Len = 50 // of compressed + var buf, zbuf bytes.Buffer + + n := 5000 + if testing.Short() { + n = 100 + } + seed := time.Now().UnixNano() + t.Logf("Seed = %v", seed) + src := rand.New(rand.NewSource(seed)) + numFail := 0 + for i := 0; i < n; i++ { + zbuf.Reset() + if i == 0 { + // Start with at least one invalid one. + zbuf.WriteString("00\x91\xff\xff\xff\xff\xc8") + } else { + for l := 0; l < Len; l++ { + zbuf.WriteByte(byte(src.Intn(256))) + } + } + + buf.Reset() + if err := huffmanDecode(&buf, 0, zbuf.Bytes()); err != nil { + if err == ErrInvalidHuffman { + numFail++ + continue + } + t.Errorf("Failed to decode %q: %v", zbuf.Bytes(), err) + continue + } + } + t.Logf("%0.02f%% are invalid (%d / %d)", 100*float64(numFail)/float64(n), numFail, n) + if numFail < 1 { + t.Error("expected at least one invalid huffman encoding (test starts with one)") + } +} + +func TestReadVarInt(t *testing.T) { + type res struct { + i uint64 + consumed int + err error + } + tests := []struct { + n byte + p []byte + want res + }{ + // Fits in a byte: + {1, []byte{0}, res{0, 1, nil}}, + {2, []byte{2}, res{2, 1, nil}}, + {3, []byte{6}, res{6, 1, nil}}, + {4, []byte{14}, res{14, 1, nil}}, + {5, []byte{30}, res{30, 1, nil}}, + {6, []byte{62}, res{62, 1, nil}}, + {7, []byte{126}, res{126, 1, nil}}, + {8, []byte{254}, res{254, 1, nil}}, + + // Doesn't fit in a byte: + {1, []byte{1}, res{0, 0, errNeedMore}}, + {2, []byte{3}, res{0, 0, errNeedMore}}, + {3, []byte{7}, res{0, 0, errNeedMore}}, + {4, []byte{15}, res{0, 0, errNeedMore}}, + {5, []byte{31}, res{0, 0, errNeedMore}}, + {6, []byte{63}, res{0, 0, errNeedMore}}, + {7, []byte{127}, res{0, 0, errNeedMore}}, + {8, []byte{255}, res{0, 0, errNeedMore}}, + + // Ignoring top bits: + {5, []byte{255, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 111 + {5, []byte{159, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 100 + {5, []byte{191, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 101 + + // Extra byte: + {5, []byte{191, 154, 10, 2}, res{1337, 3, nil}}, // extra byte + + // Short a byte: + {5, []byte{191, 154}, res{0, 0, errNeedMore}}, + + // integer overflow: + {1, []byte{255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, res{0, 0, errVarintOverflow}}, + } + for _, tt := range tests { + i, remain, err := readVarInt(tt.n, tt.p) + consumed := len(tt.p) - len(remain) + got := res{i, consumed, err} + if got != tt.want { + t.Errorf("readVarInt(%d, %v ~ %x) = %+v; want %+v", tt.n, tt.p, tt.p, got, tt.want) + } + } +} + +// Fuzz crash, originally reported at https://github.com/bradfitz/http2/issues/56 +func TestHuffmanFuzzCrash(t *testing.T) { + got, err := HuffmanDecodeToString([]byte("00\x91\xff\xff\xff\xff\xc8")) + if got != "" { + t.Errorf("Got %q; want empty string", got) + } + if err != ErrInvalidHuffman { + t.Errorf("Err = %v; want ErrInvalidHuffman", err) + } +} + +func dehex(s string) []byte { + s = strings.Replace(s, " ", "", -1) + s = strings.Replace(s, "\n", "", -1) + b, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + return b +} + +func TestEmitEnabled(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) + enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) + + numCallback := 0 + var dec *Decoder + dec = NewDecoder(8<<20, func(HeaderField) { + numCallback++ + dec.SetEmitEnabled(false) + }) + if !dec.EmitEnabled() { + t.Errorf("initial emit enabled = false; want true") + } + if _, err := dec.Write(buf.Bytes()); err != nil { + t.Error(err) + } + if numCallback != 1 { + t.Errorf("num callbacks = %d; want 1", numCallback) + } + if dec.EmitEnabled() { + t.Errorf("emit enabled = true; want false") + } +} + +func TestSaveBufLimit(t *testing.T) { + const maxStr = 1 << 10 + var got []HeaderField + dec := NewDecoder(initialHeaderTableSize, func(hf HeaderField) { + got = append(got, hf) + }) + dec.SetMaxStringLength(maxStr) + var frag []byte + frag = append(frag[:0], encodeTypeByte(false, false)) + frag = appendVarInt(frag, 7, 3) + frag = append(frag, "foo"...) + frag = appendVarInt(frag, 7, 3) + frag = append(frag, "bar"...) + + if _, err := dec.Write(frag); err != nil { + t.Fatal(err) + } + + want := []HeaderField{{Name: "foo", Value: "bar"}} + if !reflect.DeepEqual(got, want) { + t.Errorf("After small writes, got %v; want %v", got, want) + } + + frag = append(frag[:0], encodeTypeByte(false, false)) + frag = appendVarInt(frag, 7, maxStr*3) + frag = append(frag, make([]byte, maxStr*3)...) + + _, err := dec.Write(frag) + if err != ErrStringLength { + t.Fatalf("Write error = %v; want ErrStringLength", err) + } +} diff --git a/vendor/golang.org/x/net/http2/hpack/huffman.go b/vendor/golang.org/x/net/http2/hpack/huffman.go new file mode 100644 index 00000000..eb4b1f05 --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/huffman.go @@ -0,0 +1,190 @@ +// Copyright 2014 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 hpack + +import ( + "bytes" + "errors" + "io" + "sync" +) + +var bufPool = sync.Pool{ + New: func() interface{} { return new(bytes.Buffer) }, +} + +// HuffmanDecode decodes the string in v and writes the expanded +// result to w, returning the number of bytes written to w and the +// Write call's return value. At most one Write call is made. +func HuffmanDecode(w io.Writer, v []byte) (int, error) { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() + defer bufPool.Put(buf) + if err := huffmanDecode(buf, 0, v); err != nil { + return 0, err + } + return w.Write(buf.Bytes()) +} + +// HuffmanDecodeToString decodes the string in v. +func HuffmanDecodeToString(v []byte) (string, error) { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() + defer bufPool.Put(buf) + if err := huffmanDecode(buf, 0, v); err != nil { + return "", err + } + return buf.String(), nil +} + +// ErrInvalidHuffman is returned for errors found decoding +// Huffman-encoded strings. +var ErrInvalidHuffman = errors.New("hpack: invalid Huffman-encoded data") + +// huffmanDecode decodes v to buf. +// If maxLen is greater than 0, attempts to write more to buf than +// maxLen bytes will return ErrStringLength. +func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error { + n := rootHuffmanNode + cur, nbits := uint(0), uint8(0) + for _, b := range v { + cur = cur<<8 | uint(b) + nbits += 8 + for nbits >= 8 { + idx := byte(cur >> (nbits - 8)) + n = n.children[idx] + if n == nil { + return ErrInvalidHuffman + } + if n.children == nil { + if maxLen != 0 && buf.Len() == maxLen { + return ErrStringLength + } + buf.WriteByte(n.sym) + nbits -= n.codeLen + n = rootHuffmanNode + } else { + nbits -= 8 + } + } + } + for nbits > 0 { + n = n.children[byte(cur<<(8-nbits))] + if n.children != nil || n.codeLen > nbits { + break + } + buf.WriteByte(n.sym) + nbits -= n.codeLen + n = rootHuffmanNode + } + return nil +} + +type node struct { + // children is non-nil for internal nodes + children []*node + + // The following are only valid if children is nil: + codeLen uint8 // number of bits that led to the output of sym + sym byte // output symbol +} + +func newInternalNode() *node { + return &node{children: make([]*node, 256)} +} + +var rootHuffmanNode = newInternalNode() + +func init() { + if len(huffmanCodes) != 256 { + panic("unexpected size") + } + for i, code := range huffmanCodes { + addDecoderNode(byte(i), code, huffmanCodeLen[i]) + } +} + +func addDecoderNode(sym byte, code uint32, codeLen uint8) { + cur := rootHuffmanNode + for codeLen > 8 { + codeLen -= 8 + i := uint8(code >> codeLen) + if cur.children[i] == nil { + cur.children[i] = newInternalNode() + } + cur = cur.children[i] + } + shift := 8 - codeLen + start, end := int(uint8(code<> (nbits - rembits)) + dst[len(dst)-1] |= t + } + + return dst +} + +// HuffmanEncodeLength returns the number of bytes required to encode +// s in Huffman codes. The result is round up to byte boundary. +func HuffmanEncodeLength(s string) uint64 { + n := uint64(0) + for i := 0; i < len(s); i++ { + n += uint64(huffmanCodeLen[s[i]]) + } + return (n + 7) / 8 +} + +// appendByteToHuffmanCode appends Huffman code for c to dst and +// returns the extended buffer and the remaining bits in the last +// element. The appending is not byte aligned and the remaining bits +// in the last element of dst is given in rembits. +func appendByteToHuffmanCode(dst []byte, rembits uint8, c byte) ([]byte, uint8) { + code := huffmanCodes[c] + nbits := huffmanCodeLen[c] + + for { + if rembits > nbits { + t := uint8(code << (rembits - nbits)) + dst[len(dst)-1] |= t + rembits -= nbits + break + } + + t := uint8(code >> (nbits - rembits)) + dst[len(dst)-1] |= t + + nbits -= rembits + rembits = 8 + + if nbits == 0 { + break + } + + dst = append(dst, 0) + } + + return dst, rembits +} diff --git a/vendor/golang.org/x/net/http2/hpack/tables.go b/vendor/golang.org/x/net/http2/hpack/tables.go new file mode 100644 index 00000000..b9283a02 --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/tables.go @@ -0,0 +1,352 @@ +// Copyright 2014 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 hpack + +func pair(name, value string) HeaderField { + return HeaderField{Name: name, Value: value} +} + +// http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B +var staticTable = [...]HeaderField{ + pair(":authority", ""), // index 1 (1-based) + pair(":method", "GET"), + pair(":method", "POST"), + pair(":path", "/"), + pair(":path", "/index.html"), + pair(":scheme", "http"), + pair(":scheme", "https"), + pair(":status", "200"), + pair(":status", "204"), + pair(":status", "206"), + pair(":status", "304"), + pair(":status", "400"), + pair(":status", "404"), + pair(":status", "500"), + pair("accept-charset", ""), + pair("accept-encoding", "gzip, deflate"), + pair("accept-language", ""), + pair("accept-ranges", ""), + pair("accept", ""), + pair("access-control-allow-origin", ""), + pair("age", ""), + pair("allow", ""), + pair("authorization", ""), + pair("cache-control", ""), + pair("content-disposition", ""), + pair("content-encoding", ""), + pair("content-language", ""), + pair("content-length", ""), + pair("content-location", ""), + pair("content-range", ""), + pair("content-type", ""), + pair("cookie", ""), + pair("date", ""), + pair("etag", ""), + pair("expect", ""), + pair("expires", ""), + pair("from", ""), + pair("host", ""), + pair("if-match", ""), + pair("if-modified-since", ""), + pair("if-none-match", ""), + pair("if-range", ""), + pair("if-unmodified-since", ""), + pair("last-modified", ""), + pair("link", ""), + pair("location", ""), + pair("max-forwards", ""), + pair("proxy-authenticate", ""), + pair("proxy-authorization", ""), + pair("range", ""), + pair("referer", ""), + pair("refresh", ""), + pair("retry-after", ""), + pair("server", ""), + pair("set-cookie", ""), + pair("strict-transport-security", ""), + pair("transfer-encoding", ""), + pair("user-agent", ""), + pair("vary", ""), + pair("via", ""), + pair("www-authenticate", ""), +} + +var huffmanCodes = [256]uint32{ + 0x1ff8, + 0x7fffd8, + 0xfffffe2, + 0xfffffe3, + 0xfffffe4, + 0xfffffe5, + 0xfffffe6, + 0xfffffe7, + 0xfffffe8, + 0xffffea, + 0x3ffffffc, + 0xfffffe9, + 0xfffffea, + 0x3ffffffd, + 0xfffffeb, + 0xfffffec, + 0xfffffed, + 0xfffffee, + 0xfffffef, + 0xffffff0, + 0xffffff1, + 0xffffff2, + 0x3ffffffe, + 0xffffff3, + 0xffffff4, + 0xffffff5, + 0xffffff6, + 0xffffff7, + 0xffffff8, + 0xffffff9, + 0xffffffa, + 0xffffffb, + 0x14, + 0x3f8, + 0x3f9, + 0xffa, + 0x1ff9, + 0x15, + 0xf8, + 0x7fa, + 0x3fa, + 0x3fb, + 0xf9, + 0x7fb, + 0xfa, + 0x16, + 0x17, + 0x18, + 0x0, + 0x1, + 0x2, + 0x19, + 0x1a, + 0x1b, + 0x1c, + 0x1d, + 0x1e, + 0x1f, + 0x5c, + 0xfb, + 0x7ffc, + 0x20, + 0xffb, + 0x3fc, + 0x1ffa, + 0x21, + 0x5d, + 0x5e, + 0x5f, + 0x60, + 0x61, + 0x62, + 0x63, + 0x64, + 0x65, + 0x66, + 0x67, + 0x68, + 0x69, + 0x6a, + 0x6b, + 0x6c, + 0x6d, + 0x6e, + 0x6f, + 0x70, + 0x71, + 0x72, + 0xfc, + 0x73, + 0xfd, + 0x1ffb, + 0x7fff0, + 0x1ffc, + 0x3ffc, + 0x22, + 0x7ffd, + 0x3, + 0x23, + 0x4, + 0x24, + 0x5, + 0x25, + 0x26, + 0x27, + 0x6, + 0x74, + 0x75, + 0x28, + 0x29, + 0x2a, + 0x7, + 0x2b, + 0x76, + 0x2c, + 0x8, + 0x9, + 0x2d, + 0x77, + 0x78, + 0x79, + 0x7a, + 0x7b, + 0x7ffe, + 0x7fc, + 0x3ffd, + 0x1ffd, + 0xffffffc, + 0xfffe6, + 0x3fffd2, + 0xfffe7, + 0xfffe8, + 0x3fffd3, + 0x3fffd4, + 0x3fffd5, + 0x7fffd9, + 0x3fffd6, + 0x7fffda, + 0x7fffdb, + 0x7fffdc, + 0x7fffdd, + 0x7fffde, + 0xffffeb, + 0x7fffdf, + 0xffffec, + 0xffffed, + 0x3fffd7, + 0x7fffe0, + 0xffffee, + 0x7fffe1, + 0x7fffe2, + 0x7fffe3, + 0x7fffe4, + 0x1fffdc, + 0x3fffd8, + 0x7fffe5, + 0x3fffd9, + 0x7fffe6, + 0x7fffe7, + 0xffffef, + 0x3fffda, + 0x1fffdd, + 0xfffe9, + 0x3fffdb, + 0x3fffdc, + 0x7fffe8, + 0x7fffe9, + 0x1fffde, + 0x7fffea, + 0x3fffdd, + 0x3fffde, + 0xfffff0, + 0x1fffdf, + 0x3fffdf, + 0x7fffeb, + 0x7fffec, + 0x1fffe0, + 0x1fffe1, + 0x3fffe0, + 0x1fffe2, + 0x7fffed, + 0x3fffe1, + 0x7fffee, + 0x7fffef, + 0xfffea, + 0x3fffe2, + 0x3fffe3, + 0x3fffe4, + 0x7ffff0, + 0x3fffe5, + 0x3fffe6, + 0x7ffff1, + 0x3ffffe0, + 0x3ffffe1, + 0xfffeb, + 0x7fff1, + 0x3fffe7, + 0x7ffff2, + 0x3fffe8, + 0x1ffffec, + 0x3ffffe2, + 0x3ffffe3, + 0x3ffffe4, + 0x7ffffde, + 0x7ffffdf, + 0x3ffffe5, + 0xfffff1, + 0x1ffffed, + 0x7fff2, + 0x1fffe3, + 0x3ffffe6, + 0x7ffffe0, + 0x7ffffe1, + 0x3ffffe7, + 0x7ffffe2, + 0xfffff2, + 0x1fffe4, + 0x1fffe5, + 0x3ffffe8, + 0x3ffffe9, + 0xffffffd, + 0x7ffffe3, + 0x7ffffe4, + 0x7ffffe5, + 0xfffec, + 0xfffff3, + 0xfffed, + 0x1fffe6, + 0x3fffe9, + 0x1fffe7, + 0x1fffe8, + 0x7ffff3, + 0x3fffea, + 0x3fffeb, + 0x1ffffee, + 0x1ffffef, + 0xfffff4, + 0xfffff5, + 0x3ffffea, + 0x7ffff4, + 0x3ffffeb, + 0x7ffffe6, + 0x3ffffec, + 0x3ffffed, + 0x7ffffe7, + 0x7ffffe8, + 0x7ffffe9, + 0x7ffffea, + 0x7ffffeb, + 0xffffffe, + 0x7ffffec, + 0x7ffffed, + 0x7ffffee, + 0x7ffffef, + 0x7fffff0, + 0x3ffffee, +} + +var huffmanCodeLen = [256]uint8{ + 13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28, + 28, 28, 28, 28, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 6, 10, 10, 12, 13, 6, 8, 11, 10, 10, 8, 11, 8, 6, 6, 6, + 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 8, 15, 6, 12, 10, + 13, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 13, 19, 13, 14, 6, + 15, 5, 6, 5, 6, 5, 6, 6, 6, 5, 7, 7, 6, 6, 6, 5, + 6, 7, 6, 5, 5, 6, 7, 7, 7, 7, 7, 15, 11, 14, 13, 28, + 20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23, + 24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24, + 22, 21, 20, 22, 22, 23, 23, 21, 23, 22, 22, 24, 21, 22, 23, 23, + 21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23, + 26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25, + 19, 21, 26, 27, 27, 26, 27, 24, 21, 21, 26, 26, 28, 27, 27, 27, + 20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23, + 26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26, +} diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go new file mode 100644 index 00000000..03ad05cc --- /dev/null +++ b/vendor/golang.org/x/net/http2/http2.go @@ -0,0 +1,253 @@ +// Copyright 2014 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 http2 implements the HTTP/2 protocol. +// +// This is a work in progress. This package is low-level and intended +// to be used directly by very few people. Most users will use it +// indirectly through integration with the net/http package. See +// ConfigureServer. That ConfigureServer call will likely be automatic +// or available via an empty import in the future. +// +// See http://http2.github.io/ +package http2 + +import ( + "bufio" + "fmt" + "io" + "net/http" + "strconv" + "sync" +) + +var VerboseLogs = false + +const ( + // ClientPreface is the string that must be sent by new + // connections from clients. + ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" + + // SETTINGS_MAX_FRAME_SIZE default + // http://http2.github.io/http2-spec/#rfc.section.6.5.2 + initialMaxFrameSize = 16384 + + // NextProtoTLS is the NPN/ALPN protocol negotiated during + // HTTP/2's TLS setup. + NextProtoTLS = "h2" + + // http://http2.github.io/http2-spec/#SettingValues + initialHeaderTableSize = 4096 + + initialWindowSize = 65535 // 6.9.2 Initial Flow Control Window Size + + defaultMaxReadFrameSize = 1 << 20 +) + +var ( + clientPreface = []byte(ClientPreface) +) + +type streamState int + +const ( + stateIdle streamState = iota + stateOpen + stateHalfClosedLocal + stateHalfClosedRemote + stateResvLocal + stateResvRemote + stateClosed +) + +var stateName = [...]string{ + stateIdle: "Idle", + stateOpen: "Open", + stateHalfClosedLocal: "HalfClosedLocal", + stateHalfClosedRemote: "HalfClosedRemote", + stateResvLocal: "ResvLocal", + stateResvRemote: "ResvRemote", + stateClosed: "Closed", +} + +func (st streamState) String() string { + return stateName[st] +} + +// Setting is a setting parameter: which setting it is, and its value. +type Setting struct { + // ID is which setting is being set. + // See http://http2.github.io/http2-spec/#SettingValues + ID SettingID + + // Val is the value. + Val uint32 +} + +func (s Setting) String() string { + return fmt.Sprintf("[%v = %d]", s.ID, s.Val) +} + +// Valid reports whether the setting is valid. +func (s Setting) Valid() error { + // Limits and error codes from 6.5.2 Defined SETTINGS Parameters + switch s.ID { + case SettingEnablePush: + if s.Val != 1 && s.Val != 0 { + return ConnectionError(ErrCodeProtocol) + } + case SettingInitialWindowSize: + if s.Val > 1<<31-1 { + return ConnectionError(ErrCodeFlowControl) + } + case SettingMaxFrameSize: + if s.Val < 16384 || s.Val > 1<<24-1 { + return ConnectionError(ErrCodeProtocol) + } + } + return nil +} + +// A SettingID is an HTTP/2 setting as defined in +// http://http2.github.io/http2-spec/#iana-settings +type SettingID uint16 + +const ( + SettingHeaderTableSize SettingID = 0x1 + SettingEnablePush SettingID = 0x2 + SettingMaxConcurrentStreams SettingID = 0x3 + SettingInitialWindowSize SettingID = 0x4 + SettingMaxFrameSize SettingID = 0x5 + SettingMaxHeaderListSize SettingID = 0x6 +) + +var settingName = map[SettingID]string{ + SettingHeaderTableSize: "HEADER_TABLE_SIZE", + SettingEnablePush: "ENABLE_PUSH", + SettingMaxConcurrentStreams: "MAX_CONCURRENT_STREAMS", + SettingInitialWindowSize: "INITIAL_WINDOW_SIZE", + SettingMaxFrameSize: "MAX_FRAME_SIZE", + SettingMaxHeaderListSize: "MAX_HEADER_LIST_SIZE", +} + +func (s SettingID) String() string { + if v, ok := settingName[s]; ok { + return v + } + return fmt.Sprintf("UNKNOWN_SETTING_%d", uint16(s)) +} + +func validHeader(v string) bool { + if len(v) == 0 { + return false + } + for _, r := range v { + // "Just as in HTTP/1.x, header field names are + // strings of ASCII characters that are compared in a + // case-insensitive fashion. However, header field + // names MUST be converted to lowercase prior to their + // encoding in HTTP/2. " + if r >= 127 || ('A' <= r && r <= 'Z') { + return false + } + } + return true +} + +var httpCodeStringCommon = map[int]string{} // n -> strconv.Itoa(n) + +func init() { + for i := 100; i <= 999; i++ { + if v := http.StatusText(i); v != "" { + httpCodeStringCommon[i] = strconv.Itoa(i) + } + } +} + +func httpCodeString(code int) string { + if s, ok := httpCodeStringCommon[code]; ok { + return s + } + return strconv.Itoa(code) +} + +// from pkg io +type stringWriter interface { + WriteString(s string) (n int, err error) +} + +// A gate lets two goroutines coordinate their activities. +type gate chan struct{} + +func (g gate) Done() { g <- struct{}{} } +func (g gate) Wait() { <-g } + +// A closeWaiter is like a sync.WaitGroup but only goes 1 to 0 (open to closed). +type closeWaiter chan struct{} + +// Init makes a closeWaiter usable. +// It exists because so a closeWaiter value can be placed inside a +// larger struct and have the Mutex and Cond's memory in the same +// allocation. +func (cw *closeWaiter) Init() { + *cw = make(chan struct{}) +} + +// Close marks the closeWaiter as closed and unblocks any waiters. +func (cw closeWaiter) Close() { + close(cw) +} + +// Wait waits for the closeWaiter to become closed. +func (cw closeWaiter) Wait() { + <-cw +} + +// bufferedWriter is a buffered writer that writes to w. +// Its buffered writer is lazily allocated as needed, to minimize +// idle memory usage with many connections. +type bufferedWriter struct { + w io.Writer // immutable + bw *bufio.Writer // non-nil when data is buffered +} + +func newBufferedWriter(w io.Writer) *bufferedWriter { + return &bufferedWriter{w: w} +} + +var bufWriterPool = sync.Pool{ + New: func() interface{} { + // TODO: pick something better? this is a bit under + // (3 x typical 1500 byte MTU) at least. + return bufio.NewWriterSize(nil, 4<<10) + }, +} + +func (w *bufferedWriter) Write(p []byte) (n int, err error) { + if w.bw == nil { + bw := bufWriterPool.Get().(*bufio.Writer) + bw.Reset(w.w) + w.bw = bw + } + return w.bw.Write(p) +} + +func (w *bufferedWriter) Flush() error { + bw := w.bw + if bw == nil { + return nil + } + err := bw.Flush() + bw.Reset(nil) + bufWriterPool.Put(bw) + w.bw = nil + return err +} + +func mustUint31(v int32) uint32 { + if v < 0 || v > 2147483647 { + panic("out of range") + } + return uint32(v) +} diff --git a/vendor/golang.org/x/net/http2/http2_test.go b/vendor/golang.org/x/net/http2/http2_test.go new file mode 100644 index 00000000..938341bc --- /dev/null +++ b/vendor/golang.org/x/net/http2/http2_test.go @@ -0,0 +1,168 @@ +// Copyright 2014 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 http2 + +import ( + "bytes" + "errors" + "flag" + "fmt" + "net/http" + "os/exec" + "strconv" + "strings" + "testing" + + "golang.org/x/net/http2/hpack" +) + +var knownFailing = flag.Bool("known_failing", false, "Run known-failing tests.") + +func condSkipFailingTest(t *testing.T) { + if !*knownFailing { + t.Skip("Skipping known-failing test without --known_failing") + } +} + +func init() { + DebugGoroutines = true + flag.BoolVar(&VerboseLogs, "verboseh2", false, "Verbose HTTP/2 debug logging") +} + +func TestSettingString(t *testing.T) { + tests := []struct { + s Setting + want string + }{ + {Setting{SettingMaxFrameSize, 123}, "[MAX_FRAME_SIZE = 123]"}, + {Setting{1<<16 - 1, 123}, "[UNKNOWN_SETTING_65535 = 123]"}, + } + for i, tt := range tests { + got := fmt.Sprint(tt.s) + if got != tt.want { + t.Errorf("%d. for %#v, string = %q; want %q", i, tt.s, got, tt.want) + } + } +} + +type twriter struct { + t testing.TB + st *serverTester // optional +} + +func (w twriter) Write(p []byte) (n int, err error) { + if w.st != nil { + ps := string(p) + for _, phrase := range w.st.logFilter { + if strings.Contains(ps, phrase) { + return len(p), nil // no logging + } + } + } + w.t.Logf("%s", p) + return len(p), nil +} + +// like encodeHeader, but don't add implicit psuedo headers. +func encodeHeaderNoImplicit(t *testing.T, headers ...string) []byte { + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + for len(headers) > 0 { + k, v := headers[0], headers[1] + headers = headers[2:] + if err := enc.WriteField(hpack.HeaderField{Name: k, Value: v}); err != nil { + t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) + } + } + return buf.Bytes() +} + +// Verify that curl has http2. +func requireCurl(t *testing.T) { + out, err := dockerLogs(curl(t, "--version")) + if err != nil { + t.Skipf("failed to determine curl features; skipping test") + } + if !strings.Contains(string(out), "HTTP2") { + t.Skip("curl doesn't support HTTP2; skipping test") + } +} + +func curl(t *testing.T, args ...string) (container string) { + out, err := exec.Command("docker", append([]string{"run", "-d", "--net=host", "gohttp2/curl"}, args...)...).Output() + if err != nil { + t.Skipf("Failed to run curl in docker: %v, %s", err, out) + } + return strings.TrimSpace(string(out)) +} + +// Verify that h2load exists. +func requireH2load(t *testing.T) { + out, err := dockerLogs(h2load(t, "--version")) + if err != nil { + t.Skipf("failed to probe h2load; skipping test: %s", out) + } + if !strings.Contains(string(out), "h2load nghttp2/") { + t.Skipf("h2load not present; skipping test. (Output=%q)", out) + } +} + +func h2load(t *testing.T, args ...string) (container string) { + out, err := exec.Command("docker", append([]string{"run", "-d", "--net=host", "--entrypoint=/usr/local/bin/h2load", "gohttp2/curl"}, args...)...).Output() + if err != nil { + t.Skipf("Failed to run h2load in docker: %v, %s", err, out) + } + return strings.TrimSpace(string(out)) +} + +type puppetCommand struct { + fn func(w http.ResponseWriter, r *http.Request) + done chan<- bool +} + +type handlerPuppet struct { + ch chan puppetCommand +} + +func newHandlerPuppet() *handlerPuppet { + return &handlerPuppet{ + ch: make(chan puppetCommand), + } +} + +func (p *handlerPuppet) act(w http.ResponseWriter, r *http.Request) { + for cmd := range p.ch { + cmd.fn(w, r) + cmd.done <- true + } +} + +func (p *handlerPuppet) done() { close(p.ch) } +func (p *handlerPuppet) do(fn func(http.ResponseWriter, *http.Request)) { + done := make(chan bool) + p.ch <- puppetCommand{fn, done} + <-done +} +func dockerLogs(container string) ([]byte, error) { + out, err := exec.Command("docker", "wait", container).CombinedOutput() + if err != nil { + return out, err + } + exitStatus, err := strconv.Atoi(strings.TrimSpace(string(out))) + if err != nil { + return out, errors.New("unexpected exit status from docker wait") + } + out, err = exec.Command("docker", "logs", container).CombinedOutput() + exec.Command("docker", "rm", container).Run() + if err == nil && exitStatus != 0 { + err = fmt.Errorf("exit status %d: %s", exitStatus, out) + } + return out, err +} + +func kill(container string) { + exec.Command("docker", "kill", container).Run() + exec.Command("docker", "rm", container).Run() +} diff --git a/vendor/golang.org/x/net/http2/pipe.go b/vendor/golang.org/x/net/http2/pipe.go new file mode 100644 index 00000000..96a3eb8d --- /dev/null +++ b/vendor/golang.org/x/net/http2/pipe.go @@ -0,0 +1,90 @@ +// Copyright 2014 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 http2 + +import ( + "errors" + "io" + "sync" +) + +// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like +// io.Pipe except there are no PipeReader/PipeWriter halves, and the +// underlying buffer is an interface. (io.Pipe is always unbuffered) +type pipe struct { + mu sync.Mutex + c sync.Cond // c.L must point to + b pipeBuffer + err error // read error once empty. non-nil means closed. +} + +type pipeBuffer interface { + Len() int + io.Writer + io.Reader +} + +// Read waits until data is available and copies bytes +// from the buffer into p. +func (p *pipe) Read(d []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + for { + if p.b.Len() > 0 { + return p.b.Read(d) + } + if p.err != nil { + return 0, p.err + } + p.c.Wait() + } +} + +var errClosedPipeWrite = errors.New("write on closed buffer") + +// Write copies bytes from p into the buffer and wakes a reader. +// It is an error to write more data than the buffer can hold. +func (p *pipe) Write(d []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + defer p.c.Signal() + if p.err != nil { + return 0, errClosedPipeWrite + } + return p.b.Write(d) +} + +// CloseWithError causes Reads to wake up and return the +// provided err after all data has been read. +// +// The error must be non-nil. +func (p *pipe) CloseWithError(err error) { + if err == nil { + panic("CloseWithError must be non-nil") + } + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + defer p.c.Signal() + if p.err == nil { + p.err = err + } +} + +// Err returns the error (if any) first set with CloseWithError. +// This is the error which will be returned after the reader is exhausted. +func (p *pipe) Err() error { + p.mu.Lock() + defer p.mu.Unlock() + return p.err +} diff --git a/vendor/golang.org/x/net/http2/pipe_test.go b/vendor/golang.org/x/net/http2/pipe_test.go new file mode 100644 index 00000000..002ce05e --- /dev/null +++ b/vendor/golang.org/x/net/http2/pipe_test.go @@ -0,0 +1,24 @@ +// Copyright 2014 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 http2 + +import ( + "bytes" + "errors" + "testing" +) + +func TestPipeClose(t *testing.T) { + var p pipe + p.b = new(bytes.Buffer) + a := errors.New("a") + b := errors.New("b") + p.CloseWithError(a) + p.CloseWithError(b) + _, err := p.Read(make([]byte, 1)) + if err != a { + t.Errorf("err = %v want %v", err, a) + } +} diff --git a/vendor/golang.org/x/net/http2/priority_test.go b/vendor/golang.org/x/net/http2/priority_test.go new file mode 100644 index 00000000..a3fe2bb4 --- /dev/null +++ b/vendor/golang.org/x/net/http2/priority_test.go @@ -0,0 +1,118 @@ +// Copyright 2014 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 http2 + +import ( + "testing" +) + +func TestPriority(t *testing.T) { + // A -> B + // move A's parent to B + streams := make(map[uint32]*stream) + a := &stream{ + parent: nil, + weight: 16, + } + streams[1] = a + b := &stream{ + parent: a, + weight: 16, + } + streams[2] = b + adjustStreamPriority(streams, 1, PriorityParam{ + Weight: 20, + StreamDep: 2, + }) + if a.parent != b { + t.Errorf("Expected A's parent to be B") + } + if a.weight != 20 { + t.Errorf("Expected A's weight to be 20; got %d", a.weight) + } + if b.parent != nil { + t.Errorf("Expected B to have no parent") + } + if b.weight != 16 { + t.Errorf("Expected B's weight to be 16; got %d", b.weight) + } +} + +func TestPriorityExclusiveZero(t *testing.T) { + // A B and C are all children of the 0 stream. + // Exclusive reprioritization to any of the streams + // should bring the rest of the streams under the + // reprioritized stream + streams := make(map[uint32]*stream) + a := &stream{ + parent: nil, + weight: 16, + } + streams[1] = a + b := &stream{ + parent: nil, + weight: 16, + } + streams[2] = b + c := &stream{ + parent: nil, + weight: 16, + } + streams[3] = c + adjustStreamPriority(streams, 3, PriorityParam{ + Weight: 20, + StreamDep: 0, + Exclusive: true, + }) + if a.parent != c { + t.Errorf("Expected A's parent to be C") + } + if a.weight != 16 { + t.Errorf("Expected A's weight to be 16; got %d", a.weight) + } + if b.parent != c { + t.Errorf("Expected B's parent to be C") + } + if b.weight != 16 { + t.Errorf("Expected B's weight to be 16; got %d", b.weight) + } + if c.parent != nil { + t.Errorf("Expected C to have no parent") + } + if c.weight != 20 { + t.Errorf("Expected C's weight to be 20; got %d", b.weight) + } +} + +func TestPriorityOwnParent(t *testing.T) { + streams := make(map[uint32]*stream) + a := &stream{ + parent: nil, + weight: 16, + } + streams[1] = a + b := &stream{ + parent: a, + weight: 16, + } + streams[2] = b + adjustStreamPriority(streams, 1, PriorityParam{ + Weight: 20, + StreamDep: 1, + }) + if a.parent != nil { + t.Errorf("Expected A's parent to be nil") + } + if a.weight != 20 { + t.Errorf("Expected A's weight to be 20; got %d", a.weight) + } + if b.parent != a { + t.Errorf("Expected B's parent to be A") + } + if b.weight != 16 { + t.Errorf("Expected B's weight to be 16; got %d", b.weight) + } + +} diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go new file mode 100644 index 00000000..86069c25 --- /dev/null +++ b/vendor/golang.org/x/net/http2/server.go @@ -0,0 +1,1894 @@ +// Copyright 2014 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. + +// TODO: replace all <-sc.doneServing with reads from the stream's cw +// instead, and make sure that on close we close all open +// streams. then remove doneServing? + +// TODO: finish GOAWAY support. Consider each incoming frame type and +// whether it should be ignored during a shutdown race. + +// TODO: disconnect idle clients. GFE seems to do 4 minutes. make +// configurable? or maximum number of idle clients and remove the +// oldest? + +// TODO: turn off the serve goroutine when idle, so +// an idle conn only has the readFrames goroutine active. (which could +// also be optimized probably to pin less memory in crypto/tls). This +// would involve tracking when the serve goroutine is active (atomic +// int32 read/CAS probably?) and starting it up when frames arrive, +// and shutting it down when all handlers exit. the occasional PING +// packets could use time.AfterFunc to call sc.wakeStartServeLoop() +// (which is a no-op if already running) and then queue the PING write +// as normal. The serve loop would then exit in most cases (if no +// Handlers running) and not be woken up again until the PING packet +// returns. + +// TODO (maybe): add a mechanism for Handlers to going into +// half-closed-local mode (rw.(io.Closer) test?) but not exit their +// handler, and continue to be able to read from the +// Request.Body. This would be a somewhat semantic change from HTTP/1 +// (or at least what we expose in net/http), so I'd probably want to +// add it there too. For now, this package says that returning from +// the Handler ServeHTTP function means you're both done reading and +// done writing, without a way to stop just one or the other. + +package http2 + +import ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "fmt" + "io" + "log" + "net" + "net/http" + "net/url" + "strconv" + "strings" + "sync" + "time" + + "golang.org/x/net/http2/hpack" +) + +const ( + prefaceTimeout = 10 * time.Second + firstSettingsTimeout = 2 * time.Second // should be in-flight with preface anyway + handlerChunkWriteSize = 4 << 10 + defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to? +) + +var ( + errClientDisconnected = errors.New("client disconnected") + errClosedBody = errors.New("body closed by handler") + errHandlerComplete = errors.New("http2: request body closed due to handler exiting") + errStreamClosed = errors.New("http2: stream closed") +) + +var responseWriterStatePool = sync.Pool{ + New: func() interface{} { + rws := &responseWriterState{} + rws.bw = bufio.NewWriterSize(chunkWriter{rws}, handlerChunkWriteSize) + return rws + }, +} + +// Test hooks. +var ( + testHookOnConn func() + testHookGetServerConn func(*serverConn) + testHookOnPanicMu *sync.Mutex // nil except in tests + testHookOnPanic func(sc *serverConn, panicVal interface{}) (rePanic bool) +) + +// Server is an HTTP/2 server. +type Server struct { + // MaxHandlers limits the number of http.Handler ServeHTTP goroutines + // which may run at a time over all connections. + // Negative or zero no limit. + // TODO: implement + MaxHandlers int + + // MaxConcurrentStreams optionally specifies the number of + // concurrent streams that each client may have open at a + // time. This is unrelated to the number of http.Handler goroutines + // which may be active globally, which is MaxHandlers. + // If zero, MaxConcurrentStreams defaults to at least 100, per + // the HTTP/2 spec's recommendations. + MaxConcurrentStreams uint32 + + // MaxReadFrameSize optionally specifies the largest frame + // this server is willing to read. A valid value is between + // 16k and 16M, inclusive. If zero or otherwise invalid, a + // default value is used. + MaxReadFrameSize uint32 + + // PermitProhibitedCipherSuites, if true, permits the use of + // cipher suites prohibited by the HTTP/2 spec. + PermitProhibitedCipherSuites bool +} + +func (s *Server) maxReadFrameSize() uint32 { + if v := s.MaxReadFrameSize; v >= minMaxFrameSize && v <= maxFrameSize { + return v + } + return defaultMaxReadFrameSize +} + +func (s *Server) maxConcurrentStreams() uint32 { + if v := s.MaxConcurrentStreams; v > 0 { + return v + } + return defaultMaxStreams +} + +// ConfigureServer adds HTTP/2 support to a net/http Server. +// +// The configuration conf may be nil. +// +// ConfigureServer must be called before s begins serving. +func ConfigureServer(s *http.Server, conf *Server) error { + if conf == nil { + conf = new(Server) + } + + if s.TLSConfig == nil { + s.TLSConfig = new(tls.Config) + } else if s.TLSConfig.CipherSuites != nil { + // If they already provided a CipherSuite list, return + // an error if it has a bad order or is missing + // ECDHE_RSA_WITH_AES_128_GCM_SHA256. + const requiredCipher = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + haveRequired := false + sawBad := false + for i, cs := range s.TLSConfig.CipherSuites { + if cs == requiredCipher { + haveRequired = true + } + if isBadCipher(cs) { + sawBad = true + } else if sawBad { + return fmt.Errorf("http2: TLSConfig.CipherSuites index %d contains an HTTP/2-approved cipher suite (%#04x), but it comes after unapproved cipher suites. With this configuration, clients that don't support previous, approved cipher suites may be given an unapproved one and reject the connection.", i, cs) + } + } + if !haveRequired { + return fmt.Errorf("http2: TLSConfig.CipherSuites is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256") + } + } + + // Note: not setting MinVersion to tls.VersionTLS12, + // as we don't want to interfere with HTTP/1.1 traffic + // on the user's server. We enforce TLS 1.2 later once + // we accept a connection. Ideally this should be done + // during next-proto selection, but using TLS <1.2 with + // HTTP/2 is still the client's bug. + + s.TLSConfig.PreferServerCipherSuites = true + + haveNPN := false + for _, p := range s.TLSConfig.NextProtos { + if p == NextProtoTLS { + haveNPN = true + break + } + } + if !haveNPN { + s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, NextProtoTLS) + } + // h2-14 is temporary (as of 2015-03-05) while we wait for all browsers + // to switch to "h2". + s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, "h2-14") + + if s.TLSNextProto == nil { + s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){} + } + protoHandler := func(hs *http.Server, c *tls.Conn, h http.Handler) { + if testHookOnConn != nil { + testHookOnConn() + } + conf.handleConn(hs, c, h) + } + s.TLSNextProto[NextProtoTLS] = protoHandler + s.TLSNextProto["h2-14"] = protoHandler // temporary; see above. + return nil +} + +func (srv *Server) handleConn(hs *http.Server, c net.Conn, h http.Handler) { + sc := &serverConn{ + srv: srv, + hs: hs, + conn: c, + remoteAddrStr: c.RemoteAddr().String(), + bw: newBufferedWriter(c), + handler: h, + streams: make(map[uint32]*stream), + readFrameCh: make(chan readFrameResult), + wantWriteFrameCh: make(chan frameWriteMsg, 8), + wroteFrameCh: make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync + bodyReadCh: make(chan bodyReadMsg), // buffering doesn't matter either way + doneServing: make(chan struct{}), + advMaxStreams: srv.maxConcurrentStreams(), + writeSched: writeScheduler{ + maxFrameSize: initialMaxFrameSize, + }, + initialWindowSize: initialWindowSize, + headerTableSize: initialHeaderTableSize, + serveG: newGoroutineLock(), + pushEnabled: true, + } + sc.flow.add(initialWindowSize) + sc.inflow.add(initialWindowSize) + sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf) + sc.hpackDecoder = hpack.NewDecoder(initialHeaderTableSize, sc.onNewHeaderField) + sc.hpackDecoder.SetMaxStringLength(sc.maxHeaderStringLen()) + + fr := NewFramer(sc.bw, c) + fr.SetMaxReadFrameSize(srv.maxReadFrameSize()) + sc.framer = fr + + if tc, ok := c.(*tls.Conn); ok { + sc.tlsState = new(tls.ConnectionState) + *sc.tlsState = tc.ConnectionState() + // 9.2 Use of TLS Features + // An implementation of HTTP/2 over TLS MUST use TLS + // 1.2 or higher with the restrictions on feature set + // and cipher suite described in this section. Due to + // implementation limitations, it might not be + // possible to fail TLS negotiation. An endpoint MUST + // immediately terminate an HTTP/2 connection that + // does not meet the TLS requirements described in + // this section with a connection error (Section + // 5.4.1) of type INADEQUATE_SECURITY. + if sc.tlsState.Version < tls.VersionTLS12 { + sc.rejectConn(ErrCodeInadequateSecurity, "TLS version too low") + return + } + + if sc.tlsState.ServerName == "" { + // Client must use SNI, but we don't enforce that anymore, + // since it was causing problems when connecting to bare IP + // addresses during development. + // + // TODO: optionally enforce? Or enforce at the time we receive + // a new request, and verify the the ServerName matches the :authority? + // But that precludes proxy situations, perhaps. + // + // So for now, do nothing here again. + } + + if !srv.PermitProhibitedCipherSuites && isBadCipher(sc.tlsState.CipherSuite) { + // "Endpoints MAY choose to generate a connection error + // (Section 5.4.1) of type INADEQUATE_SECURITY if one of + // the prohibited cipher suites are negotiated." + // + // We choose that. In my opinion, the spec is weak + // here. It also says both parties must support at least + // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 so there's no + // excuses here. If we really must, we could allow an + // "AllowInsecureWeakCiphers" option on the server later. + // Let's see how it plays out first. + sc.rejectConn(ErrCodeInadequateSecurity, fmt.Sprintf("Prohibited TLS 1.2 Cipher Suite: %x", sc.tlsState.CipherSuite)) + return + } + } + + if hook := testHookGetServerConn; hook != nil { + hook(sc) + } + sc.serve() +} + +// isBadCipher reports whether the cipher is blacklisted by the HTTP/2 spec. +func isBadCipher(cipher uint16) bool { + switch cipher { + case tls.TLS_RSA_WITH_RC4_128_SHA, + tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA, + tls.TLS_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_RSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, + tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: + // Reject cipher suites from Appendix A. + // "This list includes those cipher suites that do not + // offer an ephemeral key exchange and those that are + // based on the TLS null, stream or block cipher type" + return true + default: + return false + } +} + +func (sc *serverConn) rejectConn(err ErrCode, debug string) { + sc.vlogf("REJECTING conn: %v, %s", err, debug) + // ignoring errors. hanging up anyway. + sc.framer.WriteGoAway(0, err, []byte(debug)) + sc.bw.Flush() + sc.conn.Close() +} + +type serverConn struct { + // Immutable: + srv *Server + hs *http.Server + conn net.Conn + bw *bufferedWriter // writing to conn + handler http.Handler + framer *Framer + hpackDecoder *hpack.Decoder + doneServing chan struct{} // closed when serverConn.serve ends + readFrameCh chan readFrameResult // written by serverConn.readFrames + wantWriteFrameCh chan frameWriteMsg // from handlers -> serve + wroteFrameCh chan frameWriteResult // from writeFrameAsync -> serve, tickles more frame writes + bodyReadCh chan bodyReadMsg // from handlers -> serve + testHookCh chan func(int) // code to run on the serve loop + flow flow // conn-wide (not stream-specific) outbound flow control + inflow flow // conn-wide inbound flow control + tlsState *tls.ConnectionState // shared by all handlers, like net/http + remoteAddrStr string + + // Everything following is owned by the serve loop; use serveG.check(): + serveG goroutineLock // used to verify funcs are on serve() + pushEnabled bool + sawFirstSettings bool // got the initial SETTINGS frame after the preface + needToSendSettingsAck bool + unackedSettings int // how many SETTINGS have we sent without ACKs? + clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) + advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client + curOpenStreams uint32 // client's number of open streams + maxStreamID uint32 // max ever seen + streams map[uint32]*stream + initialWindowSize int32 + headerTableSize uint32 + peerMaxHeaderListSize uint32 // zero means unknown (default) + canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case + req requestParam // non-zero while reading request headers + writingFrame bool // started write goroutine but haven't heard back on wroteFrameCh + needsFrameFlush bool // last frame write wasn't a flush + writeSched writeScheduler + inGoAway bool // we've started to or sent GOAWAY + needToSendGoAway bool // we need to schedule a GOAWAY frame write + goAwayCode ErrCode + shutdownTimerCh <-chan time.Time // nil until used + shutdownTimer *time.Timer // nil until used + + // Owned by the writeFrameAsync goroutine: + headerWriteBuf bytes.Buffer + hpackEncoder *hpack.Encoder +} + +func (sc *serverConn) maxHeaderStringLen() int { + v := sc.maxHeaderListSize() + if uint32(int(v)) == v { + return int(v) + } + // They had a crazy big number for MaxHeaderBytes anyway, + // so give them unlimited header lengths: + return 0 +} + +func (sc *serverConn) maxHeaderListSize() uint32 { + n := sc.hs.MaxHeaderBytes + if n <= 0 { + n = http.DefaultMaxHeaderBytes + } + // http2's count is in a slightly different unit and includes 32 bytes per pair. + // So, take the net/http.Server value and pad it up a bit, assuming 10 headers. + const perFieldOverhead = 32 // per http2 spec + const typicalHeaders = 10 // conservative + return uint32(n + typicalHeaders*perFieldOverhead) +} + +// requestParam is the state of the next request, initialized over +// potentially several frames HEADERS + zero or more CONTINUATION +// frames. +type requestParam struct { + // stream is non-nil if we're reading (HEADER or CONTINUATION) + // frames for a request (but not DATA). + stream *stream + header http.Header + method, path string + scheme, authority string + sawRegularHeader bool // saw a non-pseudo header already + invalidHeader bool // an invalid header was seen + headerListSize int64 // actually uint32, but easier math this way +} + +// stream represents a stream. This is the minimal metadata needed by +// the serve goroutine. Most of the actual stream state is owned by +// the http.Handler's goroutine in the responseWriter. Because the +// responseWriter's responseWriterState is recycled at the end of a +// handler, this struct intentionally has no pointer to the +// *responseWriter{,State} itself, as the Handler ending nils out the +// responseWriter's state field. +type stream struct { + // immutable: + id uint32 + body *pipe // non-nil if expecting DATA frames + cw closeWaiter // closed wait stream transitions to closed state + + // owned by serverConn's serve loop: + bodyBytes int64 // body bytes seen so far + declBodyBytes int64 // or -1 if undeclared + flow flow // limits writing from Handler to client + inflow flow // what the client is allowed to POST/etc to us + parent *stream // or nil + weight uint8 + state streamState + sentReset bool // only true once detached from streams map + gotReset bool // only true once detacted from streams map +} + +func (sc *serverConn) Framer() *Framer { return sc.framer } +func (sc *serverConn) CloseConn() error { return sc.conn.Close() } +func (sc *serverConn) Flush() error { return sc.bw.Flush() } +func (sc *serverConn) HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) { + return sc.hpackEncoder, &sc.headerWriteBuf +} + +func (sc *serverConn) state(streamID uint32) (streamState, *stream) { + sc.serveG.check() + // http://http2.github.io/http2-spec/#rfc.section.5.1 + if st, ok := sc.streams[streamID]; ok { + return st.state, st + } + // "The first use of a new stream identifier implicitly closes all + // streams in the "idle" state that might have been initiated by + // that peer with a lower-valued stream identifier. For example, if + // a client sends a HEADERS frame on stream 7 without ever sending a + // frame on stream 5, then stream 5 transitions to the "closed" + // state when the first frame for stream 7 is sent or received." + if streamID <= sc.maxStreamID { + return stateClosed, nil + } + return stateIdle, nil +} + +// setConnState calls the net/http ConnState hook for this connection, if configured. +// Note that the net/http package does StateNew and StateClosed for us. +// There is currently no plan for StateHijacked or hijacking HTTP/2 connections. +func (sc *serverConn) setConnState(state http.ConnState) { + if sc.hs.ConnState != nil { + sc.hs.ConnState(sc.conn, state) + } +} + +func (sc *serverConn) vlogf(format string, args ...interface{}) { + if VerboseLogs { + sc.logf(format, args...) + } +} + +func (sc *serverConn) logf(format string, args ...interface{}) { + if lg := sc.hs.ErrorLog; lg != nil { + lg.Printf(format, args...) + } else { + log.Printf(format, args...) + } +} + +func (sc *serverConn) condlogf(err error, format string, args ...interface{}) { + if err == nil { + return + } + str := err.Error() + if err == io.EOF || strings.Contains(str, "use of closed network connection") { + // Boring, expected errors. + sc.vlogf(format, args...) + } else { + sc.logf(format, args...) + } +} + +func (sc *serverConn) onNewHeaderField(f hpack.HeaderField) { + sc.serveG.check() + sc.vlogf("got header field %+v", f) + switch { + case !validHeader(f.Name): + sc.req.invalidHeader = true + case strings.HasPrefix(f.Name, ":"): + if sc.req.sawRegularHeader { + sc.logf("pseudo-header after regular header") + sc.req.invalidHeader = true + return + } + var dst *string + switch f.Name { + case ":method": + dst = &sc.req.method + case ":path": + dst = &sc.req.path + case ":scheme": + dst = &sc.req.scheme + case ":authority": + dst = &sc.req.authority + default: + // 8.1.2.1 Pseudo-Header Fields + // "Endpoints MUST treat a request or response + // that contains undefined or invalid + // pseudo-header fields as malformed (Section + // 8.1.2.6)." + sc.logf("invalid pseudo-header %q", f.Name) + sc.req.invalidHeader = true + return + } + if *dst != "" { + sc.logf("duplicate pseudo-header %q sent", f.Name) + sc.req.invalidHeader = true + return + } + *dst = f.Value + default: + sc.req.sawRegularHeader = true + sc.req.header.Add(sc.canonicalHeader(f.Name), f.Value) + const headerFieldOverhead = 32 // per spec + sc.req.headerListSize += int64(len(f.Name)) + int64(len(f.Value)) + headerFieldOverhead + if sc.req.headerListSize > int64(sc.maxHeaderListSize()) { + sc.hpackDecoder.SetEmitEnabled(false) + } + } +} + +func (sc *serverConn) canonicalHeader(v string) string { + sc.serveG.check() + cv, ok := commonCanonHeader[v] + if ok { + return cv + } + cv, ok = sc.canonHeader[v] + if ok { + return cv + } + if sc.canonHeader == nil { + sc.canonHeader = make(map[string]string) + } + cv = http.CanonicalHeaderKey(v) + sc.canonHeader[v] = cv + return cv +} + +type readFrameResult struct { + f Frame // valid until readMore is called + err error + + // readMore should be called once the consumer no longer needs or + // retains f. After readMore, f is invalid and more frames can be + // read. + readMore func() +} + +// readFrames is the loop that reads incoming frames. +// It takes care to only read one frame at a time, blocking until the +// consumer is done with the frame. +// It's run on its own goroutine. +func (sc *serverConn) readFrames() { + gate := make(gate) + for { + f, err := sc.framer.ReadFrame() + select { + case sc.readFrameCh <- readFrameResult{f, err, gate.Done}: + case <-sc.doneServing: + return + } + select { + case <-gate: + case <-sc.doneServing: + return + } + } +} + +// frameWriteResult is the message passed from writeFrameAsync to the serve goroutine. +type frameWriteResult struct { + wm frameWriteMsg // what was written (or attempted) + err error // result of the writeFrame call +} + +// writeFrameAsync runs in its own goroutine and writes a single frame +// and then reports when it's done. +// At most one goroutine can be running writeFrameAsync at a time per +// serverConn. +func (sc *serverConn) writeFrameAsync(wm frameWriteMsg) { + err := wm.write.writeFrame(sc) + sc.wroteFrameCh <- frameWriteResult{wm, err} +} + +func (sc *serverConn) closeAllStreamsOnConnClose() { + sc.serveG.check() + for _, st := range sc.streams { + sc.closeStream(st, errClientDisconnected) + } +} + +func (sc *serverConn) stopShutdownTimer() { + sc.serveG.check() + if t := sc.shutdownTimer; t != nil { + t.Stop() + } +} + +func (sc *serverConn) notePanic() { + if testHookOnPanicMu != nil { + testHookOnPanicMu.Lock() + defer testHookOnPanicMu.Unlock() + } + if testHookOnPanic != nil { + if e := recover(); e != nil { + if testHookOnPanic(sc, e) { + panic(e) + } + } + } +} + +func (sc *serverConn) serve() { + sc.serveG.check() + defer sc.notePanic() + defer sc.conn.Close() + defer sc.closeAllStreamsOnConnClose() + defer sc.stopShutdownTimer() + defer close(sc.doneServing) // unblocks handlers trying to send + + sc.vlogf("HTTP/2 connection from %v on %p", sc.conn.RemoteAddr(), sc.hs) + + sc.writeFrame(frameWriteMsg{ + write: writeSettings{ + {SettingMaxFrameSize, sc.srv.maxReadFrameSize()}, + {SettingMaxConcurrentStreams, sc.advMaxStreams}, + {SettingMaxHeaderListSize, sc.maxHeaderListSize()}, + + // TODO: more actual settings, notably + // SettingInitialWindowSize, but then we also + // want to bump up the conn window size the + // same amount here right after the settings + }, + }) + sc.unackedSettings++ + + if err := sc.readPreface(); err != nil { + sc.condlogf(err, "error reading preface from client %v: %v", sc.conn.RemoteAddr(), err) + return + } + // Now that we've got the preface, get us out of the + // "StateNew" state. We can't go directly to idle, though. + // Active means we read some data and anticipate a request. We'll + // do another Active when we get a HEADERS frame. + sc.setConnState(http.StateActive) + sc.setConnState(http.StateIdle) + + go sc.readFrames() // closed by defer sc.conn.Close above + + settingsTimer := time.NewTimer(firstSettingsTimeout) + loopNum := 0 + for { + loopNum++ + select { + case wm := <-sc.wantWriteFrameCh: + sc.writeFrame(wm) + case res := <-sc.wroteFrameCh: + sc.wroteFrame(res) + case res := <-sc.readFrameCh: + if !sc.processFrameFromReader(res) { + return + } + res.readMore() + if settingsTimer.C != nil { + settingsTimer.Stop() + settingsTimer.C = nil + } + case m := <-sc.bodyReadCh: + sc.noteBodyRead(m.st, m.n) + case <-settingsTimer.C: + sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr()) + return + case <-sc.shutdownTimerCh: + sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr()) + return + case fn := <-sc.testHookCh: + fn(loopNum) + } + } +} + +// readPreface reads the ClientPreface greeting from the peer +// or returns an error on timeout or an invalid greeting. +func (sc *serverConn) readPreface() error { + errc := make(chan error, 1) + go func() { + // Read the client preface + buf := make([]byte, len(ClientPreface)) + if _, err := io.ReadFull(sc.conn, buf); err != nil { + errc <- err + } else if !bytes.Equal(buf, clientPreface) { + errc <- fmt.Errorf("bogus greeting %q", buf) + } else { + errc <- nil + } + }() + timer := time.NewTimer(prefaceTimeout) // TODO: configurable on *Server? + defer timer.Stop() + select { + case <-timer.C: + return errors.New("timeout waiting for client preface") + case err := <-errc: + if err == nil { + sc.vlogf("client %v said hello", sc.conn.RemoteAddr()) + } + return err + } +} + +var errChanPool = sync.Pool{ + New: func() interface{} { return make(chan error, 1) }, +} + +var writeDataPool = sync.Pool{ + New: func() interface{} { return new(writeData) }, +} + +// writeDataFromHandler writes DATA response frames from a handler on +// the given stream. +func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error { + ch := errChanPool.Get().(chan error) + writeArg := writeDataPool.Get().(*writeData) + *writeArg = writeData{stream.id, data, endStream} + err := sc.writeFrameFromHandler(frameWriteMsg{ + write: writeArg, + stream: stream, + done: ch, + }) + if err != nil { + return err + } + var frameWriteDone bool // the frame write is done (successfully or not) + select { + case err = <-ch: + frameWriteDone = true + case <-sc.doneServing: + return errClientDisconnected + case <-stream.cw: + // If both ch and stream.cw were ready (as might + // happen on the final Write after an http.Handler + // ends), prefer the write result. Otherwise this + // might just be us successfully closing the stream. + // The writeFrameAsync and serve goroutines guarantee + // that the ch send will happen before the stream.cw + // close. + select { + case err = <-ch: + frameWriteDone = true + default: + return errStreamClosed + } + } + errChanPool.Put(ch) + if frameWriteDone { + writeDataPool.Put(writeArg) + } + return err +} + +// writeFrameFromHandler sends wm to sc.wantWriteFrameCh, but aborts +// if the connection has gone away. +// +// This must not be run from the serve goroutine itself, else it might +// deadlock writing to sc.wantWriteFrameCh (which is only mildly +// buffered and is read by serve itself). If you're on the serve +// goroutine, call writeFrame instead. +func (sc *serverConn) writeFrameFromHandler(wm frameWriteMsg) error { + sc.serveG.checkNotOn() // NOT + select { + case sc.wantWriteFrameCh <- wm: + return nil + case <-sc.doneServing: + // Serve loop is gone. + // Client has closed their connection to the server. + return errClientDisconnected + } +} + +// writeFrame schedules a frame to write and sends it if there's nothing +// already being written. +// +// There is no pushback here (the serve goroutine never blocks). It's +// the http.Handlers that block, waiting for their previous frames to +// make it onto the wire +// +// If you're not on the serve goroutine, use writeFrameFromHandler instead. +func (sc *serverConn) writeFrame(wm frameWriteMsg) { + sc.serveG.check() + sc.writeSched.add(wm) + sc.scheduleFrameWrite() +} + +// startFrameWrite starts a goroutine to write wm (in a separate +// goroutine since that might block on the network), and updates the +// serve goroutine's state about the world, updated from info in wm. +func (sc *serverConn) startFrameWrite(wm frameWriteMsg) { + sc.serveG.check() + if sc.writingFrame { + panic("internal error: can only be writing one frame at a time") + } + + st := wm.stream + if st != nil { + switch st.state { + case stateHalfClosedLocal: + panic("internal error: attempt to send frame on half-closed-local stream") + case stateClosed: + if st.sentReset || st.gotReset { + // Skip this frame. + sc.scheduleFrameWrite() + return + } + panic(fmt.Sprintf("internal error: attempt to send a write %v on a closed stream", wm)) + } + } + + sc.writingFrame = true + sc.needsFrameFlush = true + go sc.writeFrameAsync(wm) +} + +// wroteFrame is called on the serve goroutine with the result of +// whatever happened on writeFrameAsync. +func (sc *serverConn) wroteFrame(res frameWriteResult) { + sc.serveG.check() + if !sc.writingFrame { + panic("internal error: expected to be already writing a frame") + } + sc.writingFrame = false + + wm := res.wm + st := wm.stream + + closeStream := endsStream(wm.write) + + // Reply (if requested) to the blocked ServeHTTP goroutine. + if ch := wm.done; ch != nil { + select { + case ch <- res.err: + default: + panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wm.write)) + } + } + wm.write = nil // prevent use (assume it's tainted after wm.done send) + + if closeStream { + if st == nil { + panic("internal error: expecting non-nil stream") + } + switch st.state { + case stateOpen: + // Here we would go to stateHalfClosedLocal in + // theory, but since our handler is done and + // the net/http package provides no mechanism + // for finishing writing to a ResponseWriter + // while still reading data (see possible TODO + // at top of this file), we go into closed + // state here anyway, after telling the peer + // we're hanging up on them. + st.state = stateHalfClosedLocal // won't last long, but necessary for closeStream via resetStream + errCancel := StreamError{st.id, ErrCodeCancel} + sc.resetStream(errCancel) + case stateHalfClosedRemote: + sc.closeStream(st, errHandlerComplete) + } + } + + sc.scheduleFrameWrite() +} + +// scheduleFrameWrite tickles the frame writing scheduler. +// +// If a frame is already being written, nothing happens. This will be called again +// when the frame is done being written. +// +// If a frame isn't being written we need to send one, the best frame +// to send is selected, preferring first things that aren't +// stream-specific (e.g. ACKing settings), and then finding the +// highest priority stream. +// +// If a frame isn't being written and there's nothing else to send, we +// flush the write buffer. +func (sc *serverConn) scheduleFrameWrite() { + sc.serveG.check() + if sc.writingFrame { + return + } + if sc.needToSendGoAway { + sc.needToSendGoAway = false + sc.startFrameWrite(frameWriteMsg{ + write: &writeGoAway{ + maxStreamID: sc.maxStreamID, + code: sc.goAwayCode, + }, + }) + return + } + if sc.needToSendSettingsAck { + sc.needToSendSettingsAck = false + sc.startFrameWrite(frameWriteMsg{write: writeSettingsAck{}}) + return + } + if !sc.inGoAway { + if wm, ok := sc.writeSched.take(); ok { + sc.startFrameWrite(wm) + return + } + } + if sc.needsFrameFlush { + sc.startFrameWrite(frameWriteMsg{write: flushFrameWriter{}}) + sc.needsFrameFlush = false // after startFrameWrite, since it sets this true + return + } +} + +func (sc *serverConn) goAway(code ErrCode) { + sc.serveG.check() + if sc.inGoAway { + return + } + if code != ErrCodeNo { + sc.shutDownIn(250 * time.Millisecond) + } else { + // TODO: configurable + sc.shutDownIn(1 * time.Second) + } + sc.inGoAway = true + sc.needToSendGoAway = true + sc.goAwayCode = code + sc.scheduleFrameWrite() +} + +func (sc *serverConn) shutDownIn(d time.Duration) { + sc.serveG.check() + sc.shutdownTimer = time.NewTimer(d) + sc.shutdownTimerCh = sc.shutdownTimer.C +} + +func (sc *serverConn) resetStream(se StreamError) { + sc.serveG.check() + sc.writeFrame(frameWriteMsg{write: se}) + if st, ok := sc.streams[se.StreamID]; ok { + st.sentReset = true + sc.closeStream(st, se) + } +} + +// curHeaderStreamID returns the stream ID of the header block we're +// currently in the middle of reading. If this returns non-zero, the +// next frame must be a CONTINUATION with this stream id. +func (sc *serverConn) curHeaderStreamID() uint32 { + sc.serveG.check() + st := sc.req.stream + if st == nil { + return 0 + } + return st.id +} + +// processFrameFromReader processes the serve loop's read from readFrameCh from the +// frame-reading goroutine. +// processFrameFromReader returns whether the connection should be kept open. +func (sc *serverConn) processFrameFromReader(res readFrameResult) bool { + sc.serveG.check() + err := res.err + if err != nil { + if err == ErrFrameTooLarge { + sc.goAway(ErrCodeFrameSize) + return true // goAway will close the loop + } + clientGone := err == io.EOF || strings.Contains(err.Error(), "use of closed network connection") + if clientGone { + // TODO: could we also get into this state if + // the peer does a half close + // (e.g. CloseWrite) because they're done + // sending frames but they're still wanting + // our open replies? Investigate. + // TODO: add CloseWrite to crypto/tls.Conn first + // so we have a way to test this? I suppose + // just for testing we could have a non-TLS mode. + return false + } + } else { + f := res.f + sc.vlogf("got %v: %#v", f.Header(), f) + err = sc.processFrame(f) + if err == nil { + return true + } + } + + switch ev := err.(type) { + case StreamError: + sc.resetStream(ev) + return true + case goAwayFlowError: + sc.goAway(ErrCodeFlowControl) + return true + case ConnectionError: + sc.logf("%v: %v", sc.conn.RemoteAddr(), ev) + sc.goAway(ErrCode(ev)) + return true // goAway will handle shutdown + default: + if res.err != nil { + sc.logf("disconnecting; error reading frame from client %s: %v", sc.conn.RemoteAddr(), err) + } else { + sc.logf("disconnection due to other error: %v", err) + } + return false + } +} + +func (sc *serverConn) processFrame(f Frame) error { + sc.serveG.check() + + // First frame received must be SETTINGS. + if !sc.sawFirstSettings { + if _, ok := f.(*SettingsFrame); !ok { + return ConnectionError(ErrCodeProtocol) + } + sc.sawFirstSettings = true + } + + if s := sc.curHeaderStreamID(); s != 0 { + if cf, ok := f.(*ContinuationFrame); !ok { + return ConnectionError(ErrCodeProtocol) + } else if cf.Header().StreamID != s { + return ConnectionError(ErrCodeProtocol) + } + } + + switch f := f.(type) { + case *SettingsFrame: + return sc.processSettings(f) + case *HeadersFrame: + return sc.processHeaders(f) + case *ContinuationFrame: + return sc.processContinuation(f) + case *WindowUpdateFrame: + return sc.processWindowUpdate(f) + case *PingFrame: + return sc.processPing(f) + case *DataFrame: + return sc.processData(f) + case *RSTStreamFrame: + return sc.processResetStream(f) + case *PriorityFrame: + return sc.processPriority(f) + case *PushPromiseFrame: + // A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE + // frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. + return ConnectionError(ErrCodeProtocol) + default: + sc.vlogf("Ignoring frame: %v", f.Header()) + return nil + } +} + +func (sc *serverConn) processPing(f *PingFrame) error { + sc.serveG.check() + if f.IsAck() { + // 6.7 PING: " An endpoint MUST NOT respond to PING frames + // containing this flag." + return nil + } + if f.StreamID != 0 { + // "PING frames are not associated with any individual + // stream. If a PING frame is received with a stream + // identifier field value other than 0x0, the recipient MUST + // respond with a connection error (Section 5.4.1) of type + // PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + sc.writeFrame(frameWriteMsg{write: writePingAck{f}}) + return nil +} + +func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error { + sc.serveG.check() + switch { + case f.StreamID != 0: // stream-level flow control + st := sc.streams[f.StreamID] + if st == nil { + // "WINDOW_UPDATE can be sent by a peer that has sent a + // frame bearing the END_STREAM flag. This means that a + // receiver could receive a WINDOW_UPDATE frame on a "half + // closed (remote)" or "closed" stream. A receiver MUST + // NOT treat this as an error, see Section 5.1." + return nil + } + if !st.flow.add(int32(f.Increment)) { + return StreamError{f.StreamID, ErrCodeFlowControl} + } + default: // connection-level flow control + if !sc.flow.add(int32(f.Increment)) { + return goAwayFlowError{} + } + } + sc.scheduleFrameWrite() + return nil +} + +func (sc *serverConn) processResetStream(f *RSTStreamFrame) error { + sc.serveG.check() + + state, st := sc.state(f.StreamID) + if state == stateIdle { + // 6.4 "RST_STREAM frames MUST NOT be sent for a + // stream in the "idle" state. If a RST_STREAM frame + // identifying an idle stream is received, the + // recipient MUST treat this as a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + return ConnectionError(ErrCodeProtocol) + } + if st != nil { + st.gotReset = true + sc.closeStream(st, StreamError{f.StreamID, f.ErrCode}) + } + return nil +} + +func (sc *serverConn) closeStream(st *stream, err error) { + sc.serveG.check() + if st.state == stateIdle || st.state == stateClosed { + panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state)) + } + st.state = stateClosed + sc.curOpenStreams-- + if sc.curOpenStreams == 0 { + sc.setConnState(http.StateIdle) + } + delete(sc.streams, st.id) + if p := st.body; p != nil { + p.CloseWithError(err) + } + st.cw.Close() // signals Handler's CloseNotifier, unblocks writes, etc + sc.writeSched.forgetStream(st.id) +} + +func (sc *serverConn) processSettings(f *SettingsFrame) error { + sc.serveG.check() + if f.IsAck() { + sc.unackedSettings-- + if sc.unackedSettings < 0 { + // Why is the peer ACKing settings we never sent? + // The spec doesn't mention this case, but + // hang up on them anyway. + return ConnectionError(ErrCodeProtocol) + } + return nil + } + if err := f.ForeachSetting(sc.processSetting); err != nil { + return err + } + sc.needToSendSettingsAck = true + sc.scheduleFrameWrite() + return nil +} + +func (sc *serverConn) processSetting(s Setting) error { + sc.serveG.check() + if err := s.Valid(); err != nil { + return err + } + sc.vlogf("processing setting %v", s) + switch s.ID { + case SettingHeaderTableSize: + sc.headerTableSize = s.Val + sc.hpackEncoder.SetMaxDynamicTableSize(s.Val) + case SettingEnablePush: + sc.pushEnabled = s.Val != 0 + case SettingMaxConcurrentStreams: + sc.clientMaxStreams = s.Val + case SettingInitialWindowSize: + return sc.processSettingInitialWindowSize(s.Val) + case SettingMaxFrameSize: + sc.writeSched.maxFrameSize = s.Val + case SettingMaxHeaderListSize: + sc.peerMaxHeaderListSize = s.Val + default: + // Unknown setting: "An endpoint that receives a SETTINGS + // frame with any unknown or unsupported identifier MUST + // ignore that setting." + } + return nil +} + +func (sc *serverConn) processSettingInitialWindowSize(val uint32) error { + sc.serveG.check() + // Note: val already validated to be within range by + // processSetting's Valid call. + + // "A SETTINGS frame can alter the initial flow control window + // size for all current streams. When the value of + // SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST + // adjust the size of all stream flow control windows that it + // maintains by the difference between the new value and the + // old value." + old := sc.initialWindowSize + sc.initialWindowSize = int32(val) + growth := sc.initialWindowSize - old // may be negative + for _, st := range sc.streams { + if !st.flow.add(growth) { + // 6.9.2 Initial Flow Control Window Size + // "An endpoint MUST treat a change to + // SETTINGS_INITIAL_WINDOW_SIZE that causes any flow + // control window to exceed the maximum size as a + // connection error (Section 5.4.1) of type + // FLOW_CONTROL_ERROR." + return ConnectionError(ErrCodeFlowControl) + } + } + return nil +} + +func (sc *serverConn) processData(f *DataFrame) error { + sc.serveG.check() + // "If a DATA frame is received whose stream is not in "open" + // or "half closed (local)" state, the recipient MUST respond + // with a stream error (Section 5.4.2) of type STREAM_CLOSED." + id := f.Header().StreamID + st, ok := sc.streams[id] + if !ok || st.state != stateOpen { + // This includes sending a RST_STREAM if the stream is + // in stateHalfClosedLocal (which currently means that + // the http.Handler returned, so it's done reading & + // done writing). Try to stop the client from sending + // more DATA. + return StreamError{id, ErrCodeStreamClosed} + } + if st.body == nil { + panic("internal error: should have a body in this state") + } + data := f.Data() + + // Sender sending more than they'd declared? + if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes { + st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes)) + return StreamError{id, ErrCodeStreamClosed} + } + if len(data) > 0 { + // Check whether the client has flow control quota. + if int(st.inflow.available()) < len(data) { + return StreamError{id, ErrCodeFlowControl} + } + st.inflow.take(int32(len(data))) + wrote, err := st.body.Write(data) + if err != nil { + return StreamError{id, ErrCodeStreamClosed} + } + if wrote != len(data) { + panic("internal error: bad Writer") + } + st.bodyBytes += int64(len(data)) + } + if f.StreamEnded() { + if st.declBodyBytes != -1 && st.declBodyBytes != st.bodyBytes { + st.body.CloseWithError(fmt.Errorf("request declared a Content-Length of %d but only wrote %d bytes", + st.declBodyBytes, st.bodyBytes)) + } else { + st.body.CloseWithError(io.EOF) + } + st.state = stateHalfClosedRemote + } + return nil +} + +func (sc *serverConn) processHeaders(f *HeadersFrame) error { + sc.serveG.check() + id := f.Header().StreamID + if sc.inGoAway { + // Ignore. + return nil + } + // http://http2.github.io/http2-spec/#rfc.section.5.1.1 + if id%2 != 1 || id <= sc.maxStreamID || sc.req.stream != nil { + // Streams initiated by a client MUST use odd-numbered + // stream identifiers. [...] The identifier of a newly + // established stream MUST be numerically greater than all + // streams that the initiating endpoint has opened or + // reserved. [...] An endpoint that receives an unexpected + // stream identifier MUST respond with a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + return ConnectionError(ErrCodeProtocol) + } + if id > sc.maxStreamID { + sc.maxStreamID = id + } + st := &stream{ + id: id, + state: stateOpen, + } + if f.StreamEnded() { + st.state = stateHalfClosedRemote + } + st.cw.Init() + + st.flow.conn = &sc.flow // link to conn-level counter + st.flow.add(sc.initialWindowSize) + st.inflow.conn = &sc.inflow // link to conn-level counter + st.inflow.add(initialWindowSize) // TODO: update this when we send a higher initial window size in the initial settings + + sc.streams[id] = st + if f.HasPriority() { + adjustStreamPriority(sc.streams, st.id, f.Priority) + } + sc.curOpenStreams++ + if sc.curOpenStreams == 1 { + sc.setConnState(http.StateActive) + } + sc.req = requestParam{ + stream: st, + header: make(http.Header), + } + sc.hpackDecoder.SetEmitEnabled(true) + return sc.processHeaderBlockFragment(st, f.HeaderBlockFragment(), f.HeadersEnded()) +} + +func (sc *serverConn) processContinuation(f *ContinuationFrame) error { + sc.serveG.check() + st := sc.streams[f.Header().StreamID] + if st == nil || sc.curHeaderStreamID() != st.id { + return ConnectionError(ErrCodeProtocol) + } + return sc.processHeaderBlockFragment(st, f.HeaderBlockFragment(), f.HeadersEnded()) +} + +func (sc *serverConn) processHeaderBlockFragment(st *stream, frag []byte, end bool) error { + sc.serveG.check() + if _, err := sc.hpackDecoder.Write(frag); err != nil { + return ConnectionError(ErrCodeCompression) + } + if !end { + return nil + } + if err := sc.hpackDecoder.Close(); err != nil { + return ConnectionError(ErrCodeCompression) + } + defer sc.resetPendingRequest() + if sc.curOpenStreams > sc.advMaxStreams { + // "Endpoints MUST NOT exceed the limit set by their + // peer. An endpoint that receives a HEADERS frame + // that causes their advertised concurrent stream + // limit to be exceeded MUST treat this as a stream + // error (Section 5.4.2) of type PROTOCOL_ERROR or + // REFUSED_STREAM." + if sc.unackedSettings == 0 { + // They should know better. + return StreamError{st.id, ErrCodeProtocol} + } + // Assume it's a network race, where they just haven't + // received our last SETTINGS update. But actually + // this can't happen yet, because we don't yet provide + // a way for users to adjust server parameters at + // runtime. + return StreamError{st.id, ErrCodeRefusedStream} + } + + rw, req, err := sc.newWriterAndRequest() + if err != nil { + return err + } + st.body = req.Body.(*requestBody).pipe // may be nil + st.declBodyBytes = req.ContentLength + + handler := sc.handler.ServeHTTP + if !sc.hpackDecoder.EmitEnabled() { + // Their header list was too long. Send a 431 error. + handler = handleHeaderListTooLong + } + + go sc.runHandler(rw, req, handler) + return nil +} + +func (sc *serverConn) processPriority(f *PriorityFrame) error { + adjustStreamPriority(sc.streams, f.StreamID, f.PriorityParam) + return nil +} + +func adjustStreamPriority(streams map[uint32]*stream, streamID uint32, priority PriorityParam) { + st, ok := streams[streamID] + if !ok { + // TODO: not quite correct (this streamID might + // already exist in the dep tree, but be closed), but + // close enough for now. + return + } + st.weight = priority.Weight + parent := streams[priority.StreamDep] // might be nil + if parent == st { + // if client tries to set this stream to be the parent of itself + // ignore and keep going + return + } + + // section 5.3.3: If a stream is made dependent on one of its + // own dependencies, the formerly dependent stream is first + // moved to be dependent on the reprioritized stream's previous + // parent. The moved dependency retains its weight. + for piter := parent; piter != nil; piter = piter.parent { + if piter == st { + parent.parent = st.parent + break + } + } + st.parent = parent + if priority.Exclusive && (st.parent != nil || priority.StreamDep == 0) { + for _, openStream := range streams { + if openStream != st && openStream.parent == st.parent { + openStream.parent = st + } + } + } +} + +// resetPendingRequest zeros out all state related to a HEADERS frame +// and its zero or more CONTINUATION frames sent to start a new +// request. +func (sc *serverConn) resetPendingRequest() { + sc.serveG.check() + sc.req = requestParam{} +} + +func (sc *serverConn) newWriterAndRequest() (*responseWriter, *http.Request, error) { + sc.serveG.check() + rp := &sc.req + if rp.invalidHeader || rp.method == "" || rp.path == "" || + (rp.scheme != "https" && rp.scheme != "http") { + // See 8.1.2.6 Malformed Requests and Responses: + // + // Malformed requests or responses that are detected + // MUST be treated as a stream error (Section 5.4.2) + // of type PROTOCOL_ERROR." + // + // 8.1.2.3 Request Pseudo-Header Fields + // "All HTTP/2 requests MUST include exactly one valid + // value for the :method, :scheme, and :path + // pseudo-header fields" + return nil, nil, StreamError{rp.stream.id, ErrCodeProtocol} + } + var tlsState *tls.ConnectionState // nil if not scheme https + if rp.scheme == "https" { + tlsState = sc.tlsState + } + authority := rp.authority + if authority == "" { + authority = rp.header.Get("Host") + } + needsContinue := rp.header.Get("Expect") == "100-continue" + if needsContinue { + rp.header.Del("Expect") + } + // Merge Cookie headers into one "; "-delimited value. + if cookies := rp.header["Cookie"]; len(cookies) > 1 { + rp.header.Set("Cookie", strings.Join(cookies, "; ")) + } + bodyOpen := rp.stream.state == stateOpen + body := &requestBody{ + conn: sc, + stream: rp.stream, + needsContinue: needsContinue, + } + // TODO: handle asterisk '*' requests + test + url, err := url.ParseRequestURI(rp.path) + if err != nil { + // TODO: find the right error code? + return nil, nil, StreamError{rp.stream.id, ErrCodeProtocol} + } + req := &http.Request{ + Method: rp.method, + URL: url, + RemoteAddr: sc.remoteAddrStr, + Header: rp.header, + RequestURI: rp.path, + Proto: "HTTP/2.0", + ProtoMajor: 2, + ProtoMinor: 0, + TLS: tlsState, + Host: authority, + Body: body, + } + if bodyOpen { + body.pipe = &pipe{ + b: &fixedBuffer{buf: make([]byte, initialWindowSize)}, // TODO: share/remove XXX + } + + if vv, ok := rp.header["Content-Length"]; ok { + req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64) + } else { + req.ContentLength = -1 + } + } + + rws := responseWriterStatePool.Get().(*responseWriterState) + bwSave := rws.bw + *rws = responseWriterState{} // zero all the fields + rws.conn = sc + rws.bw = bwSave + rws.bw.Reset(chunkWriter{rws}) + rws.stream = rp.stream + rws.req = req + rws.body = body + + rw := &responseWriter{rws: rws} + return rw, req, nil +} + +// Run on its own goroutine. +func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { + defer rw.handlerDone() + // TODO: catch panics like net/http.Server + handler(rw, req) +} + +func handleHeaderListTooLong(w http.ResponseWriter, r *http.Request) { + // 10.5.1 Limits on Header Block Size: + // .. "A server that receives a larger header block than it is + // willing to handle can send an HTTP 431 (Request Header Fields Too + // Large) status code" + const statusRequestHeaderFieldsTooLarge = 431 // only in Go 1.6+ + w.WriteHeader(statusRequestHeaderFieldsTooLarge) + io.WriteString(w, "

HTTP Error 431

Request Header Field(s) Too Large

") +} + +// called from handler goroutines. +// h may be nil. +func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) error { + sc.serveG.checkNotOn() // NOT on + var errc chan error + if headerData.h != nil { + // If there's a header map (which we don't own), so we have to block on + // waiting for this frame to be written, so an http.Flush mid-handler + // writes out the correct value of keys, before a handler later potentially + // mutates it. + errc = errChanPool.Get().(chan error) + } + if err := sc.writeFrameFromHandler(frameWriteMsg{ + write: headerData, + stream: st, + done: errc, + }); err != nil { + return err + } + if errc != nil { + select { + case err := <-errc: + errChanPool.Put(errc) + return err + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + } + } + return nil +} + +// called from handler goroutines. +func (sc *serverConn) write100ContinueHeaders(st *stream) { + sc.writeFrameFromHandler(frameWriteMsg{ + write: write100ContinueHeadersFrame{st.id}, + stream: st, + }) +} + +// A bodyReadMsg tells the server loop that the http.Handler read n +// bytes of the DATA from the client on the given stream. +type bodyReadMsg struct { + st *stream + n int +} + +// called from handler goroutines. +// Notes that the handler for the given stream ID read n bytes of its body +// and schedules flow control tokens to be sent. +func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int) { + sc.serveG.checkNotOn() // NOT on + select { + case sc.bodyReadCh <- bodyReadMsg{st, n}: + case <-sc.doneServing: + } +} + +func (sc *serverConn) noteBodyRead(st *stream, n int) { + sc.serveG.check() + sc.sendWindowUpdate(nil, n) // conn-level + if st.state != stateHalfClosedRemote && st.state != stateClosed { + // Don't send this WINDOW_UPDATE if the stream is closed + // remotely. + sc.sendWindowUpdate(st, n) + } +} + +// st may be nil for conn-level +func (sc *serverConn) sendWindowUpdate(st *stream, n int) { + sc.serveG.check() + // "The legal range for the increment to the flow control + // window is 1 to 2^31-1 (2,147,483,647) octets." + // A Go Read call on 64-bit machines could in theory read + // a larger Read than this. Very unlikely, but we handle it here + // rather than elsewhere for now. + const maxUint31 = 1<<31 - 1 + for n >= maxUint31 { + sc.sendWindowUpdate32(st, maxUint31) + n -= maxUint31 + } + sc.sendWindowUpdate32(st, int32(n)) +} + +// st may be nil for conn-level +func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) { + sc.serveG.check() + if n == 0 { + return + } + if n < 0 { + panic("negative update") + } + var streamID uint32 + if st != nil { + streamID = st.id + } + sc.writeFrame(frameWriteMsg{ + write: writeWindowUpdate{streamID: streamID, n: uint32(n)}, + stream: st, + }) + var ok bool + if st == nil { + ok = sc.inflow.add(n) + } else { + ok = st.inflow.add(n) + } + if !ok { + panic("internal error; sent too many window updates without decrements?") + } +} + +type requestBody struct { + stream *stream + conn *serverConn + closed bool + pipe *pipe // non-nil if we have a HTTP entity message body + needsContinue bool // need to send a 100-continue +} + +func (b *requestBody) Close() error { + if b.pipe != nil { + b.pipe.CloseWithError(errClosedBody) + } + b.closed = true + return nil +} + +func (b *requestBody) Read(p []byte) (n int, err error) { + if b.needsContinue { + b.needsContinue = false + b.conn.write100ContinueHeaders(b.stream) + } + if b.pipe == nil { + return 0, io.EOF + } + n, err = b.pipe.Read(p) + if n > 0 { + b.conn.noteBodyReadFromHandler(b.stream, n) + } + return +} + +// responseWriter is the http.ResponseWriter implementation. It's +// intentionally small (1 pointer wide) to minimize garbage. The +// responseWriterState pointer inside is zeroed at the end of a +// request (in handlerDone) and calls on the responseWriter thereafter +// simply crash (caller's mistake), but the much larger responseWriterState +// and buffers are reused between multiple requests. +type responseWriter struct { + rws *responseWriterState +} + +// Optional http.ResponseWriter interfaces implemented. +var ( + _ http.CloseNotifier = (*responseWriter)(nil) + _ http.Flusher = (*responseWriter)(nil) + _ stringWriter = (*responseWriter)(nil) +) + +type responseWriterState struct { + // immutable within a request: + stream *stream + req *http.Request + body *requestBody // to close at end of request, if DATA frames didn't + conn *serverConn + + // TODO: adjust buffer writing sizes based on server config, frame size updates from peer, etc + bw *bufio.Writer // writing to a chunkWriter{this *responseWriterState} + + // mutated by http.Handler goroutine: + handlerHeader http.Header // nil until called + snapHeader http.Header // snapshot of handlerHeader at WriteHeader time + status int // status code passed to WriteHeader + wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. + sentHeader bool // have we sent the header frame? + handlerDone bool // handler has finished + + closeNotifierMu sync.Mutex // guards closeNotifierCh + closeNotifierCh chan bool // nil until first used +} + +type chunkWriter struct{ rws *responseWriterState } + +func (cw chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) } + +// writeChunk writes chunks from the bufio.Writer. But because +// bufio.Writer may bypass its chunking, sometimes p may be +// arbitrarily large. +// +// writeChunk is also responsible (on the first chunk) for sending the +// HEADER response. +func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { + if !rws.wroteHeader { + rws.writeHeader(200) + } + if !rws.sentHeader { + rws.sentHeader = true + var ctype, clen string // implicit ones, if we can calculate it + if rws.handlerDone && rws.snapHeader.Get("Content-Length") == "" { + clen = strconv.Itoa(len(p)) + } + if rws.snapHeader.Get("Content-Type") == "" { + ctype = http.DetectContentType(p) + } + endStream := rws.handlerDone && len(p) == 0 + err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + httpResCode: rws.status, + h: rws.snapHeader, + endStream: endStream, + contentType: ctype, + contentLength: clen, + }) + if err != nil { + return 0, err + } + if endStream { + return 0, nil + } + } + if len(p) == 0 && !rws.handlerDone { + return 0, nil + } + + if err := rws.conn.writeDataFromHandler(rws.stream, p, rws.handlerDone); err != nil { + return 0, err + } + return len(p), nil +} + +func (w *responseWriter) Flush() { + rws := w.rws + if rws == nil { + panic("Header called after Handler finished") + } + if rws.bw.Buffered() > 0 { + if err := rws.bw.Flush(); err != nil { + // Ignore the error. The frame writer already knows. + return + } + } else { + // The bufio.Writer won't call chunkWriter.Write + // (writeChunk with zero bytes, so we have to do it + // ourselves to force the HTTP response header and/or + // final DATA frame (with END_STREAM) to be sent. + rws.writeChunk(nil) + } +} + +func (w *responseWriter) CloseNotify() <-chan bool { + rws := w.rws + if rws == nil { + panic("CloseNotify called after Handler finished") + } + rws.closeNotifierMu.Lock() + ch := rws.closeNotifierCh + if ch == nil { + ch = make(chan bool, 1) + rws.closeNotifierCh = ch + go func() { + rws.stream.cw.Wait() // wait for close + ch <- true + }() + } + rws.closeNotifierMu.Unlock() + return ch +} + +func (w *responseWriter) Header() http.Header { + rws := w.rws + if rws == nil { + panic("Header called after Handler finished") + } + if rws.handlerHeader == nil { + rws.handlerHeader = make(http.Header) + } + return rws.handlerHeader +} + +func (w *responseWriter) WriteHeader(code int) { + rws := w.rws + if rws == nil { + panic("WriteHeader called after Handler finished") + } + rws.writeHeader(code) +} + +func (rws *responseWriterState) writeHeader(code int) { + if !rws.wroteHeader { + rws.wroteHeader = true + rws.status = code + if len(rws.handlerHeader) > 0 { + rws.snapHeader = cloneHeader(rws.handlerHeader) + } + } +} + +func cloneHeader(h http.Header) http.Header { + h2 := make(http.Header, len(h)) + for k, vv := range h { + vv2 := make([]string, len(vv)) + copy(vv2, vv) + h2[k] = vv2 + } + return h2 +} + +// The Life Of A Write is like this: +// +// * Handler calls w.Write or w.WriteString -> +// * -> rws.bw (*bufio.Writer) -> +// * (Handler migth call Flush) +// * -> chunkWriter{rws} +// * -> responseWriterState.writeChunk(p []byte) +// * -> responseWriterState.writeChunk (most of the magic; see comment there) +func (w *responseWriter) Write(p []byte) (n int, err error) { + return w.write(len(p), p, "") +} + +func (w *responseWriter) WriteString(s string) (n int, err error) { + return w.write(len(s), nil, s) +} + +// either dataB or dataS is non-zero. +func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, err error) { + rws := w.rws + if rws == nil { + panic("Write called after Handler finished") + } + if !rws.wroteHeader { + w.WriteHeader(200) + } + if dataB != nil { + return rws.bw.Write(dataB) + } else { + return rws.bw.WriteString(dataS) + } +} + +func (w *responseWriter) handlerDone() { + rws := w.rws + if rws == nil { + panic("handlerDone called twice") + } + rws.handlerDone = true + w.Flush() + w.rws = nil + responseWriterStatePool.Put(rws) +} diff --git a/vendor/golang.org/x/net/http2/server_test.go b/vendor/golang.org/x/net/http2/server_test.go new file mode 100644 index 00000000..57fad6d6 --- /dev/null +++ b/vendor/golang.org/x/net/http2/server_test.go @@ -0,0 +1,2622 @@ +// Copyright 2014 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 http2 + +import ( + "bytes" + "crypto/tls" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net" + "net/http" + "net/http/httptest" + "os" + "os/exec" + "reflect" + "runtime" + "strconv" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "golang.org/x/net/http2/hpack" +) + +var stderrVerbose = flag.Bool("stderr_verbose", false, "Mirror verbosity to stderr, unbuffered") + +func stderrv() io.Writer { + if *stderrVerbose { + return os.Stderr + } + + return ioutil.Discard +} + +type serverTester struct { + cc net.Conn // client conn + t testing.TB + ts *httptest.Server + fr *Framer + logBuf *bytes.Buffer + logFilter []string // substrings to filter out + scMu sync.Mutex // guards sc + sc *serverConn + + // writing headers: + headerBuf bytes.Buffer + hpackEnc *hpack.Encoder + + // reading frames: + frc chan Frame + frErrc chan error + readTimer *time.Timer +} + +func init() { + testHookOnPanicMu = new(sync.Mutex) +} + +func resetHooks() { + testHookOnPanicMu.Lock() + testHookOnPanic = nil + testHookOnPanicMu.Unlock() +} + +type serverTesterOpt string + +var optOnlyServer = serverTesterOpt("only_server") + +func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}) *serverTester { + resetHooks() + + logBuf := new(bytes.Buffer) + ts := httptest.NewUnstartedServer(handler) + + tlsConfig := &tls.Config{ + InsecureSkipVerify: true, + // The h2-14 is temporary, until curl is updated. (as used by unit tests + // in Docker) + NextProtos: []string{NextProtoTLS, "h2-14"}, + } + + onlyServer := false + for _, opt := range opts { + switch v := opt.(type) { + case func(*tls.Config): + v(tlsConfig) + case func(*httptest.Server): + v(ts) + case serverTesterOpt: + onlyServer = (v == optOnlyServer) + default: + t.Fatalf("unknown newServerTester option type %T", v) + } + } + + ConfigureServer(ts.Config, &Server{}) + + st := &serverTester{ + t: t, + ts: ts, + logBuf: logBuf, + frc: make(chan Frame, 1), + frErrc: make(chan error, 1), + } + st.hpackEnc = hpack.NewEncoder(&st.headerBuf) + + ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config + ts.Config.ErrorLog = log.New(io.MultiWriter(stderrv(), twriter{t: t, st: st}, logBuf), "", log.LstdFlags) + ts.StartTLS() + + if VerboseLogs { + t.Logf("Running test server at: %s", ts.URL) + } + testHookGetServerConn = func(v *serverConn) { + st.scMu.Lock() + defer st.scMu.Unlock() + st.sc = v + st.sc.testHookCh = make(chan func(int)) + } + log.SetOutput(io.MultiWriter(stderrv(), twriter{t: t, st: st})) + if !onlyServer { + cc, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig) + if err != nil { + t.Fatal(err) + } + st.cc = cc + st.fr = NewFramer(cc, cc) + } + + return st +} + +func (st *serverTester) closeConn() { + st.scMu.Lock() + defer st.scMu.Unlock() + st.sc.conn.Close() +} + +func (st *serverTester) addLogFilter(phrase string) { + st.logFilter = append(st.logFilter, phrase) +} + +func (st *serverTester) stream(id uint32) *stream { + ch := make(chan *stream, 1) + st.sc.testHookCh <- func(int) { + ch <- st.sc.streams[id] + } + return <-ch +} + +func (st *serverTester) streamState(id uint32) streamState { + ch := make(chan streamState, 1) + st.sc.testHookCh <- func(int) { + state, _ := st.sc.state(id) + ch <- state + } + return <-ch +} + +// loopNum reports how many times this conn's select loop has gone around. +func (st *serverTester) loopNum() int { + lastc := make(chan int, 1) + st.sc.testHookCh <- func(loopNum int) { + lastc <- loopNum + } + return <-lastc +} + +// awaitIdle heuristically awaits for the server conn's select loop to be idle. +// The heuristic is that the server connection's serve loop must schedule +// 50 times in a row without any channel sends or receives occuring. +func (st *serverTester) awaitIdle() { + remain := 50 + last := st.loopNum() + for remain > 0 { + n := st.loopNum() + if n == last+1 { + remain-- + } else { + remain = 50 + } + last = n + } +} + +func (st *serverTester) Close() { + st.ts.Close() + if st.cc != nil { + st.cc.Close() + } + log.SetOutput(os.Stderr) +} + +// greet initiates the client's HTTP/2 connection into a state where +// frames may be sent. +func (st *serverTester) greet() { + st.writePreface() + st.writeInitialSettings() + st.wantSettings() + st.writeSettingsAck() + st.wantSettingsAck() +} + +func (st *serverTester) writePreface() { + n, err := st.cc.Write(clientPreface) + if err != nil { + st.t.Fatalf("Error writing client preface: %v", err) + } + if n != len(clientPreface) { + st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(clientPreface)) + } +} + +func (st *serverTester) writeInitialSettings() { + if err := st.fr.WriteSettings(); err != nil { + st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err) + } +} + +func (st *serverTester) writeSettingsAck() { + if err := st.fr.WriteSettingsAck(); err != nil { + st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err) + } +} + +func (st *serverTester) writeHeaders(p HeadersFrameParam) { + if err := st.fr.WriteHeaders(p); err != nil { + st.t.Fatalf("Error writing HEADERS: %v", err) + } +} + +func (st *serverTester) encodeHeaderField(k, v string) { + err := st.hpackEnc.WriteField(hpack.HeaderField{Name: k, Value: v}) + if err != nil { + st.t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) + } +} + +// encodeHeader encodes headers and returns their HPACK bytes. headers +// must contain an even number of key/value pairs. There may be +// multiple pairs for keys (e.g. "cookie"). The :method, :path, and +// :scheme headers default to GET, / and https. +func (st *serverTester) encodeHeader(headers ...string) []byte { + if len(headers)%2 == 1 { + panic("odd number of kv args") + } + + st.headerBuf.Reset() + + if len(headers) == 0 { + // Fast path, mostly for benchmarks, so test code doesn't pollute + // profiles when we're looking to improve server allocations. + st.encodeHeaderField(":method", "GET") + st.encodeHeaderField(":path", "/") + st.encodeHeaderField(":scheme", "https") + return st.headerBuf.Bytes() + } + + if len(headers) == 2 && headers[0] == ":method" { + // Another fast path for benchmarks. + st.encodeHeaderField(":method", headers[1]) + st.encodeHeaderField(":path", "/") + st.encodeHeaderField(":scheme", "https") + return st.headerBuf.Bytes() + } + + pseudoCount := map[string]int{} + keys := []string{":method", ":path", ":scheme"} + vals := map[string][]string{ + ":method": {"GET"}, + ":path": {"/"}, + ":scheme": {"https"}, + } + for len(headers) > 0 { + k, v := headers[0], headers[1] + headers = headers[2:] + if _, ok := vals[k]; !ok { + keys = append(keys, k) + } + if strings.HasPrefix(k, ":") { + pseudoCount[k]++ + if pseudoCount[k] == 1 { + vals[k] = []string{v} + } else { + // Allows testing of invalid headers w/ dup pseudo fields. + vals[k] = append(vals[k], v) + } + } else { + vals[k] = append(vals[k], v) + } + } + st.headerBuf.Reset() + for _, k := range keys { + for _, v := range vals[k] { + st.encodeHeaderField(k, v) + } + } + return st.headerBuf.Bytes() +} + +// bodylessReq1 writes a HEADERS frames with StreamID 1 and EndStream and EndHeaders set. +func (st *serverTester) bodylessReq1(headers ...string) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(headers...), + EndStream: true, + EndHeaders: true, + }) +} + +func (st *serverTester) writeData(streamID uint32, endStream bool, data []byte) { + if err := st.fr.WriteData(streamID, endStream, data); err != nil { + st.t.Fatalf("Error writing DATA: %v", err) + } +} + +func (st *serverTester) readFrame() (Frame, error) { + go func() { + fr, err := st.fr.ReadFrame() + if err != nil { + st.frErrc <- err + } else { + st.frc <- fr + } + }() + t := st.readTimer + if t == nil { + t = time.NewTimer(2 * time.Second) + st.readTimer = t + } + t.Reset(2 * time.Second) + defer t.Stop() + select { + case f := <-st.frc: + return f, nil + case err := <-st.frErrc: + return nil, err + case <-t.C: + return nil, errors.New("timeout waiting for frame") + } +} + +func (st *serverTester) wantHeaders() *HeadersFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a HEADERS frame: %v", err) + } + hf, ok := f.(*HeadersFrame) + if !ok { + st.t.Fatalf("got a %T; want *HeadersFrame", f) + } + return hf +} + +func (st *serverTester) wantContinuation() *ContinuationFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a CONTINUATION frame: %v", err) + } + cf, ok := f.(*ContinuationFrame) + if !ok { + st.t.Fatalf("got a %T; want *ContinuationFrame", f) + } + return cf +} + +func (st *serverTester) wantData() *DataFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a DATA frame: %v", err) + } + df, ok := f.(*DataFrame) + if !ok { + st.t.Fatalf("got a %T; want *DataFrame", f) + } + return df +} + +func (st *serverTester) wantSettings() *SettingsFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a SETTINGS frame: %v", err) + } + sf, ok := f.(*SettingsFrame) + if !ok { + st.t.Fatalf("got a %T; want *SettingsFrame", f) + } + return sf +} + +func (st *serverTester) wantPing() *PingFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a PING frame: %v", err) + } + pf, ok := f.(*PingFrame) + if !ok { + st.t.Fatalf("got a %T; want *PingFrame", f) + } + return pf +} + +func (st *serverTester) wantGoAway() *GoAwayFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a GOAWAY frame: %v", err) + } + gf, ok := f.(*GoAwayFrame) + if !ok { + st.t.Fatalf("got a %T; want *GoAwayFrame", f) + } + return gf +} + +func (st *serverTester) wantRSTStream(streamID uint32, errCode ErrCode) { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting an RSTStream frame: %v", err) + } + rs, ok := f.(*RSTStreamFrame) + if !ok { + st.t.Fatalf("got a %T; want *RSTStreamFrame", f) + } + if rs.FrameHeader.StreamID != streamID { + st.t.Fatalf("RSTStream StreamID = %d; want %d", rs.FrameHeader.StreamID, streamID) + } + if rs.ErrCode != errCode { + st.t.Fatalf("RSTStream ErrCode = %d (%s); want %d (%s)", rs.ErrCode, rs.ErrCode, errCode, errCode) + } +} + +func (st *serverTester) wantWindowUpdate(streamID, incr uint32) { + f, err := st.readFrame() + if err != nil { + st.t.Fatalf("Error while expecting a WINDOW_UPDATE frame: %v", err) + } + wu, ok := f.(*WindowUpdateFrame) + if !ok { + st.t.Fatalf("got a %T; want *WindowUpdateFrame", f) + } + if wu.FrameHeader.StreamID != streamID { + st.t.Fatalf("WindowUpdate StreamID = %d; want %d", wu.FrameHeader.StreamID, streamID) + } + if wu.Increment != incr { + st.t.Fatalf("WindowUpdate increment = %d; want %d", wu.Increment, incr) + } +} + +func (st *serverTester) wantSettingsAck() { + f, err := st.readFrame() + if err != nil { + st.t.Fatal(err) + } + sf, ok := f.(*SettingsFrame) + if !ok { + st.t.Fatalf("Wanting a settings ACK, received a %T", f) + } + if !sf.Header().Flags.Has(FlagSettingsAck) { + st.t.Fatal("Settings Frame didn't have ACK set") + } + +} + +func TestServer(t *testing.T) { + gotReq := make(chan bool, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Foo", "Bar") + gotReq <- true + }) + defer st.Close() + + covers("3.5", ` + The server connection preface consists of a potentially empty + SETTINGS frame ([SETTINGS]) that MUST be the first frame the + server sends in the HTTP/2 connection. + `) + + st.writePreface() + st.writeInitialSettings() + st.wantSettings() + st.writeSettingsAck() + st.wantSettingsAck() + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(), + EndStream: true, // no DATA frames + EndHeaders: true, + }) + + select { + case <-gotReq: + case <-time.After(2 * time.Second): + t.Error("timeout waiting for request") + } +} + +func TestServer_Request_Get(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader("foo-bar", "some-value"), + EndStream: true, // no DATA frames + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Method != "GET" { + t.Errorf("Method = %q; want GET", r.Method) + } + if r.URL.Path != "/" { + t.Errorf("URL.Path = %q; want /", r.URL.Path) + } + if r.ContentLength != 0 { + t.Errorf("ContentLength = %v; want 0", r.ContentLength) + } + if r.Close { + t.Error("Close = true; want false") + } + if !strings.Contains(r.RemoteAddr, ":") { + t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr) + } + if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 { + t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor) + } + wantHeader := http.Header{ + "Foo-Bar": []string{"some-value"}, + } + if !reflect.DeepEqual(r.Header, wantHeader) { + t.Errorf("Header = %#v; want %#v", r.Header, wantHeader) + } + if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 { + t.Errorf("Read = %d, %v; want 0, EOF", n, err) + } + }) +} + +func TestServer_Request_Get_PathSlashes(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":path", "/%2f/"), + EndStream: true, // no DATA frames + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.RequestURI != "/%2f/" { + t.Errorf("RequestURI = %q; want /%%2f/", r.RequestURI) + } + if r.URL.Path != "///" { + t.Errorf("URL.Path = %q; want ///", r.URL.Path) + } + }) +} + +// TODO: add a test with EndStream=true on the HEADERS but setting a +// Content-Length anyway. Should we just omit it and force it to +// zero? + +func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Method != "POST" { + t.Errorf("Method = %q; want POST", r.Method) + } + if r.ContentLength != 0 { + t.Errorf("ContentLength = %v; want 0", r.ContentLength) + } + if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 { + t.Errorf("Read = %d, %v; want 0, EOF", n, err) + } + }) +} + +func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) { + testBodyContents(t, -1, "", func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, nil) // just kidding. empty body. + }) +} + +func TestServer_Request_Post_Body_OneData(t *testing.T) { + const content = "Some content" + testBodyContents(t, -1, content, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte(content)) + }) +} + +func TestServer_Request_Post_Body_TwoData(t *testing.T) { + const content = "Some content" + testBodyContents(t, -1, content, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, false, []byte(content[:5])) + st.writeData(1, true, []byte(content[5:])) + }) +} + +func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) { + const content = "Some content" + testBodyContents(t, int64(len(content)), content, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", strconv.Itoa(len(content)), + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte(content)) + }) +} + +func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) { + testBodyContentsFail(t, 3, "request declared a Content-Length of 3 but only wrote 2 bytes", + func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", "3", + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte("12")) + }) +} + +func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) { + testBodyContentsFail(t, 4, "sender tried to send more than declared Content-Length of 4 bytes", + func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader( + ":method", "POST", + "content-length", "4", + ), + EndStream: false, // to say DATA frames are coming + EndHeaders: true, + }) + st.writeData(1, true, []byte("12345")) + }) +} + +func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) { + testServerRequest(t, write, func(r *http.Request) { + if r.Method != "POST" { + t.Errorf("Method = %q; want POST", r.Method) + } + if r.ContentLength != wantContentLength { + t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength) + } + all, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Fatal(err) + } + if string(all) != wantBody { + t.Errorf("Read = %q; want %q", all, wantBody) + } + if err := r.Body.Close(); err != nil { + t.Fatalf("Close: %v", err) + } + }) +} + +func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError string, write func(st *serverTester)) { + testServerRequest(t, write, func(r *http.Request) { + if r.Method != "POST" { + t.Errorf("Method = %q; want POST", r.Method) + } + if r.ContentLength != wantContentLength { + t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength) + } + all, err := ioutil.ReadAll(r.Body) + if err == nil { + t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.", + wantReadError, all) + } + if !strings.Contains(err.Error(), wantReadError) { + t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError) + } + if err := r.Body.Close(); err != nil { + t.Fatalf("Close: %v", err) + } + }) +} + +// Using a Host header, instead of :authority +func TestServer_Request_Get_Host(t *testing.T) { + const host = "example.com" + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader("host", host), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Host != host { + t.Errorf("Host = %q; want %q", r.Host, host) + } + }) +} + +// Using an :authority pseudo-header, instead of Host +func TestServer_Request_Get_Authority(t *testing.T) { + const host = "example.com" + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":authority", host), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if r.Host != host { + t.Errorf("Host = %q; want %q", r.Host, host) + } + }) +} + +func TestServer_Request_WithContinuation(t *testing.T) { + wantHeader := http.Header{ + "Foo-One": []string{"value-one"}, + "Foo-Two": []string{"value-two"}, + "Foo-Three": []string{"value-three"}, + } + testServerRequest(t, func(st *serverTester) { + fullHeaders := st.encodeHeader( + "foo-one", "value-one", + "foo-two", "value-two", + "foo-three", "value-three", + ) + remain := fullHeaders + chunks := 0 + for len(remain) > 0 { + const maxChunkSize = 5 + chunk := remain + if len(chunk) > maxChunkSize { + chunk = chunk[:maxChunkSize] + } + remain = remain[len(chunk):] + + if chunks == 0 { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: chunk, + EndStream: true, // no DATA frames + EndHeaders: false, // we'll have continuation frames + }) + } else { + err := st.fr.WriteContinuation(1, len(remain) == 0, chunk) + if err != nil { + t.Fatal(err) + } + } + chunks++ + } + if chunks < 2 { + t.Fatal("too few chunks") + } + }, func(r *http.Request) { + if !reflect.DeepEqual(r.Header, wantHeader) { + t.Errorf("Header = %#v; want %#v", r.Header, wantHeader) + } + }) +} + +// Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field") +func TestServer_Request_CookieConcat(t *testing.T) { + const host = "example.com" + testServerRequest(t, func(st *serverTester) { + st.bodylessReq1( + ":authority", host, + "cookie", "a=b", + "cookie", "c=d", + "cookie", "e=f", + ) + }, func(r *http.Request) { + const want = "a=b; c=d; e=f" + if got := r.Header.Get("Cookie"); got != want { + t.Errorf("Cookie = %q; want %q", got, want) + } + }) +} + +func TestServer_Request_Reject_CapitalHeader(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") }) +} + +func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") }) +} + +func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) { + // 8.1.2.3 Request Pseudo-Header Fields + // "All HTTP/2 requests MUST include exactly one valid value" ... + testRejectRequest(t, func(st *serverTester) { + st.addLogFilter("duplicate pseudo-header") + st.bodylessReq1(":method", "GET", ":method", "POST") + }) +} + +func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) { + // 8.1.2.3 Request Pseudo-Header Fields + // "All pseudo-header fields MUST appear in the header block + // before regular header fields. Any request or response that + // contains a pseudo-header field that appears in a header + // block after a regular header field MUST be treated as + // malformed (Section 8.1.2.6)." + testRejectRequest(t, func(st *serverTester) { + st.addLogFilter("pseudo-header after regular header") + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"}) + enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"}) + enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"}) + enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"}) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: buf.Bytes(), + EndStream: true, + EndHeaders: true, + }) + }) +} + +func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") }) +} + +func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") }) +} + +func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") }) +} + +func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { + st.addLogFilter(`invalid pseudo-header ":unknown_thing"`) + st.bodylessReq1(":unknown_thing", "") + }) +} + +func testRejectRequest(t *testing.T, send func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + t.Fatal("server request made it to handler; should've been rejected") + }) + defer st.Close() + + st.greet() + send(st) + st.wantRSTStream(1, ErrCodeProtocol) +} + +func TestServer_Ping(t *testing.T) { + st := newServerTester(t, nil) + defer st.Close() + st.greet() + + // Server should ignore this one, since it has ACK set. + ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128} + if err := st.fr.WritePing(true, ackPingData); err != nil { + t.Fatal(err) + } + + // But the server should reply to this one, since ACK is false. + pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8} + if err := st.fr.WritePing(false, pingData); err != nil { + t.Fatal(err) + } + + pf := st.wantPing() + if !pf.Flags.Has(FlagPingAck) { + t.Error("response ping doesn't have ACK set") + } + if pf.Data != pingData { + t.Errorf("response ping has data %q; want %q", pf.Data, pingData) + } +} + +func TestServer_RejectsLargeFrames(t *testing.T) { + st := newServerTester(t, nil) + defer st.Close() + st.greet() + + // Write too large of a frame (too large by one byte) + // We ignore the return value because it's expected that the server + // will only read the first 9 bytes (the headre) and then disconnect. + st.fr.WriteRawFrame(0xff, 0, 0, make([]byte, defaultMaxReadFrameSize+1)) + + gf := st.wantGoAway() + if gf.ErrCode != ErrCodeFrameSize { + t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFrameSize) + } +} + +func TestServer_Handler_Sends_WindowUpdate(t *testing.T) { + puppet := newHandlerPuppet() + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + puppet.act(w, r) + }) + defer st.Close() + defer puppet.done() + + st.greet() + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // data coming + EndHeaders: true, + }) + st.writeData(1, false, []byte("abcdef")) + puppet.do(readBodyHandler(t, "abc")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) + + puppet.do(readBodyHandler(t, "def")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(1, 3) + + st.writeData(1, true, []byte("ghijkl")) // END_STREAM here + puppet.do(readBodyHandler(t, "ghi")) + puppet.do(readBodyHandler(t, "jkl")) + st.wantWindowUpdate(0, 3) + st.wantWindowUpdate(0, 3) // no more stream-level, since END_STREAM +} + +func TestServer_Send_GoAway_After_Bogus_WindowUpdate(t *testing.T) { + st := newServerTester(t, nil) + defer st.Close() + st.greet() + if err := st.fr.WriteWindowUpdate(0, 1<<31-1); err != nil { + t.Fatal(err) + } + gf := st.wantGoAway() + if gf.ErrCode != ErrCodeFlowControl { + t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFlowControl) + } + if gf.LastStreamID != 0 { + t.Errorf("GOAWAY last stream ID = %v; want %v", gf.LastStreamID, 0) + } +} + +func TestServer_Send_RstStream_After_Bogus_WindowUpdate(t *testing.T) { + inHandler := make(chan bool) + blockHandler := make(chan bool) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + <-blockHandler + }) + defer st.Close() + defer close(blockHandler) + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + // Send a bogus window update: + if err := st.fr.WriteWindowUpdate(1, 1<<31-1); err != nil { + t.Fatal(err) + } + st.wantRSTStream(1, ErrCodeFlowControl) +} + +// testServerPostUnblock sends a hanging POST with unsent data to handler, +// then runs fn once in the handler, and verifies that the error returned from +// handler is acceptable. It fails if takes over 5 seconds for handler to exit. +func testServerPostUnblock(t *testing.T, + handler func(http.ResponseWriter, *http.Request) error, + fn func(*serverTester), + checkErr func(error), + otherHeaders ...string) { + inHandler := make(chan bool) + errc := make(chan error, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + errc <- handler(w, r) + }) + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(append([]string{":method", "POST"}, otherHeaders...)...), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + fn(st) + select { + case err := <-errc: + if checkErr != nil { + checkErr(err) + } + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for Handler to return") + } + st.Close() +} + +func TestServer_RSTStream_Unblocks_Read(t *testing.T) { + testServerPostUnblock(t, + func(w http.ResponseWriter, r *http.Request) (err error) { + _, err = r.Body.Read(make([]byte, 1)) + return + }, + func(st *serverTester) { + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }, + func(err error) { + if err == nil { + t.Error("unexpected nil error from Request.Body.Read") + } + }, + ) +} + +func TestServer_RSTStream_Unblocks_Header_Write(t *testing.T) { + // Run this test a bunch, because it doesn't always + // deadlock. But with a bunch, it did. + n := 50 + if testing.Short() { + n = 5 + } + for i := 0; i < n; i++ { + testServer_RSTStream_Unblocks_Header_Write(t) + } +} + +func testServer_RSTStream_Unblocks_Header_Write(t *testing.T) { + inHandler := make(chan bool, 1) + unblockHandler := make(chan bool, 1) + headerWritten := make(chan bool, 1) + wroteRST := make(chan bool, 1) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + <-wroteRST + w.Header().Set("foo", "bar") + w.WriteHeader(200) + w.(http.Flusher).Flush() + headerWritten <- true + <-unblockHandler + }) + defer st.Close() + + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + wroteRST <- true + st.awaitIdle() + select { + case <-headerWritten: + case <-time.After(2 * time.Second): + t.Error("timeout waiting for header write") + } + unblockHandler <- true +} + +func TestServer_DeadConn_Unblocks_Read(t *testing.T) { + testServerPostUnblock(t, + func(w http.ResponseWriter, r *http.Request) (err error) { + _, err = r.Body.Read(make([]byte, 1)) + return + }, + func(st *serverTester) { st.cc.Close() }, + func(err error) { + if err == nil { + t.Error("unexpected nil error from Request.Body.Read") + } + }, + ) +} + +var blockUntilClosed = func(w http.ResponseWriter, r *http.Request) error { + <-w.(http.CloseNotifier).CloseNotify() + return nil +} + +func TestServer_CloseNotify_After_RSTStream(t *testing.T) { + testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }, nil) +} + +func TestServer_CloseNotify_After_ConnClose(t *testing.T) { + testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { st.cc.Close() }, nil) +} + +// that CloseNotify unblocks after a stream error due to the client's +// problem that's unrelated to them explicitly canceling it (which is +// TestServer_CloseNotify_After_RSTStream above) +func TestServer_CloseNotify_After_StreamError(t *testing.T) { + testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { + // data longer than declared Content-Length => stream error + st.writeData(1, true, []byte("1234")) + }, nil, "content-length", "3") +} + +func TestServer_StateTransitions(t *testing.T) { + var st *serverTester + inHandler := make(chan bool) + writeData := make(chan bool) + leaveHandler := make(chan bool) + st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + inHandler <- true + if st.stream(1) == nil { + t.Errorf("nil stream 1 in handler") + } + if got, want := st.streamState(1), stateOpen; got != want { + t.Errorf("in handler, state is %v; want %v", got, want) + } + writeData <- true + if n, err := r.Body.Read(make([]byte, 1)); n != 0 || err != io.EOF { + t.Errorf("body read = %d, %v; want 0, EOF", n, err) + } + if got, want := st.streamState(1), stateHalfClosedRemote; got != want { + t.Errorf("in handler, state is %v; want %v", got, want) + } + + <-leaveHandler + }) + st.greet() + if st.stream(1) != nil { + t.Fatal("stream 1 should be empty") + } + if got := st.streamState(1); got != stateIdle { + t.Fatalf("stream 1 should be idle; got %v", got) + } + + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, // keep it open + EndHeaders: true, + }) + <-inHandler + <-writeData + st.writeData(1, true, nil) + + leaveHandler <- true + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Fatal("expected END_STREAM flag") + } + + if got, want := st.streamState(1), stateClosed; got != want { + t.Errorf("at end, state is %v; want %v", got, want) + } + if st.stream(1) != nil { + t.Fatal("at end, stream 1 should be gone") + } +} + +// test HEADERS w/o EndHeaders + another HEADERS (should get rejected) +func TestServer_Rejects_HeadersNoEnd_Then_Headers(t *testing.T) { + testServerRejects(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: false, + }) + st.writeHeaders(HeadersFrameParam{ // Not a continuation. + StreamID: 3, // different stream. + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + }) +} + +// test HEADERS w/o EndHeaders + PING (should get rejected) +func TestServer_Rejects_HeadersNoEnd_Then_Ping(t *testing.T) { + testServerRejects(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: false, + }) + if err := st.fr.WritePing(false, [8]byte{}); err != nil { + t.Fatal(err) + } + }) +} + +// test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected) +func TestServer_Rejects_HeadersEnd_Then_Continuation(t *testing.T) { + testServerRejects(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + st.wantHeaders() + if err := st.fr.WriteContinuation(1, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil { + t.Fatal(err) + } + }) +} + +// test HEADERS w/o EndHeaders + a continuation HEADERS on wrong stream ID +func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t *testing.T) { + testServerRejects(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: false, + }) + if err := st.fr.WriteContinuation(3, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil { + t.Fatal(err) + } + }) +} + +// No HEADERS on stream 0. +func TestServer_Rejects_Headers0(t *testing.T) { + testServerRejects(t, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writeHeaders(HeadersFrameParam{ + StreamID: 0, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + }) +} + +// No CONTINUATION on stream 0. +func TestServer_Rejects_Continuation0(t *testing.T) { + testServerRejects(t, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + if err := st.fr.WriteContinuation(0, true, st.encodeHeader()); err != nil { + t.Fatal(err) + } + }) +} + +func TestServer_Rejects_PushPromise(t *testing.T) { + testServerRejects(t, func(st *serverTester) { + pp := PushPromiseParam{ + StreamID: 1, + PromiseID: 3, + } + if err := st.fr.WritePushPromise(pp); err != nil { + t.Fatal(err) + } + }) +} + +// testServerRejects tests that the server hangs up with a GOAWAY +// frame and a server close after the client does something +// deserving a CONNECTION_ERROR. +func testServerRejects(t *testing.T, writeReq func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) + st.addLogFilter("connection error: PROTOCOL_ERROR") + defer st.Close() + st.greet() + writeReq(st) + + st.wantGoAway() + errc := make(chan error, 1) + go func() { + fr, err := st.fr.ReadFrame() + if err == nil { + err = fmt.Errorf("got frame of type %T", fr) + } + errc <- err + }() + select { + case err := <-errc: + if err != io.EOF { + t.Errorf("ReadFrame = %v; want io.EOF", err) + } + case <-time.After(2 * time.Second): + t.Error("timeout waiting for disconnect") + } +} + +// testServerRequest sets up an idle HTTP/2 connection and lets you +// write a single request with writeReq, and then verify that the +// *http.Request is built correctly in checkReq. +func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) { + gotReq := make(chan bool, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + if r.Body == nil { + t.Fatal("nil Body") + } + checkReq(r) + gotReq <- true + }) + defer st.Close() + + st.greet() + writeReq(st) + + select { + case <-gotReq: + case <-time.After(2 * time.Second): + t.Error("timeout waiting for request") + } +} + +func getSlash(st *serverTester) { st.bodylessReq1() } + +func TestServer_Response_NoData(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + // Nothing. + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Fatal("want END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + }) +} + +func TestServer_Response_NoData_Header_FooBar(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Foo-Bar", "some-value") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Fatal("want END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := decodeHeader(t, hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"foo-bar", "some-value"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", "0"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Content-Type", "foo/bar") + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("don't want END_STREAM, expecting data") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := decodeHeader(t, hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "foo/bar"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + df := st.wantData() + if !df.StreamEnded() { + t.Error("expected DATA to have END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + }) +} + +func TestServer_Response_TransferEncoding_chunked(t *testing.T) { + const msg = "hi" + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Transfer-Encoding", "chunked") // should be stripped + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + goth := decodeHeader(t, hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +// Header accessed only after the initial write. +func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + io.WriteString(w, msg) + w.Header().Set("foo", "should be ignored") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := decodeHeader(t, hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +// Header accessed before the initial write and later mutated. +func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("foo", "proper value") + io.WriteString(w, msg) + w.Header().Set("foo", "should be ignored") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := decodeHeader(t, hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"foo", "proper value"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + }) +} + +func TestServer_Response_Data_SniffLenType(t *testing.T) { + const msg = "this is HTML." + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + io.WriteString(w, msg) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("don't want END_STREAM, expecting data") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := decodeHeader(t, hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", strconv.Itoa(len(msg))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + df := st.wantData() + if !df.StreamEnded() { + t.Error("expected DATA to have END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + }) +} + +func TestServer_Response_Header_Flush_MidWrite(t *testing.T) { + const msg = "this is HTML" + const msg2 = ", and this is the next chunk" + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + io.WriteString(w, msg) + w.(http.Flusher).Flush() + io.WriteString(w, msg2) + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := decodeHeader(t, hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/html; charset=utf-8"}, // sniffed + // and no content-length + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + { + df := st.wantData() + if df.StreamEnded() { + t.Error("unexpected END_STREAM flag") + } + if got := string(df.Data()); got != msg { + t.Errorf("got DATA %q; want %q", got, msg) + } + } + { + df := st.wantData() + if !df.StreamEnded() { + t.Error("wanted END_STREAM flag on last data chunk") + } + if got := string(df.Data()); got != msg2 { + t.Errorf("got DATA %q; want %q", got, msg2) + } + } + }) +} + +func TestServer_Response_LargeWrite(t *testing.T) { + const size = 1 << 20 + const maxFrameSize = 16 << 10 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + n, err := w.Write(bytes.Repeat([]byte("a"), size)) + if err != nil { + return fmt.Errorf("Write error: %v", err) + } + if n != size { + return fmt.Errorf("wrong size %d from Write", n) + } + return nil + }, func(st *serverTester) { + if err := st.fr.WriteSettings( + Setting{SettingInitialWindowSize, 0}, + Setting{SettingMaxFrameSize, maxFrameSize}, + ); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + // Give the handler quota to write: + if err := st.fr.WriteWindowUpdate(1, size); err != nil { + t.Fatal(err) + } + // Give the handler quota to write to connection-level + // window as well + if err := st.fr.WriteWindowUpdate(0, size); err != nil { + t.Fatal(err) + } + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := decodeHeader(t, hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, // sniffed + // and no content-length + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + var bytes, frames int + for { + df := st.wantData() + bytes += len(df.Data()) + frames++ + for _, b := range df.Data() { + if b != 'a' { + t.Fatal("non-'a' byte seen in DATA") + } + } + if df.StreamEnded() { + break + } + } + if bytes != size { + t.Errorf("Got %d bytes; want %d", bytes, size) + } + if want := int(size / maxFrameSize); frames < want || frames > want*2 { + t.Errorf("Got %d frames; want %d", frames, size) + } + }) +} + +// Test that the handler can't write more than the client allows +func TestServer_Response_LargeWrite_FlowControlled(t *testing.T) { + const size = 1 << 20 + const maxFrameSize = 16 << 10 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.(http.Flusher).Flush() + n, err := w.Write(bytes.Repeat([]byte("a"), size)) + if err != nil { + return fmt.Errorf("Write error: %v", err) + } + if n != size { + return fmt.Errorf("wrong size %d from Write", n) + } + return nil + }, func(st *serverTester) { + // Set the window size to something explicit for this test. + // It's also how much initial data we expect. + const initWindowSize = 123 + if err := st.fr.WriteSettings( + Setting{SettingInitialWindowSize, initWindowSize}, + Setting{SettingMaxFrameSize, maxFrameSize}, + ); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + defer func() { st.fr.WriteRSTStream(1, ErrCodeCancel) }() + + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + + df := st.wantData() + if got := len(df.Data()); got != initWindowSize { + t.Fatalf("Initial window size = %d but got DATA with %d bytes", initWindowSize, got) + } + + for _, quota := range []int{1, 13, 127} { + if err := st.fr.WriteWindowUpdate(1, uint32(quota)); err != nil { + t.Fatal(err) + } + df := st.wantData() + if int(quota) != len(df.Data()) { + t.Fatalf("read %d bytes after giving %d quota", len(df.Data()), quota) + } + } + + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }) +} + +// Test that the handler blocked in a Write is unblocked if the server sends a RST_STREAM. +func TestServer_Response_RST_Unblocks_LargeWrite(t *testing.T) { + const size = 1 << 20 + const maxFrameSize = 16 << 10 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.(http.Flusher).Flush() + errc := make(chan error, 1) + go func() { + _, err := w.Write(bytes.Repeat([]byte("a"), size)) + errc <- err + }() + select { + case err := <-errc: + if err == nil { + return errors.New("unexpected nil error from Write in handler") + } + return nil + case <-time.After(2 * time.Second): + return errors.New("timeout waiting for Write in handler") + } + }, func(st *serverTester) { + if err := st.fr.WriteSettings( + Setting{SettingInitialWindowSize, 0}, + Setting{SettingMaxFrameSize, maxFrameSize}, + ); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + + if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { + t.Fatal(err) + } + }) +} + +func TestServer_Response_Empty_Data_Not_FlowControlled(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.(http.Flusher).Flush() + // Nothing; send empty DATA + return nil + }, func(st *serverTester) { + // Handler gets no data quota: + if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, 0}); err != nil { + t.Fatal(err) + } + st.wantSettingsAck() + + getSlash(st) // make the single request + + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + + df := st.wantData() + if got := len(df.Data()); got != 0 { + t.Fatalf("unexpected %d DATA bytes; want 0", got) + } + if !df.StreamEnded() { + t.Fatal("DATA didn't have END_STREAM") + } + }) +} + +func TestServer_Response_Automatic100Continue(t *testing.T) { + const msg = "foo" + const reply = "bar" + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + if v := r.Header.Get("Expect"); v != "" { + t.Errorf("Expect header = %q; want empty", v) + } + buf := make([]byte, len(msg)) + // This read should trigger the 100-continue being sent. + if n, err := io.ReadFull(r.Body, buf); err != nil || n != len(msg) || string(buf) != msg { + return fmt.Errorf("ReadFull = %q, %v; want %q, nil", buf[:n], err, msg) + } + _, err := io.WriteString(w, reply) + return err + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "POST", "expect", "100-continue"), + EndStream: false, + EndHeaders: true, + }) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth := decodeHeader(t, hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "100"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Fatalf("Got headers %v; want %v", goth, wanth) + } + + // Okay, they sent status 100, so we can send our + // gigantic and/or sensitive "foo" payload now. + st.writeData(1, true, []byte(msg)) + + st.wantWindowUpdate(0, uint32(len(msg))) + + hf = st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("expected data to follow") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + goth = decodeHeader(t, hf.HeaderBlockFragment()) + wanth = [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", strconv.Itoa(len(reply))}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + + df := st.wantData() + if string(df.Data()) != reply { + t.Errorf("Client read %q; want %q", df.Data(), reply) + } + if !df.StreamEnded() { + t.Errorf("expect data stream end") + } + }) +} + +func TestServer_HandlerWriteErrorOnDisconnect(t *testing.T) { + errc := make(chan error, 1) + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + p := []byte("some data.\n") + for { + _, err := w.Write(p) + if err != nil { + errc <- err + return nil + } + } + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: false, + EndHeaders: true, + }) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("unexpected END_STREAM flag") + } + if !hf.HeadersEnded() { + t.Fatal("want END_HEADERS flag") + } + // Close the connection and wait for the handler to (hopefully) notice. + st.cc.Close() + select { + case <-errc: + case <-time.After(5 * time.Second): + t.Error("timeout") + } + }) +} + +func TestServer_Rejects_Too_Many_Streams(t *testing.T) { + const testPath = "/some/path" + + inHandler := make(chan uint32) + leaveHandler := make(chan bool) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + id := w.(*responseWriter).rws.stream.id + inHandler <- id + if id == 1+(defaultMaxStreams+1)*2 && r.URL.Path != testPath { + t.Errorf("decoded final path as %q; want %q", r.URL.Path, testPath) + } + <-leaveHandler + }) + defer st.Close() + st.greet() + nextStreamID := uint32(1) + streamID := func() uint32 { + defer func() { nextStreamID += 2 }() + return nextStreamID + } + sendReq := func(id uint32, headers ...string) { + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(headers...), + EndStream: true, + EndHeaders: true, + }) + } + for i := 0; i < defaultMaxStreams; i++ { + sendReq(streamID()) + <-inHandler + } + defer func() { + for i := 0; i < defaultMaxStreams; i++ { + leaveHandler <- true + } + }() + + // And this one should cross the limit: + // (It's also sent as a CONTINUATION, to verify we still track the decoder context, + // even if we're rejecting it) + rejectID := streamID() + headerBlock := st.encodeHeader(":path", testPath) + frag1, frag2 := headerBlock[:3], headerBlock[3:] + st.writeHeaders(HeadersFrameParam{ + StreamID: rejectID, + BlockFragment: frag1, + EndStream: true, + EndHeaders: false, // CONTINUATION coming + }) + if err := st.fr.WriteContinuation(rejectID, true, frag2); err != nil { + t.Fatal(err) + } + st.wantRSTStream(rejectID, ErrCodeProtocol) + + // But let a handler finish: + leaveHandler <- true + st.wantHeaders() + + // And now another stream should be able to start: + goodID := streamID() + sendReq(goodID, ":path", testPath) + select { + case got := <-inHandler: + if got != goodID { + t.Errorf("Got stream %d; want %d", got, goodID) + } + case <-time.After(3 * time.Second): + t.Error("timeout waiting for handler") + } +} + +// So many response headers that the server needs to use CONTINUATION frames: +func TestServer_Response_ManyHeaders_With_Continuation(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + h := w.Header() + for i := 0; i < 5000; i++ { + h.Set(fmt.Sprintf("x-header-%d", i), fmt.Sprintf("x-value-%d", i)) + } + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.HeadersEnded() { + t.Fatal("got unwanted END_HEADERS flag") + } + n := 0 + for { + n++ + cf := st.wantContinuation() + if cf.HeadersEnded() { + break + } + } + if n < 5 { + t.Errorf("Only got %d CONTINUATION frames; expected 5+ (currently 6)", n) + } + }) +} + +// This previously crashed (reported by Mathieu Lonjaret as observed +// while using Camlistore) because we got a DATA frame from the client +// after the handler exited and our logic at the time was wrong, +// keeping a stream in the map in stateClosed, which tickled an +// invariant check later when we tried to remove that stream (via +// defer sc.closeAllStreamsOnConnClose) when the serverConn serve loop +// ended. +func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + // nothing + return nil + }, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: false, // DATA is coming + EndHeaders: true, + }) + hf := st.wantHeaders() + if !hf.HeadersEnded() || !hf.StreamEnded() { + t.Fatalf("want END_HEADERS+END_STREAM, got %v", hf) + } + + // Sent when the a Handler closes while a client has + // indicated it's still sending DATA: + st.wantRSTStream(1, ErrCodeCancel) + + // Now the handler has ended, so it's ended its + // stream, but the client hasn't closed its side + // (stateClosedLocal). So send more data and verify + // it doesn't crash with an internal invariant panic, like + // it did before. + st.writeData(1, true, []byte("foo")) + + // Sent after a peer sends data anyway (admittedly the + // previous RST_STREAM might've still been in-flight), + // but they'll get the more friendly 'cancel' code + // first. + st.wantRSTStream(1, ErrCodeStreamClosed) + + // Set up a bunch of machinery to record the panic we saw + // previously. + var ( + panMu sync.Mutex + panicVal interface{} + ) + + testHookOnPanicMu.Lock() + testHookOnPanic = func(sc *serverConn, pv interface{}) bool { + panMu.Lock() + panicVal = pv + panMu.Unlock() + return true + } + testHookOnPanicMu.Unlock() + + // Now force the serve loop to end, via closing the connection. + st.cc.Close() + select { + case <-st.sc.doneServing: + // Loop has exited. + panMu.Lock() + got := panicVal + panMu.Unlock() + if got != nil { + t.Errorf("Got panic: %v", got) + } + case <-time.After(5 * time.Second): + t.Error("timeout") + } + }) +} + +func TestServer_Rejects_TLS10(t *testing.T) { testRejectTLS(t, tls.VersionTLS10) } +func TestServer_Rejects_TLS11(t *testing.T) { testRejectTLS(t, tls.VersionTLS11) } + +func testRejectTLS(t *testing.T, max uint16) { + st := newServerTester(t, nil, func(c *tls.Config) { + c.MaxVersion = max + }) + defer st.Close() + gf := st.wantGoAway() + if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want { + t.Errorf("Got error code %v; want %v", got, want) + } +} + +func TestServer_Rejects_TLSBadCipher(t *testing.T) { + st := newServerTester(t, nil, func(c *tls.Config) { + // Only list bad ones: + c.CipherSuites = []uint16{ + tls.TLS_RSA_WITH_RC4_128_SHA, + tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA, + tls.TLS_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_RSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, + tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + } + }) + defer st.Close() + gf := st.wantGoAway() + if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want { + t.Errorf("Got error code %v; want %v", got, want) + } +} + +func TestServer_Advertises_Common_Cipher(t *testing.T) { + const requiredSuite = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + st := newServerTester(t, nil, func(c *tls.Config) { + // Have the client only support the one required by the spec. + c.CipherSuites = []uint16{requiredSuite} + }, func(ts *httptest.Server) { + var srv *http.Server = ts.Config + // Have the server configured with no specific cipher suites. + // This tests that Go's defaults include the required one. + srv.TLSConfig = nil + }) + defer st.Close() + st.greet() +} + +// TODO: move this onto *serverTester, and re-use the same hpack +// decoding context throughout. We're just getting lucky here with +// creating a new decoder each time. +func decodeHeader(t *testing.T, headerBlock []byte) (pairs [][2]string) { + d := hpack.NewDecoder(initialHeaderTableSize, func(f hpack.HeaderField) { + pairs = append(pairs, [2]string{f.Name, f.Value}) + }) + if _, err := d.Write(headerBlock); err != nil { + t.Fatalf("hpack decoding error: %v", err) + } + if err := d.Close(); err != nil { + t.Fatalf("hpack decoding error: %v", err) + } + return +} + +// testServerResponse sets up an idle HTTP/2 connection and lets you +// write a single request with writeReq, and then reply to it in some way with the provided handler, +// and then verify the output with the serverTester again (assuming the handler returns nil) +func testServerResponse(t testing.TB, + handler func(http.ResponseWriter, *http.Request) error, + client func(*serverTester), +) { + errc := make(chan error, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + if r.Body == nil { + t.Fatal("nil Body") + } + errc <- handler(w, r) + }) + defer st.Close() + + donec := make(chan bool) + go func() { + defer close(donec) + st.greet() + client(st) + }() + + select { + case <-donec: + return + case <-time.After(5 * time.Second): + t.Fatal("timeout") + } + + select { + case err := <-errc: + if err != nil { + t.Fatalf("Error in handler: %v", err) + } + case <-time.After(2 * time.Second): + t.Error("timeout waiting for handler to finish") + } +} + +// readBodyHandler returns an http Handler func that reads len(want) +// bytes from r.Body and fails t if the contents read were not +// the value of want. +func readBodyHandler(t *testing.T, want string) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + buf := make([]byte, len(want)) + _, err := io.ReadFull(r.Body, buf) + if err != nil { + t.Error(err) + return + } + if string(buf) != want { + t.Errorf("read %q; want %q", buf, want) + } + } +} + +// TestServerWithCurl currently fails, hence the LenientCipherSuites test. See: +// https://github.com/tatsuhiro-t/nghttp2/issues/140 & +// http://sourceforge.net/p/curl/bugs/1472/ +func TestServerWithCurl(t *testing.T) { testServerWithCurl(t, false) } +func TestServerWithCurl_LenientCipherSuites(t *testing.T) { testServerWithCurl(t, true) } + +func testServerWithCurl(t *testing.T, permitProhibitedCipherSuites bool) { + if runtime.GOOS != "linux" { + t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway") + } + if testing.Short() { + t.Skip("skipping curl test in short mode") + } + requireCurl(t) + const msg = "Hello from curl!\n" + ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Foo", "Bar") + w.Header().Set("Client-Proto", r.Proto) + io.WriteString(w, msg) + })) + ConfigureServer(ts.Config, &Server{ + PermitProhibitedCipherSuites: permitProhibitedCipherSuites, + }) + ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config + ts.StartTLS() + defer ts.Close() + + var gotConn int32 + testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) } + + t.Logf("Running test server for curl to hit at: %s", ts.URL) + container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL) + defer kill(container) + resc := make(chan interface{}, 1) + go func() { + res, err := dockerLogs(container) + if err != nil { + resc <- err + } else { + resc <- res + } + }() + select { + case res := <-resc: + if err, ok := res.(error); ok { + t.Fatal(err) + } + body := string(res.([]byte)) + // Search for both "key: value" and "key:value", since curl changed their format + // Our Dockerfile contains the latest version (no space), but just in case people + // didn't rebuild, check both. + if !strings.Contains(body, "foo: Bar") && !strings.Contains(body, "foo:Bar") { + t.Errorf("didn't see foo: Bar header") + t.Logf("Got: %s", body) + } + if !strings.Contains(body, "client-proto: HTTP/2") && !strings.Contains(body, "client-proto:HTTP/2") { + t.Errorf("didn't see client-proto: HTTP/2 header") + t.Logf("Got: %s", res) + } + if !strings.Contains(string(res.([]byte)), msg) { + t.Errorf("didn't see %q content", msg) + t.Logf("Got: %s", res) + } + case <-time.After(3 * time.Second): + t.Errorf("timeout waiting for curl") + } + + if atomic.LoadInt32(&gotConn) == 0 { + t.Error("never saw an http2 connection") + } +} + +var doh2load = flag.Bool("h2load", false, "Run h2load test") + +func TestServerWithH2Load(t *testing.T) { + if !*doh2load { + t.Skip("Skipping without --h2load flag.") + } + if runtime.GOOS != "linux" { + t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway") + } + requireH2load(t) + + msg := strings.Repeat("Hello, h2load!\n", 5000) + ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, msg) + w.(http.Flusher).Flush() + io.WriteString(w, msg) + })) + ts.StartTLS() + defer ts.Close() + + cmd := exec.Command("docker", "run", "--net=host", "--entrypoint=/usr/local/bin/h2load", "gohttp2/curl", + "-n100000", "-c100", "-m100", ts.URL) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + t.Fatal(err) + } +} + +// Issue 12843 +func TestServerDoS_MaxHeaderListSize(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) + defer st.Close() + + // shake hands + st.writePreface() + st.writeInitialSettings() + frameSize := defaultMaxReadFrameSize + var advHeaderListSize *uint32 + st.wantSettings().ForeachSetting(func(s Setting) error { + switch s.ID { + case SettingMaxFrameSize: + if s.Val < minMaxFrameSize { + frameSize = minMaxFrameSize + } else if s.Val > maxFrameSize { + frameSize = maxFrameSize + } else { + frameSize = int(s.Val) + } + case SettingMaxHeaderListSize: + advHeaderListSize = &s.Val + } + return nil + }) + st.writeSettingsAck() + st.wantSettingsAck() + + if advHeaderListSize == nil { + t.Errorf("server didn't advertise a max header list size") + } else if *advHeaderListSize == 0 { + t.Errorf("server advertised a max header list size of 0") + } + + st.encodeHeaderField(":method", "GET") + st.encodeHeaderField(":path", "/") + st.encodeHeaderField(":scheme", "https") + cookie := strings.Repeat("*", 4058) + st.encodeHeaderField("cookie", cookie) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.headerBuf.Bytes(), + EndStream: true, + EndHeaders: false, + }) + + // Capture the short encoding of a duplicate ~4K cookie, now + // that we've already sent it once. + st.headerBuf.Reset() + st.encodeHeaderField("cookie", cookie) + + // Now send 1MB of it. + const size = 1 << 20 + b := bytes.Repeat(st.headerBuf.Bytes(), size/st.headerBuf.Len()) + for len(b) > 0 { + chunk := b + if len(chunk) > frameSize { + chunk = chunk[:frameSize] + } + b = b[len(chunk):] + st.fr.WriteContinuation(1, len(b) == 0, chunk) + } + + h := st.wantHeaders() + if !h.HeadersEnded() { + t.Fatalf("Got HEADERS without END_HEADERS set: %v", h) + } + headers := decodeHeader(t, h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "431"}, + {"content-type", "text/html; charset=utf-8"}, + {"content-length", "63"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } +} + +func TestCompressionErrorOnWrite(t *testing.T) { + const maxStrLen = 8 << 10 + var serverConfig *http.Server + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. + }, func(ts *httptest.Server) { + serverConfig = ts.Config + serverConfig.MaxHeaderBytes = maxStrLen + }) + defer st.Close() + st.greet() + + maxAllowed := st.sc.maxHeaderStringLen() + + // Crank this up, now that we have a conn connected with the + // hpack.Decoder's max string length set has been initialized + // from the earlier low ~8K value. We want this higher so don't + // hit the max header list size. We only want to test hitting + // the max string size. + serverConfig.MaxHeaderBytes = 1 << 20 + + // First a request with a header that's exactly the max allowed size. + hbf := st.encodeHeader("foo", strings.Repeat("a", maxAllowed)) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + h := st.wantHeaders() + if !h.HeadersEnded() || !h.StreamEnded() { + t.Errorf("Unexpected HEADER frame %v", h) + } + + // And now send one that's just one byte too big. + hbf = st.encodeHeader("bar", strings.Repeat("b", maxAllowed+1)) + st.writeHeaders(HeadersFrameParam{ + StreamID: 3, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeCompression { + t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode) + } +} + +func TestCompressionErrorOnClose(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. + }) + defer st.Close() + st.greet() + + hbf := st.encodeHeader("foo", "bar") + hbf = hbf[:len(hbf)-1] // truncate one byte from the end, so hpack.Decoder.Close fails. + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeCompression { + t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode) + } +} + +func BenchmarkServerGets(b *testing.B) { + b.ReportAllocs() + + const msg = "Hello, world" + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, msg) + }) + defer st.Close() + st.greet() + + // Give the server quota to reply. (plus it has the the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + + for i := 0; i < b.N; i++ { + id := 1 + uint32(i)*2 + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + st.wantHeaders() + df := st.wantData() + if !df.StreamEnded() { + b.Fatalf("DATA didn't have END_STREAM; got %v", df) + } + } +} + +func BenchmarkServerPosts(b *testing.B) { + b.ReportAllocs() + + const msg = "Hello, world" + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, msg) + }) + defer st.Close() + st.greet() + + // Give the server quota to reply. (plus it has the the 64KB) + if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { + b.Fatal(err) + } + + for i := 0; i < b.N; i++ { + id := 1 + uint32(i)*2 + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, + EndHeaders: true, + }) + st.writeData(id, true, nil) + st.wantHeaders() + df := st.wantData() + if !df.StreamEnded() { + b.Fatalf("DATA didn't have END_STREAM; got %v", df) + } + } +} + +// go-fuzz bug, originally reported at https://github.com/bradfitz/http2/issues/53 +// Verify we don't hang. +func TestIssue53(t *testing.T) { + const data = "PRI * HTTP/2.0\r\n\r\nSM" + + "\r\n\r\n\x00\x00\x00\x01\ainfinfin\ad" + s := &http.Server{ + ErrorLog: log.New(io.MultiWriter(stderrv(), twriter{t: t}), "", log.LstdFlags), + } + s2 := &Server{MaxReadFrameSize: 1 << 16, PermitProhibitedCipherSuites: true} + c := &issue53Conn{[]byte(data), false, false} + s2.handleConn(s, c, http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.Write([]byte("hello")) + })) + if !c.closed { + t.Fatal("connection is not closed") + } +} + +type issue53Conn struct { + data []byte + closed bool + written bool +} + +func (c *issue53Conn) Read(b []byte) (n int, err error) { + if len(c.data) == 0 { + return 0, io.EOF + } + n = copy(b, c.data) + c.data = c.data[n:] + return +} + +func (c *issue53Conn) Write(b []byte) (n int, err error) { + c.written = true + return len(b), nil +} + +func (c *issue53Conn) Close() error { + c.closed = true + return nil +} + +func (c *issue53Conn) LocalAddr() net.Addr { return &net.TCPAddr{net.IP{127, 0, 0, 1}, 49706, ""} } +func (c *issue53Conn) RemoteAddr() net.Addr { return &net.TCPAddr{net.IP{127, 0, 0, 1}, 49706, ""} } +func (c *issue53Conn) SetDeadline(t time.Time) error { return nil } +func (c *issue53Conn) SetReadDeadline(t time.Time) error { return nil } +func (c *issue53Conn) SetWriteDeadline(t time.Time) error { return nil } + +// golang.org/issue/12895 +func TestConfigureServer(t *testing.T) { + tests := []struct { + name string + in http.Server + wantErr string + }{ + { + name: "empty server", + in: http.Server{}, + }, + { + name: "just the required cipher suite", + in: http.Server{ + TLSConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, + }, + }, + }, + { + name: "missing required cipher suite", + in: http.Server{ + TLSConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384}, + }, + }, + wantErr: "is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", + }, + { + name: "required after bad", + in: http.Server{ + TLSConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, + }, + }, + wantErr: "contains an HTTP/2-approved cipher suite (0xc02f), but it comes after", + }, + { + name: "bad after required", + in: http.Server{ + TLSConfig: &tls.Config{ + CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, tls.TLS_RSA_WITH_RC4_128_SHA}, + }, + }, + }, + } + for _, tt := range tests { + err := ConfigureServer(&tt.in, nil) + if (err != nil) != (tt.wantErr != "") { + if tt.wantErr != "" { + t.Errorf("%s: success, but want error", tt.name) + } else { + t.Errorf("%s: unexpected error: %v", tt.name, err) + } + } + if err != nil && tt.wantErr != "" && !strings.Contains(err.Error(), tt.wantErr) { + t.Errorf("%s: err = %v; want substring %q", tt.name, err, tt.wantErr) + } + if err == nil && !tt.in.TLSConfig.PreferServerCipherSuites { + t.Error("%s: PreferServerCipherSuite is false; want true", tt.name) + } + } +} diff --git a/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml b/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml new file mode 100644 index 00000000..31a84bed --- /dev/null +++ b/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml @@ -0,0 +1,5021 @@ + + + + + + + + + + + + + + + + + + + Hypertext Transfer Protocol version 2 + + + Twist +
+ mbelshe@chromium.org +
+
+ + + Google, Inc +
+ fenix@google.com +
+
+ + + Mozilla +
+ + 331 E Evelyn Street + Mountain View + CA + 94041 + US + + martin.thomson@gmail.com +
+
+ + + Applications + HTTPbis + HTTP + SPDY + Web + + + + This specification describes an optimized expression of the semantics of the Hypertext + Transfer Protocol (HTTP). HTTP/2 enables a more efficient use of network resources and a + reduced perception of latency by introducing header field compression and allowing multiple + concurrent messages on the same connection. It also introduces unsolicited push of + representations from servers to clients. + + + This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax. + HTTP's existing semantics remain unchanged. + + + + + + Discussion of this draft takes place on the HTTPBIS working group mailing list + (ietf-http-wg@w3.org), which is archived at . + + + Working Group information can be found at ; that specific to HTTP/2 are at . + + + The changes in this draft are summarized in . + + + +
+ + +
+ + + The Hypertext Transfer Protocol (HTTP) is a wildly successful protocol. However, the + HTTP/1.1 message format () has + several characteristics that have a negative overall effect on application performance + today. + + + In particular, HTTP/1.0 allowed only one request to be outstanding at a time on a given + TCP connection. HTTP/1.1 added request pipelining, but this only partially addressed + request concurrency and still suffers from head-of-line blocking. Therefore, HTTP/1.1 + clients that need to make many requests typically use multiple connections to a server in + order to achieve concurrency and thereby reduce latency. + + + Furthermore, HTTP header fields are often repetitive and verbose, causing unnecessary + network traffic, as well as causing the initial TCP congestion + window to quickly fill. This can result in excessive latency when multiple requests are + made on a new TCP connection. + + + HTTP/2 addresses these issues by defining an optimized mapping of HTTP's semantics to an + underlying connection. Specifically, it allows interleaving of request and response + messages on the same connection and uses an efficient coding for HTTP header fields. It + also allows prioritization of requests, letting more important requests complete more + quickly, further improving performance. + + + The resulting protocol is more friendly to the network, because fewer TCP connections can + be used in comparison to HTTP/1.x. This means less competition with other flows, and + longer-lived connections, which in turn leads to better utilization of available network + capacity. + + + Finally, HTTP/2 also enables more efficient processing of messages through use of binary + message framing. + +
+ +
+ + HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2 supports all of the core + features of HTTP/1.1, but aims to be more efficient in several ways. + + + The basic protocol unit in HTTP/2 is a frame. Each frame + type serves a different purpose. For example, HEADERS and + DATA frames form the basis of HTTP requests and + responses; other frame types like SETTINGS, + WINDOW_UPDATE, and PUSH_PROMISE are used in support of other + HTTP/2 features. + + + Multiplexing of requests is achieved by having each HTTP request-response exchange + associated with its own stream. Streams are largely + independent of each other, so a blocked or stalled request or response does not prevent + progress on other streams. + + + Flow control and prioritization ensure that it is possible to efficiently use multiplexed + streams. Flow control helps to ensure that only data that + can be used by a receiver is transmitted. Prioritization ensures that limited resources can be directed + to the most important streams first. + + + HTTP/2 adds a new interaction mode, whereby a server can push + responses to a client. Server push allows a server to speculatively send a client + data that the server anticipates the client will need, trading off some network usage + against a potential latency gain. The server does this by synthesizing a request, which it + sends as a PUSH_PROMISE frame. The server is then able to send a response to + the synthetic request on a separate stream. + + + Frames that contain HTTP header fields are compressed. + HTTP requests can be highly redundant, so compression can reduce the size of requests and + responses significantly. + + +
+ + The HTTP/2 specification is split into four parts: + + + Starting HTTP/2 covers how an HTTP/2 connection is + initiated. + + + The framing and streams layers describe the way HTTP/2 frames are + structured and formed into multiplexed streams. + + + Frame and error + definitions include details of the frame and error types used in HTTP/2. + + + HTTP mappings and additional + requirements describe how HTTP semantics are expressed using frames and + streams. + + + + + While some of the frame and stream layer concepts are isolated from HTTP, this + specification does not define a completely generic framing layer. The framing and streams + layers are tailored to the needs of the HTTP protocol and server push. + +
+ +
+ + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD + NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as + described in RFC 2119. + + + All numeric values are in network byte order. Values are unsigned unless otherwise + indicated. Literal values are provided in decimal or hexadecimal as appropriate. + Hexadecimal literals are prefixed with 0x to distinguish them + from decimal literals. + + + The following terms are used: + + + The endpoint initiating the HTTP/2 connection. + + + A transport-layer connection between two endpoints. + + + An error that affects the entire HTTP/2 connection. + + + Either the client or server of the connection. + + + The smallest unit of communication within an HTTP/2 connection, consisting of a header + and a variable-length sequence of octets structured according to the frame type. + + + An endpoint. When discussing a particular endpoint, "peer" refers to the endpoint + that is remote to the primary subject of discussion. + + + An endpoint that is receiving frames. + + + An endpoint that is transmitting frames. + + + The endpoint which did not initiate the HTTP/2 connection. + + + A bi-directional flow of frames across a virtual channel within the HTTP/2 connection. + + + An error on the individual HTTP/2 stream. + + + + + Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" are defined + in . + +
+
+ +
+ + An HTTP/2 connection is an application layer protocol running on top of a TCP connection + (). The client is the TCP connection initiator. + + + HTTP/2 uses the same "http" and "https" URI schemes used by HTTP/1.1. HTTP/2 shares the same + default port numbers: 80 for "http" URIs and 443 for "https" URIs. As a result, + implementations processing requests for target resource URIs like http://example.org/foo or https://example.com/bar are required to first discover whether the + upstream server (the immediate peer to which the client wishes to establish a connection) + supports HTTP/2. + + + + The means by which support for HTTP/2 is determined is different for "http" and "https" + URIs. Discovery for "http" URIs is described in . Discovery + for "https" URIs is described in . + + +
+ + The protocol defined in this document has two identifiers. + + + + The string "h2" identifies the protocol where HTTP/2 uses TLS. This identifier is used in the TLS application layer protocol negotiation extension (ALPN) + field and any place that HTTP/2 over TLS is identified. + + + The "h2" string is serialized into an ALPN protocol identifier as the two octet + sequence: 0x68, 0x32. + + + + + The string "h2c" identifies the protocol where HTTP/2 is run over cleartext TCP. + This identifier is used in the HTTP/1.1 Upgrade header field and any place that + HTTP/2 over TCP is identified. + + + + + + Negotiating "h2" or "h2c" implies the use of the transport, security, framing and message + semantics described in this document. + + + RFC Editor's Note: please remove the remainder of this section prior to the + publication of a final version of this document. + + + Only implementations of the final, published RFC can identify themselves as "h2" or "h2c". + Until such an RFC exists, implementations MUST NOT identify themselves using these + strings. + + + Examples and text throughout the rest of this document use "h2" as a matter of + editorial convenience only. Implementations of draft versions MUST NOT identify using + this string. + + + Implementations of draft versions of the protocol MUST add the string "-" and the + corresponding draft number to the identifier. For example, draft-ietf-httpbis-http2-11 + over TLS is identified using the string "h2-11". + + + Non-compatible experiments that are based on these draft versions MUST append the string + "-" and an experiment name to the identifier. For example, an experimental implementation + of packet mood-based encoding based on draft-ietf-httpbis-http2-09 might identify itself + as "h2-09-emo". Note that any label MUST conform to the "token" syntax defined in + . Experimenters are + encouraged to coordinate their experiments on the ietf-http-wg@w3.org mailing list. + +
+ +
+ + A client that makes a request for an "http" URI without prior knowledge about support for + HTTP/2 uses the HTTP Upgrade mechanism (). The client makes an HTTP/1.1 request that includes an Upgrade + header field identifying HTTP/2 with the "h2c" token. The HTTP/1.1 request MUST include + exactly one HTTP2-Settings header field. + +
+ For example: + + +]]> +
+ + Requests that contain an entity body MUST be sent in their entirety before the client can + send HTTP/2 frames. This means that a large request entity can block the use of the + connection until it is completely sent. + + + If concurrency of an initial request with subsequent requests is important, an OPTIONS + request can be used to perform the upgrade to HTTP/2, at the cost of an additional + round-trip. + + + A server that does not support HTTP/2 can respond to the request as though the Upgrade + header field were absent: + +
+ +HTTP/1.1 200 OK +Content-Length: 243 +Content-Type: text/html + +... + +
+ + A server MUST ignore a "h2" token in an Upgrade header field. Presence of a token with + "h2" implies HTTP/2 over TLS, which is instead negotiated as described in . + + + A server that supports HTTP/2 can accept the upgrade with a 101 (Switching Protocols) + response. After the empty line that terminates the 101 response, the server can begin + sending HTTP/2 frames. These frames MUST include a response to the request that initiated + the Upgrade. + + +
+ + For example: + + +HTTP/1.1 101 Switching Protocols +Connection: Upgrade +Upgrade: h2c + +[ HTTP/2 connection ... + +
+ + The first HTTP/2 frame sent by the server is a SETTINGS frame () as the server connection preface (). Upon receiving the 101 response, the client sends a connection preface, which includes a + SETTINGS frame. + + + The HTTP/1.1 request that is sent prior to upgrade is assigned stream identifier 1 and is + assigned default priority values. Stream 1 is + implicitly half closed from the client toward the server, since the request is completed + as an HTTP/1.1 request. After commencing the HTTP/2 connection, stream 1 is used for the + response. + + +
+ + A request that upgrades from HTTP/1.1 to HTTP/2 MUST include exactly one HTTP2-Settings header field. The HTTP2-Settings header field is a connection-specific header field + that includes parameters that govern the HTTP/2 connection, provided in anticipation of + the server accepting the request to upgrade. + +
+ +
+ + A server MUST NOT upgrade the connection to HTTP/2 if this header field is not present, + or if more than one is present. A server MUST NOT send this header field. + + + + The content of the HTTP2-Settings header field is the + payload of a SETTINGS frame (), encoded as a + base64url string (that is, the URL- and filename-safe Base64 encoding described in , with any trailing '=' characters omitted). The + ABNF production for token68 is + defined in . + + + Since the upgrade is only intended to apply to the immediate connection, a client + sending HTTP2-Settings MUST also send HTTP2-Settings as a connection option in the Connection header field to prevent it from being forwarded + downstream. + + + A server decodes and interprets these values as it would any other + SETTINGS frame. Acknowledgement of the + SETTINGS parameters is not necessary, since a 101 response serves as implicit + acknowledgment. Providing these values in the Upgrade request gives a client an + opportunity to provide parameters prior to receiving any frames from the server. + +
+
+ +
+ + A client that makes a request to an "https" URI uses TLS + with the application layer protocol negotiation extension. + + + HTTP/2 over TLS uses the "h2" application token. The "h2c" token MUST NOT be sent by a + client or selected by a server. + + + Once TLS negotiation is complete, both the client and the server send a connection preface. + +
+ +
+ + A client can learn that a particular server supports HTTP/2 by other means. For example, + describes a mechanism for advertising this capability. + + + A client MAY immediately send HTTP/2 frames to a server that is known to support HTTP/2, + after the connection preface; a server can + identify such a connection by the presence of the connection preface. This only affects + the establishment of HTTP/2 connections over cleartext TCP; implementations that support + HTTP/2 over TLS MUST use protocol negotiation in TLS. + + + Without additional information, prior support for HTTP/2 is not a strong signal that a + given server will support HTTP/2 for future connections. For example, it is possible for + server configurations to change, for configurations to differ between instances in + clustered servers, or for network conditions to change. + +
+ +
+ + Upon establishment of a TCP connection and determination that HTTP/2 will be used by both + peers, each endpoint MUST send a connection preface as a final confirmation and to + establish the initial SETTINGS parameters for the HTTP/2 connection. The client and + server each send a different connection preface. + + + The client connection preface starts with a sequence of 24 octets, which in hex notation + are: + +
+ +
+ + (the string PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n). This sequence + is followed by a SETTINGS frame (). The + SETTINGS frame MAY be empty. The client sends the client connection + preface immediately upon receipt of a 101 Switching Protocols response (indicating a + successful upgrade), or as the first application data octets of a TLS connection. If + starting an HTTP/2 connection with prior knowledge of server support for the protocol, the + client connection preface is sent upon connection establishment. + + + + + The client connection preface is selected so that a large proportion of HTTP/1.1 or + HTTP/1.0 servers and intermediaries do not attempt to process further frames. Note + that this does not address the concerns raised in . + + + + + The server connection preface consists of a potentially empty SETTINGS + frame () that MUST be the first frame the server sends in the + HTTP/2 connection. + + + The SETTINGS frames received from a peer as part of the connection preface + MUST be acknowledged (see ) after sending the connection + preface. + + + To avoid unnecessary latency, clients are permitted to send additional frames to the + server immediately after sending the client connection preface, without waiting to receive + the server connection preface. It is important to note, however, that the server + connection preface SETTINGS frame might include parameters that necessarily + alter how a client is expected to communicate with the server. Upon receiving the + SETTINGS frame, the client is expected to honor any parameters established. + In some configurations, it is possible for the server to transmit SETTINGS + before the client sends additional frames, providing an opportunity to avoid this issue. + + + Clients and servers MUST treat an invalid connection preface as a connection error of type + PROTOCOL_ERROR. A GOAWAY frame () + MAY be omitted in this case, since an invalid preface indicates that the peer is not using + HTTP/2. + +
+
+ +
+ + Once the HTTP/2 connection is established, endpoints can begin exchanging frames. + + +
+ + All frames begin with a fixed 9-octet header followed by a variable-length payload. + +
+ +
+ + The fields of the frame header are defined as: + + + + The length of the frame payload expressed as an unsigned 24-bit integer. Values + greater than 214 (16,384) MUST NOT be sent unless the receiver has + set a larger value for SETTINGS_MAX_FRAME_SIZE. + + + The 9 octets of the frame header are not included in this value. + + + + + The 8-bit type of the frame. The frame type determines the format and semantics of + the frame. Implementations MUST ignore and discard any frame that has a type that + is unknown. + + + + + An 8-bit field reserved for frame-type specific boolean flags. + + + Flags are assigned semantics specific to the indicated frame type. Flags that have + no defined semantics for a particular frame type MUST be ignored, and MUST be left + unset (0) when sending. + + + + + A reserved 1-bit field. The semantics of this bit are undefined and the bit MUST + remain unset (0) when sending and MUST be ignored when receiving. + + + + + A 31-bit stream identifier (see ). The value 0 is + reserved for frames that are associated with the connection as a whole as opposed to + an individual stream. + + + + + + The structure and content of the frame payload is dependent entirely on the frame type. + +
+ +
+ + The size of a frame payload is limited by the maximum size that a receiver advertises in + the SETTINGS_MAX_FRAME_SIZE setting. This setting can have any value + between 214 (16,384) and 224-1 (16,777,215) octets, + inclusive. + + + All implementations MUST be capable of receiving and minimally processing frames up to + 214 octets in length, plus the 9 octet frame + header. The size of the frame header is not included when describing frame sizes. + + + Certain frame types, such as PING, impose additional limits + on the amount of payload data allowed. + + + + + If a frame size exceeds any defined limit, or is too small to contain mandatory frame + data, the endpoint MUST send a FRAME_SIZE_ERROR error. A frame size error + in a frame that could alter the state of the entire connection MUST be treated as a connection error; this includes any frame carrying + a header block (that is, HEADERS, + PUSH_PROMISE, and CONTINUATION), SETTINGS, + and any WINDOW_UPDATE frame with a stream identifier of 0. + + + Endpoints are not obligated to use all available space in a frame. Responsiveness can be + improved by using frames that are smaller than the permitted maximum size. Sending large + frames can result in delays in sending time-sensitive frames (such + RST_STREAM, WINDOW_UPDATE, or PRIORITY) + which if blocked by the transmission of a large frame, could affect performance. + +
+ +
+ + Just as in HTTP/1, a header field in HTTP/2 is a name with one or more associated values. + They are used within HTTP request and response messages as well as server push operations + (see ). + + + Header lists are collections of zero or more header fields. When transmitted over a + connection, a header list is serialized into a header block using HTTP Header Compression. The serialized header block is then + divided into one or more octet sequences, called header block fragments, and transmitted + within the payload of HEADERS, PUSH_PROMISE or CONTINUATION frames. + + + The Cookie header field is treated specially by the HTTP + mapping (see ). + + + A receiving endpoint reassembles the header block by concatenating its fragments, then + decompresses the block to reconstruct the header list. + + + A complete header block consists of either: + + + a single HEADERS or PUSH_PROMISE frame, + with the END_HEADERS flag set, or + + + a HEADERS or PUSH_PROMISE frame with the END_HEADERS + flag cleared and one or more CONTINUATION frames, + where the last CONTINUATION frame has the END_HEADERS flag set. + + + + + Header compression is stateful. One compression context and one decompression context is + used for the entire connection. Each header block is processed as a discrete unit. + Header blocks MUST be transmitted as a contiguous sequence of frames, with no interleaved + frames of any other type or from any other stream. The last frame in a sequence of + HEADERS or CONTINUATION frames MUST have the END_HEADERS + flag set. The last frame in a sequence of PUSH_PROMISE or + CONTINUATION frames MUST have the END_HEADERS flag set. This allows a + header block to be logically equivalent to a single frame. + + + Header block fragments can only be sent as the payload of HEADERS, + PUSH_PROMISE or CONTINUATION frames, because these frames + carry data that can modify the compression context maintained by a receiver. An endpoint + receiving HEADERS, PUSH_PROMISE or + CONTINUATION frames MUST reassemble header blocks and perform decompression + even if the frames are to be discarded. A receiver MUST terminate the connection with a + connection error of type + COMPRESSION_ERROR if it does not decompress a header block. + +
+
+ +
+ + A "stream" is an independent, bi-directional sequence of frames exchanged between the client + and server within an HTTP/2 connection. Streams have several important characteristics: + + + A single HTTP/2 connection can contain multiple concurrently open streams, with either + endpoint interleaving frames from multiple streams. + + + Streams can be established and used unilaterally or shared by either the client or + server. + + + Streams can be closed by either endpoint. + + + The order in which frames are sent on a stream is significant. Recipients process frames + in the order they are received. In particular, the order of HEADERS, + and DATA frames is semantically significant. + + + Streams are identified by an integer. Stream identifiers are assigned to streams by the + endpoint initiating the stream. + + + + +
+ + The lifecycle of a stream is shown in . + + +
+ + | |<-----------' | + | R | closed | R | + `-------------------->| |<--------------------' + +--------+ + + H: HEADERS frame (with implied CONTINUATIONs) + PP: PUSH_PROMISE frame (with implied CONTINUATIONs) + ES: END_STREAM flag + R: RST_STREAM frame +]]> + +
+ + + Note that this diagram shows stream state transitions and the frames and flags that affect + those transitions only. In this regard, CONTINUATION frames do not result + in state transitions; they are effectively part of the HEADERS or + PUSH_PROMISE that they follow. For this purpose, the END_STREAM flag is + processed as a separate event to the frame that bears it; a HEADERS frame + with the END_STREAM flag set can cause two state transitions. + + + Both endpoints have a subjective view of the state of a stream that could be different + when frames are in transit. Endpoints do not coordinate the creation of streams; they are + created unilaterally by either endpoint. The negative consequences of a mismatch in + states are limited to the "closed" state after sending RST_STREAM, where + frames might be received for some time after closing. + + + Streams have the following states: + + + + + + All streams start in the "idle" state. In this state, no frames have been + exchanged. + + + The following transitions are valid from this state: + + + Sending or receiving a HEADERS frame causes the stream to become + "open". The stream identifier is selected as described in . The same HEADERS frame can also + cause a stream to immediately become "half closed". + + + Sending a PUSH_PROMISE frame marks the associated stream for + later use. The stream state for the reserved stream transitions to "reserved + (local)". + + + Receiving a PUSH_PROMISE frame marks the associated stream as + reserved by the remote peer. The state of the stream becomes "reserved + (remote)". + + + + + Receiving any frames other than HEADERS or + PUSH_PROMISE on a stream in this state MUST be treated as a connection error of type + PROTOCOL_ERROR. + + + + + + + A stream in the "reserved (local)" state is one that has been promised by sending a + PUSH_PROMISE frame. A PUSH_PROMISE frame reserves an + idle stream by associating the stream with an open stream that was initiated by the + remote peer (see ). + + + In this state, only the following transitions are possible: + + + The endpoint can send a HEADERS frame. This causes the stream to + open in a "half closed (remote)" state. + + + Either endpoint can send a RST_STREAM frame to cause the stream + to become "closed". This releases the stream reservation. + + + + + An endpoint MUST NOT send any type of frame other than HEADERS or + RST_STREAM in this state. + + + A PRIORITY frame MAY be received in this state. Receiving any type + of frame other than RST_STREAM or PRIORITY on a stream + in this state MUST be treated as a connection + error of type PROTOCOL_ERROR. + + + + + + + A stream in the "reserved (remote)" state has been reserved by a remote peer. + + + In this state, only the following transitions are possible: + + + Receiving a HEADERS frame causes the stream to transition to + "half closed (local)". + + + Either endpoint can send a RST_STREAM frame to cause the stream + to become "closed". This releases the stream reservation. + + + + + An endpoint MAY send a PRIORITY frame in this state to reprioritize + the reserved stream. An endpoint MUST NOT send any type of frame other than + RST_STREAM, WINDOW_UPDATE, or PRIORITY + in this state. + + + Receiving any type of frame other than HEADERS or + RST_STREAM on a stream in this state MUST be treated as a connection error of type + PROTOCOL_ERROR. + + + + + + + A stream in the "open" state may be used by both peers to send frames of any type. + In this state, sending peers observe advertised stream + level flow control limits. + + + From this state either endpoint can send a frame with an END_STREAM flag set, which + causes the stream to transition into one of the "half closed" states: an endpoint + sending an END_STREAM flag causes the stream state to become "half closed (local)"; + an endpoint receiving an END_STREAM flag causes the stream state to become "half + closed (remote)". + + + Either endpoint can send a RST_STREAM frame from this state, causing + it to transition immediately to "closed". + + + + + + + A stream that is in the "half closed (local)" state cannot be used for sending + frames. Only WINDOW_UPDATE, PRIORITY and + RST_STREAM frames can be sent in this state. + + + A stream transitions from this state to "closed" when a frame that contains an + END_STREAM flag is received, or when either peer sends a RST_STREAM + frame. + + + A receiver can ignore WINDOW_UPDATE frames in this state, which might + arrive for a short period after a frame bearing the END_STREAM flag is sent. + + + PRIORITY frames received in this state are used to reprioritize + streams that depend on the current stream. + + + + + + + A stream that is "half closed (remote)" is no longer being used by the peer to send + frames. In this state, an endpoint is no longer obligated to maintain a receiver + flow control window if it performs flow control. + + + If an endpoint receives additional frames for a stream that is in this state, other + than WINDOW_UPDATE, PRIORITY or + RST_STREAM, it MUST respond with a stream error of type + STREAM_CLOSED. + + + A stream that is "half closed (remote)" can be used by the endpoint to send frames + of any type. In this state, the endpoint continues to observe advertised stream level flow control limits. + + + A stream can transition from this state to "closed" by sending a frame that contains + an END_STREAM flag, or when either peer sends a RST_STREAM frame. + + + + + + + The "closed" state is the terminal state. + + + An endpoint MUST NOT send frames other than PRIORITY on a closed + stream. An endpoint that receives any frame other than PRIORITY + after receiving a RST_STREAM MUST treat that as a stream error of type + STREAM_CLOSED. Similarly, an endpoint that receives any frames after + receiving a frame with the END_STREAM flag set MUST treat that as a connection error of type + STREAM_CLOSED, unless the frame is permitted as described below. + + + WINDOW_UPDATE or RST_STREAM frames can be received in + this state for a short period after a DATA or HEADERS + frame containing an END_STREAM flag is sent. Until the remote peer receives and + processes RST_STREAM or the frame bearing the END_STREAM flag, it + might send frames of these types. Endpoints MUST ignore + WINDOW_UPDATE or RST_STREAM frames received in this + state, though endpoints MAY choose to treat frames that arrive a significant time + after sending END_STREAM as a connection + error of type PROTOCOL_ERROR. + + + PRIORITY frames can be sent on closed streams to prioritize streams + that are dependent on the closed stream. Endpoints SHOULD process + PRIORITY frame, though they can be ignored if the stream has been + removed from the dependency tree (see ). + + + If this state is reached as a result of sending a RST_STREAM frame, + the peer that receives the RST_STREAM might have already sent - or + enqueued for sending - frames on the stream that cannot be withdrawn. An endpoint + MUST ignore frames that it receives on closed streams after it has sent a + RST_STREAM frame. An endpoint MAY choose to limit the period over + which it ignores frames and treat frames that arrive after this time as being in + error. + + + Flow controlled frames (i.e., DATA) received after sending + RST_STREAM are counted toward the connection flow control window. + Even though these frames might be ignored, because they are sent before the sender + receives the RST_STREAM, the sender will consider the frames to count + against the flow control window. + + + An endpoint might receive a PUSH_PROMISE frame after it sends + RST_STREAM. PUSH_PROMISE causes a stream to become + "reserved" even if the associated stream has been reset. Therefore, a + RST_STREAM is needed to close an unwanted promised stream. + + + + + + In the absence of more specific guidance elsewhere in this document, implementations + SHOULD treat the receipt of a frame that is not expressly permitted in the description of + a state as a connection error of type + PROTOCOL_ERROR. Frame of unknown types are ignored. + + + An example of the state transitions for an HTTP request/response exchange can be found in + . An example of the state transitions for server push can be + found in and . + + +
+ + Streams are identified with an unsigned 31-bit integer. Streams initiated by a client + MUST use odd-numbered stream identifiers; those initiated by the server MUST use + even-numbered stream identifiers. A stream identifier of zero (0x0) is used for + connection control messages; the stream identifier zero cannot be used to establish a + new stream. + + + HTTP/1.1 requests that are upgraded to HTTP/2 (see ) are + responded to with a stream identifier of one (0x1). After the upgrade + completes, stream 0x1 is "half closed (local)" to the client. Therefore, stream 0x1 + cannot be selected as a new stream identifier by a client that upgrades from HTTP/1.1. + + + The identifier of a newly established stream MUST be numerically greater than all + streams that the initiating endpoint has opened or reserved. This governs streams that + are opened using a HEADERS frame and streams that are reserved using + PUSH_PROMISE. An endpoint that receives an unexpected stream identifier + MUST respond with a connection error of + type PROTOCOL_ERROR. + + + The first use of a new stream identifier implicitly closes all streams in the "idle" + state that might have been initiated by that peer with a lower-valued stream identifier. + For example, if a client sends a HEADERS frame on stream 7 without ever + sending a frame on stream 5, then stream 5 transitions to the "closed" state when the + first frame for stream 7 is sent or received. + + + Stream identifiers cannot be reused. Long-lived connections can result in an endpoint + exhausting the available range of stream identifiers. A client that is unable to + establish a new stream identifier can establish a new connection for new streams. A + server that is unable to establish a new stream identifier can send a + GOAWAY frame so that the client is forced to open a new connection for + new streams. + +
+ +
+ + A peer can limit the number of concurrently active streams using the + SETTINGS_MAX_CONCURRENT_STREAMS parameter (see ) within a SETTINGS frame. The maximum concurrent + streams setting is specific to each endpoint and applies only to the peer that receives + the setting. That is, clients specify the maximum number of concurrent streams the + server can initiate, and servers specify the maximum number of concurrent streams the + client can initiate. + + + Streams that are in the "open" state, or either of the "half closed" states count toward + the maximum number of streams that an endpoint is permitted to open. Streams in any of + these three states count toward the limit advertised in the + SETTINGS_MAX_CONCURRENT_STREAMS setting. Streams in either of the + "reserved" states do not count toward the stream limit. + + + Endpoints MUST NOT exceed the limit set by their peer. An endpoint that receives a + HEADERS frame that causes their advertised concurrent stream limit to be + exceeded MUST treat this as a stream error. An + endpoint that wishes to reduce the value of + SETTINGS_MAX_CONCURRENT_STREAMS to a value that is below the current + number of open streams can either close streams that exceed the new value or allow + streams to complete. + +
+
+ +
+ + Using streams for multiplexing introduces contention over use of the TCP connection, + resulting in blocked streams. A flow control scheme ensures that streams on the same + connection do not destructively interfere with each other. Flow control is used for both + individual streams and for the connection as a whole. + + + HTTP/2 provides for flow control through use of the WINDOW_UPDATE frame. + + +
+ + HTTP/2 stream flow control aims to allow a variety of flow control algorithms to be + used without requiring protocol changes. Flow control in HTTP/2 has the following + characteristics: + + + Flow control is specific to a connection; i.e., it is "hop-by-hop", not + "end-to-end". + + + Flow control is based on window update frames. Receivers advertise how many octets + they are prepared to receive on a stream and for the entire connection. This is a + credit-based scheme. + + + Flow control is directional with overall control provided by the receiver. A + receiver MAY choose to set any window size that it desires for each stream and for + the entire connection. A sender MUST respect flow control limits imposed by a + receiver. Clients, servers and intermediaries all independently advertise their + flow control window as a receiver and abide by the flow control limits set by + their peer when sending. + + + The initial value for the flow control window is 65,535 octets for both new streams + and the overall connection. + + + The frame type determines whether flow control applies to a frame. Of the frames + specified in this document, only DATA frames are subject to flow + control; all other frame types do not consume space in the advertised flow control + window. This ensures that important control frames are not blocked by flow control. + + + Flow control cannot be disabled. + + + HTTP/2 defines only the format and semantics of the WINDOW_UPDATE + frame (). This document does not stipulate how a + receiver decides when to send this frame or the value that it sends, nor does it + specify how a sender chooses to send packets. Implementations are able to select + any algorithm that suits their needs. + + + + + Implementations are also responsible for managing how requests and responses are sent + based on priority; choosing how to avoid head of line blocking for requests; and + managing the creation of new streams. Algorithm choices for these could interact with + any flow control algorithm. + +
+ +
+ + Flow control is defined to protect endpoints that are operating under resource + constraints. For example, a proxy needs to share memory between many connections, and + also might have a slow upstream connection and a fast downstream one. Flow control + addresses cases where the receiver is unable process data on one stream, yet wants to + continue to process other streams in the same connection. + + + Deployments that do not require this capability can advertise a flow control window of + the maximum size, incrementing the available space when new data is received. This + effectively disables flow control for that receiver. Conversely, a sender is always + subject to the flow control window advertised by the receiver. + + + Deployments with constrained resources (for example, memory) can employ flow control to + limit the amount of memory a peer can consume. Note, however, that this can lead to + suboptimal use of available network resources if flow control is enabled without + knowledge of the bandwidth-delay product (see ). + + + Even with full awareness of the current bandwidth-delay product, implementation of flow + control can be difficult. When using flow control, the receiver MUST read from the TCP + receive buffer in a timely fashion. Failure to do so could lead to a deadlock when + critical frames, such as WINDOW_UPDATE, are not read and acted upon. + +
+
+ +
+ + A client can assign a priority for a new stream by including prioritization information in + the HEADERS frame that opens the stream. For an existing + stream, the PRIORITY frame can be used to change the + priority. + + + The purpose of prioritization is to allow an endpoint to express how it would prefer its + peer allocate resources when managing concurrent streams. Most importantly, priority can + be used to select streams for transmitting frames when there is limited capacity for + sending. + + + Streams can be prioritized by marking them as dependent on the completion of other streams + (). Each dependency is assigned a relative weight, a number + that is used to determine the relative proportion of available resources that are assigned + to streams dependent on the same stream. + + + + Explicitly setting the priority for a stream is input to a prioritization process. It + does not guarantee any particular processing or transmission order for the stream relative + to any other stream. An endpoint cannot force a peer to process concurrent streams in a + particular order using priority. Expressing priority is therefore only ever a suggestion. + + + Providing prioritization information is optional, so default values are used if no + explicit indicator is provided (). + + +
+ + Each stream can be given an explicit dependency on another stream. Including a + dependency expresses a preference to allocate resources to the identified stream rather + than to the dependent stream. + + + A stream that is not dependent on any other stream is given a stream dependency of 0x0. + In other words, the non-existent stream 0 forms the root of the tree. + + + A stream that depends on another stream is a dependent stream. The stream upon which a + stream is dependent is a parent stream. A dependency on a stream that is not currently + in the tree - such as a stream in the "idle" state - results in that stream being given + a default priority. + + + When assigning a dependency on another stream, the stream is added as a new dependency + of the parent stream. Dependent streams that share the same parent are not ordered with + respect to each other. For example, if streams B and C are dependent on stream A, and + if stream D is created with a dependency on stream A, this results in a dependency order + of A followed by B, C, and D in any order. + +
+ /|\ + B C B D C +]]> +
+ + An exclusive flag allows for the insertion of a new level of dependencies. The + exclusive flag causes the stream to become the sole dependency of its parent stream, + causing other dependencies to become dependent on the exclusive stream. In the + previous example, if stream D is created with an exclusive dependency on stream A, this + results in D becoming the dependency parent of B and C. + +
+ D + B C / \ + B C +]]> +
+ + Inside the dependency tree, a dependent stream SHOULD only be allocated resources if all + of the streams that it depends on (the chain of parent streams up to 0x0) are either + closed, or it is not possible to make progress on them. + + + A stream cannot depend on itself. An endpoint MUST treat this as a stream error of type PROTOCOL_ERROR. + +
+ +
+ + All dependent streams are allocated an integer weight between 1 and 256 (inclusive). + + + Streams with the same parent SHOULD be allocated resources proportionally based on their + weight. Thus, if stream B depends on stream A with weight 4, and C depends on stream A + with weight 12, and if no progress can be made on A, stream B ideally receives one third + of the resources allocated to stream C. + +
+ +
+ + Stream priorities are changed using the PRIORITY frame. Setting a + dependency causes a stream to become dependent on the identified parent stream. + + + Dependent streams move with their parent stream if the parent is reprioritized. Setting + a dependency with the exclusive flag for a reprioritized stream moves all the + dependencies of the new parent stream to become dependent on the reprioritized stream. + + + If a stream is made dependent on one of its own dependencies, the formerly dependent + stream is first moved to be dependent on the reprioritized stream's previous parent. + The moved dependency retains its weight. + +
+ + For example, consider an original dependency tree where B and C depend on A, D and E + depend on C, and F depends on D. If A is made dependent on D, then D takes the place + of A. All other dependency relationships stay the same, except for F, which becomes + dependent on A if the reprioritization is exclusive. + + F B C ==> F A OR A + / \ | / \ /|\ + D E E B C B C F + | | | + F E E + (intermediate) (non-exclusive) (exclusive) +]]> +
+
+ +
+ + When a stream is removed from the dependency tree, its dependencies can be moved to + become dependent on the parent of the closed stream. The weights of new dependencies + are recalculated by distributing the weight of the dependency of the closed stream + proportionally based on the weights of its dependencies. + + + Streams that are removed from the dependency tree cause some prioritization information + to be lost. Resources are shared between streams with the same parent stream, which + means that if a stream in that set closes or becomes blocked, any spare capacity + allocated to a stream is distributed to the immediate neighbors of the stream. However, + if the common dependency is removed from the tree, those streams share resources with + streams at the next highest level. + + + For example, assume streams A and B share a parent, and streams C and D both depend on + stream A. Prior to the removal of stream A, if streams A and D are unable to proceed, + then stream C receives all the resources dedicated to stream A. If stream A is removed + from the tree, the weight of stream A is divided between streams C and D. If stream D + is still unable to proceed, this results in stream C receiving a reduced proportion of + resources. For equal starting weights, C receives one third, rather than one half, of + available resources. + + + It is possible for a stream to become closed while prioritization information that + creates a dependency on that stream is in transit. If a stream identified in a + dependency has no associated priority information, then the dependent stream is instead + assigned a default priority. This potentially creates + suboptimal prioritization, since the stream could be given a priority that is different + to what is intended. + + + To avoid these problems, an endpoint SHOULD retain stream prioritization state for a + period after streams become closed. The longer state is retained, the lower the chance + that streams are assigned incorrect or default priority values. + + + This could create a large state burden for an endpoint, so this state MAY be limited. + An endpoint MAY apply a fixed upper limit on the number of closed streams for which + prioritization state is tracked to limit state exposure. The amount of additional state + an endpoint maintains could be dependent on load; under high load, prioritization state + can be discarded to limit resource commitments. In extreme cases, an endpoint could + even discard prioritization state for active or reserved streams. If a fixed limit is + applied, endpoints SHOULD maintain state for at least as many streams as allowed by + their setting for SETTINGS_MAX_CONCURRENT_STREAMS. + + + An endpoint receiving a PRIORITY frame that changes the priority of a + closed stream SHOULD alter the dependencies of the streams that depend on it, if it has + retained enough state to do so. + +
+ +
+ + Providing priority information is optional. Streams are assigned a non-exclusive + dependency on stream 0x0 by default. Pushed streams + initially depend on their associated stream. In both cases, streams are assigned a + default weight of 16. + +
+
+ +
+ + HTTP/2 framing permits two classes of error: + + + An error condition that renders the entire connection unusable is a connection error. + + + An error in an individual stream is a stream error. + + + + + A list of error codes is included in . + + +
+ + A connection error is any error which prevents further processing of the framing layer, + or which corrupts any connection state. + + + An endpoint that encounters a connection error SHOULD first send a GOAWAY + frame () with the stream identifier of the last stream that it + successfully received from its peer. The GOAWAY frame includes an error + code that indicates why the connection is terminating. After sending the + GOAWAY frame, the endpoint MUST close the TCP connection. + + + It is possible that the GOAWAY will not be reliably received by the + receiving endpoint (see ). In the event of a connection error, + GOAWAY only provides a best effort attempt to communicate with the peer + about why the connection is being terminated. + + + An endpoint can end a connection at any time. In particular, an endpoint MAY choose to + treat a stream error as a connection error. Endpoints SHOULD send a + GOAWAY frame when ending a connection, providing that circumstances + permit it. + +
+ +
+ + A stream error is an error related to a specific stream that does not affect processing + of other streams. + + + An endpoint that detects a stream error sends a RST_STREAM frame () that contains the stream identifier of the stream where the error + occurred. The RST_STREAM frame includes an error code that indicates the + type of error. + + + A RST_STREAM is the last frame that an endpoint can send on a stream. + The peer that sends the RST_STREAM frame MUST be prepared to receive any + frames that were sent or enqueued for sending by the remote peer. These frames can be + ignored, except where they modify connection state (such as the state maintained for + header compression, or flow control). + + + Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame for + any stream. However, an endpoint MAY send additional RST_STREAM frames if + it receives frames on a closed stream after more than a round-trip time. This behavior + is permitted to deal with misbehaving implementations. + + + An endpoint MUST NOT send a RST_STREAM in response to an + RST_STREAM frame, to avoid looping. + +
+ +
+ + If the TCP connection is closed or reset while streams remain in open or half closed + states, then the endpoint MUST assume that those streams were abnormally interrupted and + could be incomplete. + +
+
+ +
+ + HTTP/2 permits extension of the protocol. Protocol extensions can be used to provide + additional services or alter any aspect of the protocol, within the limitations described + in this section. Extensions are effective only within the scope of a single HTTP/2 + connection. + + + Extensions are permitted to use new frame types, new + settings, or new error + codes. Registries are established for managing these extension points: frame types, settings and + error codes. + + + Implementations MUST ignore unknown or unsupported values in all extensible protocol + elements. Implementations MUST discard frames that have unknown or unsupported types. + This means that any of these extension points can be safely used by extensions without + prior arrangement or negotiation. However, extension frames that appear in the middle of + a header block are not permitted; these MUST be treated + as a connection error of type + PROTOCOL_ERROR. + + + However, extensions that could change the semantics of existing protocol components MUST + be negotiated before being used. For example, an extension that changes the layout of the + HEADERS frame cannot be used until the peer has given a positive signal + that this is acceptable. In this case, it could also be necessary to coordinate when the + revised layout comes into effect. Note that treating any frame other than + DATA frames as flow controlled is such a change in semantics, and can only + be done through negotiation. + + + This document doesn't mandate a specific method for negotiating the use of an extension, + but notes that a setting could be used for that + purpose. If both peers set a value that indicates willingness to use the extension, then + the extension can be used. If a setting is used for extension negotiation, the initial + value MUST be defined so that the extension is initially disabled. + +
+
+ +
+ + This specification defines a number of frame types, each identified by a unique 8-bit type + code. Each frame type serves a distinct purpose either in the establishment and management + of the connection as a whole, or of individual streams. + + + The transmission of specific frame types can alter the state of a connection. If endpoints + fail to maintain a synchronized view of the connection state, successful communication + within the connection will no longer be possible. Therefore, it is important that endpoints + have a shared comprehension of how the state is affected by the use any given frame. + + +
+ + DATA frames (type=0x0) convey arbitrary, variable-length sequences of octets associated + with a stream. One or more DATA frames are used, for instance, to carry HTTP request or + response payloads. + + + DATA frames MAY also contain arbitrary padding. Padding can be added to DATA frames to + obscure the size of messages. + +
+ +
+ + The DATA frame contains the following fields: + + + An 8-bit field containing the length of the frame padding in units of octets. This + field is optional and is only present if the PADDED flag is set. + + + Application data. The amount of data is the remainder of the frame payload after + subtracting the length of the other fields that are present. + + + Padding octets that contain no application semantic value. Padding octets MUST be set + to zero when sending and ignored when receiving. + + + + + + The DATA frame defines the following flags: + + + Bit 1 being set indicates that this frame is the last that the endpoint will send for + the identified stream. Setting this flag causes the stream to enter one of the "half closed" states or the "closed" state. + + + Bit 4 being set indicates that the Pad Length field and any padding that it describes + is present. + + + + + DATA frames MUST be associated with a stream. If a DATA frame is received whose stream + identifier field is 0x0, the recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + DATA frames are subject to flow control and can only be sent when a stream is in the + "open" or "half closed (remote)" states. The entire DATA frame payload is included in flow + control, including Pad Length and Padding fields if present. If a DATA frame is received + whose stream is not in "open" or "half closed (local)" state, the recipient MUST respond + with a stream error of type + STREAM_CLOSED. + + + The total number of padding octets is determined by the value of the Pad Length field. If + the length of the padding is greater than the length of the frame payload, the recipient + MUST treat this as a connection error of + type PROTOCOL_ERROR. + + + A frame can be increased in size by one octet by including a Pad Length field with a + value of zero. + + + + + Padding is a security feature; see . + +
+ +
+ + The HEADERS frame (type=0x1) is used to open a stream, + and additionally carries a header block fragment. HEADERS frames can be sent on a stream + in the "open" or "half closed (remote)" states. + +
+ +
+ + The HEADERS frame payload has the following fields: + + + An 8-bit field containing the length of the frame padding in units of octets. This + field is only present if the PADDED flag is set. + + + A single bit flag indicates that the stream dependency is exclusive, see . This field is only present if the PRIORITY flag is set. + + + A 31-bit stream identifier for the stream that this stream depends on, see . This field is only present if the PRIORITY flag is set. + + + An 8-bit weight for the stream, see . Add one to the + value to obtain a weight between 1 and 256. This field is only present if the + PRIORITY flag is set. + + + A header block fragment. + + + Padding octets that contain no application semantic value. Padding octets MUST be set + to zero when sending and ignored when receiving. + + + + + + The HEADERS frame defines the following flags: + + + + Bit 1 being set indicates that the header block is + the last that the endpoint will send for the identified stream. Setting this flag + causes the stream to enter one of "half closed" + states. + + + A HEADERS frame carries the END_STREAM flag that signals the end of a stream. + However, a HEADERS frame with the END_STREAM flag set can be followed by + CONTINUATION frames on the same stream. Logically, the + CONTINUATION frames are part of the HEADERS frame. + + + + + Bit 3 being set indicates that this frame contains an entire header block and is not followed by any + CONTINUATION frames. + + + A HEADERS frame without the END_HEADERS flag set MUST be followed by a + CONTINUATION frame for the same stream. A receiver MUST treat the + receipt of any other type of frame or a frame on a different stream as a connection error of type + PROTOCOL_ERROR. + + + + + Bit 4 being set indicates that the Pad Length field and any padding that it + describes is present. + + + + + Bit 6 being set indicates that the Exclusive Flag (E), Stream Dependency, and Weight + fields are present; see . + + + + + + + The payload of a HEADERS frame contains a header block + fragment. A header block that does not fit within a HEADERS frame is continued in + a CONTINUATION frame. + + + + HEADERS frames MUST be associated with a stream. If a HEADERS frame is received whose + stream identifier field is 0x0, the recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + + The HEADERS frame changes the connection state as described in . + + + + The HEADERS frame includes optional padding. Padding fields and flags are identical to + those defined for DATA frames. + + + Prioritization information in a HEADERS frame is logically equivalent to a separate + PRIORITY frame, but inclusion in HEADERS avoids the potential for churn in + stream prioritization when new streams are created. Priorization fields in HEADERS frames + subsequent to the first on a stream reprioritize the + stream. + +
+ +
+ + The PRIORITY frame (type=0x2) specifies the sender-advised + priority of a stream. It can be sent at any time for an existing stream, including + closed streams. This enables reprioritization of existing streams. + +
+ +
+ + The payload of a PRIORITY frame contains the following fields: + + + A single bit flag indicates that the stream dependency is exclusive, see . + + + A 31-bit stream identifier for the stream that this stream depends on, see . + + + An 8-bit weight for the identified stream dependency, see . Add one to the value to obtain a weight between 1 and 256. + + + + + + The PRIORITY frame does not define any flags. + + + + The PRIORITY frame is associated with an existing stream. If a PRIORITY frame is received + with a stream identifier of 0x0, the recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + The PRIORITY frame can be sent on a stream in any of the "reserved (remote)", "open", + "half closed (local)", "half closed (remote)", or "closed" states, though it cannot be + sent between consecutive frames that comprise a single header + block. Note that this frame could arrive after processing or frame sending has + completed, which would cause it to have no effect on the current stream. For a stream + that is in the "half closed (remote)" or "closed" - state, this frame can only affect + processing of the current stream and not frame transmission. + + + The PRIORITY frame is the only frame that can be sent for a stream in the "closed" state. + This allows for the reprioritization of a group of dependent streams by altering the + priority of a parent stream, which might be closed. However, a PRIORITY frame sent on a + closed stream risks being ignored due to the peer having discarded priority state + information for that stream. + +
+ +
+ + The RST_STREAM frame (type=0x3) allows for abnormal termination of a stream. When sent by + the initiator of a stream, it indicates that they wish to cancel the stream or that an + error condition has occurred. When sent by the receiver of a stream, it indicates that + either the receiver is rejecting the stream, requesting that the stream be cancelled, or + that an error condition has occurred. + +
+ +
+ + + The RST_STREAM frame contains a single unsigned, 32-bit integer identifying the error code. The error code indicates why the stream is being + terminated. + + + + The RST_STREAM frame does not define any flags. + + + + The RST_STREAM frame fully terminates the referenced stream and causes it to enter the + closed state. After receiving a RST_STREAM on a stream, the receiver MUST NOT send + additional frames for that stream, with the exception of PRIORITY. However, + after sending the RST_STREAM, the sending endpoint MUST be prepared to receive and process + additional frames sent on the stream that might have been sent by the peer prior to the + arrival of the RST_STREAM. + + + + RST_STREAM frames MUST be associated with a stream. If a RST_STREAM frame is received + with a stream identifier of 0x0, the recipient MUST treat this as a connection error of type + PROTOCOL_ERROR. + + + + RST_STREAM frames MUST NOT be sent for a stream in the "idle" state. If a RST_STREAM + frame identifying an idle stream is received, the recipient MUST treat this as a connection error of type + PROTOCOL_ERROR. + + +
+ +
+ + The SETTINGS frame (type=0x4) conveys configuration parameters that affect how endpoints + communicate, such as preferences and constraints on peer behavior. The SETTINGS frame is + also used to acknowledge the receipt of those parameters. Individually, a SETTINGS + parameter can also be referred to as a "setting". + + + SETTINGS parameters are not negotiated; they describe characteristics of the sending peer, + which are used by the receiving peer. Different values for the same parameter can be + advertised by each peer. For example, a client might set a high initial flow control + window, whereas a server might set a lower value to conserve resources. + + + + A SETTINGS frame MUST be sent by both endpoints at the start of a connection, and MAY be + sent at any other time by either endpoint over the lifetime of the connection. + Implementations MUST support all of the parameters defined by this specification. + + + + Each parameter in a SETTINGS frame replaces any existing value for that parameter. + Parameters are processed in the order in which they appear, and a receiver of a SETTINGS + frame does not need to maintain any state other than the current value of its + parameters. Therefore, the value of a SETTINGS parameter is the last value that is seen by + a receiver. + + + SETTINGS parameters are acknowledged by the receiving peer. To enable this, the SETTINGS + frame defines the following flag: + + + Bit 1 being set indicates that this frame acknowledges receipt and application of the + peer's SETTINGS frame. When this bit is set, the payload of the SETTINGS frame MUST + be empty. Receipt of a SETTINGS frame with the ACK flag set and a length field value + other than 0 MUST be treated as a connection + error of type FRAME_SIZE_ERROR. For more info, see Settings Synchronization. + + + + + SETTINGS frames always apply to a connection, never a single stream. The stream + identifier for a SETTINGS frame MUST be zero (0x0). If an endpoint receives a SETTINGS + frame whose stream identifier field is anything other than 0x0, the endpoint MUST respond + with a connection error of type + PROTOCOL_ERROR. + + + The SETTINGS frame affects connection state. A badly formed or incomplete SETTINGS frame + MUST be treated as a connection error of type + PROTOCOL_ERROR. + + +
+ + The payload of a SETTINGS frame consists of zero or more parameters, each consisting of + an unsigned 16-bit setting identifier and an unsigned 32-bit value. + + +
+ +
+
+ +
+ + The following parameters are defined: + + + + Allows the sender to inform the remote endpoint of the maximum size of the header + compression table used to decode header blocks, in octets. The encoder can select + any size equal to or less than this value by using signaling specific to the + header compression format inside a header block. The initial value is 4,096 + octets. + + + + + This setting can be use to disable server + push. An endpoint MUST NOT send a PUSH_PROMISE frame if it + receives this parameter set to a value of 0. An endpoint that has both set this + parameter to 0 and had it acknowledged MUST treat the receipt of a + PUSH_PROMISE frame as a connection error of type + PROTOCOL_ERROR. + + + The initial value is 1, which indicates that server push is permitted. Any value + other than 0 or 1 MUST be treated as a connection error of type + PROTOCOL_ERROR. + + + + + Indicates the maximum number of concurrent streams that the sender will allow. + This limit is directional: it applies to the number of streams that the sender + permits the receiver to create. Initially there is no limit to this value. It is + recommended that this value be no smaller than 100, so as to not unnecessarily + limit parallelism. + + + A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be treated as special + by endpoints. A zero value does prevent the creation of new streams, however this + can also happen for any limit that is exhausted with active streams. Servers + SHOULD only set a zero value for short durations; if a server does not wish to + accept requests, closing the connection could be preferable. + + + + + Indicates the sender's initial window size (in octets) for stream level flow + control. The initial value is 216-1 (65,535) octets. + + + This setting affects the window size of all streams, including existing streams, + see . + + + Values above the maximum flow control window size of 231-1 MUST + be treated as a connection error of + type FLOW_CONTROL_ERROR. + + + + + Indicates the size of the largest frame payload that the sender is willing to + receive, in octets. + + + The initial value is 214 (16,384) octets. The value advertised by + an endpoint MUST be between this initial value and the maximum allowed frame size + (224-1 or 16,777,215 octets), inclusive. Values outside this range + MUST be treated as a connection error + of type PROTOCOL_ERROR. + + + + + This advisory setting informs a peer of the maximum size of header list that the + sender is prepared to accept, in octets. The value is based on the uncompressed + size of header fields, including the length of the name and value in octets plus + an overhead of 32 octets for each header field. + + + For any given request, a lower limit than what is advertised MAY be enforced. The + initial value of this setting is unlimited. + + + + + + An endpoint that receives a SETTINGS frame with any unknown or unsupported identifier + MUST ignore that setting. + +
+ +
+ + Most values in SETTINGS benefit from or require an understanding of when the peer has + received and applied the changed parameter values. In order to provide + such synchronization timepoints, the recipient of a SETTINGS frame in which the ACK flag + is not set MUST apply the updated parameters as soon as possible upon receipt. + + + The values in the SETTINGS frame MUST be processed in the order they appear, with no + other frame processing between values. Unsupported parameters MUST be ignored. Once + all values have been processed, the recipient MUST immediately emit a SETTINGS frame + with the ACK flag set. Upon receiving a SETTINGS frame with the ACK flag set, the sender + of the altered parameters can rely on the setting having been applied. + + + If the sender of a SETTINGS frame does not receive an acknowledgement within a + reasonable amount of time, it MAY issue a connection error of type + SETTINGS_TIMEOUT. + +
+
+ +
+ + The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint in advance of + streams the sender intends to initiate. The PUSH_PROMISE frame includes the unsigned + 31-bit identifier of the stream the endpoint plans to create along with a set of headers + that provide additional context for the stream. contains a + thorough description of the use of PUSH_PROMISE frames. + + +
+ +
+ + The PUSH_PROMISE frame payload has the following fields: + + + An 8-bit field containing the length of the frame padding in units of octets. This + field is only present if the PADDED flag is set. + + + A single reserved bit. + + + An unsigned 31-bit integer that identifies the stream that is reserved by the + PUSH_PROMISE. The promised stream identifier MUST be a valid choice for the next + stream sent by the sender (see new stream + identifier). + + + A header block fragment containing request header + fields. + + + Padding octets. + + + + + + The PUSH_PROMISE frame defines the following flags: + + + + Bit 3 being set indicates that this frame contains an entire header block and is not followed by any + CONTINUATION frames. + + + A PUSH_PROMISE frame without the END_HEADERS flag set MUST be followed by a + CONTINUATION frame for the same stream. A receiver MUST treat the receipt of any + other type of frame or a frame on a different stream as a connection error of type + PROTOCOL_ERROR. + + + + + Bit 4 being set indicates that the Pad Length field and any padding that it + describes is present. + + + + + + + PUSH_PROMISE frames MUST be associated with an existing, peer-initiated stream. The stream + identifier of a PUSH_PROMISE frame indicates the stream it is associated with. If the + stream identifier field specifies the value 0x0, a recipient MUST respond with a connection error of type + PROTOCOL_ERROR. + + + + Promised streams are not required to be used in the order they are promised. The + PUSH_PROMISE only reserves stream identifiers for later use. + + + + PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH setting of the + peer endpoint is set to 0. An endpoint that has set this setting and has received + acknowledgement MUST treat the receipt of a PUSH_PROMISE frame as a connection error of type + PROTOCOL_ERROR. + + + Recipients of PUSH_PROMISE frames can choose to reject promised streams by returning a + RST_STREAM referencing the promised stream identifier back to the sender of + the PUSH_PROMISE. + + + + A PUSH_PROMISE frame modifies the connection state in two ways. The inclusion of a header block potentially modifies the state maintained for + header compression. PUSH_PROMISE also reserves a stream for later use, causing the + promised stream to enter the "reserved" state. A sender MUST NOT send a PUSH_PROMISE on a + stream unless that stream is either "open" or "half closed (remote)"; the sender MUST + ensure that the promised stream is a valid choice for a new stream identifier (that is, the promised stream MUST + be in the "idle" state). + + + Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame causes the stream + state to become indeterminate. A receiver MUST treat the receipt of a PUSH_PROMISE on a + stream that is neither "open" nor "half closed (local)" as a connection error of type + PROTOCOL_ERROR. However, an endpoint that has sent + RST_STREAM on the associated stream MUST handle PUSH_PROMISE frames that + might have been created before the RST_STREAM frame is received and + processed. + + + A receiver MUST treat the receipt of a PUSH_PROMISE that promises an illegal stream identifier (that is, an identifier for a + stream that is not currently in the "idle" state) as a connection error of type + PROTOCOL_ERROR. + + + + The PUSH_PROMISE frame includes optional padding. Padding fields and flags are identical + to those defined for DATA frames. + +
+ +
+ + The PING frame (type=0x6) is a mechanism for measuring a minimal round trip time from the + sender, as well as determining whether an idle connection is still functional. PING + frames can be sent from any endpoint. + +
+ +
+ + + In addition to the frame header, PING frames MUST contain 8 octets of data in the payload. + A sender can include any value it chooses and use those bytes in any fashion. + + + Receivers of a PING frame that does not include an ACK flag MUST send a PING frame with + the ACK flag set in response, with an identical payload. PING responses SHOULD be given + higher priority than any other frame. + + + + The PING frame defines the following flags: + + + Bit 1 being set indicates that this PING frame is a PING response. An endpoint MUST + set this flag in PING responses. An endpoint MUST NOT respond to PING frames + containing this flag. + + + + + PING frames are not associated with any individual stream. If a PING frame is received + with a stream identifier field value other than 0x0, the recipient MUST respond with a + connection error of type + PROTOCOL_ERROR. + + + Receipt of a PING frame with a length field value other than 8 MUST be treated as a connection error of type + FRAME_SIZE_ERROR. + + +
+ +
+ + The GOAWAY frame (type=0x7) informs the remote peer to stop creating streams on this + connection. GOAWAY can be sent by either the client or the server. Once sent, the sender + will ignore frames sent on any new streams with identifiers higher than the included last + stream identifier. Receivers of a GOAWAY frame MUST NOT open additional streams on the + connection, although a new connection can be established for new streams. + + + The purpose of this frame is to allow an endpoint to gracefully stop accepting new + streams, while still finishing processing of previously established streams. This enables + administrative actions, like server maintainance. + + + There is an inherent race condition between an endpoint starting new streams and the + remote sending a GOAWAY frame. To deal with this case, the GOAWAY contains the stream + identifier of the last peer-initiated stream which was or might be processed on the + sending endpoint in this connection. For instance, if the server sends a GOAWAY frame, + the identified stream is the highest numbered stream initiated by the client. + + + If the receiver of the GOAWAY has sent data on streams with a higher stream identifier + than what is indicated in the GOAWAY frame, those streams are not or will not be + processed. The receiver of the GOAWAY frame can treat the streams as though they had + never been created at all, thereby allowing those streams to be retried later on a new + connection. + + + Endpoints SHOULD always send a GOAWAY frame before closing a connection so that the remote + can know whether a stream has been partially processed or not. For example, if an HTTP + client sends a POST at the same time that a server closes a connection, the client cannot + know if the server started to process that POST request if the server does not send a + GOAWAY frame to indicate what streams it might have acted on. + + + An endpoint might choose to close a connection without sending GOAWAY for misbehaving + peers. + + +
+ +
+ + The GOAWAY frame does not define any flags. + + + The GOAWAY frame applies to the connection, not a specific stream. An endpoint MUST treat + a GOAWAY frame with a stream identifier other than 0x0 as a connection error of type + PROTOCOL_ERROR. + + + The last stream identifier in the GOAWAY frame contains the highest numbered stream + identifier for which the sender of the GOAWAY frame might have taken some action on, or + might yet take action on. All streams up to and including the identified stream might + have been processed in some way. The last stream identifier can be set to 0 if no streams + were processed. + + + In this context, "processed" means that some data from the stream was passed to some + higher layer of software that might have taken some action as a result. + + + If a connection terminates without a GOAWAY frame, the last stream identifier is + effectively the highest possible stream identifier. + + + On streams with lower or equal numbered identifiers that were not closed completely prior + to the connection being closed, re-attempting requests, transactions, or any protocol + activity is not possible, with the exception of idempotent actions like HTTP GET, PUT, or + DELETE. Any protocol activity that uses higher numbered streams can be safely retried + using a new connection. + + + Activity on streams numbered lower or equal to the last stream identifier might still + complete successfully. The sender of a GOAWAY frame might gracefully shut down a + connection by sending a GOAWAY frame, maintaining the connection in an open state until + all in-progress streams complete. + + + An endpoint MAY send multiple GOAWAY frames if circumstances change. For instance, an + endpoint that sends GOAWAY with NO_ERROR during graceful shutdown could + subsequently encounter an condition that requires immediate termination of the connection. + The last stream identifier from the last GOAWAY frame received indicates which streams + could have been acted upon. Endpoints MUST NOT increase the value they send in the last + stream identifier, since the peers might already have retried unprocessed requests on + another connection. + + + A client that is unable to retry requests loses all requests that are in flight when the + server closes the connection. This is especially true for intermediaries that might + not be serving clients using HTTP/2. A server that is attempting to gracefully shut down + a connection SHOULD send an initial GOAWAY frame with the last stream identifier set to + 231-1 and a NO_ERROR code. This signals to the client that + a shutdown is imminent and that no further requests can be initiated. After waiting at + least one round trip time, the server can send another GOAWAY frame with an updated last + stream identifier. This ensures that a connection can be cleanly shut down without losing + requests. + + + + After sending a GOAWAY frame, the sender can discard frames for streams with identifiers + higher than the identified last stream. However, any frames that alter connection state + cannot be completely ignored. For instance, HEADERS, + PUSH_PROMISE and CONTINUATION frames MUST be minimally + processed to ensure the state maintained for header compression is consistent (see ); similarly DATA frames MUST be counted toward the connection flow + control window. Failure to process these frames can cause flow control or header + compression state to become unsynchronized. + + + + The GOAWAY frame also contains a 32-bit error code that + contains the reason for closing the connection. + + + Endpoints MAY append opaque data to the payload of any GOAWAY frame. Additional debug + data is intended for diagnostic purposes only and carries no semantic value. Debug + information could contain security- or privacy-sensitive data. Logged or otherwise + persistently stored debug data MUST have adequate safeguards to prevent unauthorized + access. + +
+ +
+ + The WINDOW_UPDATE frame (type=0x8) is used to implement flow control; see for an overview. + + + Flow control operates at two levels: on each individual stream and on the entire + connection. + + + Both types of flow control are hop-by-hop; that is, only between the two endpoints. + Intermediaries do not forward WINDOW_UPDATE frames between dependent connections. + However, throttling of data transfer by any receiver can indirectly cause the propagation + of flow control information toward the original sender. + + + Flow control only applies to frames that are identified as being subject to flow control. + Of the frame types defined in this document, this includes only DATA frames. + Frames that are exempt from flow control MUST be accepted and processed, unless the + receiver is unable to assign resources to handling the frame. A receiver MAY respond with + a stream error or connection error of type + FLOW_CONTROL_ERROR if it is unable to accept a frame. + +
+ +
+ + The payload of a WINDOW_UPDATE frame is one reserved bit, plus an unsigned 31-bit integer + indicating the number of octets that the sender can transmit in addition to the existing + flow control window. The legal range for the increment to the flow control window is 1 to + 231-1 (0x7fffffff) octets. + + + The WINDOW_UPDATE frame does not define any flags. + + + The WINDOW_UPDATE frame can be specific to a stream or to the entire connection. In the + former case, the frame's stream identifier indicates the affected stream; in the latter, + the value "0" indicates that the entire connection is the subject of the frame. + + + A receiver MUST treat the receipt of a WINDOW_UPDATE frame with an flow control window + increment of 0 as a stream error of type + PROTOCOL_ERROR; errors on the connection flow control window MUST be + treated as a connection error. + + + WINDOW_UPDATE can be sent by a peer that has sent a frame bearing the END_STREAM flag. + This means that a receiver could receive a WINDOW_UPDATE frame on a "half closed (remote)" + or "closed" stream. A receiver MUST NOT treat this as an error, see . + + + A receiver that receives a flow controlled frame MUST always account for its contribution + against the connection flow control window, unless the receiver treats this as a connection error. This is necessary even if the + frame is in error. Since the sender counts the frame toward the flow control window, if + the receiver does not, the flow control window at sender and receiver can become + different. + + +
+ + Flow control in HTTP/2 is implemented using a window kept by each sender on every + stream. The flow control window is a simple integer value that indicates how many octets + of data the sender is permitted to transmit; as such, its size is a measure of the + buffering capacity of the receiver. + + + Two flow control windows are applicable: the stream flow control window and the + connection flow control window. The sender MUST NOT send a flow controlled frame with a + length that exceeds the space available in either of the flow control windows advertised + by the receiver. Frames with zero length with the END_STREAM flag set (that is, an + empty DATA frame) MAY be sent if there is no available space in either + flow control window. + + + For flow control calculations, the 9 octet frame header is not counted. + + + After sending a flow controlled frame, the sender reduces the space available in both + windows by the length of the transmitted frame. + + + The receiver of a frame sends a WINDOW_UPDATE frame as it consumes data and frees up + space in flow control windows. Separate WINDOW_UPDATE frames are sent for the stream + and connection level flow control windows. + + + A sender that receives a WINDOW_UPDATE frame updates the corresponding window by the + amount specified in the frame. + + + A sender MUST NOT allow a flow control window to exceed 231-1 octets. + If a sender receives a WINDOW_UPDATE that causes a flow control window to exceed this + maximum it MUST terminate either the stream or the connection, as appropriate. For + streams, the sender sends a RST_STREAM with the error code of + FLOW_CONTROL_ERROR code; for the connection, a GOAWAY + frame with a FLOW_CONTROL_ERROR code. + + + Flow controlled frames from the sender and WINDOW_UPDATE frames from the receiver are + completely asynchronous with respect to each other. This property allows a receiver to + aggressively update the window size kept by the sender to prevent streams from stalling. + +
+ +
+ + When an HTTP/2 connection is first established, new streams are created with an initial + flow control window size of 65,535 octets. The connection flow control window is 65,535 + octets. Both endpoints can adjust the initial window size for new streams by including + a value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS + frame that forms part of the connection preface. The connection flow control window can + only be changed using WINDOW_UPDATE frames. + + + Prior to receiving a SETTINGS frame that sets a value for + SETTINGS_INITIAL_WINDOW_SIZE, an endpoint can only use the default + initial window size when sending flow controlled frames. Similarly, the connection flow + control window is set to the default initial window size until a WINDOW_UPDATE frame is + received. + + + A SETTINGS frame can alter the initial flow control window size for all + current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE changes, + a receiver MUST adjust the size of all stream flow control windows that it maintains by + the difference between the new value and the old value. + + + A change to SETTINGS_INITIAL_WINDOW_SIZE can cause the available space in + a flow control window to become negative. A sender MUST track the negative flow control + window, and MUST NOT send new flow controlled frames until it receives WINDOW_UPDATE + frames that cause the flow control window to become positive. + + + For example, if the client sends 60KB immediately on connection establishment, and the + server sets the initial window size to be 16KB, the client will recalculate the + available flow control window to be -44KB on receipt of the SETTINGS + frame. The client retains a negative flow control window until WINDOW_UPDATE frames + restore the window to being positive, after which the client can resume sending. + + + A SETTINGS frame cannot alter the connection flow control window. + + + An endpoint MUST treat a change to SETTINGS_INITIAL_WINDOW_SIZE that + causes any flow control window to exceed the maximum size as a connection error of type + FLOW_CONTROL_ERROR. + +
+ +
+ + A receiver that wishes to use a smaller flow control window than the current size can + send a new SETTINGS frame. However, the receiver MUST be prepared to + receive data that exceeds this window size, since the sender might send data that + exceeds the lower limit prior to processing the SETTINGS frame. + + + After sending a SETTINGS frame that reduces the initial flow control window size, a + receiver has two options for handling streams that exceed flow control limits: + + + The receiver can immediately send RST_STREAM with + FLOW_CONTROL_ERROR error code for the affected streams. + + + The receiver can accept the streams and tolerate the resulting head of line + blocking, sending WINDOW_UPDATE frames as it consumes data. + + + +
+
+ +
+ + The CONTINUATION frame (type=0x9) is used to continue a sequence of header block fragments. Any number of CONTINUATION frames can + be sent on an existing stream, as long as the preceding frame is on the same stream and is + a HEADERS, PUSH_PROMISE or CONTINUATION frame without the + END_HEADERS flag set. + + +
+ +
+ + The CONTINUATION frame payload contains a header block + fragment. + + + + The CONTINUATION frame defines the following flag: + + + + Bit 3 being set indicates that this frame ends a header + block. + + + If the END_HEADERS bit is not set, this frame MUST be followed by another + CONTINUATION frame. A receiver MUST treat the receipt of any other type of frame or + a frame on a different stream as a connection + error of type PROTOCOL_ERROR. + + + + + + + The CONTINUATION frame changes the connection state as defined in . + + + + CONTINUATION frames MUST be associated with a stream. If a CONTINUATION frame is received + whose stream identifier field is 0x0, the recipient MUST respond with a connection error of type PROTOCOL_ERROR. + + + + A CONTINUATION frame MUST be preceded by a HEADERS, + PUSH_PROMISE or CONTINUATION frame without the END_HEADERS flag set. A + recipient that observes violation of this rule MUST respond with a connection error of type + PROTOCOL_ERROR. + +
+
+ +
+ + Error codes are 32-bit fields that are used in RST_STREAM and + GOAWAY frames to convey the reasons for the stream or connection error. + + + + Error codes share a common code space. Some error codes apply only to either streams or the + entire connection and have no defined semantics in the other context. + + + + The following error codes are defined: + + + The associated condition is not as a result of an error. For example, a + GOAWAY might include this code to indicate graceful shutdown of a + connection. + + + The endpoint detected an unspecific protocol error. This error is for use when a more + specific error code is not available. + + + The endpoint encountered an unexpected internal error. + + + The endpoint detected that its peer violated the flow control protocol. + + + The endpoint sent a SETTINGS frame, but did not receive a response in a + timely manner. See Settings Synchronization. + + + The endpoint received a frame after a stream was half closed. + + + The endpoint received a frame with an invalid size. + + + The endpoint refuses the stream prior to performing any application processing, see + for details. + + + Used by the endpoint to indicate that the stream is no longer needed. + + + The endpoint is unable to maintain the header compression context for the connection. + + + The connection established in response to a CONNECT + request was reset or abnormally closed. + + + The endpoint detected that its peer is exhibiting a behavior that might be generating + excessive load. + + + The underlying transport has properties that do not meet minimum security + requirements (see ). + + + + + Unknown or unsupported error codes MUST NOT trigger any special behavior. These MAY be + treated by an implementation as being equivalent to INTERNAL_ERROR. + +
+ +
+ + HTTP/2 is intended to be as compatible as possible with current uses of HTTP. This means + that, from the application perspective, the features of the protocol are largely + unchanged. To achieve this, all request and response semantics are preserved, although the + syntax of conveying those semantics has changed. + + + Thus, the specification and requirements of HTTP/1.1 Semantics and Content , Conditional Requests , Range Requests , Caching and Authentication are applicable to HTTP/2. Selected portions of HTTP/1.1 Message Syntax + and Routing , such as the HTTP and HTTPS URI schemes, are also + applicable in HTTP/2, but the expression of those semantics for this protocol are defined + in the sections below. + + +
+ + A client sends an HTTP request on a new stream, using a previously unused stream identifier. A server sends an HTTP response on + the same stream as the request. + + + An HTTP message (request or response) consists of: + + + for a response only, zero or more HEADERS frames (each followed by zero + or more CONTINUATION frames) containing the message headers of + informational (1xx) HTTP responses (see and ), + and + + + one HEADERS frame (followed by zero or more CONTINUATION + frames) containing the message headers (see ), and + + + zero or more DATA frames containing the message payload (see ), and + + + optionally, one HEADERS frame, followed by zero or more + CONTINUATION frames containing the trailer-part, if present (see ). + + + The last frame in the sequence bears an END_STREAM flag, noting that a + HEADERS frame bearing the END_STREAM flag can be followed by + CONTINUATION frames that carry any remaining portions of the header block. + + + Other frames (from any stream) MUST NOT occur between either HEADERS frame + and any CONTINUATION frames that might follow. + + + + Trailing header fields are carried in a header block that also terminates the stream. + That is, a sequence starting with a HEADERS frame, followed by zero or more + CONTINUATION frames, where the HEADERS frame bears an + END_STREAM flag. Header blocks after the first that do not terminate the stream are not + part of an HTTP request or response. + + + A HEADERS frame (and associated CONTINUATION frames) can + only appear at the start or end of a stream. An endpoint that receives a + HEADERS frame without the END_STREAM flag set after receiving a final + (non-informational) status code MUST treat the corresponding request or response as malformed. + + + + An HTTP request/response exchange fully consumes a single stream. A request starts with + the HEADERS frame that puts the stream into an "open" state. The request + ends with a frame bearing END_STREAM, which causes the stream to become "half closed + (local)" for the client and "half closed (remote)" for the server. A response starts with + a HEADERS frame and ends with a frame bearing END_STREAM, which places the + stream in the "closed" state. + + + +
+ + HTTP/2 removes support for the 101 (Switching Protocols) informational status code + (). + + + The semantics of 101 (Switching Protocols) aren't applicable to a multiplexed protocol. + Alternative protocols are able to use the same mechanisms that HTTP/2 uses to negotiate + their use (see ). + +
+ +
+ + HTTP header fields carry information as a series of key-value pairs. For a listing of + registered HTTP headers, see the Message Header Field Registry maintained at . + + +
+ + While HTTP/1.x used the message start-line (see ) to convey the target URI and method of the request, and the + status code for the response, HTTP/2 uses special pseudo-header fields beginning with + ':' character (ASCII 0x3a) for this purpose. + + + Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT generate + pseudo-header fields other than those defined in this document. + + + Pseudo-header fields are only valid in the context in which they are defined. + Pseudo-header fields defined for requests MUST NOT appear in responses; pseudo-header + fields defined for responses MUST NOT appear in requests. Pseudo-header fields MUST + NOT appear in trailers. Endpoints MUST treat a request or response that contains + undefined or invalid pseudo-header fields as malformed. + + + Just as in HTTP/1.x, header field names are strings of ASCII characters that are + compared in a case-insensitive fashion. However, header field names MUST be converted + to lowercase prior to their encoding in HTTP/2. A request or response containing + uppercase header field names MUST be treated as malformed. + + + All pseudo-header fields MUST appear in the header block before regular header fields. + Any request or response that contains a pseudo-header field that appears in a header + block after a regular header field MUST be treated as malformed. + +
+ +
+ + HTTP/2 does not use the Connection header field to + indicate connection-specific header fields; in this protocol, connection-specific + metadata is conveyed by other means. An endpoint MUST NOT generate a HTTP/2 message + containing connection-specific header fields; any message containing + connection-specific header fields MUST be treated as malformed. + + + This means that an intermediary transforming an HTTP/1.x message to HTTP/2 will need + to remove any header fields nominated by the Connection header field, along with the + Connection header field itself. Such intermediaries SHOULD also remove other + connection-specific header fields, such as Keep-Alive, Proxy-Connection, + Transfer-Encoding and Upgrade, even if they are not nominated by Connection. + + + One exception to this is the TE header field, which MAY be present in an HTTP/2 + request, but when it is MUST NOT contain any value other than "trailers". + + + + + HTTP/2 purposefully does not support upgrade to another protocol. The handshake + methods described in are believed sufficient to + negotiate the use of alternative protocols. + + + +
+ +
+ + The following pseudo-header fields are defined for HTTP/2 requests: + + + + The :method pseudo-header field includes the HTTP + method (). + + + + + The :scheme pseudo-header field includes the scheme + portion of the target URI (). + + + :scheme is not restricted to http and https schemed URIs. A + proxy or gateway can translate requests for non-HTTP schemes, enabling the use + of HTTP to interact with non-HTTP services. + + + + + The :authority pseudo-header field includes the + authority portion of the target URI (). The authority MUST NOT include the deprecated userinfo subcomponent for http + or https schemed URIs. + + + To ensure that the HTTP/1.1 request line can be reproduced accurately, this + pseudo-header field MUST be omitted when translating from an HTTP/1.1 request + that has a request target in origin or asterisk form (see ). Clients that generate + HTTP/2 requests directly SHOULD use the :authority pseudo-header + field instead of the Host header field. An + intermediary that converts an HTTP/2 request to HTTP/1.1 MUST create a Host header field if one is not present in a request by + copying the value of the :authority pseudo-header + field. + + + + + The :path pseudo-header field includes the path and + query parts of the target URI (the path-absolute + production from and optionally a '?' character + followed by the query production, see and ). A request in asterisk form includes the value '*' for the + :path pseudo-header field. + + + This pseudo-header field MUST NOT be empty for http + or https URIs; http or + https URIs that do not contain a path component + MUST include a value of '/'. The exception to this rule is an OPTIONS request + for an http or https + URI that does not include a path component; these MUST include a :path pseudo-header field with a value of '*' (see ). + + + + + + All HTTP/2 requests MUST include exactly one valid value for the :method, :scheme, and :path pseudo-header fields, unless it is a CONNECT request. An HTTP request that omits mandatory + pseudo-header fields is malformed. + + + HTTP/2 does not define a way to carry the version identifier that is included in the + HTTP/1.1 request line. + +
+ +
+ + For HTTP/2 responses, a single :status pseudo-header + field is defined that carries the HTTP status code field (see ). This pseudo-header field MUST be included in all + responses, otherwise the response is malformed. + + + HTTP/2 does not define a way to carry the version or reason phrase that is included in + an HTTP/1.1 status line. + +
+ +
+ + The Cookie header field can carry a significant amount of + redundant data. + + + The Cookie header field uses a semi-colon (";") to delimit cookie-pairs (or "crumbs"). + This header field doesn't follow the list construction rules in HTTP (see ), which prevents cookie-pairs from + being separated into different name-value pairs. This can significantly reduce + compression efficiency as individual cookie-pairs are updated. + + + To allow for better compression efficiency, the Cookie header field MAY be split into + separate header fields, each with one or more cookie-pairs. If there are multiple + Cookie header fields after decompression, these MUST be concatenated into a single + octet string using the two octet delimiter of 0x3B, 0x20 (the ASCII string "; ") + before being passed into a non-HTTP/2 context, such as an HTTP/1.1 connection, or a + generic HTTP server application. + +
+ + Therefore, the following two lists of Cookie header fields are semantically + equivalent. + + +
+
+ +
+ + A malformed request or response is one that is an otherwise valid sequence of HTTP/2 + frames, but is otherwise invalid due to the presence of extraneous frames, prohibited + header fields, the absence of mandatory header fields, or the inclusion of uppercase + header field names. + + + A request or response that includes an entity body can include a content-length header field. A request or response is also + malformed if the value of a content-length header field + does not equal the sum of the DATA frame payload lengths that form the + body. A response that is defined to have no payload, as described in , can have a non-zero + content-length header field, even though no content is + included in DATA frames. + + + Intermediaries that process HTTP requests or responses (i.e., any intermediary not + acting as a tunnel) MUST NOT forward a malformed request or response. Malformed + requests or responses that are detected MUST be treated as a stream error of type PROTOCOL_ERROR. + + + For malformed requests, a server MAY send an HTTP response prior to closing or + resetting the stream. Clients MUST NOT accept a malformed response. Note that these + requirements are intended to protect against several types of common attacks against + HTTP; they are deliberately strict, because being permissive can expose + implementations to these vulnerabilities. + +
+
+ +
+ + This section shows HTTP/1.1 requests and responses, with illustrations of equivalent + HTTP/2 requests and responses. + + + An HTTP GET request includes request header fields and no body and is therefore + transmitted as a single HEADERS frame, followed by zero or more + CONTINUATION frames containing the serialized block of request header + fields. The HEADERS frame in the following has both the END_HEADERS and + END_STREAM flags set; no CONTINUATION frames are sent: + + +
+ + END_STREAM + Accept: image/jpeg + END_HEADERS + :method = GET + :scheme = https + :path = /resource + host = example.org + accept = image/jpeg +]]> +
+ + + Similarly, a response that includes only response header fields is transmitted as a + HEADERS frame (again, followed by zero or more + CONTINUATION frames) containing the serialized block of response header + fields. + + +
+ + END_STREAM + Expires: Thu, 23 Jan ... + END_HEADERS + :status = 304 + etag = "xyzzy" + expires = Thu, 23 Jan ... +]]> +
+ + + An HTTP POST request that includes request header fields and payload data is transmitted + as one HEADERS frame, followed by zero or more + CONTINUATION frames containing the request header fields, followed by one + or more DATA frames, with the last CONTINUATION (or + HEADERS) frame having the END_HEADERS flag set and the final + DATA frame having the END_STREAM flag set: + + +
+ - END_STREAM + Content-Type: image/jpeg - END_HEADERS + Content-Length: 123 :method = POST + :path = /resource + {binary data} :scheme = https + + CONTINUATION + + END_HEADERS + content-type = image/jpeg + host = example.org + content-length = 123 + + DATA + + END_STREAM + {binary data} +]]> + + Note that data contributing to any given header field could be spread between header + block fragments. The allocation of header fields to frames in this example is + illustrative only. + +
+ + + A response that includes header fields and payload data is transmitted as a + HEADERS frame, followed by zero or more CONTINUATION + frames, followed by one or more DATA frames, with the last + DATA frame in the sequence having the END_STREAM flag set: + + +
+ - END_STREAM + Content-Length: 123 + END_HEADERS + :status = 200 + {binary data} content-type = image/jpeg + content-length = 123 + + DATA + + END_STREAM + {binary data} +]]> +
+ + + Trailing header fields are sent as a header block after both the request or response + header block and all the DATA frames have been sent. The + HEADERS frame starting the trailers header block has the END_STREAM flag + set. + + +
+ - END_STREAM + Transfer-Encoding: chunked + END_HEADERS + Trailer: Foo :status = 200 + content-length = 123 + 123 content-type = image/jpeg + {binary data} trailer = Foo + 0 + Foo: bar DATA + - END_STREAM + {binary data} + + HEADERS + + END_STREAM + + END_HEADERS + foo = bar +]]> +
+ + +
+ + An informational response using a 1xx status code other than 101 is transmitted as a + HEADERS frame, followed by zero or more CONTINUATION + frames: + + - END_STREAM + + END_HEADERS + :status = 103 + extension-field = bar +]]> +
+
+ +
+ + In HTTP/1.1, an HTTP client is unable to retry a non-idempotent request when an error + occurs, because there is no means to determine the nature of the error. It is possible + that some server processing occurred prior to the error, which could result in + undesirable effects if the request were reattempted. + + + HTTP/2 provides two mechanisms for providing a guarantee to a client that a request has + not been processed: + + + The GOAWAY frame indicates the highest stream number that might have + been processed. Requests on streams with higher numbers are therefore guaranteed to + be safe to retry. + + + The REFUSED_STREAM error code can be included in a + RST_STREAM frame to indicate that the stream is being closed prior to + any processing having occurred. Any request that was sent on the reset stream can + be safely retried. + + + + + Requests that have not been processed have not failed; clients MAY automatically retry + them, even those with non-idempotent methods. + + + A server MUST NOT indicate that a stream has not been processed unless it can guarantee + that fact. If frames that are on a stream are passed to the application layer for any + stream, then REFUSED_STREAM MUST NOT be used for that stream, and a + GOAWAY frame MUST include a stream identifier that is greater than or + equal to the given stream identifier. + + + In addition to these mechanisms, the PING frame provides a way for a + client to easily test a connection. Connections that remain idle can become broken as + some middleboxes (for instance, network address translators, or load balancers) silently + discard connection bindings. The PING frame allows a client to safely + test whether a connection is still active without sending a request. + +
+
+ +
+ + HTTP/2 allows a server to pre-emptively send (or "push") responses (along with + corresponding "promised" requests) to a client in association with a previous + client-initiated request. This can be useful when the server knows the client will need + to have those responses available in order to fully process the response to the original + request. + + + + Pushing additional message exchanges in this fashion is optional, and is negotiated + between individual endpoints. The SETTINGS_ENABLE_PUSH setting can be set + to 0 to indicate that server push is disabled. + + + Promised requests MUST be cacheable (see ), MUST be safe (see ) and MUST NOT include a request body. Clients that receive a + promised request that is not cacheable, unsafe or that includes a request body MUST + reset the stream with a stream error of type + PROTOCOL_ERROR. + + + Pushed responses that are cacheable (see ) can be stored by the client, if it implements a HTTP + cache. Pushed responses are considered successfully validated on the origin server (e.g., + if the "no-cache" cache response directive is present) while the stream identified by the + promised stream ID is still open. + + + Pushed responses that are not cacheable MUST NOT be stored by any HTTP cache. They MAY + be made available to the application separately. + + + An intermediary can receive pushes from the server and choose not to forward them on to + the client. In other words, how to make use of the pushed information is up to that + intermediary. Equally, the intermediary might choose to make additional pushes to the + client, without any action taken by the server. + + + A client cannot push. Thus, servers MUST treat the receipt of a + PUSH_PROMISE frame as a connection + error of type PROTOCOL_ERROR. Clients MUST reject any attempt to + change the SETTINGS_ENABLE_PUSH setting to a value other than 0 by treating + the message as a connection error of type + PROTOCOL_ERROR. + + +
+ + Server push is semantically equivalent to a server responding to a request; however, in + this case that request is also sent by the server, as a PUSH_PROMISE + frame. + + + The PUSH_PROMISE frame includes a header block that contains a complete + set of request header fields that the server attributes to the request. It is not + possible to push a response to a request that includes a request body. + + + + Pushed responses are always associated with an explicit request from the client. The + PUSH_PROMISE frames sent by the server are sent on that explicit + request's stream. The PUSH_PROMISE frame also includes a promised stream + identifier, chosen from the stream identifiers available to the server (see ). + + + + The header fields in PUSH_PROMISE and any subsequent + CONTINUATION frames MUST be a valid and complete set of request header fields. The server MUST include a method in + the :method header field that is safe and cacheable. If a + client receives a PUSH_PROMISE that does not include a complete and valid + set of header fields, or the :method header field identifies + a method that is not safe, it MUST respond with a stream error of type PROTOCOL_ERROR. + + + + The server SHOULD send PUSH_PROMISE () + frames prior to sending any frames that reference the promised responses. This avoids a + race where clients issue requests prior to receiving any PUSH_PROMISE + frames. + + + For example, if the server receives a request for a document containing embedded links + to multiple image files, and the server chooses to push those additional images to the + client, sending push promises before the DATA frames that contain the + image links ensures that the client is able to see the promises before discovering + embedded links. Similarly, if the server pushes responses referenced by the header block + (for instance, in Link header fields), sending the push promises before sending the + header block ensures that clients do not request them. + + + + PUSH_PROMISE frames MUST NOT be sent by the client. + + + PUSH_PROMISE frames can be sent by the server in response to any + client-initiated stream, but the stream MUST be in either the "open" or "half closed + (remote)" state with respect to the server. PUSH_PROMISE frames are + interspersed with the frames that comprise a response, though they cannot be + interspersed with HEADERS and CONTINUATION frames that + comprise a single header block. + + + Sending a PUSH_PROMISE frame creates a new stream and puts the stream + into the “reserved (local)” state for the server and the “reserved (remote)” state for + the client. + +
+ +
+ + After sending the PUSH_PROMISE frame, the server can begin delivering the + pushed response as a response on a server-initiated + stream that uses the promised stream identifier. The server uses this stream to + transmit an HTTP response, using the same sequence of frames as defined in . This stream becomes "half closed" + to the client after the initial HEADERS frame is sent. + + + + Once a client receives a PUSH_PROMISE frame and chooses to accept the + pushed response, the client SHOULD NOT issue any requests for the promised response + until after the promised stream has closed. + + + + If the client determines, for any reason, that it does not wish to receive the pushed + response from the server, or if the server takes too long to begin sending the promised + response, the client can send an RST_STREAM frame, using either the + CANCEL or REFUSED_STREAM codes, and referencing the pushed + stream's identifier. + + + A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit the + number of responses that can be concurrently pushed by a server. Advertising a + SETTINGS_MAX_CONCURRENT_STREAMS value of zero disables server push by + preventing the server from creating the necessary streams. This does not prohibit a + server from sending PUSH_PROMISE frames; clients need to reset any + promised streams that are not wanted. + + + + Clients receiving a pushed response MUST validate that either the server is + authoritative (see ), or the proxy that provided the pushed + response is configured for the corresponding request. For example, a server that offers + a certificate for only the example.com DNS-ID or Common Name + is not permitted to push a response for https://www.example.org/doc. + + + The response for a PUSH_PROMISE stream begins with a + HEADERS frame, which immediately puts the stream into the “half closed + (remote)” state for the server and “half closed (local)” state for the client, and ends + with a frame bearing END_STREAM, which places the stream in the "closed" state. + + + The client never sends a frame with the END_STREAM flag for a server push. + + + +
+ +
+ +
+ + In HTTP/1.x, the pseudo-method CONNECT () is used to convert an HTTP connection into a tunnel to a remote host. + CONNECT is primarily used with HTTP proxies to establish a TLS session with an origin + server for the purposes of interacting with https resources. + + + In HTTP/2, the CONNECT method is used to establish a tunnel over a single HTTP/2 stream to + a remote host, for similar purposes. The HTTP header field mapping works as defined in + Request Header Fields, with a few + differences. Specifically: + + + The :method header field is set to CONNECT. + + + The :scheme and :path header + fields MUST be omitted. + + + The :authority header field contains the host and port to + connect to (equivalent to the authority-form of the request-target of CONNECT + requests, see ). + + + + + A proxy that supports CONNECT establishes a TCP connection to + the server identified in the :authority header field. Once + this connection is successfully established, the proxy sends a HEADERS + frame containing a 2xx series status code to the client, as defined in . + + + After the initial HEADERS frame sent by each peer, all subsequent + DATA frames correspond to data sent on the TCP connection. The payload of + any DATA frames sent by the client is transmitted by the proxy to the TCP + server; data received from the TCP server is assembled into DATA frames by + the proxy. Frame types other than DATA or stream management frames + (RST_STREAM, WINDOW_UPDATE, and PRIORITY) + MUST NOT be sent on a connected stream, and MUST be treated as a stream error if received. + + + The TCP connection can be closed by either peer. The END_STREAM flag on a + DATA frame is treated as being equivalent to the TCP FIN bit. A client is + expected to send a DATA frame with the END_STREAM flag set after receiving + a frame bearing the END_STREAM flag. A proxy that receives a DATA frame + with the END_STREAM flag set sends the attached data with the FIN bit set on the last TCP + segment. A proxy that receives a TCP segment with the FIN bit set sends a + DATA frame with the END_STREAM flag set. Note that the final TCP segment + or DATA frame could be empty. + + + A TCP connection error is signaled with RST_STREAM. A proxy treats any + error in the TCP connection, which includes receiving a TCP segment with the RST bit set, + as a stream error of type + CONNECT_ERROR. Correspondingly, a proxy MUST send a TCP segment with the + RST bit set if it detects an error with the stream or the HTTP/2 connection. + +
+
+ +
+ + This section outlines attributes of the HTTP protocol that improve interoperability, reduce + exposure to known security vulnerabilities, or reduce the potential for implementation + variation. + + +
+ + HTTP/2 connections are persistent. For best performance, it is expected clients will not + close connections until it is determined that no further communication with a server is + necessary (for example, when a user navigates away from a particular web page), or until + the server closes the connection. + + + Clients SHOULD NOT open more than one HTTP/2 connection to a given host and port pair, + where host is derived from a URI, a selected alternative + service, or a configured proxy. + + + A client can create additional connections as replacements, either to replace connections + that are near to exhausting the available stream + identifier space, to refresh the keying material for a TLS connection, or to + replace connections that have encountered errors. + + + A client MAY open multiple connections to the same IP address and TCP port using different + Server Name Indication values or to provide different TLS + client certificates, but SHOULD avoid creating multiple connections with the same + configuration. + + + Servers are encouraged to maintain open connections for as long as possible, but are + permitted to terminate idle connections if necessary. When either endpoint chooses to + close the transport-layer TCP connection, the terminating endpoint SHOULD first send a + GOAWAY () frame so that both endpoints can reliably + determine whether previously sent frames have been processed and gracefully complete or + terminate any necessary remaining tasks. + + +
+ + Connections that are made to an origin servers, either directly or through a tunnel + created using the CONNECT method MAY be reused for + requests with multiple different URI authority components. A connection can be reused + as long as the origin server is authoritative. For + http resources, this depends on the host having resolved to + the same IP address. + + + For https resources, connection reuse additionally depends + on having a certificate that is valid for the host in the URI. An origin server might + offer a certificate with multiple subjectAltName attributes, + or names with wildcards, one of which is valid for the authority in the URI. For + example, a certificate with a subjectAltName of *.example.com might permit the use of the same connection for + requests to URIs starting with https://a.example.com/ and + https://b.example.com/. + + + In some deployments, reusing a connection for multiple origins can result in requests + being directed to the wrong origin server. For example, TLS termination might be + performed by a middlebox that uses the TLS Server Name Indication + (SNI) extension to select an origin server. This means that it is possible + for clients to send confidential information to servers that might not be the intended + target for the request, even though the server is otherwise authoritative. + + + A server that does not wish clients to reuse connections can indicate that it is not + authoritative for a request by sending a 421 (Misdirected Request) status code in response + to the request (see ). + + + A client that is configured to use a proxy over HTTP/2 directs requests to that proxy + through a single connection. That is, all requests sent via a proxy reuse the + connection to the proxy. + +
+ +
+ + The 421 (Misdirected Request) status code indicates that the request was directed at a + server that is not able to produce a response. This can be sent by a server that is not + configured to produce responses for the combination of scheme and authority that are + included in the request URI. + + + Clients receiving a 421 (Misdirected Request) response from a server MAY retry the + request - whether the request method is idempotent or not - over a different connection. + This is possible if a connection is reused () or if an alternative + service is selected (). + + + This status code MUST NOT be generated by proxies. + + + A 421 response is cacheable by default; i.e., unless otherwise indicated by the method + definition or explicit cache controls (see ). + +
+
+ +
+ + Implementations of HTTP/2 MUST support TLS 1.2 for HTTP/2 over + TLS. The general TLS usage guidance in SHOULD be followed, with + some additional restrictions that are specific to HTTP/2. + + + + An implementation of HTTP/2 over TLS MUST use TLS 1.2 or higher with the restrictions on + feature set and cipher suite described in this section. Due to implementation + limitations, it might not be possible to fail TLS negotiation. An endpoint MUST + immediately terminate an HTTP/2 connection that does not meet these minimum requirements + with a connection error of type + INADEQUATE_SECURITY. + + +
+ + The TLS implementation MUST support the Server Name Indication + (SNI) extension to TLS. HTTP/2 clients MUST indicate the target domain name when + negotiating TLS. + + + The TLS implementation MUST disable compression. TLS compression can lead to the + exposure of information that would not otherwise be revealed . + Generic compression is unnecessary since HTTP/2 provides compression features that are + more aware of context and therefore likely to be more appropriate for use for + performance, security or other reasons. + + + The TLS implementation MUST disable renegotiation. An endpoint MUST treat a TLS + renegotiation as a connection error of type + PROTOCOL_ERROR. Note that disabling renegotiation can result in + long-lived connections becoming unusable due to limits on the number of messages the + underlying cipher suite can encipher. + + + A client MAY use renegotiation to provide confidentiality protection for client + credentials offered in the handshake, but any renegotiation MUST occur prior to sending + the connection preface. A server SHOULD request a client certificate if it sees a + renegotiation request immediately after establishing a connection. + + + This effectively prevents the use of renegotiation in response to a request for a + specific protected resource. A future specification might provide a way to support this + use case. + +
+ +
+ + The set of TLS cipher suites that are permitted in HTTP/2 is restricted. HTTP/2 MUST + only be used with cipher suites that have ephemeral key exchange, such as the ephemeral Diffie-Hellman (DHE) or the elliptic curve variant (ECDHE). Ephemeral key exchange MUST + have a minimum size of 2048 bits for DHE or security level of 128 bits for ECDHE. + Clients MUST accept DHE sizes of up to 4096 bits. HTTP MUST NOT be used with cipher + suites that use stream or block ciphers. Authenticated Encryption with Additional Data + (AEAD) modes, such as the Galois Counter Model (GCM) mode for + AES are acceptable. + + + The effect of these restrictions is that TLS 1.2 implementations could have + non-intersecting sets of available cipher suites, since these prevent the use of the + cipher suite that TLS 1.2 makes mandatory. To avoid this problem, implementations of + HTTP/2 that use TLS 1.2 MUST support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 with P256 . + + + Clients MAY advertise support of cipher suites that are prohibited by the above + restrictions in order to allow for connection to servers that do not support HTTP/2. + This enables a fallback to protocols without these constraints without the additional + latency imposed by using a separate connection for fallback. + +
+
+
+ +
+
+ + HTTP/2 relies on the HTTP/1.1 definition of authority for determining whether a server is + authoritative in providing a given response, see . This relies on local name resolution for the "http" + URI scheme, and the authenticated server identity for the "https" scheme (see ). + +
+ +
+ + In a cross-protocol attack, an attacker causes a client to initiate a transaction in one + protocol toward a server that understands a different protocol. An attacker might be able + to cause the transaction to appear as valid transaction in the second protocol. In + combination with the capabilities of the web context, this can be used to interact with + poorly protected servers in private networks. + + + Completing a TLS handshake with an ALPN identifier for HTTP/2 can be considered sufficient + protection against cross protocol attacks. ALPN provides a positive indication that a + server is willing to proceed with HTTP/2, which prevents attacks on other TLS-based + protocols. + + + The encryption in TLS makes it difficult for attackers to control the data which could be + used in a cross-protocol attack on a cleartext protocol. + + + The cleartext version of HTTP/2 has minimal protection against cross-protocol attacks. + The connection preface contains a string that is + designed to confuse HTTP/1.1 servers, but no special protection is offered for other + protocols. A server that is willing to ignore parts of an HTTP/1.1 request containing an + Upgrade header field in addition to the client connection preface could be exposed to a + cross-protocol attack. + +
+ +
+ + HTTP/2 header field names and values are encoded as sequences of octets with a length + prefix. This enables HTTP/2 to carry any string of octets as the name or value of a + header field. An intermediary that translates HTTP/2 requests or responses into HTTP/1.1 + directly could permit the creation of corrupted HTTP/1.1 messages. An attacker might + exploit this behavior to cause the intermediary to create HTTP/1.1 messages with illegal + header fields, extra header fields, or even new messages that are entirely falsified. + + + Header field names or values that contain characters not permitted by HTTP/1.1, including + carriage return (ASCII 0xd) or line feed (ASCII 0xa) MUST NOT be translated verbatim by an + intermediary, as stipulated in . + + + Translation from HTTP/1.x to HTTP/2 does not produce the same opportunity to an attacker. + Intermediaries that perform translation to HTTP/2 MUST remove any instances of the obs-fold production from header field values. + +
+ +
+ + Pushed responses do not have an explicit request from the client; the request + is provided by the server in the PUSH_PROMISE frame. + + + Caching responses that are pushed is possible based on the guidance provided by the origin + server in the Cache-Control header field. However, this can cause issues if a single + server hosts more than one tenant. For example, a server might offer multiple users each + a small portion of its URI space. + + + Where multiple tenants share space on the same server, that server MUST ensure that + tenants are not able to push representations of resources that they do not have authority + over. Failure to enforce this would allow a tenant to provide a representation that would + be served out of cache, overriding the actual representation that the authoritative tenant + provides. + + + Pushed responses for which an origin server is not authoritative (see + ) are never cached or used. + +
+ +
+ + An HTTP/2 connection can demand a greater commitment of resources to operate than a + HTTP/1.1 connection. The use of header compression and flow control depend on a + commitment of resources for storing a greater amount of state. Settings for these + features ensure that memory commitments for these features are strictly bounded. + + + The number of PUSH_PROMISE frames is not constrained in the same fashion. + A client that accepts server push SHOULD limit the number of streams it allows to be in + the "reserved (remote)" state. Excessive number of server push streams can be treated as + a stream error of type + ENHANCE_YOUR_CALM. + + + Processing capacity cannot be guarded as effectively as state capacity. + + + The SETTINGS frame can be abused to cause a peer to expend additional + processing time. This might be done by pointlessly changing SETTINGS parameters, setting + multiple undefined parameters, or changing the same setting multiple times in the same + frame. WINDOW_UPDATE or PRIORITY frames can be abused to + cause an unnecessary waste of resources. + + + Large numbers of small or empty frames can be abused to cause a peer to expend time + processing frame headers. Note however that some uses are entirely legitimate, such as + the sending of an empty DATA frame to end a stream. + + + Header compression also offers some opportunities to waste processing resources; see for more details on potential abuses. + + + Limits in SETTINGS parameters cannot be reduced instantaneously, which + leaves an endpoint exposed to behavior from a peer that could exceed the new limits. In + particular, immediately after establishing a connection, limits set by a server are not + known to clients and could be exceeded without being an obvious protocol violation. + + + All these features - i.e., SETTINGS changes, small frames, header + compression - have legitimate uses. These features become a burden only when they are + used unnecessarily or to excess. + + + An endpoint that doesn't monitor this behavior exposes itself to a risk of denial of + service attack. Implementations SHOULD track the use of these features and set limits on + their use. An endpoint MAY treat activity that is suspicious as a connection error of type + ENHANCE_YOUR_CALM. + + +
+ + A large header block can cause an implementation to + commit a large amount of state. Header fields that are critical for routing can appear + toward the end of a header block, which prevents streaming of header fields to their + ultimate destination. For this an other reasons, such as ensuring cache correctness, + means that an endpoint might need to buffer the entire header block. Since there is no + hard limit to the size of a header block, some endpoints could be forced commit a large + amount of available memory for header fields. + + + An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE to advise peers of + limits that might apply on the size of header blocks. This setting is only advisory, so + endpoints MAY choose to send header blocks that exceed this limit and risk having the + request or response being treated as malformed. This setting specific to a connection, + so any request or response could encounter a hop with a lower, unknown limit. An + intermediary can attempt to avoid this problem by passing on values presented by + different peers, but they are not obligated to do so. + + + A server that receives a larger header block than it is willing to handle can send an + HTTP 431 (Request Header Fields Too Large) status code . A + client can discard responses that it cannot process. The header block MUST be processed + to ensure a consistent connection state, unless the connection is closed. + +
+
+ +
+ + HTTP/2 enables greater use of compression for both header fields () and entity bodies. Compression can allow an attacker to recover + secret data when it is compressed in the same context as data under attacker control. + + + There are demonstrable attacks on compression that exploit the characteristics of the web + (e.g., ). The attacker induces multiple requests containing + varying plaintext, observing the length of the resulting ciphertext in each, which + reveals a shorter length when a guess about the secret is correct. + + + Implementations communicating on a secure channel MUST NOT compress content that includes + both confidential and attacker-controlled data unless separate compression dictionaries + are used for each source of data. Compression MUST NOT be used if the source of data + cannot be reliably determined. Generic stream compression, such as that provided by TLS + MUST NOT be used with HTTP/2 (). + + + Further considerations regarding the compression of header fields are described in . + +
+ +
+ + Padding within HTTP/2 is not intended as a replacement for general purpose padding, such + as might be provided by TLS. Redundant padding could even be + counterproductive. Correct application can depend on having specific knowledge of the + data that is being padded. + + + To mitigate attacks that rely on compression, disabling or limiting compression might be + preferable to padding as a countermeasure. + + + Padding can be used to obscure the exact size of frame content, and is provided to + mitigate specific attacks within HTTP. For example, attacks where compressed content + includes both attacker-controlled plaintext and secret data (see for example, ). + + + Use of padding can result in less protection than might seem immediately obvious. At + best, padding only makes it more difficult for an attacker to infer length information by + increasing the number of frames an attacker has to observe. Incorrectly implemented + padding schemes can be easily defeated. In particular, randomized padding with a + predictable distribution provides very little protection; similarly, padding payloads to a + fixed size exposes information as payload sizes cross the fixed size boundary, which could + be possible if an attacker can control plaintext. + + + Intermediaries SHOULD retain padding for DATA frames, but MAY drop padding + for HEADERS and PUSH_PROMISE frames. A valid reason for an + intermediary to change the amount of padding of frames is to improve the protections that + padding provides. + +
+ +
+ + Several characteristics of HTTP/2 provide an observer an opportunity to correlate actions + of a single client or server over time. This includes the value of settings, the manner + in which flow control windows are managed, the way priorities are allocated to streams, + timing of reactions to stimulus, and handling of any optional features. + + + As far as this creates observable differences in behavior, they could be used as a basis + for fingerprinting a specific client, as defined in . + +
+
+ +
+ + A string for identifying HTTP/2 is entered into the "Application Layer Protocol Negotiation + (ALPN) Protocol IDs" registry established in . + + + This document establishes a registry for frame types, settings, and error codes. These new + registries are entered into a new "Hypertext Transfer Protocol (HTTP) 2 Parameters" section. + + + This document registers the HTTP2-Settings header field for + use in HTTP; and the 421 (Misdirected Request) status code. + + + This document registers the PRI method for use in HTTP, to avoid + collisions with the connection preface. + + +
+ + This document creates two registrations for the identification of HTTP/2 in the + "Application Layer Protocol Negotiation (ALPN) Protocol IDs" registry established in . + + + The "h2" string identifies HTTP/2 when used over TLS: + + HTTP/2 over TLS + 0x68 0x32 ("h2") + This document + + + + The "h2c" string identifies HTTP/2 when used over cleartext TCP: + + HTTP/2 over TCP + 0x68 0x32 0x63 ("h2c") + This document + + +
+ +
+ + This document establishes a registry for HTTP/2 frame type codes. The "HTTP/2 Frame + Type" registry manages an 8-bit space. The "HTTP/2 Frame Type" registry operates under + either of the "IETF Review" or "IESG Approval" policies for + values between 0x00 and 0xef, with values between 0xf0 and 0xff being reserved for + experimental use. + + + New entries in this registry require the following information: + + + A name or label for the frame type. + + + The 8-bit code assigned to the frame type. + + + A reference to a specification that includes a description of the frame layout, + it's semantics and flags that the frame type uses, including any parts of the frame + that are conditionally present based on the value of flags. + + + + + The entries in the following table are registered by this document. + + + Frame Type + Code + Section + DATA0x0 + HEADERS0x1 + PRIORITY0x2 + RST_STREAM0x3 + SETTINGS0x4 + PUSH_PROMISE0x5 + PING0x6 + GOAWAY0x7 + WINDOW_UPDATE0x8 + CONTINUATION0x9 + +
+ +
+ + This document establishes a registry for HTTP/2 settings. The "HTTP/2 Settings" registry + manages a 16-bit space. The "HTTP/2 Settings" registry operates under the "Expert Review" policy for values in the range from 0x0000 to + 0xefff, with values between and 0xf000 and 0xffff being reserved for experimental use. + + + New registrations are advised to provide the following information: + + + A symbolic name for the setting. Specifying a setting name is optional. + + + The 16-bit code assigned to the setting. + + + An initial value for the setting. + + + An optional reference to a specification that describes the use of the setting. + + + + + An initial set of setting registrations can be found in . + + + Name + Code + Initial Value + Specification + HEADER_TABLE_SIZE + 0x14096 + ENABLE_PUSH + 0x21 + MAX_CONCURRENT_STREAMS + 0x3(infinite) + INITIAL_WINDOW_SIZE + 0x465535 + MAX_FRAME_SIZE + 0x516384 + MAX_HEADER_LIST_SIZE + 0x6(infinite) + + +
+ +
+ + This document establishes a registry for HTTP/2 error codes. The "HTTP/2 Error Code" + registry manages a 32-bit space. The "HTTP/2 Error Code" registry operates under the + "Expert Review" policy. + + + Registrations for error codes are required to include a description of the error code. An + expert reviewer is advised to examine new registrations for possible duplication with + existing error codes. Use of existing registrations is to be encouraged, but not + mandated. + + + New registrations are advised to provide the following information: + + + A name for the error code. Specifying an error code name is optional. + + + The 32-bit error code value. + + + A brief description of the error code semantics, longer if no detailed specification + is provided. + + + An optional reference for a specification that defines the error code. + + + + + The entries in the following table are registered by this document. + + + Name + Code + Description + Specification + NO_ERROR0x0 + Graceful shutdown + + PROTOCOL_ERROR0x1 + Protocol error detected + + INTERNAL_ERROR0x2 + Implementation fault + + FLOW_CONTROL_ERROR0x3 + Flow control limits exceeded + + SETTINGS_TIMEOUT0x4 + Settings not acknowledged + + STREAM_CLOSED0x5 + Frame received for closed stream + + FRAME_SIZE_ERROR0x6 + Frame size incorrect + + REFUSED_STREAM0x7 + Stream not processed + + CANCEL0x8 + Stream cancelled + + COMPRESSION_ERROR0x9 + Compression state not updated + + CONNECT_ERROR0xa + TCP connection error for CONNECT method + + ENHANCE_YOUR_CALM0xb + Processing capacity exceeded + + INADEQUATE_SECURITY0xc + Negotiated TLS parameters not acceptable + + + +
+ +
+ + This section registers the HTTP2-Settings header field in the + Permanent Message Header Field Registry. + + + HTTP2-Settings + + + http + + + standard + + + IETF + + + of this document + + + This header field is only used by an HTTP/2 client for Upgrade-based negotiation. + + + +
+ +
+ + This section registers the PRI method in the HTTP Method + Registry (). + + + PRI + + + No + + + No + + + of this document + + + This method is never used by an actual client. This method will appear to be used + when an HTTP/1.1 server or intermediary attempts to parse an HTTP/2 connection + preface. + + + +
+ +
+ + This document registers the 421 (Misdirected Request) HTTP Status code in the Hypertext + Transfer Protocol (HTTP) Status Code Registry (). + + + + + 421 + + + Misdirected Request + + + of this document + + + +
+ +
+ +
+ + This document includes substantial input from the following individuals: + + + Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa Wilk, Costin + Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam Barth, Ryan Hamilton, Gavin + Peters, Kent Alstad, Kevin Lindsay, Paul Amer, Fan Yang, Jonathan Leighton (SPDY + contributors). + + + Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). + + + William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, Jitu Padhye, Roberto + Peon, Rob Trace (Flow control). + + + Mike Bishop (Extensibility). + + + Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike Bishop, Herve Ruellan + (Substantial editorial contributions). + + + Kari Hurtta, Tatsuhiro Tsujikawa, Greg Wilkins, Poul-Henning Kamp. + + + Alexey Melnikov was an editor of this document during 2013. + + + A substantial proportion of Martin's contribution was supported by Microsoft during his + employment there. + + + +
+
+ + + + + + HPACK - Header Compression for HTTP/2 + + + + + + + + + + + + Transmission Control Protocol + + + University of Southern California (USC)/Information Sciences + Institute + + + + + + + + + + + Key words for use in RFCs to Indicate Requirement Levels + + + Harvard University +
sob@harvard.edu
+
+ +
+ + +
+ + + + + HTTP Over TLS + + + + + + + + + + Uniform Resource Identifier (URI): Generic + Syntax + + + + + + + + + + + + The Base16, Base32, and Base64 Data Encodings + + + + + + + + + Guidelines for Writing an IANA Considerations Section in RFCs + + + + + + + + + + + Augmented BNF for Syntax Specifications: ABNF + + + + + + + + + + + The Transport Layer Security (TLS) Protocol Version 1.2 + + + + + + + + + + + Transport Layer Security (TLS) Extensions: Extension Definitions + + + + + + + + + + Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension + + + + + + + + + + + + + TLS Elliptic Curve Cipher Suites with SHA-256/384 and AES Galois + Counter Mode (GCM) + + + + + + + + + + + Digital Signature Standard (DSS) + + NIST + + + + + + + + + Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing + + Adobe Systems Incorporated +
fielding@gbiv.com
+
+ + greenbytes GmbH +
julian.reschke@greenbytes.de
+
+ +
+ + +
+ + + + Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content + + Adobe Systems Incorporated +
fielding@gbiv.com
+
+ + greenbytes GmbH +
julian.reschke@greenbytes.de
+
+ +
+ + +
+ + + Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests + + Adobe Systems Incorporated +
fielding@gbiv.com
+
+ + greenbytes GmbH +
julian.reschke@greenbytes.de
+
+ +
+ +
+ + + Hypertext Transfer Protocol (HTTP/1.1): Range Requests + + Adobe Systems Incorporated +
fielding@gbiv.com
+
+ + World Wide Web Consortium +
ylafon@w3.org
+
+ + greenbytes GmbH +
julian.reschke@greenbytes.de
+
+ +
+ +
+ + + Hypertext Transfer Protocol (HTTP/1.1): Caching + + Adobe Systems Incorporated +
fielding@gbiv.com
+
+ + Akamai +
mnot@mnot.net
+
+ + greenbytes GmbH +
julian.reschke@greenbytes.de
+
+ +
+ + +
+ + + Hypertext Transfer Protocol (HTTP/1.1): Authentication + + Adobe Systems Incorporated +
fielding@gbiv.com
+
+ + greenbytes GmbH +
julian.reschke@greenbytes.de
+
+ +
+ + +
+ + + + HTTP State Management Mechanism + + + + + +
+ + + + + + TCP Extensions for High Performance + + + + + + + + + + + + Transport Layer Security Protocol Compression Methods + + + + + + + + + Additional HTTP Status Codes + + + + + + + + + + + Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) + + + + + + + + + + + + + + + AES Galois Counter Mode (GCM) Cipher Suites for TLS + + + + + + + + + + + + HTML5 + + + + + + + + + + + Latest version available at + . + + + + + + + Talking to Yourself for Fun and Profit + + + + + + + + + + + + + + BREACH: Reviving the CRIME Attack + + + + + + + + + + + Registration Procedures for Message Header Fields + + Nine by Nine +
GK-IETF@ninebynine.org
+
+ + BEA Systems +
mnot@pobox.com
+
+ + HP Labs +
JeffMogul@acm.org
+
+ +
+ + +
+ + + + Recommendations for Secure Use of TLS and DTLS + + + + + + + + + + + + + + + + + + HTTP Alternative Services + + + Akamai + + + Mozilla + + + greenbytes + + + + + + +
+ +
+ + This section is to be removed by RFC Editor before publication. + + +
+ + Renamed Not Authoritative status code to Misdirected Request. + +
+ +
+ + Pseudo-header fields are now required to appear strictly before regular ones. + + + Restored 1xx series status codes, except 101. + + + Changed frame length field 24-bits. Expanded frame header to 9 octets. Added a setting + to limit the damage. + + + Added a setting to advise peers of header set size limits. + + + Removed segments. + + + Made non-semantic-bearing HEADERS frames illegal in the HTTP mapping. + +
+ +
+ + Restored extensibility options. + + + Restricting TLS cipher suites to AEAD only. + + + Removing Content-Encoding requirements. + + + Permitting the use of PRIORITY after stream close. + + + Removed ALTSVC frame. + + + Removed BLOCKED frame. + + + Reducing the maximum padding size to 256 octets; removing padding from + CONTINUATION frames. + + + Removed per-frame GZIP compression. + +
+ +
+ + Added BLOCKED frame (at risk). + + + Simplified priority scheme. + + + Added DATA per-frame GZIP compression. + +
+ +
+ + Changed "connection header" to "connection preface" to avoid confusion. + + + Added dependency-based stream prioritization. + + + Added "h2c" identifier to distinguish between cleartext and secured HTTP/2. + + + Adding missing padding to PUSH_PROMISE. + + + Integrate ALTSVC frame and supporting text. + + + Dropping requirement on "deflate" Content-Encoding. + + + Improving security considerations around use of compression. + +
+ +
+ + Adding padding for data frames. + + + Renumbering frame types, error codes, and settings. + + + Adding INADEQUATE_SECURITY error code. + + + Updating TLS usage requirements to 1.2; forbidding TLS compression. + + + Removing extensibility for frames and settings. + + + Changing setting identifier size. + + + Removing the ability to disable flow control. + + + Changing the protocol identification token to "h2". + + + Changing the use of :authority to make it optional and to allow userinfo in non-HTTP + cases. + + + Allowing split on 0x0 for Cookie. + + + Reserved PRI method in HTTP/1.1 to avoid possible future collisions. + +
+ +
+ + Added cookie crumbling for more efficient header compression. + + + Added header field ordering with the value-concatenation mechanism. + +
+ +
+ + Marked draft for implementation. + +
+ +
+ + Adding definition for CONNECT method. + + + Constraining the use of push to safe, cacheable methods with no request body. + + + Changing from :host to :authority to remove any potential confusion. + + + Adding setting for header compression table size. + + + Adding settings acknowledgement. + + + Removing unnecessary and potentially problematic flags from CONTINUATION. + + + Added denial of service considerations. + +
+
+ + Marking the draft ready for implementation. + + + Renumbering END_PUSH_PROMISE flag. + + + Editorial clarifications and changes. + +
+ +
+ + Added CONTINUATION frame for HEADERS and PUSH_PROMISE. + + + PUSH_PROMISE is no longer implicitly prohibited if SETTINGS_MAX_CONCURRENT_STREAMS is + zero. + + + Push expanded to allow all safe methods without a request body. + + + Clarified the use of HTTP header fields in requests and responses. Prohibited HTTP/1.1 + hop-by-hop header fields. + + + Requiring that intermediaries not forward requests with missing or illegal routing + :-headers. + + + Clarified requirements around handling different frames after stream close, stream reset + and GOAWAY. + + + Added more specific prohibitions for sending of different frame types in various stream + states. + + + Making the last received setting value the effective value. + + + Clarified requirements on TLS version, extension and ciphers. + +
+ +
+ + Committed major restructuring atrocities. + + + Added reference to first header compression draft. + + + Added more formal description of frame lifecycle. + + + Moved END_STREAM (renamed from FINAL) back to HEADERS/DATA. + + + Removed HEADERS+PRIORITY, added optional priority to HEADERS frame. + + + Added PRIORITY frame. + +
+ +
+ + Added continuations to frames carrying header blocks. + + + Replaced use of "session" with "connection" to avoid confusion with other HTTP stateful + concepts, like cookies. + + + Removed "message". + + + Switched to TLS ALPN from NPN. + + + Editorial changes. + +
+ +
+ + Added IANA considerations section for frame types, error codes and settings. + + + Removed data frame compression. + + + Added PUSH_PROMISE. + + + Added globally applicable flags to framing. + + + Removed zlib-based header compression mechanism. + + + Updated references. + + + Clarified stream identifier reuse. + + + Removed CREDENTIALS frame and associated mechanisms. + + + Added advice against naive implementation of flow control. + + + Added session header section. + + + Restructured frame header. Removed distinction between data and control frames. + + + Altered flow control properties to include session-level limits. + + + Added note on cacheability of pushed resources and multiple tenant servers. + + + Changed protocol label form based on discussions. + +
+ +
+ + Changed title throughout. + + + Removed section on Incompatibilities with SPDY draft#2. + + + Changed INTERNAL_ERROR on GOAWAY to have a value of 2 . + + + Replaced abstract and introduction. + + + Added section on starting HTTP/2.0, including upgrade mechanism. + + + Removed unused references. + + + Added flow control principles based on . + +
+ +
+ + Adopted as base for draft-ietf-httpbis-http2. + + + Updated authors/editors list. + + + Added status note. + +
+
+ +
+
+ diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go new file mode 100644 index 00000000..fb6d319d --- /dev/null +++ b/vendor/golang.org/x/net/http2/transport.go @@ -0,0 +1,1104 @@ +// Copyright 2015 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. + +// Transport code. + +package http2 + +import ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "net" + "net/http" + "strconv" + "strings" + "sync" + + "golang.org/x/net/http2/hpack" +) + +const ( + // transportDefaultConnFlow is how many connection-level flow control + // tokens we give the server at start-up, past the default 64k. + transportDefaultConnFlow = 1 << 30 + + // transportDefaultStreamFlow is how many stream-level flow + // control tokens we announce to the peer, and how many bytes + // we buffer per stream. + transportDefaultStreamFlow = 4 << 20 + + // transportDefaultStreamMinRefresh is the minimum number of bytes we'll send + // a stream-level WINDOW_UPDATE for at a time. + transportDefaultStreamMinRefresh = 4 << 10 +) + +// Transport is an HTTP/2 Transport. +// +// A Transport internally caches connections to servers. It is safe +// for concurrent use by multiple goroutines. +type Transport struct { + // DialTLS specifies an optional dial function for creating + // TLS connections for requests. + // + // If DialTLS is nil, tls.Dial is used. + // + // If the returned net.Conn has a ConnectionState method like tls.Conn, + // it will be used to set http.Response.TLS. + DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error) + + // TLSClientConfig specifies the TLS configuration to use with + // tls.Client. If nil, the default configuration is used. + TLSClientConfig *tls.Config + + // ConnPool optionally specifies an alternate connection pool to use. + // If nil, the default is used. + ConnPool ClientConnPool + + connPoolOnce sync.Once + connPoolOrDef ClientConnPool // non-nil version of ConnPool +} + +var errTransportVersion = errors.New("http2: ConfigureTransport is only supported starting at Go 1.6") + +// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. +// It requires Go 1.6 or later and returns an error if the net/http package is too old +// or if t1 has already been HTTP/2-enabled. +func ConfigureTransport(t1 *http.Transport) error { + return configureTransport(t1) // in configure_transport.go (go1.6) or go15.go +} + +func (t *Transport) connPool() ClientConnPool { + t.connPoolOnce.Do(t.initConnPool) + return t.connPoolOrDef +} + +func (t *Transport) initConnPool() { + if t.ConnPool != nil { + t.connPoolOrDef = t.ConnPool + } else { + t.connPoolOrDef = &clientConnPool{t: t} + } +} + +// ClientConn is the state of a single HTTP/2 client connection to an +// HTTP/2 server. +type ClientConn struct { + t *Transport + tconn net.Conn // usually *tls.Conn, except specialized impls + tlsState *tls.ConnectionState // nil only for specialized impls + + // readLoop goroutine fields: + readerDone chan struct{} // closed on error + readerErr error // set before readerDone is closed + + mu sync.Mutex // guards following + cond *sync.Cond // hold mu; broadcast on flow/closed changes + flow flow // our conn-level flow control quota (cs.flow is per stream) + inflow flow // peer's conn-level flow control + closed bool + goAway *GoAwayFrame // if non-nil, the GoAwayFrame we received + streams map[uint32]*clientStream // client-initiated + nextStreamID uint32 + bw *bufio.Writer + br *bufio.Reader + fr *Framer + // Settings from peer: + maxFrameSize uint32 + maxConcurrentStreams uint32 + initialWindowSize uint32 + hbuf bytes.Buffer // HPACK encoder writes into this + henc *hpack.Encoder + freeBuf [][]byte + + wmu sync.Mutex // held while writing; acquire AFTER wmu if holding both + werr error // first write error that has occurred +} + +// clientStream is the state for a single HTTP/2 stream. One of these +// is created for each Transport.RoundTrip call. +type clientStream struct { + cc *ClientConn + ID uint32 + resc chan resAndError + bufPipe pipe // buffered pipe with the flow-controlled response payload + + flow flow // guarded by cc.mu + inflow flow // guarded by cc.mu + + peerReset chan struct{} // closed on peer reset + resetErr error // populated before peerReset is closed +} + +// checkReset reports any error sent in a RST_STREAM frame by the +// server. +func (cs *clientStream) checkReset() error { + select { + case <-cs.peerReset: + return cs.resetErr + default: + return nil + } +} + +type stickyErrWriter struct { + w io.Writer + err *error +} + +func (sew stickyErrWriter) Write(p []byte) (n int, err error) { + if *sew.err != nil { + return 0, *sew.err + } + n, err = sew.w.Write(p) + *sew.err = err + return +} + +var ErrNoCachedConn = errors.New("http2: no cached connection was available") + +// RoundTripOpt are options for the Transport.RoundTripOpt method. +type RoundTripOpt struct { + // OnlyCachedConn controls whether RoundTripOpt may + // create a new TCP connection. If set true and + // no cached connection is available, RoundTripOpt + // will return ErrNoCachedConn. + OnlyCachedConn bool +} + +func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { + return t.RoundTripOpt(req, RoundTripOpt{}) +} + +// authorityAddr returns a given authority (a host/IP, or host:port / ip:port) +// and returns a host:port. The port 443 is added if needed. +func authorityAddr(authority string) (addr string) { + if _, _, err := net.SplitHostPort(authority); err == nil { + return authority + } + return net.JoinHostPort(authority, "443") +} + +// RoundTripOpt is like RoundTrip, but takes options. +func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { + if req.URL.Scheme != "https" { + return nil, errors.New("http2: unsupported scheme") + } + + addr := authorityAddr(req.URL.Host) + for { + cc, err := t.connPool().GetClientConn(req, addr) + if err != nil { + return nil, err + } + res, err := cc.RoundTrip(req) + if shouldRetryRequest(req, err) { + continue + } + if err != nil { + return nil, err + } + return res, nil + } +} + +// CloseIdleConnections closes any connections which were previously +// connected from previous requests but are now sitting idle. +// It does not interrupt any connections currently in use. +func (t *Transport) CloseIdleConnections() { + if cp, ok := t.connPool().(*clientConnPool); ok { + cp.closeIdleConnections() + } +} + +var ( + errClientConnClosed = errors.New("http2: client conn is closed") + errClientConnUnusable = errors.New("http2: client conn not usable") +) + +func shouldRetryRequest(req *http.Request, err error) bool { + // TODO: retry GET requests (no bodies) more aggressively, if shutdown + // before response. + return err == errClientConnUnusable +} + +func (t *Transport) dialClientConn(addr string) (*ClientConn, error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + tconn, err := t.dialTLS()("tcp", addr, t.newTLSConfig(host)) + if err != nil { + return nil, err + } + return t.NewClientConn(tconn) +} + +func (t *Transport) newTLSConfig(host string) *tls.Config { + cfg := new(tls.Config) + if t.TLSClientConfig != nil { + *cfg = *t.TLSClientConfig + } + cfg.NextProtos = []string{NextProtoTLS} // TODO: don't override if already in list + cfg.ServerName = host + return cfg +} + +func (t *Transport) dialTLS() func(string, string, *tls.Config) (net.Conn, error) { + if t.DialTLS != nil { + return t.DialTLS + } + return t.dialTLSDefault +} + +func (t *Transport) dialTLSDefault(network, addr string, cfg *tls.Config) (net.Conn, error) { + cn, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + if err := cn.Handshake(); err != nil { + return nil, err + } + if !cfg.InsecureSkipVerify { + if err := cn.VerifyHostname(cfg.ServerName); err != nil { + return nil, err + } + } + state := cn.ConnectionState() + if p := state.NegotiatedProtocol; p != NextProtoTLS { + return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS) + } + if !state.NegotiatedProtocolIsMutual { + return nil, errors.New("http2: could not negotiate protocol mutually") + } + return cn, nil +} + +func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) { + if _, err := c.Write(clientPreface); err != nil { + return nil, err + } + + cc := &ClientConn{ + t: t, + tconn: c, + readerDone: make(chan struct{}), + nextStreamID: 1, + maxFrameSize: 16 << 10, // spec default + initialWindowSize: 65535, // spec default + maxConcurrentStreams: 1000, // "infinite", per spec. 1000 seems good enough. + streams: make(map[uint32]*clientStream), + } + cc.cond = sync.NewCond(&cc.mu) + cc.flow.add(int32(initialWindowSize)) + + // TODO: adjust this writer size to account for frame size + + // MTU + crypto/tls record padding. + cc.bw = bufio.NewWriter(stickyErrWriter{c, &cc.werr}) + cc.br = bufio.NewReader(c) + cc.fr = NewFramer(cc.bw, cc.br) + cc.henc = hpack.NewEncoder(&cc.hbuf) + + type connectionStater interface { + ConnectionState() tls.ConnectionState + } + if cs, ok := c.(connectionStater); ok { + state := cs.ConnectionState() + cc.tlsState = &state + } + + cc.fr.WriteSettings( + Setting{ID: SettingEnablePush, Val: 0}, + Setting{ID: SettingInitialWindowSize, Val: transportDefaultStreamFlow}, + ) + cc.fr.WriteWindowUpdate(0, transportDefaultConnFlow) + cc.inflow.add(transportDefaultConnFlow + initialWindowSize) + cc.bw.Flush() + if cc.werr != nil { + return nil, cc.werr + } + + // Read the obligatory SETTINGS frame + f, err := cc.fr.ReadFrame() + if err != nil { + return nil, err + } + sf, ok := f.(*SettingsFrame) + if !ok { + return nil, fmt.Errorf("expected settings frame, got: %T", f) + } + cc.fr.WriteSettingsAck() + cc.bw.Flush() + + sf.ForeachSetting(func(s Setting) error { + switch s.ID { + case SettingMaxFrameSize: + cc.maxFrameSize = s.Val + case SettingMaxConcurrentStreams: + cc.maxConcurrentStreams = s.Val + case SettingInitialWindowSize: + cc.initialWindowSize = s.Val + default: + // TODO(bradfitz): handle more + t.vlogf("Unhandled Setting: %v", s) + } + return nil + }) + + go cc.readLoop() + return cc, nil +} + +func (cc *ClientConn) setGoAway(f *GoAwayFrame) { + cc.mu.Lock() + defer cc.mu.Unlock() + cc.goAway = f +} + +func (cc *ClientConn) CanTakeNewRequest() bool { + cc.mu.Lock() + defer cc.mu.Unlock() + return cc.canTakeNewRequestLocked() +} + +func (cc *ClientConn) canTakeNewRequestLocked() bool { + return cc.goAway == nil && + int64(len(cc.streams)+1) < int64(cc.maxConcurrentStreams) && + cc.nextStreamID < 2147483647 +} + +func (cc *ClientConn) closeIfIdle() { + cc.mu.Lock() + if len(cc.streams) > 0 { + cc.mu.Unlock() + return + } + cc.closed = true + // TODO: do clients send GOAWAY too? maybe? Just Close: + cc.mu.Unlock() + + cc.tconn.Close() +} + +const maxAllocFrameSize = 512 << 10 + +// frameBuffer returns a scratch buffer suitable for writing DATA frames. +// They're capped at the min of the peer's max frame size or 512KB +// (kinda arbitrarily), but definitely capped so we don't allocate 4GB +// bufers. +func (cc *ClientConn) frameScratchBuffer() []byte { + cc.mu.Lock() + size := cc.maxFrameSize + if size > maxAllocFrameSize { + size = maxAllocFrameSize + } + for i, buf := range cc.freeBuf { + if len(buf) >= int(size) { + cc.freeBuf[i] = nil + cc.mu.Unlock() + return buf[:size] + } + } + cc.mu.Unlock() + return make([]byte, size) +} + +func (cc *ClientConn) putFrameScratchBuffer(buf []byte) { + cc.mu.Lock() + defer cc.mu.Unlock() + const maxBufs = 4 // arbitrary; 4 concurrent requests per conn? investigate. + if len(cc.freeBuf) < maxBufs { + cc.freeBuf = append(cc.freeBuf, buf) + return + } + for i, old := range cc.freeBuf { + if old == nil { + cc.freeBuf[i] = buf + return + } + } + // forget about it. +} + +func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { + cc.mu.Lock() + + if cc.closed || !cc.canTakeNewRequestLocked() { + cc.mu.Unlock() + return nil, errClientConnUnusable + } + + cs := cc.newStream() + hasBody := req.Body != nil + + // we send: HEADERS{1}, CONTINUATION{0,} + DATA{0,} + hdrs := cc.encodeHeaders(req) + first := true // first frame written (HEADERS is first, then CONTINUATION) + + cc.wmu.Lock() + frameSize := int(cc.maxFrameSize) + for len(hdrs) > 0 && cc.werr == nil { + chunk := hdrs + if len(chunk) > frameSize { + chunk = chunk[:frameSize] + } + hdrs = hdrs[len(chunk):] + endHeaders := len(hdrs) == 0 + if first { + cc.fr.WriteHeaders(HeadersFrameParam{ + StreamID: cs.ID, + BlockFragment: chunk, + EndStream: !hasBody, + EndHeaders: endHeaders, + }) + first = false + } else { + cc.fr.WriteContinuation(cs.ID, endHeaders, chunk) + } + } + cc.bw.Flush() + werr := cc.werr + cc.wmu.Unlock() + cc.mu.Unlock() + + if werr != nil { + return nil, werr + } + + var bodyCopyErrc chan error + var gotResHeaders chan struct{} // closed on resheaders + if hasBody { + bodyCopyErrc = make(chan error, 1) + gotResHeaders = make(chan struct{}) + go func() { + bodyCopyErrc <- cs.writeRequestBody(req.Body, gotResHeaders) + }() + } + + for { + select { + case re := <-cs.resc: + if gotResHeaders != nil { + close(gotResHeaders) + } + if re.err != nil { + return nil, re.err + } + res := re.res + res.Request = req + res.TLS = cc.tlsState + return res, nil + case err := <-bodyCopyErrc: + if err != nil { + return nil, err + } + } + } +} + +var errServerResponseBeforeRequestBody = errors.New("http2: server sent response while still writing request body") + +func (cs *clientStream) writeRequestBody(body io.Reader, gotResHeaders <-chan struct{}) error { + cc := cs.cc + sentEnd := false // whether we sent the final DATA frame w/ END_STREAM + buf := cc.frameScratchBuffer() + defer cc.putFrameScratchBuffer(buf) + + for !sentEnd { + var sawEOF bool + n, err := io.ReadFull(body, buf) + if err == io.ErrUnexpectedEOF { + sawEOF = true + err = nil + } else if err == io.EOF { + break + } else if err != nil { + return err + } + + toWrite := buf[:n] + for len(toWrite) > 0 && err == nil { + var allowed int32 + allowed, err = cs.awaitFlowControl(int32(len(toWrite))) + if err != nil { + return err + } + + cc.wmu.Lock() + select { + case <-gotResHeaders: + err = errServerResponseBeforeRequestBody + case <-cs.peerReset: + err = cs.resetErr + default: + data := toWrite[:allowed] + toWrite = toWrite[allowed:] + sentEnd = sawEOF && len(toWrite) == 0 + err = cc.fr.WriteData(cs.ID, sentEnd, data) + } + cc.wmu.Unlock() + } + if err != nil { + return err + } + } + + var err error + + cc.wmu.Lock() + if !sentEnd { + err = cc.fr.WriteData(cs.ID, true, nil) + } + if ferr := cc.bw.Flush(); ferr != nil && err == nil { + err = ferr + } + cc.wmu.Unlock() + + return err +} + +// awaitFlowControl waits for [1, min(maxBytes, cc.cs.maxFrameSize)] flow +// control tokens from the server. +// It returns either the non-zero number of tokens taken or an error +// if the stream is dead. +func (cs *clientStream) awaitFlowControl(maxBytes int32) (taken int32, err error) { + cc := cs.cc + cc.mu.Lock() + defer cc.mu.Unlock() + for { + if cc.closed { + return 0, errClientConnClosed + } + if err := cs.checkReset(); err != nil { + return 0, err + } + if a := cs.flow.available(); a > 0 { + take := a + if take > maxBytes { + take = maxBytes + } + if take > int32(cc.maxFrameSize) { + take = int32(cc.maxFrameSize) + } + cs.flow.take(take) + return take, nil + } + cc.cond.Wait() + } +} + +// requires cc.mu be held. +func (cc *ClientConn) encodeHeaders(req *http.Request) []byte { + cc.hbuf.Reset() + + // TODO(bradfitz): figure out :authority-vs-Host stuff between http2 and Go + host := req.Host + if host == "" { + host = req.URL.Host + } + + // 8.1.2.3 Request Pseudo-Header Fields + // The :path pseudo-header field includes the path and query parts of the + // target URI (the path-absolute production and optionally a '?' character + // followed by the query production (see Sections 3.3 and 3.4 of + // [RFC3986]). + cc.writeHeader(":authority", host) // probably not right for all sites + cc.writeHeader(":method", req.Method) + cc.writeHeader(":path", req.URL.RequestURI()) + cc.writeHeader(":scheme", "https") + + for k, vv := range req.Header { + lowKey := strings.ToLower(k) + if lowKey == "host" { + continue + } + for _, v := range vv { + cc.writeHeader(lowKey, v) + } + } + return cc.hbuf.Bytes() +} + +func (cc *ClientConn) writeHeader(name, value string) { + cc.henc.WriteField(hpack.HeaderField{Name: name, Value: value}) +} + +type resAndError struct { + res *http.Response + err error +} + +// requires cc.mu be held. +func (cc *ClientConn) newStream() *clientStream { + cs := &clientStream{ + cc: cc, + ID: cc.nextStreamID, + resc: make(chan resAndError, 1), + peerReset: make(chan struct{}), + } + cs.flow.add(int32(cc.initialWindowSize)) + cs.flow.setConnFlow(&cc.flow) + cs.inflow.add(transportDefaultStreamFlow) + cs.inflow.setConnFlow(&cc.inflow) + cc.nextStreamID += 2 + cc.streams[cs.ID] = cs + return cs +} + +func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { + cc.mu.Lock() + defer cc.mu.Unlock() + cs := cc.streams[id] + if andRemove { + delete(cc.streams, id) + } + return cs +} + +// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop. +type clientConnReadLoop struct { + cc *ClientConn + activeRes map[uint32]*clientStream // keyed by streamID + + // continueStreamID is the stream ID we're waiting for + // continuation frames for. + continueStreamID uint32 + + hdec *hpack.Decoder + + // Fields reset on each HEADERS: + nextRes *http.Response + sawRegHeader bool // saw non-pseudo header + reqMalformed error // non-nil once known to be malformed +} + +// readLoop runs in its own goroutine and reads and dispatches frames. +func (cc *ClientConn) readLoop() { + rl := &clientConnReadLoop{ + cc: cc, + activeRes: make(map[uint32]*clientStream), + } + // TODO: figure out henc size + rl.hdec = hpack.NewDecoder(initialHeaderTableSize, rl.onNewHeaderField) + + defer rl.cleanup() + cc.readerErr = rl.run() + if ce, ok := cc.readerErr.(ConnectionError); ok { + cc.wmu.Lock() + cc.fr.WriteGoAway(0, ErrCode(ce), nil) + cc.wmu.Unlock() + } +} + +func (rl *clientConnReadLoop) cleanup() { + cc := rl.cc + defer cc.tconn.Close() + defer cc.t.connPool().MarkDead(cc) + defer close(cc.readerDone) + + // Close any response bodies if the server closes prematurely. + // TODO: also do this if we've written the headers but not + // gotten a response yet. + err := cc.readerErr + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + cc.mu.Lock() + for _, cs := range rl.activeRes { + cs.bufPipe.CloseWithError(err) + } + for _, cs := range cc.streams { + select { + case cs.resc <- resAndError{err: err}: + default: + } + } + cc.closed = true + cc.cond.Broadcast() + cc.mu.Unlock() +} + +func (rl *clientConnReadLoop) run() error { + cc := rl.cc + for { + f, err := cc.fr.ReadFrame() + if se, ok := err.(StreamError); ok { + // TODO: deal with stream errors from the framer. + return se + } else if err != nil { + return err + } + cc.vlogf("Transport received %v: %#v", f.Header(), f) + + streamID := f.Header().StreamID + + _, isContinue := f.(*ContinuationFrame) + if isContinue { + if streamID != rl.continueStreamID { + cc.logf("Protocol violation: got CONTINUATION with id %d; want %d", streamID, rl.continueStreamID) + return ConnectionError(ErrCodeProtocol) + } + } else if rl.continueStreamID != 0 { + // Continue frames need to be adjacent in the stream + // and we were in the middle of headers. + cc.logf("Protocol violation: got %T for stream %d, want CONTINUATION for %d", f, streamID, rl.continueStreamID) + return ConnectionError(ErrCodeProtocol) + } + + switch f := f.(type) { + case *HeadersFrame: + err = rl.processHeaders(f) + case *ContinuationFrame: + err = rl.processContinuation(f) + case *DataFrame: + err = rl.processData(f) + case *GoAwayFrame: + err = rl.processGoAway(f) + case *RSTStreamFrame: + err = rl.processResetStream(f) + case *SettingsFrame: + err = rl.processSettings(f) + case *PushPromiseFrame: + err = rl.processPushPromise(f) + case *WindowUpdateFrame: + err = rl.processWindowUpdate(f) + case *PingFrame: + err = rl.processPing(f) + default: + cc.logf("Transport: unhandled response frame type %T", f) + } + if err != nil { + return err + } + } +} + +func (rl *clientConnReadLoop) processHeaders(f *HeadersFrame) error { + rl.sawRegHeader = false + rl.reqMalformed = nil + rl.nextRes = &http.Response{ + Proto: "HTTP/2.0", + ProtoMajor: 2, + Header: make(http.Header), + } + return rl.processHeaderBlockFragment(f.HeaderBlockFragment(), f.StreamID, f.HeadersEnded(), f.StreamEnded()) +} + +func (rl *clientConnReadLoop) processContinuation(f *ContinuationFrame) error { + return rl.processHeaderBlockFragment(f.HeaderBlockFragment(), f.StreamID, f.HeadersEnded(), f.StreamEnded()) +} + +func (rl *clientConnReadLoop) processHeaderBlockFragment(frag []byte, streamID uint32, headersEnded, streamEnded bool) error { + cc := rl.cc + cs := cc.streamByID(streamID, streamEnded) + if cs == nil { + // We could return a ConnectionError(ErrCodeProtocol) + // here, except that in the case of us canceling + // client requests, we may also delete from the + // streams map, in which case we forgot that we sent + // this request. So, just ignore any responses for + // now. They might've been in-flight before the + // server got our RST_STREAM. + return nil + } + _, err := rl.hdec.Write(frag) + if err != nil { + return err + } + if !headersEnded { + rl.continueStreamID = cs.ID + return nil + } + + // HEADERS (or CONTINUATION) are now over. + rl.continueStreamID = 0 + + if rl.reqMalformed != nil { + cs.resc <- resAndError{err: rl.reqMalformed} + rl.cc.writeStreamReset(cs.ID, ErrCodeProtocol, rl.reqMalformed) + return nil + } + + res := rl.nextRes + if streamEnded { + res.Body = noBody + } else { + buf := new(bytes.Buffer) // TODO(bradfitz): recycle this garbage + cs.bufPipe = pipe{b: buf} + res.Body = transportResponseBody{cs} + } + rl.activeRes[cs.ID] = cs + cs.resc <- resAndError{res: res} + rl.nextRes = nil // unused now; will be reset next HEADERS frame + return nil +} + +// transportResponseBody is the concrete type of Transport.RoundTrip's +// Response.Body. It is an io.ReadCloser. On Read, it reads from cs.body. +// On Close it sends RST_STREAM if EOF wasn't already seen. +type transportResponseBody struct { + cs *clientStream +} + +func (b transportResponseBody) Read(p []byte) (n int, err error) { + n, err = b.cs.bufPipe.Read(p) + if n == 0 { + return + } + + cs := b.cs + cc := cs.cc + cc.mu.Lock() + defer cc.mu.Unlock() + + var connAdd, streamAdd int32 + // Check the conn-level first, before the stream-level. + if v := cc.inflow.available(); v < transportDefaultConnFlow/2 { + connAdd = transportDefaultConnFlow - v + cc.inflow.add(connAdd) + } + if err == nil { // No need to refresh if the stream is over or failed. + if v := cs.inflow.available(); v < transportDefaultStreamFlow-transportDefaultStreamMinRefresh { + streamAdd = transportDefaultStreamFlow - v + cs.inflow.add(streamAdd) + } + } + if connAdd != 0 || streamAdd != 0 { + cc.wmu.Lock() + defer cc.wmu.Unlock() + if connAdd != 0 { + cc.fr.WriteWindowUpdate(0, mustUint31(connAdd)) + } + if streamAdd != 0 { + cc.fr.WriteWindowUpdate(cs.ID, mustUint31(streamAdd)) + } + cc.bw.Flush() + } + return +} + +func (b transportResponseBody) Close() error { + if b.cs.bufPipe.Err() != io.EOF { + // TODO: write test for this + b.cs.cc.writeStreamReset(b.cs.ID, ErrCodeCancel, nil) + } + return nil +} + +func (rl *clientConnReadLoop) processData(f *DataFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, f.StreamEnded()) + if cs == nil { + return nil + } + data := f.Data() + if VerboseLogs { + rl.cc.logf("DATA: %q", data) + } + + // Check connection-level flow control. + cc.mu.Lock() + if cs.inflow.available() >= int32(len(data)) { + cs.inflow.take(int32(len(data))) + } else { + cc.mu.Unlock() + return ConnectionError(ErrCodeFlowControl) + } + cc.mu.Unlock() + + if _, err := cs.bufPipe.Write(data); err != nil { + return err + } + + if f.StreamEnded() { + cs.bufPipe.CloseWithError(io.EOF) + delete(rl.activeRes, cs.ID) + } + return nil +} + +func (rl *clientConnReadLoop) processGoAway(f *GoAwayFrame) error { + cc := rl.cc + cc.t.connPool().MarkDead(cc) + if f.ErrCode != 0 { + // TODO: deal with GOAWAY more. particularly the error code + cc.vlogf("transport got GOAWAY with error code = %v", f.ErrCode) + } + cc.setGoAway(f) + return nil +} + +func (rl *clientConnReadLoop) processSettings(f *SettingsFrame) error { + cc := rl.cc + cc.mu.Lock() + defer cc.mu.Unlock() + return f.ForeachSetting(func(s Setting) error { + switch s.ID { + case SettingMaxFrameSize: + cc.maxFrameSize = s.Val + case SettingMaxConcurrentStreams: + cc.maxConcurrentStreams = s.Val + case SettingInitialWindowSize: + // TODO: error if this is too large. + + // TODO: adjust flow control of still-open + // frames by the difference of the old initial + // window size and this one. + cc.initialWindowSize = s.Val + default: + // TODO(bradfitz): handle more settings? + cc.vlogf("Unhandled Setting: %v", s) + } + return nil + }) +} + +func (rl *clientConnReadLoop) processWindowUpdate(f *WindowUpdateFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, false) + if f.StreamID != 0 && cs == nil { + return nil + } + + cc.mu.Lock() + defer cc.mu.Unlock() + + fl := &cc.flow + if cs != nil { + fl = &cs.flow + } + if !fl.add(int32(f.Increment)) { + return ConnectionError(ErrCodeFlowControl) + } + cc.cond.Broadcast() + return nil +} + +func (rl *clientConnReadLoop) processResetStream(f *RSTStreamFrame) error { + cs := rl.cc.streamByID(f.StreamID, true) + if cs == nil { + // TODO: return error if server tries to RST_STEAM an idle stream + return nil + } + select { + case <-cs.peerReset: + // Already reset. + // This is the only goroutine + // which closes this, so there + // isn't a race. + default: + err := StreamError{cs.ID, f.ErrCode} + cs.resetErr = err + close(cs.peerReset) + cs.bufPipe.CloseWithError(err) + } + delete(rl.activeRes, cs.ID) + return nil +} + +func (rl *clientConnReadLoop) processPing(f *PingFrame) error { + if f.IsAck() { + // 6.7 PING: " An endpoint MUST NOT respond to PING frames + // containing this flag." + return nil + } + cc := rl.cc + cc.wmu.Lock() + defer cc.wmu.Unlock() + if err := cc.fr.WritePing(true, f.Data); err != nil { + return err + } + return cc.bw.Flush() +} + +func (rl *clientConnReadLoop) processPushPromise(f *PushPromiseFrame) error { + // We told the peer we don't want them. + // Spec says: + // "PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH + // setting of the peer endpoint is set to 0. An endpoint that + // has set this setting and has received acknowledgement MUST + // treat the receipt of a PUSH_PROMISE frame as a connection + // error (Section 5.4.1) of type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) +} + +func (cc *ClientConn) writeStreamReset(streamID uint32, code ErrCode, err error) { + // TODO: do something with err? send it as a debug frame to the peer? + // But that's only in GOAWAY. Invent a new frame type? Is there one already? + cc.wmu.Lock() + cc.fr.WriteRSTStream(streamID, code) + cc.wmu.Unlock() +} + +// onNewHeaderField runs on the readLoop goroutine whenever a new +// hpack header field is decoded. +func (rl *clientConnReadLoop) onNewHeaderField(f hpack.HeaderField) { + cc := rl.cc + if VerboseLogs { + cc.logf("Header field: %+v", f) + } + isPseudo := strings.HasPrefix(f.Name, ":") + if isPseudo { + if rl.sawRegHeader { + rl.reqMalformed = errors.New("http2: invalid pseudo header after regular header") + return + } + switch f.Name { + case ":status": + code, err := strconv.Atoi(f.Value) + if err != nil { + rl.reqMalformed = errors.New("http2: invalid :status") + return + } + rl.nextRes.Status = f.Value + " " + http.StatusText(code) + rl.nextRes.StatusCode = code + default: + // "Endpoints MUST NOT generate pseudo-header + // fields other than those defined in this + // document." + rl.reqMalformed = fmt.Errorf("http2: unknown response pseudo header %q", f.Name) + } + } else { + rl.sawRegHeader = true + rl.nextRes.Header.Add(http.CanonicalHeaderKey(f.Name), f.Value) + } +} + +func (cc *ClientConn) logf(format string, args ...interface{}) { + cc.t.logf(format, args...) +} + +func (cc *ClientConn) vlogf(format string, args ...interface{}) { + cc.t.vlogf(format, args...) +} + +func (t *Transport) vlogf(format string, args ...interface{}) { + if VerboseLogs { + t.logf(format, args...) + } +} + +func (t *Transport) logf(format string, args ...interface{}) { + log.Printf(format, args...) +} + +var noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil)) + +func strSliceContains(ss []string, s string) bool { + for _, v := range ss { + if v == s { + return true + } + } + return false +} + +type erringRoundTripper struct{ err error } + +func (rt erringRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { return nil, rt.err } diff --git a/vendor/golang.org/x/net/http2/transport_test.go b/vendor/golang.org/x/net/http2/transport_test.go new file mode 100644 index 00000000..b7385d65 --- /dev/null +++ b/vendor/golang.org/x/net/http2/transport_test.go @@ -0,0 +1,375 @@ +// Copyright 2015 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 http2 + +import ( + "crypto/tls" + "flag" + "fmt" + "io" + "io/ioutil" + "math/rand" + "net" + "net/http" + "net/url" + "os" + "reflect" + "strings" + "sync" + "testing" + "time" +) + +var ( + extNet = flag.Bool("extnet", false, "do external network tests") + transportHost = flag.String("transporthost", "http2.golang.org", "hostname to use for TestTransport") + insecure = flag.Bool("insecure", false, "insecure TLS dials") // TODO: dead code. remove? +) + +var tlsConfigInsecure = &tls.Config{InsecureSkipVerify: true} + +func TestTransportExternal(t *testing.T) { + if !*extNet { + t.Skip("skipping external network test") + } + req, _ := http.NewRequest("GET", "https://"+*transportHost+"/", nil) + rt := &Transport{TLSClientConfig: tlsConfigInsecure} + res, err := rt.RoundTrip(req) + if err != nil { + t.Fatalf("%v", err) + } + res.Write(os.Stdout) +} + +func TestTransport(t *testing.T) { + const body = "sup" + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, body) + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + t.Logf("Got res: %+v", res) + if g, w := res.StatusCode, 200; g != w { + t.Errorf("StatusCode = %v; want %v", g, w) + } + if g, w := res.Status, "200 OK"; g != w { + t.Errorf("Status = %q; want %q", g, w) + } + wantHeader := http.Header{ + "Content-Length": []string{"3"}, + "Content-Type": []string{"text/plain; charset=utf-8"}, + } + if !reflect.DeepEqual(res.Header, wantHeader) { + t.Errorf("res Header = %v; want %v", res.Header, wantHeader) + } + if res.Request != req { + t.Errorf("Response.Request = %p; want %p", res.Request, req) + } + if res.TLS == nil { + t.Error("Response.TLS = nil; want non-nil") + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Errorf("Body read: %v", err) + } else if string(slurp) != body { + t.Errorf("Body = %q; want %q", slurp, body) + } + +} + +func TestTransportReusesConns(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, r.RemoteAddr) + }, optOnlyServer) + defer st.Close() + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + get := func() string { + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatalf("Body read: %v", err) + } + addr := strings.TrimSpace(string(slurp)) + if addr == "" { + t.Fatalf("didn't get an addr in response") + } + return addr + } + first := get() + second := get() + if first != second { + t.Errorf("first and second responses were on different connections: %q vs %q", first, second) + } +} + +func TestTransportAbortClosesPipes(t *testing.T) { + shutdown := make(chan struct{}) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + w.(http.Flusher).Flush() + <-shutdown + }, + optOnlyServer, + ) + defer st.Close() + defer close(shutdown) // we must shutdown before st.Close() to avoid hanging + + done := make(chan struct{}) + requestMade := make(chan struct{}) + go func() { + defer close(done) + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Fatal(err) + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + close(requestMade) + _, err = ioutil.ReadAll(res.Body) + if err == nil { + t.Error("expected error from res.Body.Read") + } + }() + + <-requestMade + // Now force the serve loop to end, via closing the connection. + st.closeConn() + // deadlock? that's a bug. + select { + case <-done: + case <-time.After(3 * time.Second): + t.Fatal("timeout") + } +} + +// TODO: merge this with TestTransportBody to make TestTransportRequest? This +// could be a table-driven test with extra goodies. +func TestTransportPath(t *testing.T) { + gotc := make(chan *url.URL, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + gotc <- r.URL + }, + optOnlyServer, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + const ( + path = "/testpath" + query = "q=1" + ) + surl := st.ts.URL + path + "?" + query + req, err := http.NewRequest("POST", surl, nil) + if err != nil { + t.Fatal(err) + } + c := &http.Client{Transport: tr} + res, err := c.Do(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + got := <-gotc + if got.Path != path { + t.Errorf("Read Path = %q; want %q", got.Path, path) + } + if got.RawQuery != query { + t.Errorf("Read RawQuery = %q; want %q", got.RawQuery, query) + } +} + +func randString(n int) string { + rnd := rand.New(rand.NewSource(int64(n))) + b := make([]byte, n) + for i := range b { + b[i] = byte(rnd.Intn(256)) + } + return string(b) +} + +var bodyTests = []struct { + body string + noContentLen bool +}{ + {body: "some message"}, + {body: "some message", noContentLen: true}, + {body: ""}, + {body: "", noContentLen: true}, + {body: strings.Repeat("a", 1<<20), noContentLen: true}, + {body: strings.Repeat("a", 1<<20)}, + {body: randString(16<<10 - 1)}, + {body: randString(16 << 10)}, + {body: randString(16<<10 + 1)}, + {body: randString(512<<10 - 1)}, + {body: randString(512 << 10)}, + {body: randString(512<<10 + 1)}, + {body: randString(1<<20 - 1)}, + {body: randString(1 << 20)}, + {body: randString(1<<20 + 2)}, +} + +func TestTransportBody(t *testing.T) { + gotc := make(chan interface{}, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + slurp, err := ioutil.ReadAll(r.Body) + if err != nil { + gotc <- err + } else { + gotc <- string(slurp) + } + }, + optOnlyServer, + ) + defer st.Close() + + for i, tt := range bodyTests { + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + var body io.Reader = strings.NewReader(tt.body) + if tt.noContentLen { + body = struct{ io.Reader }{body} // just a Reader, hiding concrete type and other methods + } + req, err := http.NewRequest("POST", st.ts.URL, body) + if err != nil { + t.Fatalf("#%d: %v", i, err) + } + c := &http.Client{Transport: tr} + res, err := c.Do(req) + if err != nil { + t.Fatalf("#%d: %v", i, err) + } + defer res.Body.Close() + got := <-gotc + if err, ok := got.(error); ok { + t.Fatalf("#%d: %v", i, err) + } else if got.(string) != tt.body { + got := got.(string) + t.Errorf("#%d: Read body mismatch.\n got: %q (len %d)\nwant: %q (len %d)", i, shortString(got), len(got), shortString(tt.body), len(tt.body)) + } + } +} + +func shortString(v string) string { + const maxLen = 100 + if len(v) <= maxLen { + return v + } + return fmt.Sprintf("%v[...%d bytes omitted...]%v", v[:maxLen/2], len(v)-maxLen, v[len(v)-maxLen/2:]) +} + +func TestTransportDialTLS(t *testing.T) { + var mu sync.Mutex // guards following + var gotReq, didDial bool + + ts := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + mu.Lock() + gotReq = true + mu.Unlock() + }, + optOnlyServer, + ) + defer ts.Close() + tr := &Transport{ + DialTLS: func(netw, addr string, cfg *tls.Config) (net.Conn, error) { + mu.Lock() + didDial = true + mu.Unlock() + cfg.InsecureSkipVerify = true + c, err := tls.Dial(netw, addr, cfg) + if err != nil { + return nil, err + } + return c, c.Handshake() + }, + } + defer tr.CloseIdleConnections() + client := &http.Client{Transport: tr} + res, err := client.Get(ts.ts.URL) + if err != nil { + t.Fatal(err) + } + res.Body.Close() + mu.Lock() + if !gotReq { + t.Error("didn't get request") + } + if !didDial { + t.Error("didn't use dial hook") + } +} + +func TestConfigureTransport(t *testing.T) { + t1 := &http.Transport{} + err := ConfigureTransport(t1) + if err == errTransportVersion { + t.Skip(err) + } + if err != nil { + t.Fatal(err) + } + if got := fmt.Sprintf("%#v", *t1); !strings.Contains(got, `"h2"`) { + // Laziness, to avoid buildtags. + t.Errorf("stringification of HTTP/1 transport didn't contain \"h2\": %v", got) + } + if t1.TLSClientConfig == nil { + t.Errorf("nil t1.TLSClientConfig") + } else if !reflect.DeepEqual(t1.TLSClientConfig.NextProtos, []string{"h2"}) { + t.Errorf("TLSClientConfig.NextProtos = %q; want just 'h2'", t1.TLSClientConfig.NextProtos) + } + if err := ConfigureTransport(t1); err == nil { + t.Error("unexpected success on second call to ConfigureTransport") + } + + // And does it work? + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, r.Proto) + }, optOnlyServer) + defer st.Close() + + t1.TLSClientConfig.InsecureSkipVerify = true + c := &http.Client{Transport: t1} + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if got, want := string(slurp), "HTTP/2.0"; got != want { + t.Errorf("body = %q; want %q", got, want) + } +} diff --git a/vendor/golang.org/x/net/http2/write.go b/vendor/golang.org/x/net/http2/write.go new file mode 100644 index 00000000..9050bebb --- /dev/null +++ b/vendor/golang.org/x/net/http2/write.go @@ -0,0 +1,206 @@ +// Copyright 2014 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 http2 + +import ( + "bytes" + "fmt" + "net/http" + "time" + + "golang.org/x/net/http2/hpack" +) + +// writeFramer is implemented by any type that is used to write frames. +type writeFramer interface { + writeFrame(writeContext) error +} + +// writeContext is the interface needed by the various frame writer +// types below. All the writeFrame methods below are scheduled via the +// frame writing scheduler (see writeScheduler in writesched.go). +// +// This interface is implemented by *serverConn. +// TODO: use it from the client code too, once it exists. +type writeContext interface { + Framer() *Framer + Flush() error + CloseConn() error + // HeaderEncoder returns an HPACK encoder that writes to the + // returned buffer. + HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) +} + +// endsStream reports whether the given frame writer w will locally +// close the stream. +func endsStream(w writeFramer) bool { + switch v := w.(type) { + case *writeData: + return v.endStream + case *writeResHeaders: + return v.endStream + case nil: + // This can only happen if the caller reuses w after it's + // been intentionally nil'ed out to prevent use. Keep this + // here to catch future refactoring breaking it. + panic("endsStream called on nil writeFramer") + } + return false +} + +type flushFrameWriter struct{} + +func (flushFrameWriter) writeFrame(ctx writeContext) error { + return ctx.Flush() +} + +type writeSettings []Setting + +func (s writeSettings) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteSettings([]Setting(s)...) +} + +type writeGoAway struct { + maxStreamID uint32 + code ErrCode +} + +func (p *writeGoAway) writeFrame(ctx writeContext) error { + err := ctx.Framer().WriteGoAway(p.maxStreamID, p.code, nil) + if p.code != 0 { + ctx.Flush() // ignore error: we're hanging up on them anyway + time.Sleep(50 * time.Millisecond) + ctx.CloseConn() + } + return err +} + +type writeData struct { + streamID uint32 + p []byte + endStream bool +} + +func (w *writeData) String() string { + return fmt.Sprintf("writeData(stream=%d, p=%d, endStream=%v)", w.streamID, len(w.p), w.endStream) +} + +func (w *writeData) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteData(w.streamID, w.endStream, w.p) +} + +func (se StreamError) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteRSTStream(se.StreamID, se.Code) +} + +type writePingAck struct{ pf *PingFrame } + +func (w writePingAck) writeFrame(ctx writeContext) error { + return ctx.Framer().WritePing(true, w.pf.Data) +} + +type writeSettingsAck struct{} + +func (writeSettingsAck) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteSettingsAck() +} + +// writeResHeaders is a request to write a HEADERS and 0+ CONTINUATION frames +// for HTTP response headers from a server handler. +type writeResHeaders struct { + streamID uint32 + httpResCode int + h http.Header // may be nil + endStream bool + + contentType string + contentLength string +} + +func (w *writeResHeaders) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: httpCodeString(w.httpResCode)}) + for k, vv := range w.h { + k = lowerHeader(k) + for _, v := range vv { + // TODO: more of "8.1.2.2 Connection-Specific Header Fields" + if k == "transfer-encoding" && v != "trailers" { + continue + } + enc.WriteField(hpack.HeaderField{Name: k, Value: v}) + } + } + if w.contentType != "" { + enc.WriteField(hpack.HeaderField{Name: "content-type", Value: w.contentType}) + } + if w.contentLength != "" { + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: w.contentLength}) + } + + headerBlock := buf.Bytes() + if len(headerBlock) == 0 { + panic("unexpected empty hpack") + } + + // For now we're lazy and just pick the minimum MAX_FRAME_SIZE + // that all peers must support (16KB). Later we could care + // more and send larger frames if the peer advertised it, but + // there's little point. Most headers are small anyway (so we + // generally won't have CONTINUATION frames), and extra frames + // only waste 9 bytes anyway. + const maxFrameSize = 16384 + + first := true + for len(headerBlock) > 0 { + frag := headerBlock + if len(frag) > maxFrameSize { + frag = frag[:maxFrameSize] + } + headerBlock = headerBlock[len(frag):] + endHeaders := len(headerBlock) == 0 + var err error + if first { + first = false + err = ctx.Framer().WriteHeaders(HeadersFrameParam{ + StreamID: w.streamID, + BlockFragment: frag, + EndStream: w.endStream, + EndHeaders: endHeaders, + }) + } else { + err = ctx.Framer().WriteContinuation(w.streamID, endHeaders, frag) + } + if err != nil { + return err + } + } + return nil +} + +type write100ContinueHeadersFrame struct { + streamID uint32 +} + +func (w write100ContinueHeadersFrame) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "100"}) + return ctx.Framer().WriteHeaders(HeadersFrameParam{ + StreamID: w.streamID, + BlockFragment: buf.Bytes(), + EndStream: false, + EndHeaders: true, + }) +} + +type writeWindowUpdate struct { + streamID uint32 // or 0 for conn-level + n uint32 +} + +func (wu writeWindowUpdate) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteWindowUpdate(wu.streamID, wu.n) +} diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go new file mode 100644 index 00000000..c24316ce --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched.go @@ -0,0 +1,283 @@ +// Copyright 2014 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 http2 + +import "fmt" + +// frameWriteMsg is a request to write a frame. +type frameWriteMsg struct { + // write is the interface value that does the writing, once the + // writeScheduler (below) has decided to select this frame + // to write. The write functions are all defined in write.go. + write writeFramer + + stream *stream // used for prioritization. nil for non-stream frames. + + // done, if non-nil, must be a buffered channel with space for + // 1 message and is sent the return value from write (or an + // earlier error) when the frame has been written. + done chan error +} + +// for debugging only: +func (wm frameWriteMsg) String() string { + var streamID uint32 + if wm.stream != nil { + streamID = wm.stream.id + } + var des string + if s, ok := wm.write.(fmt.Stringer); ok { + des = s.String() + } else { + des = fmt.Sprintf("%T", wm.write) + } + return fmt.Sprintf("[frameWriteMsg stream=%d, ch=%v, type: %v]", streamID, wm.done != nil, des) +} + +// writeScheduler tracks pending frames to write, priorities, and decides +// the next one to use. It is not thread-safe. +type writeScheduler struct { + // zero are frames not associated with a specific stream. + // They're sent before any stream-specific freams. + zero writeQueue + + // maxFrameSize is the maximum size of a DATA frame + // we'll write. Must be non-zero and between 16K-16M. + maxFrameSize uint32 + + // sq contains the stream-specific queues, keyed by stream ID. + // when a stream is idle, it's deleted from the map. + sq map[uint32]*writeQueue + + // canSend is a slice of memory that's reused between frame + // scheduling decisions to hold the list of writeQueues (from sq) + // which have enough flow control data to send. After canSend is + // built, the best is selected. + canSend []*writeQueue + + // pool of empty queues for reuse. + queuePool []*writeQueue +} + +func (ws *writeScheduler) putEmptyQueue(q *writeQueue) { + if len(q.s) != 0 { + panic("queue must be empty") + } + ws.queuePool = append(ws.queuePool, q) +} + +func (ws *writeScheduler) getEmptyQueue() *writeQueue { + ln := len(ws.queuePool) + if ln == 0 { + return new(writeQueue) + } + q := ws.queuePool[ln-1] + ws.queuePool = ws.queuePool[:ln-1] + return q +} + +func (ws *writeScheduler) empty() bool { return ws.zero.empty() && len(ws.sq) == 0 } + +func (ws *writeScheduler) add(wm frameWriteMsg) { + st := wm.stream + if st == nil { + ws.zero.push(wm) + } else { + ws.streamQueue(st.id).push(wm) + } +} + +func (ws *writeScheduler) streamQueue(streamID uint32) *writeQueue { + if q, ok := ws.sq[streamID]; ok { + return q + } + if ws.sq == nil { + ws.sq = make(map[uint32]*writeQueue) + } + q := ws.getEmptyQueue() + ws.sq[streamID] = q + return q +} + +// take returns the most important frame to write and removes it from the scheduler. +// It is illegal to call this if the scheduler is empty or if there are no connection-level +// flow control bytes available. +func (ws *writeScheduler) take() (wm frameWriteMsg, ok bool) { + if ws.maxFrameSize == 0 { + panic("internal error: ws.maxFrameSize not initialized or invalid") + } + + // If there any frames not associated with streams, prefer those first. + // These are usually SETTINGS, etc. + if !ws.zero.empty() { + return ws.zero.shift(), true + } + if len(ws.sq) == 0 { + return + } + + // Next, prioritize frames on streams that aren't DATA frames (no cost). + for id, q := range ws.sq { + if q.firstIsNoCost() { + return ws.takeFrom(id, q) + } + } + + // Now, all that remains are DATA frames with non-zero bytes to + // send. So pick the best one. + if len(ws.canSend) != 0 { + panic("should be empty") + } + for _, q := range ws.sq { + if n := ws.streamWritableBytes(q); n > 0 { + ws.canSend = append(ws.canSend, q) + } + } + if len(ws.canSend) == 0 { + return + } + defer ws.zeroCanSend() + + // TODO: find the best queue + q := ws.canSend[0] + + return ws.takeFrom(q.streamID(), q) +} + +// zeroCanSend is defered from take. +func (ws *writeScheduler) zeroCanSend() { + for i := range ws.canSend { + ws.canSend[i] = nil + } + ws.canSend = ws.canSend[:0] +} + +// streamWritableBytes returns the number of DATA bytes we could write +// from the given queue's stream, if this stream/queue were +// selected. It is an error to call this if q's head isn't a +// *writeData. +func (ws *writeScheduler) streamWritableBytes(q *writeQueue) int32 { + wm := q.head() + ret := wm.stream.flow.available() // max we can write + if ret == 0 { + return 0 + } + if int32(ws.maxFrameSize) < ret { + ret = int32(ws.maxFrameSize) + } + if ret == 0 { + panic("internal error: ws.maxFrameSize not initialized or invalid") + } + wd := wm.write.(*writeData) + if len(wd.p) < int(ret) { + ret = int32(len(wd.p)) + } + return ret +} + +func (ws *writeScheduler) takeFrom(id uint32, q *writeQueue) (wm frameWriteMsg, ok bool) { + wm = q.head() + // If the first item in this queue costs flow control tokens + // and we don't have enough, write as much as we can. + if wd, ok := wm.write.(*writeData); ok && len(wd.p) > 0 { + allowed := wm.stream.flow.available() // max we can write + if allowed == 0 { + // No quota available. Caller can try the next stream. + return frameWriteMsg{}, false + } + if int32(ws.maxFrameSize) < allowed { + allowed = int32(ws.maxFrameSize) + } + // TODO: further restrict the allowed size, because even if + // the peer says it's okay to write 16MB data frames, we might + // want to write smaller ones to properly weight competing + // streams' priorities. + + if len(wd.p) > int(allowed) { + wm.stream.flow.take(allowed) + chunk := wd.p[:allowed] + wd.p = wd.p[allowed:] + // Make up a new write message of a valid size, rather + // than shifting one off the queue. + return frameWriteMsg{ + stream: wm.stream, + write: &writeData{ + streamID: wd.streamID, + p: chunk, + // even if the original had endStream set, there + // arebytes remaining because len(wd.p) > allowed, + // so we know endStream is false: + endStream: false, + }, + // our caller is blocking on the final DATA frame, not + // these intermediates, so no need to wait: + done: nil, + }, true + } + wm.stream.flow.take(int32(len(wd.p))) + } + + q.shift() + if q.empty() { + ws.putEmptyQueue(q) + delete(ws.sq, id) + } + return wm, true +} + +func (ws *writeScheduler) forgetStream(id uint32) { + q, ok := ws.sq[id] + if !ok { + return + } + delete(ws.sq, id) + + // But keep it for others later. + for i := range q.s { + q.s[i] = frameWriteMsg{} + } + q.s = q.s[:0] + ws.putEmptyQueue(q) +} + +type writeQueue struct { + s []frameWriteMsg +} + +// streamID returns the stream ID for a non-empty stream-specific queue. +func (q *writeQueue) streamID() uint32 { return q.s[0].stream.id } + +func (q *writeQueue) empty() bool { return len(q.s) == 0 } + +func (q *writeQueue) push(wm frameWriteMsg) { + q.s = append(q.s, wm) +} + +// head returns the next item that would be removed by shift. +func (q *writeQueue) head() frameWriteMsg { + if len(q.s) == 0 { + panic("invalid use of queue") + } + return q.s[0] +} + +func (q *writeQueue) shift() frameWriteMsg { + if len(q.s) == 0 { + panic("invalid use of queue") + } + wm := q.s[0] + // TODO: less copy-happy queue. + copy(q.s, q.s[1:]) + q.s[len(q.s)-1] = frameWriteMsg{} + q.s = q.s[:len(q.s)-1] + return wm +} + +func (q *writeQueue) firstIsNoCost() bool { + if df, ok := q.s[0].write.(*writeData); ok { + return len(df.p) == 0 + } + return true +} diff --git a/vendor/golang.org/x/net/http2/z_spec_test.go b/vendor/golang.org/x/net/http2/z_spec_test.go new file mode 100644 index 00000000..e0f420a1 --- /dev/null +++ b/vendor/golang.org/x/net/http2/z_spec_test.go @@ -0,0 +1,356 @@ +// Copyright 2014 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 http2 + +import ( + "bytes" + "encoding/xml" + "flag" + "fmt" + "io" + "os" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "sync" + "testing" +) + +var coverSpec = flag.Bool("coverspec", false, "Run spec coverage tests") + +// The global map of sentence coverage for the http2 spec. +var defaultSpecCoverage specCoverage + +var loadSpecOnce sync.Once + +func loadSpec() { + if f, err := os.Open("testdata/draft-ietf-httpbis-http2.xml"); err != nil { + panic(err) + } else { + defaultSpecCoverage = readSpecCov(f) + f.Close() + } +} + +// covers marks all sentences for section sec in defaultSpecCoverage. Sentences not +// "covered" will be included in report outputed by TestSpecCoverage. +func covers(sec, sentences string) { + loadSpecOnce.Do(loadSpec) + defaultSpecCoverage.cover(sec, sentences) +} + +type specPart struct { + section string + sentence string +} + +func (ss specPart) Less(oo specPart) bool { + atoi := func(s string) int { + n, err := strconv.Atoi(s) + if err != nil { + panic(err) + } + return n + } + a := strings.Split(ss.section, ".") + b := strings.Split(oo.section, ".") + for len(a) > 0 { + if len(b) == 0 { + return false + } + x, y := atoi(a[0]), atoi(b[0]) + if x == y { + a, b = a[1:], b[1:] + continue + } + return x < y + } + if len(b) > 0 { + return true + } + return false +} + +type bySpecSection []specPart + +func (a bySpecSection) Len() int { return len(a) } +func (a bySpecSection) Less(i, j int) bool { return a[i].Less(a[j]) } +func (a bySpecSection) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type specCoverage struct { + coverage map[specPart]bool + d *xml.Decoder +} + +func joinSection(sec []int) string { + s := fmt.Sprintf("%d", sec[0]) + for _, n := range sec[1:] { + s = fmt.Sprintf("%s.%d", s, n) + } + return s +} + +func (sc specCoverage) readSection(sec []int) { + var ( + buf = new(bytes.Buffer) + sub = 0 + ) + for { + tk, err := sc.d.Token() + if err != nil { + if err == io.EOF { + return + } + panic(err) + } + switch v := tk.(type) { + case xml.StartElement: + if skipElement(v) { + if err := sc.d.Skip(); err != nil { + panic(err) + } + if v.Name.Local == "section" { + sub++ + } + break + } + switch v.Name.Local { + case "section": + sub++ + sc.readSection(append(sec, sub)) + case "xref": + buf.Write(sc.readXRef(v)) + } + case xml.CharData: + if len(sec) == 0 { + break + } + buf.Write(v) + case xml.EndElement: + if v.Name.Local == "section" { + sc.addSentences(joinSection(sec), buf.String()) + return + } + } + } +} + +func (sc specCoverage) readXRef(se xml.StartElement) []byte { + var b []byte + for { + tk, err := sc.d.Token() + if err != nil { + panic(err) + } + switch v := tk.(type) { + case xml.CharData: + if b != nil { + panic("unexpected CharData") + } + b = []byte(string(v)) + case xml.EndElement: + if v.Name.Local != "xref" { + panic("expected ") + } + if b != nil { + return b + } + sig := attrSig(se) + switch sig { + case "target": + return []byte(fmt.Sprintf("[%s]", attrValue(se, "target"))) + case "fmt-of,rel,target", "fmt-,,rel,target": + return []byte(fmt.Sprintf("[%s, %s]", attrValue(se, "target"), attrValue(se, "rel"))) + case "fmt-of,sec,target", "fmt-,,sec,target": + return []byte(fmt.Sprintf("[section %s of %s]", attrValue(se, "sec"), attrValue(se, "target"))) + case "fmt-of,rel,sec,target": + return []byte(fmt.Sprintf("[section %s of %s, %s]", attrValue(se, "sec"), attrValue(se, "target"), attrValue(se, "rel"))) + default: + panic(fmt.Sprintf("unknown attribute signature %q in %#v", sig, fmt.Sprintf("%#v", se))) + } + default: + panic(fmt.Sprintf("unexpected tag %q", v)) + } + } +} + +var skipAnchor = map[string]bool{ + "intro": true, + "Overview": true, +} + +var skipTitle = map[string]bool{ + "Acknowledgements": true, + "Change Log": true, + "Document Organization": true, + "Conventions and Terminology": true, +} + +func skipElement(s xml.StartElement) bool { + switch s.Name.Local { + case "artwork": + return true + case "section": + for _, attr := range s.Attr { + switch attr.Name.Local { + case "anchor": + if skipAnchor[attr.Value] || strings.HasPrefix(attr.Value, "changes.since.") { + return true + } + case "title": + if skipTitle[attr.Value] { + return true + } + } + } + } + return false +} + +func readSpecCov(r io.Reader) specCoverage { + sc := specCoverage{ + coverage: map[specPart]bool{}, + d: xml.NewDecoder(r)} + sc.readSection(nil) + return sc +} + +func (sc specCoverage) addSentences(sec string, sentence string) { + for _, s := range parseSentences(sentence) { + sc.coverage[specPart{sec, s}] = false + } +} + +func (sc specCoverage) cover(sec string, sentence string) { + for _, s := range parseSentences(sentence) { + p := specPart{sec, s} + if _, ok := sc.coverage[p]; !ok { + panic(fmt.Sprintf("Not found in spec: %q, %q", sec, s)) + } + sc.coverage[specPart{sec, s}] = true + } + +} + +var whitespaceRx = regexp.MustCompile(`\s+`) + +func parseSentences(sens string) []string { + sens = strings.TrimSpace(sens) + if sens == "" { + return nil + } + ss := strings.Split(whitespaceRx.ReplaceAllString(sens, " "), ". ") + for i, s := range ss { + s = strings.TrimSpace(s) + if !strings.HasSuffix(s, ".") { + s += "." + } + ss[i] = s + } + return ss +} + +func TestSpecParseSentences(t *testing.T) { + tests := []struct { + ss string + want []string + }{ + {"Sentence 1. Sentence 2.", + []string{ + "Sentence 1.", + "Sentence 2.", + }}, + {"Sentence 1. \nSentence 2.\tSentence 3.", + []string{ + "Sentence 1.", + "Sentence 2.", + "Sentence 3.", + }}, + } + + for i, tt := range tests { + got := parseSentences(tt.ss) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("%d: got = %q, want %q", i, got, tt.want) + } + } +} + +func TestSpecCoverage(t *testing.T) { + if !*coverSpec { + t.Skip() + } + + loadSpecOnce.Do(loadSpec) + + var ( + list []specPart + cv = defaultSpecCoverage.coverage + total = len(cv) + complete = 0 + ) + + for sp, touched := range defaultSpecCoverage.coverage { + if touched { + complete++ + } else { + list = append(list, sp) + } + } + sort.Stable(bySpecSection(list)) + + if testing.Short() && len(list) > 5 { + list = list[:5] + } + + for _, p := range list { + t.Errorf("\tSECTION %s: %s", p.section, p.sentence) + } + + t.Logf("%d/%d (%d%%) sentances covered", complete, total, (complete/total)*100) +} + +func attrSig(se xml.StartElement) string { + var names []string + for _, attr := range se.Attr { + if attr.Name.Local == "fmt" { + names = append(names, "fmt-"+attr.Value) + } else { + names = append(names, attr.Name.Local) + } + } + sort.Strings(names) + return strings.Join(names, ",") +} + +func attrValue(se xml.StartElement, attr string) string { + for _, a := range se.Attr { + if a.Name.Local == attr { + return a.Value + } + } + panic("unknown attribute " + attr) +} + +func TestSpecPartLess(t *testing.T) { + tests := []struct { + sec1, sec2 string + want bool + }{ + {"6.2.1", "6.2", false}, + {"6.2", "6.2.1", true}, + {"6.10", "6.10.1", true}, + {"6.10", "6.1.1", false}, // 10, not 1 + {"6.1", "6.1", false}, // equal, so not less + } + for _, tt := range tests { + got := (specPart{tt.sec1, "foo"}).Less(specPart{tt.sec2, "foo"}) + if got != tt.want { + t.Errorf("Less(%q, %q) = %v; want %v", tt.sec1, tt.sec2, got, tt.want) + } + } +} diff --git a/vendor/golang.org/x/net/icmp/endpoint.go b/vendor/golang.org/x/net/icmp/endpoint.go index 3de49e65..0213d1a1 100644 --- a/vendor/golang.org/x/net/icmp/endpoint.go +++ b/vendor/golang.org/x/net/icmp/endpoint.go @@ -16,13 +16,12 @@ import ( var _ net.PacketConn = &PacketConn{} -type ipc interface{} - // A PacketConn represents a packet network endpoint that uses either // ICMPv4 or ICMPv6. type PacketConn struct { - c net.PacketConn - ipc // either ipv4.PacketConn or ipv6.PacketConn + c net.PacketConn + p4 *ipv4.PacketConn + p6 *ipv6.PacketConn } func (c *PacketConn) ok() bool { return c != nil && c.c != nil } @@ -33,8 +32,7 @@ func (c *PacketConn) IPv4PacketConn() *ipv4.PacketConn { if !c.ok() { return nil } - p, _ := c.ipc.(*ipv4.PacketConn) - return p + return c.p4 } // IPv6PacketConn returns the ipv6.PacketConn of c. @@ -43,8 +41,7 @@ func (c *PacketConn) IPv6PacketConn() *ipv6.PacketConn { if !c.ok() { return nil } - p, _ := c.ipc.(*ipv6.PacketConn) - return p + return c.p6 } // ReadFrom reads an ICMP message from the connection. @@ -55,11 +52,9 @@ func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) { // Please be informed that ipv4.NewPacketConn enables // IP_STRIPHDR option by default on Darwin. // See golang.org/issue/9395 for futher information. - if runtime.GOOS == "darwin" { - if p, _ := c.ipc.(*ipv4.PacketConn); p != nil { - n, _, peer, err := p.ReadFrom(b) - return n, peer, err - } + if runtime.GOOS == "darwin" && c.p4 != nil { + n, _, peer, err := c.p4.ReadFrom(b) + return n, peer, err } return c.c.ReadFrom(b) } diff --git a/vendor/golang.org/x/net/icmp/listen_posix.go b/vendor/golang.org/x/net/icmp/listen_posix.go index fa1653b7..b9f26079 100644 --- a/vendor/golang.org/x/net/icmp/listen_posix.go +++ b/vendor/golang.org/x/net/icmp/listen_posix.go @@ -89,9 +89,9 @@ func ListenPacket(network, address string) (*PacketConn, error) { } switch proto { case iana.ProtocolICMP: - return &PacketConn{c: c, ipc: ipv4.NewPacketConn(c)}, nil + return &PacketConn{c: c, p4: ipv4.NewPacketConn(c)}, nil case iana.ProtocolIPv6ICMP: - return &PacketConn{c: c, ipc: ipv6.NewPacketConn(c)}, nil + return &PacketConn{c: c, p6: ipv6.NewPacketConn(c)}, nil default: return &PacketConn{c: c}, nil } diff --git a/vendor/golang.org/x/net/ipv4/doc.go b/vendor/golang.org/x/net/ipv4/doc.go index 75eb12d7..9a79badf 100644 --- a/vendor/golang.org/x/net/ipv4/doc.go +++ b/vendor/golang.org/x/net/ipv4/doc.go @@ -42,7 +42,7 @@ // The outgoing packets will be labeled DiffServ assured forwarding // class 1 low drop precedence, known as AF11 packets. // -// if err := ipv4.NewConn(c).SetTOS(DiffServAF11); err != nil { +// if err := ipv4.NewConn(c).SetTOS(0x28); err != nil { // // error handling // } // if _, err := c.Write(data); err != nil { @@ -124,7 +124,7 @@ // // The application can also send both unicast and multicast packets. // -// p.SetTOS(DiffServCS0) +// p.SetTOS(0x0) // p.SetTTL(16) // if _, err := p.WriteTo(data, nil, src); err != nil { // // error handling diff --git a/vendor/golang.org/x/net/ipv6/doc.go b/vendor/golang.org/x/net/ipv6/doc.go index c0c833e8..3c15c21f 100644 --- a/vendor/golang.org/x/net/ipv6/doc.go +++ b/vendor/golang.org/x/net/ipv6/doc.go @@ -42,7 +42,7 @@ // The outgoing packets will be labeled DiffServ assured forwarding // class 1 low drop precedence, known as AF11 packets. // -// if err := ipv6.NewConn(c).SetTrafficClass(DiffServAF11); err != nil { +// if err := ipv6.NewConn(c).SetTrafficClass(0x28); err != nil { // // error handling // } // if _, err := c.Write(data); err != nil { @@ -124,7 +124,7 @@ // // The application can also send both unicast and multicast packets. // -// p.SetTrafficClass(DiffServCS0) +// p.SetTrafficClass(0x0) // p.SetHopLimit(16) // if _, err := p.WriteTo(data[:n], nil, src); err != nil { // // error handling diff --git a/vendor/golang.org/x/net/publicsuffix/list_test.go b/vendor/golang.org/x/net/publicsuffix/list_test.go index f231de4c..a08e64ea 100644 --- a/vendor/golang.org/x/net/publicsuffix/list_test.go +++ b/vendor/golang.org/x/net/publicsuffix/list_test.go @@ -356,10 +356,10 @@ var eTLDPlusOneTestCases = []struct { {"a.b.example.uk.com", "example.uk.com"}, {"test.ac", "test.ac"}, // TLD with only 1 (wildcard) rule. - {"il", ""}, - {"c.il", ""}, - {"b.c.il", "b.c.il"}, - {"a.b.c.il", "b.c.il"}, + {"mm", ""}, + {"c.mm", ""}, + {"b.c.mm", "b.c.mm"}, + {"a.b.c.mm", "b.c.mm"}, // More complex TLD. {"jp", ""}, {"test.jp", "test.jp"}, diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go index 9b8c7212..8acecbcf 100644 --- a/vendor/golang.org/x/net/publicsuffix/table.go +++ b/vendor/golang.org/x/net/publicsuffix/table.go @@ -2,7 +2,7 @@ package publicsuffix -const version = "publicsuffix.org's public_suffix_list.dat, git revision 0de6f8e (2015-07-15)" +const version = "publicsuffix.org's public_suffix_list.dat, git revision 8952c0c (2015-10-12)" const ( nodesBitsChildren = 9 @@ -23,417 +23,429 @@ const ( ) // numTLD is the number of top level domains. -const numTLD = 1337 +const numTLD = 1526 // Text is the combined text of all labels. -const text = "biomutashinainfoggiabirdartdecodynaliascoli-picenord-frontierbir" + - "kenesoddtangenovaravennagatorockartuzyunsakakinokiabirthplacevje" + - "-og-hornnesangostrodawarabjarkoyurihonjournalistjordalshalsenfsh" + - "ostre-totenkawabjerkreimmobilienhsanjotatsunostrolekaniepcexpose" + - "dogawarabikomaezakirunortonsbergminakamichigangwonikonantananger" + - "bjugninohelpaleostrowiecasertairabloombergbauernuorokunohealthca" + - "reerschmidtre-gauldalottokashikinuyamanouchikuhokuryugasakitaura" + - "yasudabluedatsunanjogaszkolahppiacenzachpomorskieninomiyakonojos" + - "oyrovnostrowwlkpmgmodalenirasakinvestmentsannanishiazais-a-candi" + - "datexasiabmsannohelsinkitakamiizumisanofieldyndns-freemasonryusu" + - "harabmweirbnpparibaselburgmxboxeroxjaworznobomloanswatch-and-clo" + - "ckerbondyndns-homednsanokasumigaurawa-mazowszexeterbonnishigotvs" + - "antabarbarabootsantacruzsantafedjelenia-goraboschlesischesanukis" + - "-a-catererbostikasuyakutiabostonakijinsekikogentingretajimakaneg" + - "asakitagawabotanicalgardenishiharabotanicgardenishiizunazukis-a-" + - "celticsfanishikatakayamatta-varjjatattoolsztynsettlersaotomelbou" + - "rnextraspace-to-rentalsapodhalebotanynysadoesntexistanbullensake" + - "rboutiquebecasinore-og-uvdalouvrepair-traffic-controlleyusuisser" + - "vegame-serverdalovenneslaskerrylogisticsapporobozentsujiiebrades" + - "corporationishikatsuragivingrimstadyndns-ip6brandywinevalleyuulm" + - "inamibosogndalowiczest-le-patrondheimperiabrasiljan-mayenishikaw" + - "azukaneyamaxunjargabresciabrindisiciliabristolgalsacebritishcolu" + - "mbialowiezagannakadomari-elasticbeanstalkaszubyuzawabroadcastleb" + - "timnetzgorabroadwayuzhno-sakhalinskatowicebroke-itaxihuanishimer" + - "abrokerrypropertiesaratovalleaostavropolicebronnoysundyndns-mail" + - "ubindalucaniabrothermesaverdealstahaugesundyndns-office-on-the-w" + - "ebcambridgestonewportlligatewaybrumunddaluccapetownishinomiyashi" + - "ronobrunelblagdenesnaaseralingenkainanaejrietiendaburyatiabrusse" + - "lsardegnamsosnowiecastresistancebruxellesardiniabryanskleppalerm" + - "omasvuotnakatsugawabryneuesarlucernebuyshousesarpsborgripebuzeni" + - "shinoomotegovtgorybuzzgorzeleccollegersundyndns-picsarufutsunomi" + - "yawakasaikaitakoelnishinoshimabwfarmequipmentjeldsundyndns-remot" + - "egildeskalmykiabzhitomirkutskodjeffersonishiokoppegardyndns-serv" + - "erbaniacntoyonezawacolognewjerseycolonialwilliamsburgrpanamacolo" + - "radoplateaudiocolumbusantiquest-a-la-masioncommunitydaluxembourg" + - "ruecomobaracompanycompute-1computerhistoryofscience-fictioncomse" + - "curitysfjordcondoshichikashukujitawaraconferenceconstructioncons" + - "uladollsatxn--0trq7p7nnconsultanthropologyconsultingvolluxurycon" + - "tactoyonocontemporaryartgallerybnikahokutogitsuldaluzerncontract" + - "orskenconventureshinodesashibetsuikindleikangercookingchannelver" + - "uminamiechizencoolbia-tempio-olbiatempioolbialystokkecoopocznori" + - "lskypescaravantaarparachutinguidellogliastradercopenhagencyclope" + - "dicdn77-sslattuminamidaitomangotsukisosakitagatakamoriokamikitay" + - "amatotakadacorsicamerakershus-east-1corvettelemarkazunocosenzako" + - "panerairguardcostumedio-campidano-mediocampidanomediocouncilviva" + - "no-frankivskchristiansburguitarsaudacouponsauheradcoursesavannah" + - "gacqhachinoheguris-a-democratoyookarasjohkamiokaminokawanishiaiz" + - "ubangecranbrookuwanalyticsaves-the-whalessandria-trani-barletta-" + - "andriatranibarlettaandriacreditcardcreditunioncremonashorokanaie" + - "crewiiheyaizuwakamatsubushikusakadogawacricketrzyncrimeacrotonew" + - "mexicoldwarmiamiastarnbergujolstercrowncrsavonamsskoganeis-a-des" + - "ignercruisesaxocuisinellancasterculturalcentertainmentoyosatomsk" + - "ddielddanuorrikuzentakatajirissafetysnesayokkaichirurgiens-denti" + - "stesbscholarshipschoolcuneocupcakecxn--11b4c3dcyouthdfcbankfhskh" + - "abarovskhakassiafinlandfinnoyfirebaseappspotenzamamicrolightingu" + - "nmaritimodellinguovdageaidnulsanfranciscotlandfirenzefirestonewy" + - "orkshireggio-calabriafirmdaleirfjordfishingoldpointelligencefitj" + - "arfitnessettlementoyotsukaidovre-eikerfjalerflesbergushikamifura" + - "noshiroomuraflickragerotikamchatkameokameyamashinatsukigatakahar" + - "ussiaflightschweizippodlasiellakasamatsudoosandnessjoenfloguchik" + - "uzenfloraflorencefloridafloristanohatakahashimamakirkenesciencec" + - "entersciencehistoryfloromskogxn--1ck2e1balestrandabergamoarekepn" + - "ordlandivtasvuodnakaiwamizawaugustowadaejeonbukarlsoyokote12flow" + - "erscientistor-elvdalflsmidthruhereggio-emilia-romagnakanotoddenf" + - "lynnhubalsanagochihayaakasakawagoebinagisoccertificationaturalsc" + - "iencesnaturelles3-sa-east-1fndfolldalfoodnetworkangerfor-better-" + - "thandafor-ourfor-somedizinhistorischescrapper-sitefor-theatreefo" + - "rexrothachiojiyahikobeatscrappingzjcbnlforgotdnservicesettsuppor" + - "toyouraforli-cesena-forlicesenaforliguriaforsaleirvikharkivalled" + - "-aostakinoueforsandasuolodingenfortmissoulan-udefenseljordfortwo" + - "rthachirogatakanabeauxartsandcraftsevastopoleforuminamiizukamito" + - "ndabayashiogamagoriziafosnesewildlifestylefotoystre-slidrettozaw" + - "afredrikstadtveronakamuratakahamaniwakuratelevisionfreiburgfreig" + - "htcmwilliamhillfribourgfriuli-v-giuliafriuli-ve-giuliafriuli-veg" + - "iuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriu" + - "liv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuliafriul" + - "iveneziagiuliafriulivgiuliafrlfroganshakotankharkovalledaostakko" + - "fuelfrognfrolandfrom-akrehamnfrom-alfrom-arfrom-azlgfrom-capebre" + - "tonamiasakuchinotsuchiurakawassamukawataricohdavvesiidazaifudaig" + - "odoharuhrfrom-collectionfrom-ctozsdeltajimibungotakadavvenjargam" + - "vikhersonfrom-dcheltenham-radio-operaunitelefonicagliaridagawars" + - "zawashingtondclkatsushikabelaudiblebesbyglandyndns-weberlincolni" + - "shitosashimizunaminamiashigarafrom-degreefrom-flandersharis-a-ge" + - "ekhmelnitskiyamashikiyosatohoboleslawiechelyabinskydivingriwatar" + - "ailwayfrom-gausdalfrom-higashiagatsumagoizumizakirovogradoyfrom-" + - "iafrom-idfrom-ilfrom-in-the-bandaiwafunexusdecorativeartsharpara" + - "glidingfrom-kshawaiijimarylandfrom-kyknetnedalfrom-langevagrarbo" + - "retumbriafrom-mannosegawafrom-mdfrom-meereshellaspeziafrom-micro" + - "softbankhmelnytskyivallee-aosteroyfrom-mnfrom-mochizukiryuohkura" + - "from-msherbrookegawafrom-mtnfrom-nchernigovernmentjomeloyalistoc" + - "kholmestrandyndns-wikirafrom-ndfrom-nefrom-nhktranaritakurashiki" + - "s-a-greenfrom-njcparisor-fronfrom-nminamimakis-a-gurulvikhvallee" + - "aosteigenfrom-nvanylvenicefrom-nyfrom-ohtawaramotoineppugliafrom" + - "-oketogolfashionfrom-orfrom-paderbornfrom-praxis-a-anarchistoire" + - "ggiocalabriafrom-rittogurafrom-schokoladenfrom-sdnipropetrovskla" + - "businessebykleclerchernihivgucciprianiigataishinomakikugawatchan" + - "dclockatsuyamashikefrom-tnfrom-txn--1ctwolominamatamayukis-a-har" + - "d-workerfrom-utazuerichardlikes-piedmontblancashireggioemiliarom" + - "agnakasatsunairlinebraskaunbieidsvollfrom-vadsochildrensgardenfr" + - "om-vtranbyfrom-wafrom-wielunnerfrom-wvaofrom-wyfrosinonefrostalo" + - "wa-wolawafroyahabaghdadfstcgrouparliamentrani-andria-barletta-tr" + - "ani-andriafujiiderafujikawaguchikonefujiminohadanotaireshimojis-" + - "a-hunterfujinomiyadafujiokayamansionshimokawafujisatoshonairport" + - "land-4-salernogiessengerdalaskanittedallasalleaseeklogeshimokita" + - "yamafujisawafujishiroishidakabiratorideliveryggeelvinckmpspbalsf" + - "jordivttasvuotnakamagayachts3-us-gov-west-1fujiyoshidafukayabear" + - "dubaiduckdnsdojoetsurutaharaumakeupowiatmallorcafederationfukuch" + - "iyamadafukudominichernivtsicilyfukuis-a-knightraniandriabarletta" + - "traniandriafukumitsukefukuokazakisarazure-mobileitungsenfukurois" + - "higakishiwadafukusakisofukushimanxn--1lqs03nfukuyamagatakahataka" + - "ishimogosenfunabashiriuchinadafunagatakamatsukawafunahashikamiam" + - "akusatsumasendaisennangonohejis-a-landscaperugiafundaciofuoiskuj" + - "ukuriyamaoris-a-lawyerfuosskoczowinbaltimore-og-romsdalillesandi" + - "egotembaixadaukraanghkemerovodkagoshimagnitkakamigaharaholtaleni" + - "waizumiotsukumiyamazonawsaarlandgcampobassociates3-eu-west-1furn" + - "iturehabikinokawairtelecityeatshimonitayanagis-a-liberalfurubira" + - "quarelleasingleshimonosekikawafurudonostiafurukawaharafusodegaur" + - "afussagaeroclubmedecincinnativeamericanantiquesquarendalenugfuta" + - "bayamaguchinomigawafutboldlygoingnowhere-for-moregontrailroadfut" + - "tsurugashimarburgfvgfyis-a-libertarianfylkesbiblackfridayfyresda" + - "lhannanmokuizumodenakatombetsulikescandynathomebuiltranoyhannova" + - "reservebbshimotsukehanyuzenhapmirumarnardalhappounzenhareidsberg" + - "enharstadharvestcelebrationhasamarahasaminami-alpssells-for-ustk" + - "arasuyamazoehasudahasvikokonoehatogayahoooshikamaishimodatenris-" + - "a-nurseminehatoyamazakitahiroshimarriottransportrapaniimimatakas" + - "ugais-a-painteractivegaskimitsubatamicadaqueshimotsumahatsukaich" + - "iharahattfjelldalhayashimamotobunkyonanaoshimabariakehazuminobus" + - "ells-itravelchannelhembygdsforbundhemneshinichinanhemsedalheroku" + - "ssldheroyhgtvarggatravelersinsurancehigashichichibusheyhigashihi" + - "roshimanehigashiizumozakitakatakaokamikoaniikappulawyhigashikaga" + - "wahigashikagurasoedahigashikawakitaaikitakyushuaiahigashikurumee" + - "trdhigashimatsushimarugame-hostinghigashimatsuyamakitaakitadaito" + - "igawahigashimurayamalatvuopmidoris-a-patsfanhigashinarusellsyour" + - "homeftpaccesshinjournalismolanshinjukumanohigashinehigashiomihac" + - "himanchesterhigashiosakasayamamotorcycleshinkamigotoyohashimotok" + - "uyamahigashishirakawamatakarazukamiminershinshinotsurfastlyhigas" + - "hisumiyoshikawaminamiaikitamidsundhigashitsunotteroyhigashiuraus" + - "ukitamotosumidatlantichiryukyuragifuefukihabmerhigashiyamatokori" + - "yamanakakogawahigashiyodogawahigashiyoshinogaris-a-personaltrain" + - "erhiraizumisatohmarumorimachidahirakatashinagawahiranairtrafficb" + - "cghirarahiratsukagawahirayaitakasagooglecodespotrentino-a-adigeh" + - "istorichouseshinshirohitachiomiyaginowaniihamatamakawajimarcheap" + - "artmentshintokushimahitachiotagoparocherkasyzrankoshigayaltaikis" + - "-a-photographerokuapparshintomikasaharahitoyoshimifunehitradingh" + - "jartdalhjelmelandholeckobierzyceholidayhomeipartis-a-playerhomel" + - "inuxn--1lqs71dhomessinashikitanakagusukumodernhomeunixn--1qqw23a" + - "hondahonefosshinyoshitomiokanmakiwakunigamihamadahongorgehonjyoi" + - "chiropractichitachinakagawatchesasayamahornindalhorsembokukitash" + - "iobarahortendofinternetrentino-aadigehoteleshiojirishirifujiedah" + - "otmailhoyangerhoylandetroitskolobrzegyptianquanconagawakeisenbah" + - "nhurdalhurumajis-a-republicancerresearchaeologicaliforniahyogori" + - "s-a-rockstarachowicehyugawarajfkomakiyosemitejgorajlchloejlljmpa" + - "rtnershiraokanonjis-a-studentaljnjeonnamerikawauejoyoitakasakitc" + - "henjpmorganichocolatelekommunikationishiwakis-a-conservativegars" + - "heis-a-cpadoval-daostavalleyjpnchofunatorientexpressexyzgradyndn" + - "s-workshoppdalukowhalingroks-thisayamanashichinohedmarketsasebok" + - "nowsitallyngenissandvikcoromantovalle-aostatoiluroyjprshiratakah" + - "agis-a-teacherkassymantechnologyjurkredstonekristiansandefjordkr" + - "istiansundkrodsheradkrokstadelvaldaostathellewismillerkryminamio" + - "guniversitykumatorinokumejimateramoldelmenhorstalbanshisuifuette" + - "rtdasnetzwindmillkumenanyokaichibahccavuotnagareyamaintenancekun" + - "isakis-an-actresshirahamatonbetsurgeonshalloffamelhuslivinghisto" + - "rykunitachiaraisaijoshkar-olayangroupartykunitomigusukumamotoyam" + - "asudakunneppupasadenaklodzkodairakunstsammlungkunstunddesignkuok" + - "groupassagenshitaramakureitrentino-sudtirolkurgankurobellevuelos" + - "angelesjaguarchitecturebungoonomichinomiyakembuchikujobservercel" + - "liernemurorangemologicallfinanzkurogimilitarykuroisoftwaremarker" + - "ryhotelshizukuishimofusaikis-an-anarchistoricalsocietyumenkuroma" + - "tsunais-an-artistjohnkurotakikawasakis-an-engineeringerikekursko" + - "mmunalforbundkushirogawakustanais-an-entertainerkusunndalkutchan" + - "elkutnokuzbassnillfjordkuzumakis-bykvafjordkvalsundkvamlidlugole" + - "kagaminord-aurdalvdalipayufuchukotkafjordkvanangenkvinesdalkvinn" + - "heradkviteseidskogkvitsoykwpspjelkavikommunekyotobetsupersportre" + - "ntino-sued-tirolkyowariasahikawamissilexusgardenmisugitokigawami" + - "takeharamitourismolenskomorotsukamisunagawamitoyoakemiuramiyazur" + - "ewebsiteshikagamiishikarikaturindalmiyotamanomjondalenmlbarclays" + - "3-us-west-2monmouthaebaruminamiminowamonticellombardiamondshouji" + - "s-into-animegurovigorlicemontrealestatebankomvuxn--2m4a15emonza-" + - "brianzaporizhzhekinannestadmonza-e-della-brianzaporizhzhiamonzab" + - "rianzapposts-and-telecommunicationshowamonzaebrianzaramonzaedell" + - "abrianzamordoviajessheiminamisanrikubetsupplieshizuokanoyakagemo" + - "riyamatsusakahogithubusercontentrentino-suedtirolmoriyoshiokamit" + - "suemormoneymoroyamatsushigemortgagemoscowindowshriramsterdamberk" + - "eleymoseushistorymosjoenmoskenesienaplesigdalmossimbirskongsberg" + - "mosvikongsvingermoviemovistargardmtpccwioslombardyndns-at-homede" + - "potaruis-into-carshirakoenigmtrainingmuenstermugivestbytomakomai" + - "baramuikamogawamukochikushinonsenergymulhouseoullensvangmulticho" + - "icemunakatanemuncieszynmuosattemupassenger-associationmurmanskon" + - "injamisonymurotorcraftrentinoa-adigemusashimurayamatsuuramusashi" + - "noharamuseetrentinoaadigemuseumverenigingmutsuzawamutuellezajsko" + - "nskowolapyatigorskomatsushimashikokuchuomyphotoshibaikaliszczytn" + - "ordkappgmytis-a-bookkeeperminamitanephilatelyphilipsyphoenixn--3" + - "0rr7yphotographysiopiagetmyipaviancapitalpictetrentinoaltoadigep" + - "icturesirdalpiemontepilotslupskonsulatrobelgorodeopinkonyvelolku" + - "szpartshishikuis-a-techietis-a-socialistmeincheonpippupiszpittsb" + - "urghofauskedsmokorsetagayasells-for-lesschulepiwatepizzapkooris-" + - "a-therapistoiaplanetariuminamiuonumatsumotofukeplantationplantsn" + - "oasaintlouis-a-bruinsfansnzplatforminamiyamashirokawanabellunord" + - "re-landplaystationplazaplchonanbuildingrondarplomzansimagichosei" + - "kakegawawhoswhokksundyroyrvikingrongaplumbingoplusterpmnpodzonep" + - "ohlpokerpokrovskopervikomforbambleborkarpaczeladz-2polkowicepolt" + - "avalle-d-aostavangerpomorzeszowitdkoryolasitepordenonepornporsan" + - "gerporsangugeporsgrunnanpoznanprdpreservationpresidioprimeiwamat" + - "sumaebashikshacknetrentinos-tirolprincipeprivneprochowiceproduct" + - "ionsokanraprofermobilyprojectrentinostirolpromombetsupplypropert" + - "yprotectionpruszkowithgoogleapisa-hockeynutrentinosud-tirolprzew" + - "orskogptzpvtrentinosudtirolpzqldqponqslgbtrentinosued-tirolsrlsr" + - "varoystoragestordalstorenburgstorfjordstpetersburgstudiostudyndn" + - "s-blogdnsolarssonstuff-4-salestuttgartrentoshimasurgutsiracusait" + - "amatsukuris-into-cartoonshiranukannamiharusurnadalsurreysusakis-" + - "into-gameshiraois-a-soxfansusonosuzakanumazurysuzukanzakiwiensuz" + - "ukis-leetrentino-alto-adigesvalbardudinkamakurazakinkobayashikao" + - "irmincommbankomonosveiosvelvikosaigawasvizzeraswedenswidnicarbon" + - "ia-iglesias-carboniaiglesiascarboniaswiebodzindianapolis-a-blogg" + - "erswinoujscienceandhistoryswisshikis-lostfoldsxn--32vp30hagakhan" + - "amigawatuis-not-certifiedunetflixiltulaquilarvikoseis-an-account" + - "antshioyameldaltunesologneturystykarasjoksnesolundtuscanytushuma" + - "nitiesolutionsokndaltuvalle-daostavernversicherungvestfoldvestne" + - "somnarashinovestre-slidreamhostersoovestre-totennishiawakuravest" + - "vagoyvevelstadvibo-valentiavibovalentiavideovillaskvolloabathsbc" + - "ngvinnicargojomediavinnytsiavipsinaappharmacymruovatrentinoalto-" + - "adigevirginiavirtualvirtuelvistaprinternationalfirearmsopotrenti" + - "nosuedtirolviterboltrevisohuissier-justicevladikavkazanvladimirv" + - "ladivostokaizukaratevlogvoldavolgogradvolkenkunderseaportroandin" + - "osaurepbodyndns-at-workinggroupharmaciensimple-urlvolkswagentsor" + - "-odalvologdanskoshunantokamachippubetsubetsugaruvolyngdalvoronez" + - "hytomyrvossevangenvotevotingvotottoris-savedvrnwroclawloclawekos" + - "tromahabororoskolelwtchoyodobashibuyachiyodawtferrarawuozuwwwrit" + - "esthisblogspotrogstadwzmiuwajimaxn--3pxu8kosugexn--42c2d9axn--45" + - "brj9christmasakimobetsuwanouchikuseihichisobetsuitaitogakushimot" + - "oganewhampshirecreationissedalutskaufenisshinguernseyxn--45q11ch" + - "romedicaltanissettaiwanairforceoxn--4gbriminingxn--4it168dxn--4i" + - "t797kotohiradomainsureisenxn--4pvxsor-varangerxn--54b7fta0cchtra" + - "eumtgeradeatnurembergrossetouchijiwadell-ogliastrakhanawaxn--55q" + - "w42gxn--55qx5dxn--5js045dxn--5rtp49chungbukautokeinoxn--5rtq34ko" + - "touraxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--" + - "7t0a264chungnamdalseidfjordxn--80adxhksorfoldxn--80ao21axn--80as" + - "ehdbargainstituteledatabaseballooningjerdrumemorialimitedownload" + - "rangedalimoliserniaustraliaisondre-landebudejjuedischesapeakebay" + - "erndigitalillehammerfest-mon-blogueurovisionasushiobaragrinetban" + - "kz-1kappleangaviikadenaamesjevuemielnoboribetsucks3-ap-northeast" + - "-1xn--80aswgxn--80audnedalnxn--8ltr62kouhokutamakizunokunimilano" + - "xn--8pvr4uxn--8y0a063axn--90a3academykolaivanovosibirskiervaapst" + - "eiermarkhangelskinderoyerimo-i-ranadexchangeiseiroumuenchendofth" + - "einternetcimdbarreauctionaturbruksgymnaturhistorischesakuraibiga" + - "waustrheimatunduhrennesoyokoze164xn--90aishobaraxn--90azhagebost" + - "adxn--9dbhblg6diethnologyxn--9dbq2axn--9et52uxn--9krt00axn--andy" + - "-iraxn--aroport-byanagawaxn--asky-iraxn--aurskog-hland-jnbarrel-" + - "of-knowledgeorgiauthordalandroidiscountysvardonnaharimamurogawag" + - "roks-theaternidds3-ap-southeast-1xn--avery-yuasakatakazakis-slic" + - "komaganexn--b-5gaxn--b4w605ferdxn--bck1b9a5dre4churchaseljejuego" + - "shikiminokamoenaircraftmpamperedchefarmsteadxn--bdddj-mrabdxn--b" + - "earalvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7" + - "axn--bidr-5nachikatsuuraxn--bievt-0qaxn--bjarky-fyanaizuxn--bjdd" + - "ar-ptambovdonskoshimizumakiyosumitakaginozawaonsenxn--blt-elabor" + - "xn--bmlo-graingerxn--bod-2naroyxn--brnny-wuaccident-investigatio" + - "njukudoyamaceratabuseat-band-campaniamallamadridvagsoygardenebak" + - "keshibechambagricaaarborteaches-yogasawaracingxn--brnnysund-m8ac" + - "cident-preventionlineat-urlxn--brum-voagatromsaitokorozawaxn--bt" + - "sfjord-9zaxn--c1avgxn--c2br7gxn--c3s14misakis-foundationxn--cck2" + - "b3barrell-of-knowledgets-itarumizusawautomotivelandiscoveryokami" + - "kawanehonbetsuruokaluganskarmoyomitanobihirosakikamijimakunecn-n" + - "orth-1xn--cg4bkis-uberleetrentino-altoadigexn--ciqpnxn--clchc0ea" + - "0b2g2a9gcdn77-securecipesaro-urbino-pesarourbinopesaromalvikouno" + - "sumypetshisognexn--comunicaes-v6a2oxn--correios-e-telecomunicaes" + - "-ghc29axn--czr694bashkiriautoscanadagestangeologyonabarudmurtiam" + - "usementargibestadevenes3-ap-southeast-2xn--czrs0tromsojavald-aos" + - "tarostwodzislawiwatsukiyonowtvbarefootballangenoamishirasatobish" + - "imaizurubtsovskjervoyageometre-experts-comptablesakuragawaustinn" + - "aspers3-external-1xn--czru2dxn--czrw28basilicataniaveroykenviron" + - "mentalconservationaturalhistorymuseumcentereportarnobrzegjemnes3" + - "-external-2xn--d1acj3batochigiftsakyotanabeneventochiokinoshimal" + - "opolskanlandrivefsncfagebizenakaniikawatanaguravocatanzarowebhop" + - "agespeedmobilizerobirasnesoddenmarketplace-burggfamilyokosukariy" + - "akumodumemerck-uralsk12xn--d1alferreroticanonoichikawamisatodayx" + - "n--d1atrusteexn--d5qv7z876chuvashiaxn--davvenjrga-y4axn--djrs72d" + - "6uyxn--djty4kouyamasoyxn--dnna-grajeworldxn--drbak-wuaxn--dyry-i" + - "raxn--eckvdtc9dxn--efvn9sorreisahayakawakamiichikaiseiyokoshibah" + - "ikariwanumataketomisatokyotangoxn--efvy88haibarakitahatakanezawa" + - "xn--ehqz56nxn--elqq16hakatanotogawaxn--estv75gxn--eveni-0qa01gax" + - "n--f6qx53axn--fct429kouzushimassa-carrara-massacarraramassabuske" + - "rudineustarhubarclaycards3-us-west-1xn--fhbeiarnxn--finny-yuaxn-" + - "-fiq228c5hsortlandxn--fiq64batsfjordrobaknoluoktainaibetsubameri" + - "canartanddesignieznogatagajobojibmdunloppacificarriereviewskrako" + - "weddingjerstadotsurugimetlifeinsurancehimejiinetatamotorsalangen" + - "atuurwetenschappenaumburgjesdalindaskoyabenorddalindesnesalatata" + - "rstanaustdalinkaruizawavoues3-fips-us-gov-west-1xn--fiqs8sorumin" + - "anoxn--fiqz9southcarolinazawaxn--fjord-lraxn--fjq720axn--fl-ziax" + - "n--flor-jraxn--flw351exn--fpcrj9c3dxn--frde-grandrapidsouthwestf" + - "alenxn--frna-woarais-very-badaddjamalborkdalxn--frya-hraxn--fzc2" + - "c9e2circlegnicahcesuolocalhistoryazannefrankfurtoyokawaxn--fzys8" + - "d69uvgmailxn--g2xx48circusculturedumbrellajollanbibaidarq-axn--g" + - "ckr3f0fetsundxn--gecrj9citicateringebuildersvpalmspringsakerxn--" + - "ggaviika-8ya47hakodatemasekmshimosuwalkis-a-linux-useranishiarit" + - "abashijonawatextilevangerxn--gildeskl-g0axn--givuotna-8yandexhib" + - "itionxn--gjvik-wuaxn--gls-elacaixaxn--gmq050is-very-evillagexn--" + - "gmqw5axn--h-2failxn--h1aeghakonexn--h2brj9civilaviationiyodogawa" + - "xn--hbmer-xqaxn--hcesuolo-7ya35bauhaustevollinzaiitatebayashiiba" + - "hcavuotnagarakkestadupontariobninskarumaifareastcoastaldefencemb" + - "roideryonagoyaxastronomyokohamamatsudaegubs3-eu-central-1xn--her" + - "y-iraxn--hgebostad-g3axn--hmmrfeasta-s4acoachampionshiphopenair-" + - "surveillancebetsukubabia-goracleaningatlantachikawakayamagadance" + - "chirealtorlandxn--hnefoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmi" + - "r-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn" + - "--imr513nxn--indery-fyaotsurgeryxn--io0a7is-very-goodyearthadsel" + - "fipirangaxn--j1aefgulenxn--j1amhakubanxn--j6w193gxn--jlq61u9w7bb" + - "cartierhcloudcontrolappalanakhodkanagawaxn--jlster-byaroslavlaan" + - "derenxn--jrpeland-54axn--jvr189misasaguris-gonexn--k7yn95exn--ka" + - "rmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--kl" + - "t787dxn--kltp7dxn--kltx9axn--klty5xn--3bst00minnesotaketakatoris" + - "-certifieducatorahimeshimageandsoundandvisionxn--koluokta-7ya57h" + - "akuis-a-llamarylhursteinkjerusalembetsukuis-a-musicianxn--kprw13" + - "dxn--kpry57dxn--kpu716figuerestaurantoyotaris-a-doctorayxn--kput" + - "3is-very-nicexn--krager-gyasakaiminatoursowaxn--kranghke-b0axn--" + - "krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jetztrentino-stiro" + - "lxn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyasugis-very-sweetrenti" + - "no-s-tirollagriculturennebudapest-a-la-maisondriodejaneirocheste" + - "rxn--kvnangen-k0axn--l-1fairwindspreadbettingxn--l1accentureklam" + - "borghinikkoebenhavnxn--laheadju-7yasuokaratsuginamikatagamihobby" + - "-sitevaksdalxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagavi" + - "ika-52bbvacationsnasabaerobaticketsalondonetskasaokamisatohnosho" + - "oceanographicsaltdalipetskashibatakashimasfjordenaval-d-aosta-va" + - "lleyonagunikolaeventsalvadordalibabajddarchaeologyeongnamegawakk" + - "anaikawababydgoszczecinemailivornoceanographiquemergencyberlevag" + - "angaviikarugaulardalorenskogjovikashiharaxn--lesund-huaxn--lgbba" + - "t1ad8jevnakerxn--lgrd-poacivilisationrwifarsundxn--lhppi-xqaxn--" + - "linds-pratoyakokamishihoronobeokaminoyamatsuris-with-thebandoomd" + - "nsaliascolipicenord-odalxn--lns-qlavagiskexn--loabt-0qaxn--lrdal" + - "-sraxn--lrenskog-54axn--lt-liacivilizationxn--lten-granexn--lury" + - "-iraxn--mely-iraxn--merker-kuaxn--mgb2ddespydebergxn--mgb9awbfil" + - "ateliaxn--mgba3a3ejtrvchoshibukawaxn--mgba3a4f16axn--mgba3a4fran" + - "amizuholdingsmileksvikozagawaxn--mgba7c0bbn0axn--mgbaam7a8hakusa" + - "ndoyxn--mgbab2bdxn--mgbai9a5eva00beppubolognagasukesennumalselve" + - "ndrelloteneiiyamanobedzin-addrammenuernberglassassinationalherit" + - "agematsubarakawachinaganoharaogashimadachicagoboatsalzburgliwice" + - "mrxn--mgbai9azgqp6jewelryxn--mgbayh7gpaduaxn--mgbb9fbpobanazawax" + - "n--mgbbh1a71exn--mgbc0a9azcgxn--mgberp4a5d4a87gxn--mgberp4a5d4ar" + - "xn--mgbpl2fhvalerxn--mgbqly7c0a67fbcivilwarmanagementoyonakagyok" + - "utomobentleyxn--mgbqly7cvafranziskanerimarinextdirectoryxn--mgbt" + - "3dhdxn--mgbtf8flatangerxn--mgbtx2bernrtateshinanomachintaijindus" + - "triesteambulancepilepsykkylvenetogliattipschoenbrunnavigationavu" + - "otnakayamatsuzakinfinitiresamegawaxn--mgbx4cd0abogadocscbgxn--mi" + - "x082filminamifuranoxn--mix891finalxn--mjndalen-64axn--mk0axindia" + - "nmarketingxn--mk1bu44claimsaskatchewanggouvicenzaxn--mkru45isleo" + - "fmandalxn--mlatvuopmi-s4axn--mli-tlavangenxn--mlselv-iuaxn--more" + - "ke-juaxn--mori-qsakegawaxn--mosjen-eyatominamiawajikissmartertha" + - "nyoutubeeldengeluidxn--mot-tlazioxn--mre-og-romsdal-qqbeskidyn-o" + - "-saurlandesamnangerxn--msy-ula0haldenxn--mtta-vrjjat-k7aflakstad" + - "aokagakibichuoxn--muost-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngbe9e" + - "0axn--nit225kozakis-an-actorxn--nmesjevuemie-tcbalatinabearalvah" + - "kikonaioirasebastopologyeonggiehtavuoatnagaivuotnagaokakyotambad" + - "ajozorahkkeravjudygarlandxn--nnx388axn--nodessakuhokkaidontexist" + - "eingeekpnxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn" + - "--nttery-byaeserveftphiladelphiaareadmyblogsitexn--nvuotna-hwaxn" + - "--nyqy26axn--o1achattanooganorfolkebiblegallocuscountryestateofd" + - "elawarezzoologyxn--o3cw4halsagamiharaxn--od0algxn--od0aq3betaina" + - "boxfordealerdalottepsongdalenviknakanojohanamakinoharaxn--ogbpf8" + - "flekkefjordxn--oppegrd-ixaxn--ostery-fyatsukareliancexn--osyro-w" + - "uaxn--p1acfdxn--p1aiwchitosetoeiheijis-a-chefarmerseinewspaperxn" + - "--pbt977clickazimierz-dolnyxn--pgbs0dhammarfeastafricamagicherno" + - "vtsydneyxn--porsgu-sta26financexn--pssu33lxn--pssy2uxn--q9jyb4cl" + - "inicoffeedbackazoxn--qcka1pmclintonoshoesassaris-a-cubicle-slave" + - "llinowruzhgorodoyxn--qqqt11misconfusedxn--qxamurskjakdnepropetro" + - "vskiptveterinairealtychyllestadultrysilkosakaerodromegallupinbar" + - "celonagasakikuchikumagayagawalbrzycharternopilawalesundnpalacebi" + - "northwesternmutualimanowarudaurskog-holandroverhalla-speziaetnag" + - "ahamaroyekaterinburgdyniaeroportalaheadjudaicabbottarantomaritim" + - "ekeeping12000xn--rady-iraxn--rdal-poaxn--rde-ulaxn--rdy-0nabarix" + - "n--rennesy-v1axn--rhkkervju-01afineartschwarzgwangjuifminamiisel" + - "ectoyotomiyazakis-a-financialadvisor-aurdalxn--rholt-mragoworse-" + - "thandsoniizaxn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5na" + - "rusawaxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byatsus" + - "hiroxn--rny31hamurakamigoriginankokubunjis-a-nascarfanxn--rovu88" + - "bhartiffanycartoonarteducationalchikugokasejnyoriikashiwaraxn--r" + - "ros-granvindafjordxn--rskog-uuaxn--rst-0narutokonamegatakatsukix" + - "n--rsta-francaiseharaxn--ryken-vuaxn--ryrvik-byawaraxn--s-1faith" + - "eguardianxn--s9brj9clothingroundhandlingroznyxn--sandnessjen-ogb" + - "izhevskppspiegelxn--sandy-yuaxn--seral-lraxn--ses554gxn--sgne-gr" + - "atangenxn--skierv-utazasmatartcenterprisesakievenassisibenikihok" + - "umakogenglandxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland" + - "-fxaxn--slat-5narviikananporoxn--slt-elabourxn--smla-hraxn--smna" + - "-gratis-a-bulls-fanxn--snase-nraxn--sndre-land-0cbremangerxn--sn" + - "es-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1" + - "axn--sr-varanger-ggbielawallonieruchomoscienceandindustrynavyatk" + - "anazawaxn--srfold-byawatahamaxn--srreisa-q1axn--srum-grazxn--stf" + - "old-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbiellaakesvuemielecce" + - "verbankashiwazakiyokawaraxn--stre-toten-zcbieszczadygeyachimatai" + - "peigersundurbanpachigasakicks-assedicasadelamonedaxn--t60b56axn-" + - "-tckweatherchannelxn--tjme-hraxn--tn0agrigentomologyeongbukrasno" + - "darxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trgstad-r1axn--trn" + - "a-woaxn--troms-zuaxn--tysvr-vraxn--uc0atverranzanxn--uc0ay4axn--" + - "uist22hangglidingxn--uisz3gxn--unjrga-rtaobaomoriguchiharamcoalx" + - "n--unup4yxn--uuwu58axn--vads-jraxn--vard-jraxn--vegrshei-c0axn--" + - "vermgensberater-ctbievattorneyagawakuyabukijoburglobalashovhachi" + - "jorpelandurhamburglobodoes-itateyamaxn--vermgensberatung-pwbifuk" + - "agawalterxn--vestvgy-ixa6oxn--vg-yiabruzzoologicalabamagasakishi" + - "mabaragusartsaritsynxn--vgan-qoaxn--vgsy-qoa0jewishartrentino-su" + - "d-tirolxn--vgu402cloudcontrolledekakudamatsuenoharaxn--vhquversa" + - "illesomaxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5g" + - "xn--vuq861bihorologyukuhashimoichinosekigaharaxn--w4r85el8fhu5dn" + - "raxn--wcvs22dxn--wgbh1cloudfrontdoorxn--wgbl6axn--xhq521bikedati" + - "nglogowegroweibolzanordreisa-geekasukabeerxn--xkc2al3hye2axn--xk" + - "c2dl3a5ee0hangoutsystemscloudapparmaxn--y9a3aquariumishimatsunox" + - "n--yer-znarvikrasnoyarskomitamamuraxn--yfro4i67oxn--ygarden-p1ax" + - "n--ygbi2ammxn--3ds443gxn--ystre-slidre-ujbilbaogakidstvedestrand" + - "vrdnsamsungloppenzaokinawashirosatobamagazinedre-eikerxn--zbx025" + - "dxn--zf0ao64axn--zf0avxn--3e0b707exn--zfr164billustrationayorodd" + - "axperiaxxxn--3oq18vl8pn36axz" +const text = "bievatmallorcafederationavigationavuotnakhodkananporovnoddabifuk" + + "agawalmartateyamabihorologyurihonjournalistjordalshalsenayoromut" + + "ashinainvestmentsamsclubindalinkaszubyusuharabikedatingliwicebil" + + "baogakievenesurancebillustrationflatangerbiostrowiecasadelamoned" + + "abirdartcenterprisesakikonairbusantiquest-a-la-maisondre-landebu" + + "dejjudygarlandurhamburglobalashovhachinoheguris-a-candidatebirke" + + "nesoddtangenovarabirthplacebjarkoyusuisservicesamsunglobodoes-it" + + "veronaharimalvikatowicebjerkreimmobilienfshostrodawarabjugnhsanf" + + "ranciscotlandvrdnsangostrowwlkpmglogowegroweiboltatsunoblockbust" + + "ernopilawalterbloombergbauernurembergloppenzaogashimadachicagobo" + + "atsanjotattoolsztynsettlersannanikkoebenhavnikolaeverbankatsushi" + + "kabeerbluedatsunanjoetsuwanouchikujogaszkoladbrokesennumalselven" + + "drellinzais-a-catererbmoattachmentsannohelsinkitahiroshimarriott" + + "axihuanikonantanangerbmsanokatsuyamaseratis-a-celticsfaninohelpl" + + "financialipetskaufeninomiyakonojoshkar-olayangroupalermomasvuotn" + + "akatsugawabmweirbnpparibaselburgminakamichigangwonirasakis-a-che" + + "farsundwgmodenakatombetsumidatlanticaseihichisobetsuitairabolzan" + + "ore-og-uvdalivornobomloansantabarbarabondyndns-homednsantacruzsa" + + "ntafedexhibitionishiazais-a-conservativefsncfailomzansimagicaser" + + "taishinomakikuchikuseikarugapartmentsanukis-a-cpadoval-daostaval" + + "leyuudmurtiabonnishigotpantheonishiharabookingmxboxfinityuzawabo" + + "otsaotomeldalorenskogretakanabeatsapodhalewismillerboschaefflerd" + + "alotenkawabostikautokeinobostonakijinsekikogentingrimstadyndns-i" + + "p6botanicalgardenishiizunazukis-a-cubicle-slavellinowtvalleaosta" + + "vernishikatakazakis-a-democratgoryuzhno-sakhalinskazimierz-dolny" + + "botanicgardenishikatsuragivestbytomaritimekeepingripebotanybouti" + + "quebecngriwataraidyndns-mailottebozentsujiiebradescorporationish" + + "ikawazukaneyamaxunjargabrandywinevalleybrasiljan-mayenishimerabr" + + "esciabrindisibenikebristolgalsacebritishcolumbialowiezachpomorsk" + + "ienishinomiyashironobroadcastlebtimnetzgorzeleccolognewmexicolle" + + "ctionishinoomotegotsukisosakitagatakamoriokamikitayamatotakadabr" + + "oadwaybroke-itjeldsundyndns-office-on-the-webcambridgestonewspap" + + "erbrokerrypropertiesapporobronnoysundyndns-picsaratovalled-aosta" + + "vropolicebrothermesaverdefensejnybrumunddalottokigawabrunelblagd" + + "enesnaaseralingenkainanaejrietisalatinabenogatagajobojis-a-desig" + + "nerbrusselsardegnamsskoganeis-a-doctoraybruxellesardiniabryanskl" + + "eppalmspringsakerbryneustarhubalatinordre-landishakotankaruizawa" + + "smatartanddesignieznorddalavangenasushiobarabruzzoologicalvinkle" + + "in-addrammenuernbergdyniabogadocscbg12000buskerudinewhampshireci" + + "pesaro-urbino-pesarourbinopesaromamurogawarszawashingtondclkazob" + + "uzenishinoshimatsuzakis-a-financialadvisor-aurdalouvrepbodyndns-" + + "blogdnsarlovegaskimitsubatamicadaquesarpsborgroks-thisamitsukebu" + + "zzgradyndns-remotegildeskalmykiabwfashionishiokoppegardyndns-ser" + + "verbaniabzhitomirkutskodjeepilepsydneycloudcontrolledekakegawawi" + + "iheyaizuwakamatsubushikusakadogawacloudfrontdoorcntkmaxxn--1ck2e" + + "1balestrandabergamoarekembroideryonagoyasnesoddenmarketplace12co" + + "lonialwilliamsburgujolstercoloradoplateaudiocolumbusheycommbankh" + + "ersoncommunitysfjordcomobaracomparemarkerryhotelsayokoshibahikar" + + "iwanumatakinouecompute-1computerhistoryofscience-fictioncomsecur" + + "itysnesbschokoladencondoshichinohedmarketscholarshipschooluxuryc" + + "onferenceconstructionconsuladoharuhrconsultanthropologyconsultin" + + "gvolluzerncontactmpanasonicateringebugattipschmidtre-gauldalowic" + + "zest-le-patrondheimperiacontemporaryarteducationalchikugojomedic" + + "altanissettaiwanaircraftraeumtgeradealstahaugesundcontractorsken" + + "conventureshinodesashibetsuikimobetsuliguriacookingchannelverumi" + + "namidaitomangotembaixadacoolkuszippodlasiellakasamatsudoosandieg" + + "okaseljordcoopocznorthwesternmutualvivano-frankivskhmelnitskiyam" + + "asfjordencopenhagencyclopedicdn77-sslattumetlifeinsurancecorsica" + + "hcesuolocalhistoryazannakadomari-elasticbeanstalkhmelnytskyivall" + + "eeaosteigencorvettelevisioncosenzakopanerairforceocostumedio-cam" + + "pidano-mediocampidanomediocouncilcouponschulezajskhvanylveniceco" + + "urseschwarzgwangjuifminamiechizencq-acranbrookuwanalyticschweizj" + + "cbnlcreditcardcreditunioncremonashorokanaiecrewildlifestylecrick" + + "etrzyncrimeacrotonewportlligatewaycrowncrsciencecentersciencehis" + + "torycruisescientistor-elvdalcuisinellajollamericanexpressexyzlgu" + + "lenculturalcentertainmentoyokawacuneocupcakecxn--1ctwolominamata" + + "mayukis-a-hard-workercymruovatoyonakagyokutoshimacyouthdfcbankla" + + "budhabikinokawabarthachiojiyahikobeauxartsandcraftscjohnsonfilmi" + + "namifuranofinalfinancefineartscrappinguovdageaidnulsandvikcoroma" + + "ntovalle-daostavangerfinlandfinnoyfirebaseappspotenzamamicroligh" + + "tingushikamifuranotairesettsurfauskedsmokorsetagayasells-for-les" + + "scrapper-sitefirenzefirestonextdirectoryfirmdalegolfedjejuegoshi" + + "kiminokamoenairguardfishingonohejis-a-hunterfitjarqhachirogataka" + + "nezawafitnessettlementoyonofjalerflickragerotikamakurazakiraflig" + + "htsevastopoleflirumannoshiroomurafloguchikuzenfloraflorenceflori" + + "dafloristanohatakaharussiafloromskogxn--1lqs03nflowersevenassisi" + + "cilyflsmidthruhereggiocalabriaflynnhubalsanagochihayaakasakawaha" + + "rastronomyokohamamatsudaegubs3-eu-west-1fndfolldalfoodnetworkang" + + "erfor-better-thandafor-ourfor-somedizinhistorischesewilliamhillf" + + "or-theatreeforexrothadanotogawaforgotdnsfranziskanerimamateramoc" + + "hizukirkeneshangrilangevagrarboretumbriaforli-cesena-forlicesena" + + "forlikes-piedmontblancomeeresharis-a-knightoyookarasjoksnesharpa" + + "raglidingzparisor-fronforsaleikangerforsandasuolodingenfortmisso" + + "ulan-udell-ogliastrakhanawafortworthadselfipirangaforuminamiisel" + + "ectoyosatotalfosneshawaiijimarumorimachidafotoyotaris-a-landscap" + + "erugiafoxn--1lqs71dfreiburgfreightcmwinbalsfjordivtasvuodnakaiwa" + + "mizawaugustowadaejeonbukarlsoyokosukariyakumolde164freseniusdeco" + + "rativeartshellaspeziafribourgfriuli-v-giuliafriuli-ve-giuliafriu" + + "li-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiul" + + "iafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuli" + + "afriuliveneziagiuliafriulivgiuliafrlfroganshimokawafrognfrolandf" + + "rom-akrehamnfrom-alfrom-arfrom-azwindmillfrom-capebretonamiasaku" + + "chinotsuchiurakawassamukawataricohdavvesiidazaifudaigodaddynatho" + + "mebuiltoyotomiyazakis-a-lawyerfrom-collegersundfrom-ctoyotsukaid" + + "ovre-eikerfrom-dcheltenham-radio-operaunitelekommunikationishiwa" + + "kis-a-geekazunofrom-dellogliastraderfrom-flandershimokitayamafro" + + "m-gaulardalfrom-higashiagatsumagoirminamiizukamitsuefrom-iafrom-" + + "idfrom-ilfrom-incheonfrom-kshimonitayanagivingfrom-kyknetoyouraf" + + "rom-lanbibaidarfrom-mansionshimonosekikawafrom-mdfrom-meetoystre" + + "-slidrettozawafrom-microsoftbankmpspbaltimore-og-romsdalillyonag" + + "unikibmdivttasvuotnakamagayachts3-us-west-1from-mnfrom-modalenfr" + + "om-mshimosuwalkis-a-liberalfrom-mtnfrom-nchelyabinskypescaravant" + + "aafrom-ndfrom-nexusgardenfrom-nhktozsdefrom-njcparliamentranbyfr" + + "om-nminamimakis-a-libertarianfrom-nvaolbia-tempio-olbiatempioolb" + + "ialystokkembuchikumagayagawalbrzycharterfrom-nyfrom-ohkurafrom-o" + + "ketogurafrom-orfrom-paderbornfrom-pratohmanxn--1qqw23afrom-ris-a" + + "-linux-useranishiaritabashikaoizumizakitaurayasudafrom-schoenbru" + + "nnfrom-sdnipropetrovskmshimotsukefrom-tnfrom-txn--2m4a15efrom-ut" + + "azuerichardlikescandyndns-at-homedepotaruis-a-llamarylandfrom-va" + + "dsochildrensgardenfrom-vtrani-andria-barletta-trani-andriafrom-w" + + "afrom-wielunnerfrom-wvareserveftparmafrom-wyfrosinonefrostalowa-" + + "wolawafroyahabadajozoraumaintenancefstcgrouparocherkasyzrankoshi" + + "gayaltaikis-a-musicianfujiiderafujikawaguchikonefujiminohtawaram" + + "otoineppugliafujinomiyadafujiokayamaoris-a-nascarfanfujisatoshon" + + "airlinebraskaunbieidsvollfujisawafujishiroishidakabiratoridelmen" + + "horstalbanshimotsumafujitsurugashimarinefujixeroxn--30rr7yfujiyo" + + "shidafukayabeardubaiduckdnsdojoburgfukuchiyamadafukudominicherni" + + "governmentjmaxxxjaworznofukuis-a-nurseoullensvanguardfukumitsubi" + + "shigakirovogradoyfukuokazakiryuohaebaruminamiminowafukuroishikar" + + "ikaturindalfukusakisarazure-mobileirfjordfukuyamagatakahashimama" + + "kishiwadafunabashiriuchinadafunagatakahatakaishimoichinosekigaha" + + "rafunahashikamiamakusatsumasendaisennangoodyearthagakhanamigawaf" + + "undaciofuoiskujukuriyamarburgfuosskoczowindowshinichinanfurnitur" + + "eggioemiliaromagnakasatsunairportland-4-salernogiessengerdalaska" + + "nittedallasalleaseeklogesquarezzoologyeongnamegawakeisenbahnfuru" + + "biraquarelleasingleshinjournalismailillehammerfest-mon-blogueuro" + + "visionfurudonostiafurukawairtelecityeatshinjukumanofusodegaurafu" + + "ssaikisofukushimarcheaparshinkamigotoyohashimotomobeneventochiok" + + "inoshimalopolskanlandfutabayamaguchinomigawafutboldlygoingnowher" + + "e-for-moregontrailroadfuttsurugiminamioguniversityfvgfyis-a-pain" + + "teractivegarsheis-a-patsfanfylkesbiblackfridayfyresdalhanyuzenha" + + "pmirhappoulvikolobrzegyptianpachigasakidstvedestrandhareidsberge" + + "nharstadharvestcelebrationhasamarahasaminami-alpssells-for-unzen" + + "hasudahasvikomaganehatogayahoooshikamaishimofusartshintokushimah" + + "atoyamazakitahatakaokamikoaniikappulawyhatsukaichiharahattfjelld" + + "alhayashimamotobungotakadavvenjargamvikomakiyosatokamachippubets" + + "ubetsugaruhazuminobusells-itranoyhboehringerikehembygdsforbundhe" + + "mneshintomikasaharahemsedalherokussldheroyhgtvaroyhigashichichib" + + "unkyonanaoshimageandsoundandvisionhigashihiroshimanehigashiizumo" + + "zakitakamiizumisanofiatransportrapaniimimatakatoris-a-playerhiga" + + "shikagawahigashikagurasoedahigashikawakitaaikitakatakarazukamimi" + + "nershinyoshitomiokanmakiwakunigamihamadahigashikurumeguroroskole" + + "itungsenhigashimatsushimarshallstatebankomatsushimashikehigashim" + + "atsuyamakitaakitadaitoigawahigashimurayamalatvuopmidoris-a-repub" + + "licancerresearchaeologicaliforniahigashinarusellsyourhomegoodshi" + + "ojirishirifujiedahigashinehigashiomihachimanchesterhigashiosakas" + + "ayamamotorcycleshioyameloyalistockholmestrandhigashishirakawamat" + + "akasagooglecodespotravelchannelhigashisumiyoshikawaminamiaikitak" + + "yushuaiahigashitsunowruzhgorodoyhigashiurausukitamidsundhigashiy" + + "amatokoriyamanakakogawahigashiyodogawahigashiyoshinogaris-a-rock" + + "starachowicehiraizumisatohnoshoohirakatashinagawahiranairtraffic" + + "hernivtsiciliahirarahiratsukagawahirayaitakasakitamotosumitakagi" + + "nankokubunjis-a-socialistmeindianapolis-a-bloggerhisayamanashiib" + + "aghdadultravelersinsurancehistorichouseshirahamatonbetsurgeryhit" + + "achiomiyaginowaniihamatamakawajimaritimodellinghitachiotagoparts" + + "hirakoenighitoyoshimifunehitradinghjartdalhjelmelandholeckobierz" + + "yceholidayhomeipartyhomelinuxn--32vp30hagebostadhomesensembokuki" + + "tanakagusukumoduminamisanrikubetsupplyhomeunixn--3bst00minamitan" + + "ehondahonefosshiranukannamiharuhoneywellhongorgehonjyoitakashima" + + "rugame-hostinghornindalhorseminehortendofinternetrdhoteleshiraoi" + + "s-a-soxfanhotmailhoyangerhoylandetroitskomforbambleborkarumaifar" + + "msteadnpalanaklodzkodairaukraanghkebinagisoccertificationativeam" + + "ericanantiques3-external-1humanitieshiraokanoyakagehurdalhurumaj" + + "is-a-studentalhyllestadhyogoris-a-teacherkassymantechnologyhyuga" + + "warahyundaiwafunejfkommunalforbundjgorajlchiryukyuragifuefukihab" + + "orokunohealthcareersarufutsunomiyawakasaikaitakoelnissedalucania" + + "jlljmpasadenamsosnowiechitachinakagawatchandclockchristiansburgr" + + "ondarjnjelenia-gorajoyokaichibahcavuotnagaravennagareyamaizurubt" + + "sovskjervoyageometre-experts-comptableshitaramajpmorganichitoset" + + "ogitsuldaluccapetownisshinguernseyjpnchloejprshizukuishimogosenj" + + "uniperjurkristiansandcatshoujis-bykristiansundkrodsheradkrokstad" + + "elvaldaostarostwodzislawinnershowakryminamiuonumasudakumatorinok" + + "umejimassa-carrara-massacarraramassabusinessebykleclerchocolatel" + + "emarkddielddanuorrightathomeftpaccessasayamakumenanyokkaichirurg" + + "iens-dentisteshowtimemerckomorotsukamisunagawakunisakis-certifie" + + "ducatorahimeshimakanegasakinkobayashikshacknetnedalkunitachiarai" + + "lwaykunitomigusukumamotoyamasoykunneppupassagenshriramsterdambul" + + "ancekunstsammlungkunstunddesignkuokgroupassenger-associationkure" + + "pair-traffic-controlleykurgankurobelgorodeokurogimilitarykuroiso" + + "ftwarendalenugkuromatsunais-foundationkurotakikawasakis-gonekurs" + + "komvuxn--3ds443gkushirogawakustanais-into-animeiwamarylhurstjohn" + + "kusupersportrentino-sud-tirolkutchanelkutnokuzbassnillfjordkuzum" + + "akis-into-carshisognekvafjordkvalsundkvamlidlugolekagaminord-aur" + + "dalvdalipayufuchukotkafjordkvanangenkvinesdalkvinnheradkviteseid" + + "skogkvitsoykwpspjelkavikongsbergkyotobetsuppliesienarashinokyowa" + + "riasahikawamissilelmisugitokonamegatakayamatsumotofukemitakehara" + + "mitourismolanciamitoyoakemiuramiyazurewebsiteshikagamiishibukawa" + + "miyotamanomjondalenmlbarcelonagasukemergencyberlevagangaviikanon" + + "jiinetarumizusawaurskog-holandroverhalla-speziaeroportalabamagas" + + "akishimabaragusaarlandds3-ap-southeast-1kappleangaviikadenaamesj" + + "evuemielnoboribetsucks3-ap-northeast-1monmouthaibarakitagawamons" + + "termonticellolmontrealestatefarmequipmentrentino-sudtirolmonza-b" + + "rianzaporizhzhekinannestadmonza-e-della-brianzaporizhzhiamonzabr" + + "ianzapposlombardiamondsimbirskongsvingermonzaebrianzaramonzaedel" + + "labrianzamoparachutingmordoviajessheiminamiyamashirokawanabellev" + + "uelosangelesjaguarchitecturebungoonomichinomiyakemerovodkagoshim" + + "agnitkakamigaharaholtalenglandmoriyamatsunomoriyoshiokamogawamor" + + "moneymoroyamatsusakahoginozawaonsenmortgagemoscowiostrolekaniepc" + + "emoseushistorymosjoenmoskenesimple-urlmossirdalmosvikoninjamison" + + "moviemovistargardmtpccwitdkonskowolancashireisenmtranakayamatsus" + + "higemuenstermugithubusercontentrentino-sued-tirolmuikanagawamuko" + + "chikushinonsenergymulhouservebbslingmultichoicemunakatanemuncies" + + "zynmuosattemupaviancapitalonewhollandmurmanskonsulatrobelaudible" + + "besbyglandmurotorcraftrentino-suedtirolmusashimurayamatsuuramusa" + + "shinoharamuseetrentinoa-adigemuseumverenigingmutsuzawamutuelleva" + + "ngermyphotoshibahccavuotnagasakijobservercellierneueslupskonyvel" + + "oftrentino-s-tirollagriculturennebudapest-a-la-masionmytis-a-boo" + + "kkeeperminanophiladelphiaareadmyblogsitephilatelyphilipsyphoenix" + + "n--3e0b707ephotographysiopiagetmyipfizerpictetrentinoaadigepictu" + + "resnzpiemontepilotsokanumazurypinkopervikommunepioneerpippupiszp" + + "ittsburghofermobilypiwatepizzapkoryolasiteplanetariumincomcastre" + + "sistanceplantationplantsokndalplatforminnesotaketakatsukis-into-" + + "cartoonshisuifuettertdasnetzplaystationplazaplchofunatorientexpr" + + "essasebofageplombardyndns-at-workinggroupharmaciensmolenskooris-" + + "an-anarchistoricalsocietyplumbingotvbarclaycards3-us-west-2plust" + + "erpmnpodzonepohlpokerpokrovskosaigawapolitiendapolkowicepoltaval" + + "le-aostathellexuslivinghistorypomorzeszowithgoogleapisa-hockeynu" + + "trentinoalto-adigepordenonepornporsangerporsangugeporsgrunnanpoz" + + "nanpraxis-a-bruinsfansolarssonprdpreservationpresidioprimelbourn" + + "eprincipeprivneprochowiceproductionsologneproferraraprogressiven" + + "neslaskerrylogisticsolundbeckosakaerodromegallupinbananarepublic" + + "arrierprojectrentinoaltoadigepromombetsupportrentinos-tirolprope" + + "rtyprotectionprudentialpruszkowithyoutubentleyprzeworskogptzpvtr" + + "entinostirolpzqldqponqslgbtrentinosud-tirolqvchonanbuildersvpamp" + + "eredchefastlystorfjordstpetersburgstudiostudyndns-freemasonryoka" + + "mikawanehonbetsurutaharastuff-4-salestuttgartrentinosuedtirolsur" + + "nadalsurreysusakis-slickomitamamurasusonosuzakanzakiwiensuzukara" + + "sjohkamiokaminokawanishiaizubangesuzukis-uberleetrentino-aadiges" + + "valbardudinkakudamatsuesveiosvelvikosherbrookegawasvizzerasweden" + + "swidnicarbonia-iglesias-carboniaiglesiascarboniaswiebodzindianma" + + "rketingswiftcoverisignswinoujscienceandhistoryswisshikis-very-ba" + + "daddjamalborkdalsxn--3oq18vl8pn36atunesooturystykarasuyamazoetus" + + "canytushuissier-justicetuvalle-d-aostatoilvestnesor-odalvestre-s" + + "lidreamhostersor-varangervestre-totennishiawakuravestvagoyvevels" + + "tadvibo-valentiavibovalentiavideovillaskoyabearalvahkihokumakoge" + + "niwaizumiotsukumiyamazonawsabaerobaticketsaritsynvinnicargodoesn" + + "texistanbullensakervinnytsiavipsinaappharmacysnoasaitamatsukuris" + + "-lostre-toteneis-an-actresshishikuis-an-accountantshiratakahagis" + + "-a-techietis-a-therapistoiavirginiavirtualvirtuelvisakataketomis" + + "atokyotangovtrevisohughesolutionsomavistaprintuitroandinosaurepo" + + "rtrentottoris-very-evillageviterboknowsitallvivoldavladikavkazan" + + "vladimirvladivostokaizukaratevlogvolgogradvolkenkunderseaportrog" + + "stadvolkswagentsorfoldvologdanskoshunantokashikiyosumypetshizuok" + + "anravolyngdalvoronezhytomyrvossevangenvotevotingvotoursorreisaha" + + "yakawakamiichikaiseis-savedvrnworse-thangglidingwowiwatsukiyonow" + + "ritesthisblogspotromsakakinokiawroclawloclawekostromahachijorpel" + + "andwtchoseiroumuencheniyodogawawtferrarittogoldpointelligencewuo" + + "zuwwworldwzmiuwajimaxn--45q11choyodobashichikashukujitawaraxn--4" + + "gbriminingxn--4gq48lf9jeonnamerikawauexn--4it168dxn--4it797kotoh" + + "iradomainsureitrentino-stirolxn--4pvxsortlandxn--54b7fta0cchrist" + + "masakikugawatchesaskatchewanggouvicenzaxn--55qw42gxn--55qx5dxn--" + + "5js045dxn--5rtp49chromediaxn--5rtq34kotouraxn--5su34j936bgsgxn--" + + "5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a264ch" + + "ryslerxn--80adxhksoruminternationalfirearmsigdalxn--80ao21axn--8" + + "0asehdbarclaysakuraiitatebayashijonawatextileksvikasaokamisatoho" + + "bby-sitexasdaburyatiaarpaleoceanographicsakyotanabellunordreisa-" + + "geekashibatakasugaiiyamanobedzin-the-bandaioirasebastopologyeong" + + "giehtavuoatnagaivuotnagaokakyotambabydgoszczecinemailimanowaruda" + + "ustevollaziobiraetnagahamaroyekaterinburggfarmerseinewyorkshireg" + + "gio-emilia-romagnakanotoddenaspers3-ap-southeast-2xn--80aswgxn--" + + "80audnedalnxn--8ltr62kouhokutamakizunokunimilanoxn--8pvr4uxn--8y" + + "0a063axn--90a3academykolaivanovosibirskiervaapsteiermarkhangelsk" + + "inderoyericssonjukudoyamaceratabuseat-band-campaniamallamadridva" + + "gsoygardendoftheinternetcimdbarefootballangenoamishirasatobishim" + + "akeupowiathletajimabariakepnordkappgjovikashiharaustinnaturalhis" + + "torymuseumcenterhcloudcontrolappalacebinortonsbergjerdrumckinsey" + + "okotebizenakaniikawatanaguragrinetbankz-1xn--90aishobaraomoriguc" + + "hiharahkkeravjuedischesapeakebayerndxn--90azhakatanotteroyxn--9d" + + "bhblg6diethnologyxn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--" + + "aroport-byanagawaxn--asky-iraxn--aurskog-hland-jnbargainstitutel" + + "efonicagliaridagawalesundrangedalimitedrivelandrobaknoluoktainai" + + "kawachinaganoharamcoalaheadjudaicabbottatamotorsalangenaturbruks" + + "gymnaturhistorischesalondonetskashiwaraustraliaisondriodejaneiro" + + "chesterxn--avery-yuasakegawaxn--b-5gaxn--b4w605ferdxn--bck1b9a5d" + + "re4chtrainingrongausdalucernexn--bdddj-mrabdxn--bearalvhki-y4axn" + + "--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nach" + + "ikatsuuraxn--bievt-0qa2xn--bjarky-fyanaizuxn--bjddar-ptamboversa" + + "illesopotrentinosudtirolxn--blt-elaborxn--bmlo-graingerxn--bod-2" + + "naroyxn--brnny-wuaccident-investigationlineat-urlxn--brnnysund-m" + + "8accident-preventionxn--brum-voagatromsojavald-aostarnbergxn--bt" + + "sfjord-9zaxn--c1avgxn--c2br7gxn--c3s14misakis-into-gamessinashik" + + "itchenxn--cck2b3barreauctionatuurwetenschappenaumburgladeloittem" + + "asekashiwazakiyokawaraustrheimatunduhrennesoyokozehimejibigawagr" + + "oks-theaternidgcamerakershus-east-1xn--cg4bkis-very-goodhandsonx" + + "n--ciqpnxn--clchc0ea0b2g2a9gcdn77-securecreationxn--comunicaes-v" + + "6a2oxn--correios-e-telecomunicaes-ghc29axn--czr694barrel-of-know" + + "ledgeorgeorgiauthordalandroidiscountysvardolls3-external-2xn--cz" + + "rs0trusteexn--czru2dxn--czrw28barrell-of-knowledgemersongdalenvi" + + "knakanojohanamakinoharautomotivecodyn-o-saurlandes3-fips-us-gov-" + + "west-1xn--d1acj3bashkiriautoscanadagestangeologyomitanobninskarm" + + "oyonabaruconnectarnobrzegjerstadotsuruokamchatkameokameyamashina" + + "tsukigatakamatsukawakunedre-eikereviewskrakowebhopagespeedmobili" + + "zerobihirosakikamijimatta-varjjatarantomsk-uralsk12xn--d1alfarom" + + "eoxn--d1atrverranzanxn--d5qv7z876chungbukfhskhabarovskhakassiaxn" + + "--davvenjrga-y4axn--djrs72d6uyxn--djty4kounosunndalxn--dnna-graj" + + "ewolterskluwerxn--drbak-wuaxn--dyry-iraxn--eckvdtc9dxn--efvn9sou" + + "thcarolinazawaxn--efvy88hakodatevaksdalxn--ehqz56nxn--elqq16hako" + + "nexn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct429kouyamashikis" + + "-an-engineeringxn--fhbeiarnxn--finny-yuaxn--fiq228c5hsouthwestfa" + + "lenxn--fiq64basilicataniaveroykenvironmentalconservationaturalsc" + + "iencesnaturelles3-sa-east-1xn--fiqs8sowaxn--fiqz9spreadbettingxn" + + "--fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--fpcrj" + + "9c3dxn--frde-grandrapidspydebergxn--frna-woaraisaijosoyrovigorli" + + "cexn--frya-hraxn--fzc2c9e2chungnamdalseidfjordyndns-wikindlegnic" + + "ampobassociatesassaris-a-gurulminamibosogndalukowhalingrossetouc" + + "hijiwadeltajimibuildingroundhandlingroznyxn--fzys8d69uvgmailxn--" + + "g2xx48churchaseljeffersonrwhoswhokksundyndns-workshoppdaluroyxn-" + + "-gckr3f0ferreroticanonoichikawamisatodayxn--gecrj9chuvashiaxn--g" + + "gaviika-8ya47hakubankokonoexn--gildeskl-g0axn--givuotna-8yandext" + + "raspace-to-rentalstomakomaibaraxn--gjvik-wuaxn--gk3at1exn--gls-e" + + "lacaixaxn--gmq050is-very-nicexn--gmqw5axn--h-2fairwindsrlxn--h1a" + + "eghakuis-a-personaltrainerxn--h2brj9circlegallocuscountryestateo" + + "fdelawaredumbrellahppiacenzagannefrankfurtjomemorialutskharkival" + + "ledaostakkofueluxembourgrpanamatteledatabaseballooningruexn--hbm" + + "er-xqaxn--hcesuolo-7ya35basketballfinanzgoravocatanzaroweddingje" + + "sdalillesandefjordiscoveryggeelvinckarpaczeladz-2xn--hery-iraxn-" + + "-hgebostad-g3axn--hmmrfeasta-s4acoachampionshiphopenair-surveill" + + "ancebetsukubabia-goracleaningatlantachikawakayamagadancechirealt" + + "orlandxn--hnefoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn-" + + "-hxt814exn--hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn--imr513" + + "nxn--indery-fyaotsurgutsiracusaitokuyamaxn--io0a7is-very-sweetre" + + "ntino-alto-adigexn--j1aefetsundxn--j1amhakusandnessjoenxn--j6w19" + + "3gxn--jlq61u9w7batochigiftsaltdalimoliserniavoues3-us-gov-west-1" + + "xn--jlster-byaroslavlaanderenxn--jrpeland-54axn--jvr189misasagur" + + "is-leetrentino-a-adigexn--k7yn95exn--karmy-yuaxn--kbrq7oxn--kcrx" + + "77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn--kltx9a" + + "xn--klty5xn--3pxu8kosugexn--koluokta-7ya57haldenxn--kprw13dxn--k" + + "pry57dxn--kpu716fgunmarnardalxn--kput3is-with-thebandoomdnsalias" + + "colipicenord-odalxn--krager-gyasakaiminatoyakokamishihoronobeoka" + + "minoyamatsurisleofmandalxn--kranghke-b0axn--krdsherad-m8axn--kre" + + "hamn-dxaxn--krjohka-hwab49jetztrentino-altoadigexn--ksnes-uuaxn-" + + "-kvfjord-nxaxn--kvitsy-fyasugissmarterthanyouxn--kvnangen-k0axn-" + + "-l-1faitheguardianquanconagawakuyabukicks-assedicircuscultureggi" + + "o-calabriaxn--l1accentureklamborghiniizaxn--laheadju-7yasuokarat" + + "suginamikatagamihoboleslawiecitadeliverybnikahokutogliattiresatx" + + "n--0trq7p7nnxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagavi" + + "ika-52batsfjordunloppacificartierxn--lesund-huaxn--lgbbat1ad8jev" + + "nakerxn--lgrd-poaciticasinorfolkebiblefrakkestadyndns-weberlinco" + + "lnishitosashimizunaminamiashigaraxn--lhppi-xqaxn--linds-prameric" + + "anartrysilkoshimizumakiyosemitexn--lns-qlanxessrtrentinosued-tir" + + "olxn--loabt-0qaxn--lrdal-sraxn--lrenskog-54axn--lt-liacivilaviat" + + "ionxn--lten-granexn--lury-iraxn--mely-iraxn--merker-kuaxn--mgb2d" + + "desrvdonskoseis-an-artisteinkjerusalembetsukuis-an-actorxn--mgb9" + + "awbfidelityumenxn--mgba3a3ejtulansomnaritakurashikis-not-certifi" + + "edunetflixilxn--mgba3a4f16axn--mgba3a4franamizuholdingsmileirvik" + + "ouzushimashikokuchuoxn--mgba7c0bbn0axn--mgbaakc7dvfidonnakamurat" + + "ajirikuzentakatakahamaniwakuratenrissagaeroclubmedecincinnationw" + + "idealerimo-i-ranadexchangeiseiyoichiropracticbcn-north-1xn--mgba" + + "am7a8halsaintlouis-a-anarchistoirehabmerxn--mgbab2bdxn--mgbai9a5" + + "eva00bauhausposts-and-telecommunicationsnasadodgemrxn--mgbai9azg" + + "qp6jewelryxn--mgbayh7gpaduaxn--mgbb9fbpobanazawaxn--mgbbh1a71exn" + + "--mgbc0a9azcgxn--mgbca7dzdownloadxn--mgberp4a5d4a87gxn--mgberp4a" + + "5d4arxn--mgbpl2fhvalerxn--mgbqly7c0a67fbcivilisationxn--mgbqly7c" + + "vafredrikstadtvstoragexn--mgbt3dhdxn--mgbtf8flekkefjordxn--mgbtx" + + "2bbcartoonartdecoffeedbackasukabeeldengeluidunsagamiharaxamuseme" + + "ntargets-itargibestadigitalavagiske-burgjemnes3-eu-central-1xn--" + + "mgbx4cd0abbvieeexn--mix082fieldxn--mix891figuerestaurantoyonezaw" + + "axn--mjndalen-64axn--mk0axindustriesteamfamberkeleyxn--mk1bu44ci" + + "vilizationxn--mkru45iwchernovtsykkylvenetogakushimotoganewjersey" + + "xn--mlatvuopmi-s4axn--mli-tlapyatigorskozagawaxn--mlselv-iuaxn--" + + "moreke-juaxn--mori-qsakuhokkaidontexisteingeekozakis-an-entertai" + + "nerxn--mosjen-eyatominamiawajikixn--mot-tlaquilancasterxn--mre-o" + + "g-romsdal-qqbbtatarstanaustdalindasiaxn--msy-ula0hammarfeastafri" + + "camagichernihivgucciprianiigataitoeiheijis-a-greenissandoyxn--mt" + + "ta-vrjjat-k7afamilycompanycivilwarmanagementjxn--11b4c3dyroyrvik" + + "inguideventsaudaxn--muost-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngbe" + + "9e0axn--nit225kpnxn--nmesjevuemie-tcbajddarchaeologyxn--nnx388ax" + + "n--nodessakuragawaxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--" + + "ntsq17gxn--nttery-byaeservegame-serverdalxn--nvuotna-hwaxn--nyqy" + + "26axn--o1achattanooganorilskydivingxn--o3cw4hamurakamigoriginshi" + + "nshinotsurgeonshalloffamelhustkamitondabayashiogamagoriziaxn--od" + + "0algxn--od0aq3bbvacationswatch-and-clockerxn--ogbpf8flesbergxn--" + + "oppegrd-ixaxn--ostery-fyatsukareliancexn--osyro-wuaxn--p1acfdxn-" + + "-p1aixn--pbt977claimsauheradxn--pgbs0dhlxn--porsgu-sta26filateli" + + "axn--pssu33lxn--pssy2uxn--q9jyb4clickharkovallee-aosteroyxn--qck" + + "a1pmcdonaldstordalxn--qqqt11misconfusedxn--qxamurskjakdnepropetr" + + "ovskiptveterinairealtychyattorneyagawakkanaibetsubamericanfamily" + + "ngenebakkeshibechambagricaaarborteaches-yogasawaracingxn--rady-i" + + "raxn--rdal-poaxn--rde-ularvikppspiegelxn--rdy-0nabarixn--rennesy" + + "-v1axn--rhkkervju-01aflakstadaokagakibichuoxn--rholt-mragowoodsi" + + "dexn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5narusawaxn--" + + "risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byatsushiroxn--rn" + + "y31hangoutsystemscloudappartis-a-photographerokuappartnershinshi" + + "roxn--rovu88beppubolognagatorockartuzyoriikasumigaurawa-mazowsze" + + "xposedogawarabikomaezakirunosegawaxn--rros-granvindafjordxn--rsk" + + "og-uuaxn--rst-0narutokorozawaxn--rsta-francaiseharaxn--ryken-vua" + + "xn--ryrvik-byawaraxn--s-1fareastcoastaldefencexn--s9brj9clinicol" + + "dwarmiamiastaplesavannahgaxn--sandnessjen-ogbizhevskrasnodarxn--" + + "sandy-yuaxn--seral-lraxn--ses554gxn--sgne-gratangenxn--skierv-ut" + + "azaskvolloabathsbcliniquenoharaxn--skjervy-v1axn--skjk-soaxn--sk" + + "nit-yqaxn--sknland-fxaxn--slat-5narviikanazawaxn--slt-elabourxn-" + + "-smla-hraxn--smna-gratis-a-bulls-fanxn--snase-nraxn--sndre-land-" + + "0cbremangerxn--snes-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fron-" + + "q1axn--sr-odal-q1axn--sr-varanger-ggbernrtateshinanomachintaijin" + + "finitinfoggiaxn--srfold-byawatahamaxn--srreisa-q1axn--srum-grazx" + + "n--stfold-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbeskidynaliasco" + + "li-picenord-frontierxn--stre-toten-zcbstorenburgxn--t60b56axn--t" + + "ckweatherchannelxn--tjme-hraxn--tn0agrigentomologyeongbukrasnoya" + + "rskomonoxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trgstad-r1axn" + + "--trna-woaxn--troms-zuaxn--tysvr-vraxn--uc0atversicherungxn--uc0" + + "ay4axn--uist22hannanmokuizumodernxn--uisz3gxn--unjrga-rtaobaokin" + + "awashirosatobamagazinemurorangemologicallyxn--unup4yxn--uuwu58ax" + + "n--vads-jraxn--vard-jraxn--vegrshei-c0axn--vermgensberater-ctbes" + + "tbuyshousesalvadordalibabaikaliszczytnordlandupontarioceanograph" + + "iquepostfoldnavyatkaluganskasuyakutiaxn--vermgensberatung-pwbeta" + + "inaboxfordeatnuorogerschlesischesalzburglassassinationalheritage" + + "matsubarakawagoepsonyoursidegreevje-og-hornnesamegawaxn--vestvgy" + + "-ixa6oxn--vg-yiabcgxn--vgan-qoaxn--vgsy-qoa0jewishartgalleryxn--" + + "vgu402clintonoshoesaves-the-whalessandria-trani-barletta-andriat" + + "ranibarlettaandriaxn--vhquvestfoldxn--vler-qoaxn--vre-eiker-k8ax" + + "n--vrggt-xqadxn--vry-yla5gxn--vuq861bhartiffanynysafetydalindesn" + + "esamnangerxn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1clo" + + "thinguitarsavonaplesaxoxn--wgbl6axn--xhq521bielawallonieruchomos" + + "cienceandindustrynaval-d-aosta-valleyukuhashimojinuyamanouchikuh" + + "okuryugasakitashiobaraxn--xkc2al3hye2axn--xkc2dl3a5ee0hannovargg" + + "atraniandriabarlettatraniandriaxn--y9a3aquariumishimatsumaebashi" + + "modatexn--yer-znarvikredstonexn--yfro4i67oxn--ygarden-p1axn--ygb" + + "i2ammxn--42c2d9axn--ystre-slidre-ujbiellaakesvuemieleccexn--zbx0" + + "25dxn--zf0ao64axn--zf0avxn--45brj9choshibuyachiyodaxn--zfr164bie" + + "szczadygeyachimataipeigersundurbanamexeterxperiaxz" // nodes is the list of nodes. Each node is represented as a uint32, which // encodes the node's children, wildcard bit and node type (as an index into @@ -452,7619 +464,7823 @@ const text = "biomutashinainfoggiabirdartdecodynaliascoli-picenord-frontierbir" // [15 bits] text index // [ 6 bits] text length var nodes = [...]uint32{ - 0x00301443, // n0x0000 c0x0000 (---------------) + I aaa - 0x002293c4, // n0x0001 c0x0000 (---------------) + I aarp - 0x0036eb43, // n0x0002 c0x0000 (---------------) + I abb - 0x0036eb46, // n0x0003 c0x0000 (---------------) + I abbott - 0x0030cb04, // n0x0004 c0x0000 (---------------) + I able - 0x00355b87, // n0x0005 c0x0000 (---------------) + I abogado - 0x01a01e82, // n0x0006 c0x0006 (n0x0539-n0x053f) + I ac - 0x002f2787, // n0x0007 c0x0000 (---------------) + I academy - 0x0033dcc9, // n0x0008 c0x0000 (---------------) + I accenture - 0x002d7e4a, // n0x0009 c0x0000 (---------------) + I accountant - 0x002d7e4b, // n0x000a c0x0000 (---------------) + I accountants - 0x00221483, // n0x000b c0x0000 (---------------) + I aco - 0x0027d3c6, // n0x000c c0x0000 (---------------) + I active - 0x00226f45, // n0x000d c0x0000 (---------------) + I actor - 0x01e10a02, // n0x000e c0x0007 (n0x053f-n0x0540) + I ad - 0x00262ac3, // n0x000f c0x0000 (---------------) + I ads - 0x0036b745, // n0x0010 c0x0000 (---------------) + I adult - 0x02204342, // n0x0011 c0x0008 (n0x0540-n0x0548) + I ae - 0x003285c3, // n0x0012 c0x0000 (---------------) + I aeg - 0x026751c4, // n0x0013 c0x0009 (n0x0548-n0x05a1) + I aero - 0x0036de85, // n0x0014 c0x0000 (---------------) + I aetna - 0x02a0c702, // n0x0015 c0x000a (n0x05a1-n0x05a6) + I af - 0x0023a2c3, // n0x0016 c0x0000 (---------------) + I afl - 0x00367c06, // n0x0017 c0x0000 (---------------) + I africa - 0x00367c0b, // n0x0018 c0x0000 (---------------) + I africamagic - 0x02e015c2, // n0x0019 c0x000b (n0x05a6-n0x05ab) + I ag - 0x002d6e47, // n0x001a c0x0000 (---------------) + I agakhan - 0x00229d46, // n0x001b c0x0000 (---------------) + I agency - 0x032002c2, // n0x001c c0x000c (n0x05ab-n0x05af) + I ai - 0x0024ef43, // n0x001d c0x0000 (---------------) + I aig - 0x002e75c8, // n0x001e c0x0000 (---------------) + I airforce - 0x00273406, // n0x001f c0x0000 (---------------) + I airtel - 0x0036acc4, // n0x0020 c0x0000 (---------------) + I akdn - 0x03600882, // n0x0021 c0x000d (n0x05af-n0x05b6) + I al - 0x00342747, // n0x0022 c0x0000 (---------------) + I alibaba - 0x002ab4c6, // n0x0023 c0x0000 (---------------) + I alipay - 0x002a6589, // n0x0024 c0x0000 (---------------) + I allfinanz - 0x0029c184, // n0x0025 c0x0000 (---------------) + I ally - 0x00215bc6, // n0x0026 c0x0000 (---------------) + I alsace - 0x03a04942, // n0x0027 c0x000e (n0x05b6-n0x05b7) + I am - 0x0027d885, // n0x0028 c0x0000 (---------------) + I amica - 0x002b6cc9, // n0x0029 c0x0000 (---------------) + I amsterdam - 0x03e01242, // n0x002a c0x000f (n0x05b7-n0x05bb) + I an - 0x0022f449, // n0x002b c0x0000 (---------------) + I analytics - 0x002f8647, // n0x002c c0x0000 (---------------) + I android - 0x00295a46, // n0x002d c0x0000 (---------------) + I anquan - 0x0420fd82, // n0x002e c0x0010 (n0x05bb-n0x05c1) + I ao - 0x0028df8a, // n0x002f c0x0000 (---------------) + I apartments - 0x00212a03, // n0x0030 c0x0000 (---------------) + I app - 0x002f0145, // n0x0031 c0x0000 (---------------) + I apple - 0x00273fc2, // n0x0032 c0x0000 (---------------) + I aq - 0x00273fc9, // n0x0033 c0x0000 (---------------) + I aquarelle - 0x04600602, // n0x0034 c0x0011 (n0x05c1-n0x05ca) + I ar - 0x00387dc6, // n0x0035 c0x0000 (---------------) + I aramco - 0x0025dd45, // n0x0036 c0x0000 (---------------) + I archi - 0x00333fc4, // n0x0037 c0x0000 (---------------) + I army - 0x04e29404, // n0x0038 c0x0013 (n0x05cb-n0x05d1) + I arpa - 0x00359e04, // n0x0039 c0x0000 (---------------) + I arte - 0x05200182, // n0x003a c0x0014 (n0x05d1-n0x05d2) + I as - 0x00209144, // n0x003b c0x0000 (---------------) + I asia - 0x002729ca, // n0x003c c0x0000 (---------------) + I associates - 0x05601642, // n0x003d c0x0015 (n0x05d2-n0x05d9) + I at - 0x00389588, // n0x003e c0x0000 (---------------) + I attorney - 0x05e05ac2, // n0x003f c0x0017 (n0x05da-n0x05ec) + I au - 0x002f4487, // n0x0040 c0x0000 (---------------) + I auction - 0x00222244, // n0x0041 c0x0000 (---------------) + I audi - 0x00251707, // n0x0042 c0x0000 (---------------) + I audible - 0x00222245, // n0x0043 c0x0000 (---------------) + I audio - 0x002f8406, // n0x0044 c0x0000 (---------------) + I author - 0x002eaac4, // n0x0045 c0x0000 (---------------) + I auto - 0x00309645, // n0x0046 c0x0000 (---------------) + I autos - 0x002c0747, // n0x0047 c0x0000 (---------------) + I avianca - 0x06e02502, // n0x0048 c0x001b (n0x05fa-n0x05fb) + I aw - 0x00272583, // n0x0049 c0x0000 (---------------) + I aws - 0x00215282, // n0x004a c0x0000 (---------------) + I ax - 0x0032b343, // n0x004b c0x0000 (---------------) + I axa - 0x07208cc2, // n0x004c c0x001c (n0x05fb-n0x0607) + I az - 0x0026c905, // n0x004d c0x0000 (---------------) + I azure - 0x07605a82, // n0x004e c0x001d (n0x0607-n0x0612) + I ba - 0x00343204, // n0x004f c0x0000 (---------------) + I baby - 0x0026a085, // n0x0050 c0x0000 (---------------) + I baidu - 0x00255704, // n0x0051 c0x0000 (---------------) + I band - 0x00235dc4, // n0x0052 c0x0000 (---------------) + I bank - 0x0020c103, // n0x0053 c0x0000 (---------------) + I bar - 0x0036bf49, // n0x0054 c0x0000 (---------------) + I barcelona - 0x0031934b, // n0x0055 c0x0000 (---------------) + I barclaycard - 0x002afe08, // n0x0056 c0x0000 (---------------) + I barclays - 0x0030b788, // n0x0057 c0x0000 (---------------) + I barefoot - 0x002ed0c8, // n0x0058 c0x0000 (---------------) + I bargains - 0x003297c7, // n0x0059 c0x0000 (---------------) + I bauhaus - 0x002eef46, // n0x005a c0x0000 (---------------) + I bayern - 0x07a791c2, // n0x005b c0x001e (n0x0612-n0x061c) + I bb - 0x00331f83, // n0x005c c0x0000 (---------------) + I bbc - 0x00340184, // n0x005d c0x0000 (---------------) + I bbva - 0x0028bfc3, // n0x005e c0x0000 (---------------) + I bcg - 0x002dbf83, // n0x005f c0x0000 (---------------) + I bcn - 0x016fbc02, // n0x0060 c0x0005 (---------------)* o I bd - 0x07e04702, // n0x0061 c0x001f (n0x061c-n0x061e) + I be - 0x00243505, // n0x0062 c0x0000 (---------------) + I beats - 0x00391984, // n0x0063 c0x0000 (---------------) + I beer - 0x00352147, // n0x0064 c0x0000 (---------------) + I bentley - 0x00251d46, // n0x0065 c0x0000 (---------------) + I berlin - 0x0030a2c4, // n0x0066 c0x0000 (---------------) + I best - 0x00227703, // n0x0067 c0x0000 (---------------) + I bet - 0x08349f02, // n0x0068 c0x0020 (n0x061e-n0x061f) + I bf - 0x08755e02, // n0x0069 c0x0021 (n0x061f-n0x0644) + I bg - 0x08af6202, // n0x006a c0x0022 (n0x0644-n0x0649) + I bh - 0x00375006, // n0x006b c0x0000 (---------------) + I bharti - 0x08e00002, // n0x006c c0x0023 (n0x0649-n0x064e) + I bi - 0x003628c5, // n0x006d c0x0000 (---------------) + I bible - 0x002fd143, // n0x006e c0x0000 (---------------) + I bid - 0x00390e04, // n0x006f c0x0000 (---------------) + I bike - 0x002c7a44, // n0x0070 c0x0000 (---------------) + I bing - 0x002c7a45, // n0x0071 c0x0000 (---------------) + I bingo - 0x00200003, // n0x0072 c0x0000 (---------------) + I bio - 0x09310603, // n0x0073 c0x0024 (n0x064e-n0x0655) + I biz - 0x09602642, // n0x0074 c0x0025 (n0x0655-n0x0659) + I bj - 0x00277b85, // n0x0075 c0x0000 (---------------) + I black - 0x00277b8b, // n0x0076 c0x0000 (---------------) + I blackfriday - 0x002d0084, // n0x0077 c0x0000 (---------------) + I blog - 0x00205849, // n0x0078 c0x0000 (---------------) + I bloomberg - 0x00207184, // n0x0079 c0x0000 (---------------) + I blue - 0x09a09242, // n0x007a c0x0026 (n0x0659-n0x065e) + I bm - 0x00209243, // n0x007b c0x0000 (---------------) + I bms - 0x0020a103, // n0x007c c0x0000 (---------------) + I bmw - 0x0160a282, // n0x007d c0x0005 (---------------)* o I bn - 0x00243903, // n0x007e c0x0000 (---------------) + I bnl - 0x0020a28a, // n0x007f c0x0000 (---------------) + I bnpparibas - 0x09e0a702, // n0x0080 c0x0027 (n0x065e-n0x0667) + I bo - 0x0034eb85, // n0x0081 c0x0000 (---------------) + I boats - 0x0020aac3, // n0x0082 c0x0000 (---------------) + I bom - 0x0020b104, // n0x0083 c0x0000 (---------------) + I bond - 0x0020c2c3, // n0x0084 c0x0000 (---------------) + I boo - 0x0020c2c5, // n0x0085 c0x0000 (---------------) + I boots - 0x0020cb05, // n0x0086 c0x0000 (---------------) + I bosch - 0x0020d286, // n0x0087 c0x0000 (---------------) + I bostik - 0x0020e2c3, // n0x0088 c0x0000 (---------------) + I bot - 0x00211048, // n0x0089 c0x0000 (---------------) + I boutique - 0x0a212e82, // n0x008a c0x0028 (n0x0667-n0x06ad) + I br - 0x00212e88, // n0x008b c0x0000 (---------------) + I bradesco - 0x0021a14b, // n0x008c c0x0000 (---------------) + I bridgestone - 0x002172c8, // n0x008d c0x0000 (---------------) + I broadway - 0x00218046, // n0x008e c0x0000 (---------------) + I broker - 0x00219347, // n0x008f c0x0000 (---------------) + I brother - 0x0021be88, // n0x0090 c0x0000 (---------------) + I brussels - 0x0aa35102, // n0x0091 c0x002a (n0x06ae-n0x06b3) + I bs - 0x0ae16fc2, // n0x0092 c0x002b (n0x06b3-n0x06b8) + I bt - 0x0033c648, // n0x0093 c0x0000 (---------------) + I budapest - 0x002c67c5, // n0x0094 c0x0000 (---------------) + I build - 0x00324908, // n0x0095 c0x0000 (---------------) + I builders - 0x0025f008, // n0x0096 c0x0000 (---------------) + I business - 0x0021d903, // n0x0097 c0x0000 (---------------) + I buy - 0x0021e484, // n0x0098 c0x0000 (---------------) + I buzz - 0x003401c2, // n0x0099 c0x0000 (---------------) + I bv - 0x0b21f782, // n0x009a c0x002c (n0x06b8-n0x06ba) + I bw - 0x0b616b42, // n0x009b c0x002d (n0x06ba-n0x06be) + I by - 0x0be203c2, // n0x009c c0x002f (n0x06bf-n0x06c5) + I bz - 0x002203c3, // n0x009d c0x0000 (---------------) + I bzh - 0x0c2055c2, // n0x009e c0x0030 (n0x06c5-n0x06d6) + I ca - 0x0036eb03, // n0x009f c0x0000 (---------------) + I cab - 0x0026ab84, // n0x00a0 c0x0000 (---------------) + I cafe - 0x0020e443, // n0x00a1 c0x0000 (---------------) + I cal - 0x002a6544, // n0x00a2 c0x0000 (---------------) + I call - 0x0022b406, // n0x00a3 c0x0000 (---------------) + I camera - 0x0022c604, // n0x00a4 c0x0000 (---------------) + I camp - 0x0029668e, // n0x00a5 c0x0000 (---------------) + I cancerresearch - 0x00312a05, // n0x00a6 c0x0000 (---------------) + I canon - 0x0021aac8, // n0x00a7 c0x0000 (---------------) + I capetown - 0x002c0887, // n0x00a8 c0x0000 (---------------) + I capital - 0x00205f83, // n0x00a9 c0x0000 (---------------) + I car - 0x002291c7, // n0x00aa c0x0000 (---------------) + I caravan - 0x00319505, // n0x00ab c0x0000 (---------------) + I cards - 0x00205f84, // n0x00ac c0x0000 (---------------) + I care - 0x00205f86, // n0x00ad c0x0000 (---------------) + I career - 0x00205f87, // n0x00ae c0x0000 (---------------) + I careers - 0x002b9384, // n0x00af c0x0000 (---------------) + I cars - 0x00332007, // n0x00b0 c0x0000 (---------------) + I cartier - 0x00383904, // n0x00b1 c0x0000 (---------------) + I casa - 0x00261b04, // n0x00b2 c0x0000 (---------------) + I cash - 0x002112c6, // n0x00b3 c0x0000 (---------------) + I casino - 0x0020d0c3, // n0x00b4 c0x0000 (---------------) + I cat - 0x003246c8, // n0x00b5 c0x0000 (---------------) + I catering - 0x00235d83, // n0x00b6 c0x0000 (---------------) + I cba - 0x002438c3, // n0x00b7 c0x0000 (---------------) + I cbn - 0x0037dc04, // n0x00b8 c0x0000 (---------------) + I cbre - 0x0c61aa82, // n0x00b9 c0x0031 (n0x06d6-n0x06da) + I cc - 0x0ca2a082, // n0x00ba c0x0032 (n0x06da-n0x06db) + I cd - 0x00215cc3, // n0x00bb c0x0000 (---------------) + I ceb - 0x00233a06, // n0x00bc c0x0000 (---------------) + I center - 0x002e7743, // n0x00bd c0x0000 (---------------) + I ceo - 0x0021d7c4, // n0x00be c0x0000 (---------------) + I cern - 0x0cf104c2, // n0x00bf c0x0033 (n0x06db-n0x06dc) + I cf - 0x003104c3, // n0x00c0 c0x0000 (---------------) + I cfa - 0x00366243, // n0x00c1 c0x0000 (---------------) + I cfd - 0x0020ea02, // n0x00c2 c0x0000 (---------------) + I cg - 0x0d204a02, // n0x00c3 c0x0034 (n0x06dc-n0x06dd) + I ch - 0x002a9f06, // n0x00c4 c0x0000 (---------------) + I chanel - 0x00227d87, // n0x00c5 c0x0000 (---------------) + I channel - 0x002facc5, // n0x00c6 c0x0000 (---------------) + I chase - 0x0023a704, // n0x00c7 c0x0000 (---------------) + I chat - 0x0028dec5, // n0x00c8 c0x0000 (---------------) + I cheap - 0x00353cc7, // n0x00c9 c0x0000 (---------------) + I chintai - 0x00297d05, // n0x00ca c0x0000 (---------------) + I chloe - 0x002e5109, // n0x00cb c0x0000 (---------------) + I christmas - 0x002e6f86, // n0x00cc c0x0000 (---------------) + I chrome - 0x002fabc6, // n0x00cd c0x0000 (---------------) + I church - 0x0d6155c2, // n0x00ce c0x0035 (n0x06dd-n0x06ec) + I ci - 0x0025f788, // n0x00cf c0x0000 (---------------) + I cipriani - 0x00322106, // n0x00d0 c0x0000 (---------------) + I circle - 0x00237905, // n0x00d1 c0x0000 (---------------) + I cisco - 0x003245c5, // n0x00d2 c0x0000 (---------------) + I citic - 0x002735c4, // n0x00d3 c0x0000 (---------------) + I city - 0x002735c8, // n0x00d4 c0x0000 (---------------) + I cityeats - 0x0da01782, // n0x00d5 c0x0036 (n0x06ec-n0x06ed)* o I ck - 0x0de0af42, // n0x00d6 c0x0037 (n0x06ed-n0x06f2) + I cl - 0x00357546, // n0x00d7 c0x0000 (---------------) + I claims - 0x0032d748, // n0x00d8 c0x0000 (---------------) + I cleaning - 0x00367205, // n0x00d9 c0x0000 (---------------) + I click - 0x00368f86, // n0x00da c0x0000 (---------------) + I clinic - 0x003784c8, // n0x00db c0x0000 (---------------) + I clothing - 0x00332205, // n0x00dc c0x0000 (---------------) + I cloud - 0x002752c4, // n0x00dd c0x0000 (---------------) + I club - 0x002752c7, // n0x00de c0x0000 (---------------) + I clubmed - 0x0e249082, // n0x00df c0x0038 (n0x06f2-n0x06f6) + I cm - 0x0e6211c2, // n0x00e0 c0x0039 (n0x06f6-n0x0723) + I cn - 0x0fe00742, // n0x00e1 c0x003f (n0x0728-n0x0735) + I co - 0x0032ca05, // n0x00e2 c0x0000 (---------------) + I coach - 0x0028ca05, // n0x00e3 c0x0000 (---------------) + I codes - 0x003690c6, // n0x00e4 c0x0000 (---------------) + I coffee - 0x0021e787, // n0x00e5 c0x0000 (---------------) + I college - 0x002214c7, // n0x00e6 c0x0000 (---------------) + I cologne - 0x10622ac3, // n0x00e7 c0x0041 (n0x0736-n0x07ff) + I com - 0x002d4148, // n0x00e8 c0x0000 (---------------) + I commbank - 0x00222ac9, // n0x00e9 c0x0000 (---------------) + I community - 0x002232c7, // n0x00ea c0x0000 (---------------) + I company - 0x002236c8, // n0x00eb c0x0000 (---------------) + I computer - 0x00223ec6, // n0x00ec c0x0000 (---------------) + I comsec - 0x00224306, // n0x00ed c0x0000 (---------------) + I condos - 0x00224c0c, // n0x00ee c0x0000 (---------------) + I construction - 0x00225a8a, // n0x00ef c0x0000 (---------------) + I consulting - 0x00225f47, // n0x00f0 c0x0000 (---------------) + I contact - 0x00226e0b, // n0x00f1 c0x0000 (---------------) + I contractors - 0x00227bc7, // n0x00f2 c0x0000 (---------------) + I cooking - 0x00227bce, // n0x00f3 c0x0000 (---------------) + I cookingchannel - 0x00228384, // n0x00f4 c0x0000 (---------------) + I cool - 0x00228d44, // n0x00f5 c0x0000 (---------------) + I coop - 0x0022b2c7, // n0x00f6 c0x0000 (---------------) + I corsica - 0x00362c07, // n0x00f7 c0x0000 (---------------) + I country - 0x0022d906, // n0x00f8 c0x0000 (---------------) + I coupon - 0x0022d907, // n0x00f9 c0x0000 (---------------) + I coupons - 0x0022dc87, // n0x00fa c0x0000 (---------------) + I courses - 0x11a0c502, // n0x00fb c0x0046 (n0x081d-n0x0824) + I cr - 0x00230646, // n0x00fc c0x0000 (---------------) + I credit - 0x0023064a, // n0x00fd c0x0000 (---------------) + I creditcard - 0x002308cb, // n0x00fe c0x0000 (---------------) + I creditunion - 0x002319c7, // n0x00ff c0x0000 (---------------) + I cricket - 0x00232885, // n0x0100 c0x0000 (---------------) + I crown - 0x002329c3, // n0x0101 c0x0000 (---------------) + I crs - 0x00233147, // n0x0102 c0x0000 (---------------) + I cruises - 0x00355d43, // n0x0103 c0x0000 (---------------) + I csc - 0x11e24002, // n0x0104 c0x0047 (n0x0824-n0x082a) + I cu - 0x002333ca, // n0x0105 c0x0000 (---------------) + I cuisinella - 0x1233f802, // n0x0106 c0x0048 (n0x082a-n0x082b) + I cv - 0x126b8942, // n0x0107 c0x0049 (n0x082b-n0x082f) + I cw - 0x12a35882, // n0x0108 c0x004a (n0x082f-n0x0831) + I cx - 0x12e29e42, // n0x0109 c0x004b (n0x0831-n0x083e) o I cy - 0x002dcac5, // n0x010a c0x0000 (---------------) + I cymru - 0x00235b84, // n0x010b c0x0000 (---------------) + I cyou - 0x13614442, // n0x010c c0x004d (n0x083f-n0x0840) + I cz - 0x0021bc05, // n0x010d c0x0000 (---------------) + I dabur - 0x00264503, // n0x010e c0x0000 (---------------) + I dad - 0x0032dec5, // n0x010f c0x0000 (---------------) + I dance - 0x00209004, // n0x0110 c0x0000 (---------------) + I date - 0x00390f06, // n0x0111 c0x0000 (---------------) + I dating - 0x00207286, // n0x0112 c0x0000 (---------------) + I datsun - 0x00277d83, // n0x0113 c0x0000 (---------------) + I day - 0x00251304, // n0x0114 c0x0000 (---------------) + I dclk - 0x002f9383, // n0x0115 c0x0000 (---------------) + I dds - 0x13a006c2, // n0x0116 c0x004e (n0x0840-n0x0848) + I de - 0x002196c4, // n0x0117 c0x0000 (---------------) + I deal - 0x00364186, // n0x0118 c0x0000 (---------------) + I dealer - 0x002196c5, // n0x0119 c0x0000 (---------------) + I deals - 0x002528c6, // n0x011a c0x0000 (---------------) + I degree - 0x00268948, // n0x011b c0x0000 (---------------) + I delivery - 0x002297c4, // n0x011c c0x0000 (---------------) + I dell - 0x0024f885, // n0x011d c0x0000 (---------------) + I delta - 0x0022e548, // n0x011e c0x0000 (---------------) + I democrat - 0x00298646, // n0x011f c0x0000 (---------------) + I dental - 0x00234ec7, // n0x0120 c0x0000 (---------------) + I dentist - 0x00232f44, // n0x0121 c0x0000 (---------------) + I desi - 0x00232f46, // n0x0122 c0x0000 (---------------) + I design - 0x0030a403, // n0x0123 c0x0000 (---------------) + I dev - 0x002b0cc8, // n0x0124 c0x0000 (---------------) + I diamonds - 0x002f6384, // n0x0125 c0x0000 (---------------) + I diet - 0x002ef0c7, // n0x0126 c0x0000 (---------------) + I digital - 0x00352bc6, // n0x0127 c0x0000 (---------------) + I direct - 0x00352bc9, // n0x0128 c0x0000 (---------------) + I directory - 0x002f87c8, // n0x0129 c0x0000 (---------------) + I discount - 0x0020c7c2, // n0x012a c0x0000 (---------------) + I dj - 0x13e71742, // n0x012b c0x004f (n0x0848-n0x0849) + I dk - 0x142618c2, // n0x012c c0x0050 (n0x0849-n0x084e) + I dm - 0x0036cd83, // n0x012d c0x0000 (---------------) + I dnp - 0x14604002, // n0x012e c0x0051 (n0x084e-n0x0858) + I do - 0x00355cc4, // n0x012f c0x0000 (---------------) + I docs - 0x00204003, // n0x0130 c0x0000 (---------------) + I dog - 0x0024f044, // n0x0131 c0x0000 (---------------) + I doha - 0x002e8307, // n0x0132 c0x0000 (---------------) + I domains - 0x0023ba06, // n0x0133 c0x0000 (---------------) + I doosan - 0x0031c343, // n0x0134 c0x0000 (---------------) + I dot - 0x002ede08, // n0x0135 c0x0000 (---------------) + I download - 0x003102c5, // n0x0136 c0x0000 (---------------) + I drive - 0x00394cc4, // n0x0137 c0x0000 (---------------) + I dstv - 0x002482c3, // n0x0138 c0x0000 (---------------) + I dtv - 0x0026a005, // n0x0139 c0x0000 (---------------) + I dubai - 0x0031b886, // n0x013a c0x0000 (---------------) + I dunlop - 0x0032a4c6, // n0x013b c0x0000 (---------------) + I dupont - 0x00383246, // n0x013c c0x0000 (---------------) + I durban - 0x00300bc4, // n0x013d c0x0000 (---------------) + I dvag - 0x14aa3602, // n0x013e c0x0052 (n0x0858-n0x0860) + I dz - 0x00330d85, // n0x013f c0x0000 (---------------) + I earth - 0x00242e03, // n0x0140 c0x0000 (---------------) + I eat - 0x14e00702, // n0x0141 c0x0053 (n0x0860-n0x086c) + I ec - 0x0038d785, // n0x0142 c0x0000 (---------------) + I edeka - 0x002d75c3, // n0x0143 c0x0000 (---------------) + I edu - 0x00375549, // n0x0144 c0x0000 (---------------) + I education - 0x15206042, // n0x0145 c0x0054 (n0x086c-n0x0876) + I ee - 0x15a0df82, // n0x0146 c0x0056 (n0x0877-n0x0880) + I eg - 0x003435c5, // n0x0147 c0x0000 (---------------) + I email - 0x00312206, // n0x0148 c0x0000 (---------------) + I emerck - 0x002ba7c6, // n0x0149 c0x0000 (---------------) + I energy - 0x002a8a88, // n0x014a c0x0000 (---------------) + I engineer - 0x002a8a8b, // n0x014b c0x0000 (---------------) + I engineering - 0x0037a7cb, // n0x014c c0x0000 (---------------) + I enterprises - 0x00364485, // n0x014d c0x0000 (---------------) + I epson - 0x0021f909, // n0x014e c0x0000 (---------------) + I equipment - 0x01600ec2, // n0x014f c0x0005 (---------------)* o I er - 0x00259904, // n0x0150 c0x0000 (---------------) + I erni - 0x162010c2, // n0x0151 c0x0058 (n0x0881-n0x0886) + I es - 0x00275b43, // n0x0152 c0x0000 (---------------) + I esq - 0x002b1846, // n0x0153 c0x0000 (---------------) + I estate - 0x16a0bbc2, // n0x0154 c0x005a (n0x0887-n0x088f) + I et - 0x0021d5c2, // n0x0155 c0x0000 (---------------) + I eu - 0x002ef88a, // n0x0156 c0x0000 (---------------) + I eurovision - 0x002b71c3, // n0x0157 c0x0000 (---------------) + I eus - 0x003423c6, // n0x0158 c0x0000 (---------------) + I events - 0x00381fc8, // n0x0159 c0x0000 (---------------) + I everbank - 0x002f3908, // n0x015a c0x0000 (---------------) + I exchange - 0x0030c7c6, // n0x015b c0x0000 (---------------) + I expert - 0x00203e87, // n0x015c c0x0000 (---------------) + I exposed - 0x0029ab47, // n0x015d c0x0000 (---------------) + I express - 0x0021008a, // n0x015e c0x0000 (---------------) + I extraspace - 0x00310504, // n0x015f c0x0000 (---------------) + I fage - 0x00328344, // n0x0160 c0x0000 (---------------) + I fail - 0x0033d609, // n0x0161 c0x0000 (---------------) + I fairwinds - 0x00377ec5, // n0x0162 c0x0000 (---------------) + I faith - 0x00311c06, // n0x0163 c0x0000 (---------------) + I family - 0x0020f1c3, // n0x0164 c0x0000 (---------------) + I fan - 0x002c5544, // n0x0165 c0x0000 (---------------) + I fans - 0x0021f804, // n0x0166 c0x0000 (---------------) + I farm - 0x0025d247, // n0x0167 c0x0000 (---------------) + I fashion - 0x00287d44, // n0x0168 c0x0000 (---------------) + I fast - 0x00369188, // n0x0169 c0x0000 (---------------) + I feedback - 0x003127c7, // n0x016a c0x0000 (---------------) + I ferrero - 0x16e099c2, // n0x016b c0x005b (n0x088f-n0x0892) + I fi - 0x00356104, // n0x016c c0x0000 (---------------) + I film - 0x00356745, // n0x016d c0x0000 (---------------) + I final - 0x00368607, // n0x016e c0x0000 (---------------) + I finance - 0x00371509, // n0x016f c0x0000 (---------------) + I financial - 0x00236744, // n0x0170 c0x0000 (---------------) + I fire - 0x00237d49, // n0x0171 c0x0000 (---------------) + I firestone - 0x00238548, // n0x0172 c0x0000 (---------------) + I firmdale - 0x00238904, // n0x0173 c0x0000 (---------------) + I fish - 0x00238907, // n0x0174 c0x0000 (---------------) + I fishing - 0x00238f03, // n0x0175 c0x0000 (---------------) + I fit - 0x00239087, // n0x0176 c0x0000 (---------------) + I fitness - 0x016241c2, // n0x0177 c0x0005 (---------------)* o I fj - 0x01697782, // n0x0178 c0x0005 (---------------)* o I fk - 0x0023a306, // n0x0179 c0x0000 (---------------) + I flickr - 0x0023b147, // n0x017a c0x0000 (---------------) + I flights - 0x0023c607, // n0x017b c0x0000 (---------------) + I florist - 0x0023ef07, // n0x017c c0x0000 (---------------) + I flowers - 0x0023f508, // n0x017d c0x0000 (---------------) + I flsmidth - 0x0023ffc3, // n0x017e c0x0000 (---------------) + I fly - 0x00358002, // n0x017f c0x0000 (---------------) + I fm - 0x00200382, // n0x0180 c0x0000 (---------------) + I fo - 0x00241943, // n0x0181 c0x0000 (---------------) + I foo - 0x0024194b, // n0x0182 c0x0000 (---------------) + I foodnetwork - 0x0030b888, // n0x0183 c0x0000 (---------------) + I football - 0x003640c4, // n0x0184 c0x0000 (---------------) + I ford - 0x00242f85, // n0x0185 c0x0000 (---------------) + I forex - 0x00244a47, // n0x0186 c0x0000 (---------------) + I forsale - 0x00246b45, // n0x0187 c0x0000 (---------------) + I forum - 0x00303b8a, // n0x0188 c0x0000 (---------------) + I foundation - 0x17200d42, // n0x0189 c0x005c (n0x0892-n0x08aa) + I fr - 0x0024c6c3, // n0x018a c0x0000 (---------------) + I frl - 0x0024c787, // n0x018b c0x0000 (---------------) + I frogans - 0x003906c9, // n0x018c c0x0000 (---------------) + I frontdoor - 0x00200d48, // n0x018d c0x0000 (---------------) + I frontier - 0x0026fc04, // n0x018e c0x0000 (---------------) + I fund - 0x00272f09, // n0x018f c0x0000 (---------------) + I furniture - 0x002764c6, // n0x0190 c0x0000 (---------------) + I futbol - 0x00277503, // n0x0191 c0x0000 (---------------) + I fyi - 0x00201602, // n0x0192 c0x0000 (---------------) + I ga - 0x00215b83, // n0x0193 c0x0000 (---------------) + I gal - 0x00226607, // n0x0194 c0x0000 (---------------) + I gallery - 0x00362a05, // n0x0195 c0x0000 (---------------) + I gallo - 0x0036bd46, // n0x0196 c0x0000 (---------------) + I gallup - 0x00212084, // n0x0197 c0x0000 (---------------) + I game - 0x002d2145, // n0x0198 c0x0000 (---------------) + I games - 0x0020e506, // n0x0199 c0x0000 (---------------) + I garden - 0x00205a42, // n0x019a c0x0000 (---------------) + I gb - 0x00378f84, // n0x019b c0x0000 (---------------) + I gbiz - 0x0021b342, // n0x019c c0x0000 (---------------) + I gd - 0x002d0143, // n0x019d c0x0000 (---------------) + I gdn - 0x176012c2, // n0x019e c0x005d (n0x08aa-n0x08b1) + I ge - 0x00237543, // n0x019f c0x0000 (---------------) + I gea - 0x0020db04, // n0x01a0 c0x0000 (---------------) + I gent - 0x0020db07, // n0x01a1 c0x0000 (---------------) + I genting - 0x00248e82, // n0x01a2 c0x0000 (---------------) + I gf - 0x17a00402, // n0x01a3 c0x005e (n0x08b1-n0x08b4) + I gg - 0x00268b44, // n0x01a4 c0x0000 (---------------) + I ggee - 0x17e36e42, // n0x01a5 c0x005f (n0x08b4-n0x08b9) + I gh - 0x18200442, // n0x01a6 c0x0060 (n0x08b9-n0x08bf) + I gi - 0x0030f704, // n0x01a7 c0x0000 (---------------) + I gift - 0x0030f705, // n0x01a8 c0x0000 (---------------) + I gifts - 0x002b9bc5, // n0x01a9 c0x0000 (---------------) + I gives - 0x00213586, // n0x01aa c0x0000 (---------------) + I giving - 0x18629902, // n0x01ab c0x0061 (n0x08bf-n0x08c4) + I gl - 0x0034da85, // n0x01ac c0x0000 (---------------) + I glass - 0x00274303, // n0x01ad c0x0000 (---------------) + I gle - 0x00389c06, // n0x01ae c0x0000 (---------------) + I global - 0x0038a445, // n0x01af c0x0000 (---------------) + I globo - 0x002047c2, // n0x01b0 c0x0000 (---------------) + I gm - 0x00323145, // n0x01b1 c0x0000 (---------------) + I gmail - 0x00208443, // n0x01b2 c0x0000 (---------------) + I gmo - 0x0020a643, // n0x01b3 c0x0000 (---------------) + I gmx - 0x18a050c2, // n0x01b4 c0x0062 (n0x08c4-n0x08ca) + I gn - 0x00238a84, // n0x01b5 c0x0000 (---------------) + I gold - 0x00238a89, // n0x01b6 c0x0000 (---------------) + I goldpoint - 0x0025d184, // n0x01b7 c0x0000 (---------------) + I golf - 0x0028c883, // n0x01b8 c0x0000 (---------------) + I goo - 0x00330c48, // n0x01b9 c0x0000 (---------------) + I goodyear - 0x0028c884, // n0x01ba c0x0000 (---------------) + I goog - 0x0028c886, // n0x01bb c0x0000 (---------------) + I google - 0x0028e783, // n0x01bc c0x0000 (---------------) + I gop - 0x0020bec3, // n0x01bd c0x0000 (---------------) + I got - 0x0020bec4, // n0x01be c0x0000 (---------------) + I gotv - 0x0021e283, // n0x01bf c0x0000 (---------------) + I gov - 0x18ece142, // n0x01c0 c0x0063 (n0x08ca-n0x08d0) + I gp - 0x0034f382, // n0x01c1 c0x0000 (---------------) + I gq - 0x1920dc82, // n0x01c2 c0x0064 (n0x08d0-n0x08d6) + I gr - 0x002ff248, // n0x01c3 c0x0000 (---------------) + I grainger - 0x00341188, // n0x01c4 c0x0000 (---------------) + I graphics - 0x0037d046, // n0x01c5 c0x0000 (---------------) + I gratis - 0x0025b105, // n0x01c6 c0x0000 (---------------) + I green - 0x0021dd45, // n0x01c7 c0x0000 (---------------) + I gripe - 0x002646c5, // n0x01c8 c0x0000 (---------------) + I group - 0x0026cd02, // n0x01c9 c0x0000 (---------------) + I gs - 0x19651202, // n0x01ca c0x0065 (n0x08d6-n0x08dd) + I gt - 0x01629702, // n0x01cb c0x0005 (---------------)* o I gu - 0x0025f6c5, // n0x01cc c0x0000 (---------------) + I gucci - 0x002ca244, // n0x01cd c0x0000 (---------------) + I guge - 0x00229705, // n0x01ce c0x0000 (---------------) + I guide - 0x0022d647, // n0x01cf c0x0000 (---------------) + I guitars - 0x0025bc44, // n0x01d0 c0x0000 (---------------) + I guru - 0x00204b82, // n0x01d1 c0x0000 (---------------) + I gw - 0x19a25a02, // n0x01d2 c0x0066 (n0x08dd-n0x08e0) + I gy - 0x0038a2c7, // n0x01d3 c0x0000 (---------------) + I hamburg - 0x00392287, // n0x01d4 c0x0000 (---------------) + I hangout - 0x00329884, // n0x01d5 c0x0000 (---------------) + I haus - 0x00235cc8, // n0x01d6 c0x0000 (---------------) + I hdfcbank - 0x00205e06, // n0x01d7 c0x0000 (---------------) + I health - 0x00205e0a, // n0x01d8 c0x0000 (---------------) + I healthcare - 0x00205204, // n0x01d9 c0x0000 (---------------) + I help - 0x00209408, // n0x01da c0x0000 (---------------) + I helsinki - 0x0023f784, // n0x01db c0x0000 (---------------) + I here - 0x00219446, // n0x01dc c0x0000 (---------------) + I hermes - 0x00280244, // n0x01dd c0x0000 (---------------) + I hgtv - 0x0032cd06, // n0x01de c0x0000 (---------------) + I hiphop - 0x0028d547, // n0x01df c0x0000 (---------------) + I hitachi - 0x0025f603, // n0x01e0 c0x0000 (---------------) + I hiv - 0x19e2ea02, // n0x01e1 c0x0067 (n0x08e0-n0x08f8) + I hk - 0x0025ab03, // n0x01e2 c0x0000 (---------------) + I hkt - 0x00206182, // n0x01e3 c0x0000 (---------------) + I hm - 0x1a217542, // n0x01e4 c0x0068 (n0x08f8-n0x08fe) + I hn - 0x002cd886, // n0x01e5 c0x0000 (---------------) + I hockey - 0x0034b148, // n0x01e6 c0x0000 (---------------) + I holdings - 0x00290807, // n0x01e7 c0x0000 (---------------) + I holiday - 0x002b8e89, // n0x01e8 c0x0000 (---------------) + I homedepot - 0x00291385, // n0x01e9 c0x0000 (---------------) + I homes - 0x00292005, // n0x01ea c0x0000 (---------------) + I honda - 0x00293c05, // n0x01eb c0x0000 (---------------) + I horse - 0x00202fc4, // n0x01ec c0x0000 (---------------) + I host - 0x002836c7, // n0x01ed c0x0000 (---------------) + I hosting - 0x00294947, // n0x01ee c0x0000 (---------------) + I hoteles - 0x00294fc7, // n0x01ef c0x0000 (---------------) + I hotmail - 0x0021da05, // n0x01f0 c0x0000 (---------------) + I house - 0x00297383, // n0x01f1 c0x0000 (---------------) + I how - 0x1a625842, // n0x01f2 c0x0069 (n0x08fe-n0x0903) + I hr - 0x002dbf04, // n0x01f3 c0x0000 (---------------) + I hsbc - 0x1aa36e82, // n0x01f4 c0x006a (n0x0903-n0x0914) + I ht - 0x00249003, // n0x01f5 c0x0000 (---------------) + I htc - 0x1ae17d42, // n0x01f6 c0x006b (n0x0914-n0x0934) + I hu - 0x0031b7c3, // n0x01f7 c0x0000 (---------------) + I ibm - 0x0028bf44, // n0x01f8 c0x0000 (---------------) + I icbc - 0x00200b43, // n0x01f9 c0x0000 (---------------) + I ice - 0x0033c383, // n0x01fa c0x0000 (---------------) + I icu - 0x1b206202, // n0x01fb c0x006c (n0x0934-n0x093f) + I id - 0x1ba00e82, // n0x01fc c0x006e (n0x0940-n0x0942) + I ie - 0x00370d03, // n0x01fd c0x0000 (---------------) + I ifm - 0x0031cac5, // n0x01fe c0x0000 (---------------) + I iinet - 0x1be036c2, // n0x01ff c0x006f (n0x0942-n0x0943)* o I il - 0x1c603582, // n0x0200 c0x0071 (n0x0944-n0x094b) + I im - 0x002f4284, // n0x0201 c0x0000 (---------------) + I imdb - 0x00203584, // n0x0202 c0x0000 (---------------) + I immo - 0x0020358a, // n0x0203 c0x0000 (---------------) + I immobilien - 0x1ce00242, // n0x0204 c0x0073 (n0x094d-n0x095a) + I in - 0x00353eca, // n0x0205 c0x0000 (---------------) + I industries - 0x00355408, // n0x0206 c0x0000 (---------------) + I infiniti - 0x1d200304, // n0x0207 c0x0074 (n0x095a-n0x0964) + I info - 0x0020dc03, // n0x0208 c0x0000 (---------------) + I ing - 0x00209503, // n0x0209 c0x0000 (---------------) + I ink - 0x002ed209, // n0x020a c0x0000 (---------------) + I institute - 0x002806c9, // n0x020b c0x0000 (---------------) + I insurance - 0x002e8406, // n0x020c c0x0000 (---------------) + I insure - 0x1d638c03, // n0x020d c0x0075 (n0x0964-n0x0965) + I int - 0x002dd88d, // n0x020e c0x0000 (---------------) + I international - 0x002087cb, // n0x020f c0x0000 (---------------) + I investments - 0x1da00042, // n0x0210 c0x0076 (n0x0965-n0x0968) + I io - 0x00331048, // n0x0211 c0x0000 (---------------) + I ipiranga - 0x1de11142, // n0x0212 c0x0077 (n0x0968-n0x096e) + I iq - 0x1e200542, // n0x0213 c0x0078 (n0x096e-n0x0977) + I ir - 0x00294c05, // n0x0214 c0x0000 (---------------) + I irish - 0x1e602b42, // n0x0215 c0x0079 (n0x0977-n0x097f) + I is - 0x00370f07, // n0x0216 c0x0000 (---------------) + I iselect - 0x00202b43, // n0x0217 c0x0000 (---------------) + I ist - 0x00210c48, // n0x0218 c0x0000 (---------------) + I istanbul - 0x1ea06e82, // n0x0219 c0x007a (n0x097f-n0x0af0) + I it - 0x00206e84, // n0x021a c0x0000 (---------------) + I itau - 0x003664c3, // n0x021b c0x0000 (---------------) + I iwc - 0x002a51c6, // n0x021c c0x0000 (---------------) + I jaguar - 0x0030ad84, // n0x021d c0x0000 (---------------) + I java - 0x00243883, // n0x021e c0x0000 (---------------) + I jcb - 0x0025b3c3, // n0x021f c0x0000 (---------------) + I jcp - 0x1ee01f82, // n0x0220 c0x007b (n0x0af0-n0x0af3) + I je - 0x0033ab85, // n0x0221 c0x0000 (---------------) + I jetzt - 0x0034f487, // n0x0222 c0x0000 (---------------) + I jewelry - 0x00266583, // n0x0223 c0x0000 (---------------) + I jio - 0x00297c83, // n0x0224 c0x0000 (---------------) + I jlc - 0x00297e43, // n0x0225 c0x0000 (---------------) + I jll - 0x01697f02, // n0x0226 c0x0005 (---------------)* o I jm - 0x00297f03, // n0x0227 c0x0000 (---------------) + I jmp - 0x002987c3, // n0x0228 c0x0000 (---------------) + I jnj - 0x1f202982, // n0x0229 c0x007c (n0x0af3-n0x0afb) + I jo - 0x002a5d04, // n0x022a c0x0000 (---------------) + I jobs - 0x00389ac6, // n0x022b c0x0000 (---------------) + I joburg - 0x00203903, // n0x022c c0x0000 (---------------) + I jot - 0x00298c43, // n0x022d c0x0000 (---------------) + I joy - 0x1f6990c2, // n0x022e c0x007d (n0x0afb-n0x0b6a) + I jp - 0x002990c8, // n0x022f c0x0000 (---------------) + I jpmorgan - 0x0029ccc4, // n0x0230 c0x0000 (---------------) + I jprs - 0x002faec6, // n0x0231 c0x0000 (---------------) + I juegos - 0x002e6846, // n0x0232 c0x0000 (---------------) + I kaufen - 0x00233fc4, // n0x0233 c0x0000 (---------------) + I kddi - 0x2d201002, // n0x0234 c0x00b4 (n0x11fe-n0x11ff)* o I ke - 0x002a6f4b, // n0x0235 c0x0000 (---------------) + I kerryhotels - 0x0021268e, // n0x0236 c0x0000 (---------------) + I kerrylogistics - 0x0021810f, // n0x0237 c0x0000 (---------------) + I kerryproperties - 0x00235e83, // n0x0238 c0x0000 (---------------) + I kfh - 0x2daa3fc2, // n0x0239 c0x00b6 (n0x1200-n0x1206) + I kg - 0x016176c2, // n0x023a c0x0005 (---------------)* o I kh - 0x2de01b02, // n0x023b c0x00b7 (n0x1206-n0x120d) + I ki - 0x0027d603, // n0x023c c0x0000 (---------------) + I kim - 0x002f33c6, // n0x023d c0x0000 (---------------) + I kinder - 0x00227886, // n0x023e c0x0000 (---------------) + I kindle - 0x00298f07, // n0x023f c0x0000 (---------------) + I kitchen - 0x002d2dc4, // n0x0240 c0x0000 (---------------) + I kiwi - 0x2e268d82, // n0x0241 c0x00b8 (n0x120d-n0x121e) + I km - 0x2e656942, // n0x0242 c0x00b9 (n0x121e-n0x1222) + I kn - 0x0021f385, // n0x0243 c0x0000 (---------------) + I koeln - 0x002be447, // n0x0244 c0x0000 (---------------) + I komatsu - 0x2ea08382, // n0x0245 c0x00ba (n0x1222-n0x1228) + I kp - 0x00208384, // n0x0246 c0x0000 (---------------) + I kpmg - 0x00360183, // n0x0247 c0x0000 (---------------) + I kpn - 0x2ee034c2, // n0x0248 c0x00bb (n0x1228-n0x1246) + I kr - 0x0033a003, // n0x0249 c0x0000 (---------------) + I krd - 0x0029d8c4, // n0x024a c0x0000 (---------------) + I kred - 0x002a3f09, // n0x024b c0x0000 (---------------) + I kuokgroup - 0x016ac642, // n0x024c c0x0005 (---------------)* o I kw - 0x2f229082, // n0x024d c0x00bc (n0x1246-n0x124b) + I ky - 0x002568c6, // n0x024e c0x0000 (---------------) + I kyknet - 0x002acb05, // n0x024f c0x0000 (---------------) + I kyoto - 0x2f6f0002, // n0x0250 c0x00bd (n0x124b-n0x1251) + I kz - 0x2fa01e42, // n0x0251 c0x00be (n0x1251-n0x125a) + I la - 0x003276c7, // n0x0252 c0x0000 (---------------) + I lacaixa - 0x0033df4b, // n0x0253 c0x0000 (---------------) + I lamborghini - 0x002335c9, // n0x0254 c0x0000 (---------------) + I lancaster - 0x002364c4, // n0x0255 c0x0000 (---------------) + I land - 0x0036d989, // n0x0256 c0x0000 (---------------) + I landrover - 0x002679c7, // n0x0257 c0x0000 (---------------) + I lasalle - 0x00222143, // n0x0258 c0x0000 (---------------) + I lat - 0x002c18c7, // n0x0259 c0x0000 (---------------) + I latrobe - 0x00253883, // n0x025a c0x0000 (---------------) + I law - 0x00270406, // n0x025b c0x0000 (---------------) + I lawyer - 0x2fe0a542, // n0x025c c0x00bf (n0x125a-n0x125f) + I lb - 0x302339c2, // n0x025d c0x00c0 (n0x125f-n0x1265) + I lc - 0x0021fbc3, // n0x025e c0x0000 (---------------) + I lds - 0x00267b05, // n0x025f c0x0000 (---------------) + I lease - 0x0025f307, // n0x0260 c0x0000 (---------------) + I leclerc - 0x00362985, // n0x0261 c0x0000 (---------------) + I legal - 0x002ad945, // n0x0262 c0x0000 (---------------) + I lexus - 0x002ce984, // n0x0263 c0x0000 (---------------) + I lgbt - 0x306008c2, // n0x0264 c0x00c1 (n0x1265-n0x1266) + I li - 0x002ee607, // n0x0265 c0x0000 (---------------) + I liaison - 0x002aadc4, // n0x0266 c0x0000 (---------------) + I lidl - 0x00247844, // n0x0267 c0x0000 (---------------) + I life - 0x0031c64d, // n0x0268 c0x0000 (---------------) + I lifeinsurance - 0x00247849, // n0x0269 c0x0000 (---------------) + I lifestyle - 0x00236dc8, // n0x026a c0x0000 (---------------) + I lighting - 0x00261684, // n0x026b c0x0000 (---------------) + I like - 0x002edc87, // n0x026c c0x0000 (---------------) + I limited - 0x002ee1c4, // n0x026d c0x0000 (---------------) + I limo - 0x00251e07, // n0x026e c0x0000 (---------------) + I lincoln - 0x0031dc05, // n0x026f c0x0000 (---------------) + I linde - 0x0031e2c4, // n0x0270 c0x0000 (---------------) + I link - 0x002bfc05, // n0x0271 c0x0000 (---------------) + I lipsy - 0x0024b384, // n0x0272 c0x0000 (---------------) + I live - 0x002d7785, // n0x0273 c0x0000 (---------------) + I lixil - 0x30a08342, // n0x0274 c0x00c2 (n0x1266-n0x1275) + I lk - 0x0020ab84, // n0x0275 c0x0000 (---------------) + I loan - 0x0020ab85, // n0x0276 c0x0000 (---------------) + I loans - 0x0020af86, // n0x0277 c0x0000 (---------------) + I locker - 0x00362ac5, // n0x0278 c0x0000 (---------------) + I locus - 0x002c1ec3, // n0x0279 c0x0000 (---------------) + I lol - 0x00340906, // n0x027a c0x0000 (---------------) + I london - 0x00364385, // n0x027b c0x0000 (---------------) + I lotte - 0x00206505, // n0x027c c0x0000 (---------------) + I lotto - 0x002123c4, // n0x027d c0x0000 (---------------) + I love - 0x30e76e02, // n0x027e c0x00c3 (n0x1275-n0x127a) + I lr - 0x31202d42, // n0x027f c0x00c4 (n0x127a-n0x127c) + I ls - 0x31605ec2, // n0x0280 c0x00c5 (n0x127c-n0x127e) + I lt - 0x003413c3, // n0x0281 c0x0000 (---------------) + I ltd - 0x003413c4, // n0x0282 c0x0000 (---------------) + I ltda - 0x31a071c2, // n0x0283 c0x00c6 (n0x127e-n0x127f) + I lu - 0x0036be05, // n0x0284 c0x0000 (---------------) + I lupin - 0x00222d84, // n0x0285 c0x0000 (---------------) + I luxe - 0x00225dc6, // n0x0286 c0x0000 (---------------) + I luxury - 0x31e27f02, // n0x0287 c0x00c7 (n0x127f-n0x1288) + I lv - 0x32228b42, // n0x0288 c0x00c8 (n0x1288-n0x1291) + I ly - 0x32604302, // n0x0289 c0x00c9 (n0x1291-n0x1297) + I ma - 0x00300a86, // n0x028a c0x0000 (---------------) + I madrid - 0x0032a984, // n0x028b c0x0000 (---------------) + I maif - 0x0033c9c6, // n0x028c c0x0000 (---------------) + I maison - 0x0026a746, // n0x028d c0x0000 (---------------) + I makeup - 0x00206903, // n0x028e c0x0000 (---------------) + I man - 0x00351aca, // n0x028f c0x0000 (---------------) + I management - 0x0022a685, // n0x0290 c0x0000 (---------------) + I mango - 0x0029bcc6, // n0x0291 c0x0000 (---------------) + I market - 0x00357049, // n0x0292 c0x0000 (---------------) + I marketing - 0x0029bcc7, // n0x0293 c0x0000 (---------------) + I markets - 0x0027c808, // n0x0294 c0x0000 (---------------) + I marriott - 0x00271143, // n0x0295 c0x0000 (---------------) + I mba - 0x32a3a6c2, // n0x0296 c0x00ca (n0x1297-n0x1299) + I mc - 0x32e38602, // n0x0297 c0x00cb (n0x1299-n0x129a) + I md - 0x33208942, // n0x0298 c0x00cc (n0x129a-n0x12a2) + I me - 0x002dc385, // n0x0299 c0x0000 (---------------) + I media - 0x00282f44, // n0x029a c0x0000 (---------------) + I meet - 0x0020fe89, // n0x029b c0x0000 (---------------) + I melbourne - 0x003121c4, // n0x029c c0x0000 (---------------) + I meme - 0x002edac8, // n0x029d c0x0000 (---------------) + I memorial - 0x00208943, // n0x029e c0x0000 (---------------) + I men - 0x0034d804, // n0x029f c0x0000 (---------------) + I menu - 0x0023a883, // n0x02a0 c0x0000 (---------------) + I meo - 0x0031c587, // n0x02a1 c0x0000 (---------------) + I metlife - 0x33608402, // n0x02a2 c0x00cd (n0x12a2-n0x12aa) + I mg - 0x00249282, // n0x02a3 c0x0000 (---------------) + I mh - 0x002322c5, // n0x02a4 c0x0000 (---------------) + I miami - 0x00257ec9, // n0x02a5 c0x0000 (---------------) + I microsoft - 0x0023fa03, // n0x02a6 c0x0000 (---------------) + I mil - 0x0026b344, // n0x02a7 c0x0000 (---------------) + I mini - 0x00246f03, // n0x02a8 c0x0000 (---------------) + I mit - 0x33b56d82, // n0x02a9 c0x00ce (n0x12aa-n0x12b2) + I mk - 0x33e0ab42, // n0x02aa c0x00cf (n0x12b2-n0x12b9) + I ml - 0x002afd83, // n0x02ab c0x0000 (---------------) + I mlb - 0x00358b83, // n0x02ac c0x0000 (---------------) + I mls - 0x016035c2, // n0x02ad c0x0005 (---------------)* o I mm - 0x003679c3, // n0x02ae c0x0000 (---------------) + I mma - 0x34217082, // n0x02af c0x00d0 (n0x12b9-n0x12bd) + I mn - 0x00217084, // n0x02b0 c0x0000 (---------------) + I mnet - 0x34603602, // n0x02b1 c0x00d1 (n0x12bd-n0x12c2) + I mo - 0x00203604, // n0x02b2 c0x0000 (---------------) + I mobi - 0x002cc406, // n0x02b3 c0x0000 (---------------) + I mobily - 0x00208484, // n0x02b4 c0x0000 (---------------) + I moda - 0x002fb2c3, // n0x02b5 c0x0000 (---------------) + I moe - 0x0038f703, // n0x02b6 c0x0000 (---------------) + I moi - 0x0021cfc3, // n0x02b7 c0x0000 (---------------) + I mom - 0x00230c46, // n0x02b8 c0x0000 (---------------) + I monash - 0x002b6185, // n0x02b9 c0x0000 (---------------) + I money - 0x00261909, // n0x02ba c0x0000 (---------------) + I montblanc - 0x002b60c6, // n0x02bb c0x0000 (---------------) + I mormon - 0x002b66c8, // n0x02bc c0x0000 (---------------) + I mortgage - 0x002b68c6, // n0x02bd c0x0000 (---------------) + I moscow - 0x0025cb84, // n0x02be c0x0000 (---------------) + I moto - 0x0028678b, // n0x02bf c0x0000 (---------------) + I motorcycles - 0x002b8403, // n0x02c0 c0x0000 (---------------) + I mov - 0x002b8405, // n0x02c1 c0x0000 (---------------) + I movie - 0x002b8548, // n0x02c2 c0x0000 (---------------) + I movistar - 0x00214902, // n0x02c3 c0x0000 (---------------) + I mp - 0x003279c2, // n0x02c4 c0x0000 (---------------) + I mq - 0x34adcb42, // n0x02c5 c0x00d2 (n0x12c2-n0x12c4) + I mr - 0x34e09282, // n0x02c6 c0x00d3 (n0x12c4-n0x12c9) + I ms - 0x35259642, // n0x02c7 c0x00d4 (n0x12c9-n0x12cd) + I mt - 0x00259643, // n0x02c8 c0x0000 (---------------) + I mtn - 0x002b8844, // n0x02c9 c0x0000 (---------------) + I mtpc - 0x002b9703, // n0x02ca c0x0000 (---------------) + I mtr - 0x35a000c2, // n0x02cb c0x00d6 (n0x12ce-n0x12d5) + I mu - 0x002bae0b, // n0x02cc c0x0000 (---------------) + I multichoice - 0x35ebd646, // n0x02cd c0x00d7 (n0x12d5-n0x14f9) + I museum - 0x0036d306, // n0x02ce c0x0000 (---------------) + I mutual - 0x002bdc88, // n0x02cf c0x0000 (---------------) + I mutuelle - 0x3624ffc2, // n0x02d0 c0x00d8 (n0x14f9-n0x1507) + I mv - 0x3660a142, // n0x02d1 c0x00d9 (n0x1507-n0x1512) + I mw - 0x36a0a682, // n0x02d2 c0x00da (n0x1512-n0x1518) + I mx - 0x36e20282, // n0x02d3 c0x00db (n0x1518-n0x1520) + I my - 0x372c6c02, // n0x02d4 c0x00dc (n0x1520-n0x1521)* o I mz - 0x002c6c0b, // n0x02d5 c0x0000 (---------------) + I mzansimagic - 0x37600282, // n0x02d6 c0x00dd (n0x1521-n0x1532) + I na - 0x002f3845, // n0x02d7 c0x0000 (---------------) + I nadex - 0x0032b206, // n0x02d8 c0x0000 (---------------) + I nagoya - 0x37a98944, // n0x02d9 c0x00de (n0x1532-n0x1534) + I name - 0x0030cfc7, // n0x02da c0x0000 (---------------) + I naspers - 0x00240dc6, // n0x02db c0x0000 (---------------) + I natura - 0x0037fe44, // n0x02dc c0x0000 (---------------) + I navy - 0x3861c742, // n0x02dd c0x00e1 (n0x1536-n0x1537) + I nc - 0x00201082, // n0x02de c0x0000 (---------------) + I ne - 0x00305e83, // n0x02df c0x0000 (---------------) + I nec - 0x38a170c3, // n0x02e0 c0x00e2 (n0x1537-n0x1568) + I net - 0x002efe87, // n0x02e1 c0x0000 (---------------) + I netbank - 0x002d7687, // n0x02e2 c0x0000 (---------------) + I netflix - 0x00241a47, // n0x02e3 c0x0000 (---------------) + I network - 0x00319107, // n0x02e4 c0x0000 (---------------) + I neustar - 0x0021a383, // n0x02e5 c0x0000 (---------------) + I new - 0x00366d44, // n0x02e6 c0x0000 (---------------) + I news - 0x00210044, // n0x02e7 c0x0000 (---------------) + I next - 0x00352aca, // n0x02e8 c0x0000 (---------------) + I nextdirect - 0x00255985, // n0x02e9 c0x0000 (---------------) + I nexus - 0x39e00342, // n0x02ea c0x00e7 (n0x1570-n0x157a) + I nf - 0x3a201282, // n0x02eb c0x00e8 (n0x157a-n0x1583) + I ng - 0x00202303, // n0x02ec c0x0000 (---------------) + I ngo - 0x0025aac3, // n0x02ed c0x0000 (---------------) + I nhk - 0x01603d42, // n0x02ee c0x0005 (---------------)* o I ni - 0x00369044, // n0x02ef c0x0000 (---------------) + I nico - 0x00204c45, // n0x02f0 c0x0000 (---------------) + I nikon - 0x002bbfc5, // n0x02f1 c0x0000 (---------------) + I ninja - 0x0029c346, // n0x02f2 c0x0000 (---------------) + I nissan - 0x3aa36482, // n0x02f3 c0x00ea (n0x1584-n0x1587) + I nl - 0x3ae00c02, // n0x02f4 c0x00eb (n0x1587-n0x185d) + I no - 0x00201b85, // n0x02f5 c0x0000 (---------------) + I nokia - 0x0036d012, // n0x02f6 c0x0000 (---------------) + I northwesternmutual - 0x00204546, // n0x02f7 c0x0000 (---------------) + I norton - 0x0021c343, // n0x02f8 c0x0000 (---------------) + I now - 0x0036a0c6, // n0x02f9 c0x0000 (---------------) + I nowruz - 0x0030b645, // n0x02fa c0x0000 (---------------) + I nowtv - 0x0160a2c2, // n0x02fb c0x0005 (---------------)* o I np - 0x43209e82, // n0x02fc c0x010c (n0x1885-n0x188c) + I nr - 0x002cc1c3, // n0x02fd c0x0000 (---------------) + I nra - 0x00345903, // n0x02fe c0x0000 (---------------) + I nrw - 0x00361083, // n0x02ff c0x0000 (---------------) + I ntt - 0x43605bc2, // n0x0300 c0x010d (n0x188c-n0x188f) + I nu - 0x00223403, // n0x0301 c0x0000 (---------------) + I nyc - 0x43a078c2, // n0x0302 c0x010e (n0x188f-n0x189f) + I nz - 0x00203643, // n0x0303 c0x0000 (---------------) + I obi - 0x002a5d48, // n0x0304 c0x0000 (---------------) + I observer - 0x00219c46, // n0x0305 c0x0000 (---------------) + I office - 0x003954c7, // n0x0306 c0x0000 (---------------) + I okinawa - 0x002a2686, // n0x0307 c0x0000 (---------------) + I olayan - 0x002a268b, // n0x0308 c0x0000 (---------------) + I olayangroup - 0x002dbd04, // n0x0309 c0x0000 (---------------) + I ollo - 0x44200082, // n0x030a c0x0110 (n0x18a0-n0x18a9) + I om - 0x0036bc85, // n0x030b c0x0000 (---------------) + I omega - 0x0021a343, // n0x030c c0x0000 (---------------) + I one - 0x00292c83, // n0x030d c0x0000 (---------------) + I ong - 0x003023c3, // n0x030e c0x0000 (---------------) + I onl - 0x003023c6, // n0x030f c0x0000 (---------------) + I online - 0x0027b9c3, // n0x0310 c0x0000 (---------------) + I ooo - 0x0032d686, // n0x0311 c0x0000 (---------------) + I oracle - 0x002a6246, // n0x0312 c0x0000 (---------------) + I orange - 0x4461dcc3, // n0x0313 c0x0111 (n0x18a9-n0x18e3) + I org - 0x00299187, // n0x0314 c0x0000 (---------------) + I organic - 0x0029a9cd, // n0x0315 c0x0000 (---------------) + I orientexpress - 0x002864c5, // n0x0316 c0x0000 (---------------) + I osaka - 0x00239506, // n0x0317 c0x0000 (---------------) + I otsuka - 0x00206543, // n0x0318 c0x0000 (---------------) + I ott - 0x00389e43, // n0x0319 c0x0000 (---------------) + I ovh - 0x45e052c2, // n0x031a c0x0117 (n0x1920-n0x192b) + I pa - 0x00310fc4, // n0x031b c0x0000 (---------------) + I page - 0x002fb60c, // n0x031c c0x0000 (---------------) + I pamperedchef - 0x0022c007, // n0x031d c0x0000 (---------------) + I panerai - 0x0025b445, // n0x031e c0x0000 (---------------) + I paris - 0x0028f504, // n0x031f c0x0000 (---------------) + I pars - 0x00297f88, // n0x0320 c0x0000 (---------------) + I partners - 0x002c2085, // n0x0321 c0x0000 (---------------) + I parts - 0x002a2905, // n0x0322 c0x0000 (---------------) + I party - 0x002a4109, // n0x0323 c0x0000 (---------------) + I passagens - 0x002ab584, // n0x0324 c0x0000 (---------------) + I payu - 0x002b88c4, // n0x0325 c0x0000 (---------------) + I pccw - 0x46214942, // n0x0326 c0x0118 (n0x192b-n0x1933) + I pe - 0x0021ab43, // n0x0327 c0x0000 (---------------) + I pet - 0x46764f42, // n0x0328 c0x0119 (n0x1933-n0x1936) + I pf - 0x016bf182, // n0x0329 c0x0005 (---------------)* o I pg - 0x46a8f0c2, // n0x032a c0x011a (n0x1936-n0x193e) + I ph - 0x002dc948, // n0x032b c0x0000 (---------------) + I pharmacy - 0x002bfb47, // n0x032c c0x0000 (---------------) + I philips - 0x0028f0c5, // n0x032d c0x0000 (---------------) + I photo - 0x002c014b, // n0x032e c0x0000 (---------------) + I photography - 0x002bea86, // n0x032f c0x0000 (---------------) + I photos - 0x002c0346, // n0x0330 c0x0000 (---------------) + I physio - 0x002c04c6, // n0x0331 c0x0000 (---------------) + I piaget - 0x0021ec04, // n0x0332 c0x0000 (---------------) + I pics - 0x002c0a46, // n0x0333 c0x0000 (---------------) + I pictet - 0x002c0fc8, // n0x0334 c0x0000 (---------------) + I pictures - 0x0022c6c3, // n0x0335 c0x0000 (---------------) + I pid - 0x00243743, // n0x0336 c0x0000 (---------------) + I pin - 0x00243744, // n0x0337 c0x0000 (---------------) + I ping - 0x002c1c84, // n0x0338 c0x0000 (---------------) + I pink - 0x002c3cc5, // n0x0339 c0x0000 (---------------) + I pizza - 0x46ec3e02, // n0x033a c0x011b (n0x193e-n0x194c) + I pk - 0x47201e02, // n0x033b c0x011c (n0x194c-n0x19f1) + I pl - 0x00201e05, // n0x033c c0x0000 (---------------) + I place - 0x00290d44, // n0x033d c0x0000 (---------------) + I play - 0x002c61cb, // n0x033e c0x0000 (---------------) + I playstation - 0x002c7948, // n0x033f c0x0000 (---------------) + I plumbing - 0x002c7b84, // n0x0340 c0x0000 (---------------) + I plus - 0x002083c2, // n0x0341 c0x0000 (---------------) + I pm - 0x47a3df82, // n0x0342 c0x011e (n0x1a20-n0x1a25) + I pn - 0x0029a743, // n0x0343 c0x0000 (---------------) + I pnc - 0x002c7fc4, // n0x0344 c0x0000 (---------------) + I pohl - 0x002c80c5, // n0x0345 c0x0000 (---------------) + I poker - 0x002c9d84, // n0x0346 c0x0000 (---------------) + I porn - 0x002b31c4, // n0x0347 c0x0000 (---------------) + I post - 0x47e18242, // n0x0348 c0x011f (n0x1a25-n0x1a32) + I pr - 0x0025da85, // n0x0349 c0x0000 (---------------) + I praxi - 0x0029abc5, // n0x034a c0x0000 (---------------) + I press - 0x002cad45, // n0x034b c0x0000 (---------------) + I prime - 0x48218243, // n0x034c c0x0120 (n0x1a32-n0x1a39) + I pro - 0x002cbe44, // n0x034d c0x0000 (---------------) + I prod - 0x002cbe4b, // n0x034e c0x0000 (---------------) + I productions - 0x002cc284, // n0x034f c0x0000 (---------------) + I prof - 0x002cca85, // n0x0350 c0x0000 (---------------) + I promo - 0x0021824a, // n0x0351 c0x0000 (---------------) + I properties - 0x002cce48, // n0x0352 c0x0000 (---------------) + I property - 0x002cd04a, // n0x0353 c0x0000 (---------------) + I protection - 0x4861dc02, // n0x0354 c0x0121 (n0x1a39-n0x1a40) + I ps - 0x48a95982, // n0x0355 c0x0122 (n0x1a40-n0x1a49) + I pt - 0x00296543, // n0x0356 c0x0000 (---------------) + I pub - 0x48f8ae42, // n0x0357 c0x0123 (n0x1a49-n0x1a4f) + I pw - 0x492be202, // n0x0358 c0x0124 (n0x1a4f-n0x1a56) + I py - 0x496fd8c2, // n0x0359 c0x0125 (n0x1a56-n0x1a5f) + I qa - 0x002ce804, // n0x035a c0x0000 (---------------) + I qpon - 0x00211186, // n0x035b c0x0000 (---------------) + I quebec - 0x00222685, // n0x035c c0x0000 (---------------) + I quest - 0x00301a06, // n0x035d c0x0000 (---------------) + I racing - 0x49a030c2, // n0x035e c0x0126 (n0x1a5f-n0x1a63) + I re - 0x0033d884, // n0x035f c0x0000 (---------------) + I read - 0x0032e0c7, // n0x0360 c0x0000 (---------------) + I realtor - 0x0036b3c6, // n0x0361 c0x0000 (---------------) + I realty - 0x00307487, // n0x0362 c0x0000 (---------------) + I recipes - 0x00230683, // n0x0363 c0x0000 (---------------) + I red - 0x0029d908, // n0x0364 c0x0000 (---------------) + I redstone - 0x003237cb, // n0x0365 c0x0000 (---------------) + I redumbrella - 0x002730c5, // n0x0366 c0x0000 (---------------) + I rehab - 0x002e8505, // n0x0367 c0x0000 (---------------) + I reise - 0x002e8506, // n0x0368 c0x0000 (---------------) + I reisen - 0x002a45c4, // n0x0369 c0x0000 (---------------) + I reit - 0x00365b48, // n0x036a c0x0000 (---------------) + I reliance - 0x00210403, // n0x036b c0x0000 (---------------) + I ren - 0x00210404, // n0x036c c0x0000 (---------------) + I rent - 0x00210407, // n0x036d c0x0000 (---------------) + I rentals - 0x002117c6, // n0x036e c0x0000 (---------------) + I repair - 0x0030ea86, // n0x036f c0x0000 (---------------) + I report - 0x002964ca, // n0x0370 c0x0000 (---------------) + I republican - 0x00237dc4, // n0x0371 c0x0000 (---------------) + I rest - 0x003386ca, // n0x0372 c0x0000 (---------------) + I restaurant - 0x0031bd06, // n0x0373 c0x0000 (---------------) + I review - 0x0031bd07, // n0x0374 c0x0000 (---------------) + I reviews - 0x00243007, // n0x0375 c0x0000 (---------------) + I rexroth - 0x002614c4, // n0x0376 c0x0000 (---------------) + I rich - 0x002614c9, // n0x0377 c0x0000 (---------------) + I richardli - 0x0024ea05, // n0x0378 c0x0000 (---------------) + I ricoh - 0x00228f83, // n0x0379 c0x0000 (---------------) + I ril - 0x0022ad03, // n0x037a c0x0000 (---------------) + I rio - 0x0021dd83, // n0x037b c0x0000 (---------------) + I rip - 0x49e00d82, // n0x037c c0x0127 (n0x1a63-n0x1a6f) + I ro - 0x0028e886, // n0x037d c0x0000 (---------------) + I rocher - 0x00297105, // n0x037e c0x0000 (---------------) + I rocks - 0x002c1b45, // n0x037f c0x0000 (---------------) + I rodeo - 0x0023a144, // n0x0380 c0x0000 (---------------) + I room - 0x4a2060c2, // n0x0381 c0x0128 (n0x1a6f-n0x1a76) + I rs - 0x00324a84, // n0x0382 c0x0000 (---------------) + I rsvp - 0x4a6044c2, // n0x0383 c0x0129 (n0x1a76-n0x1afa) + I ru - 0x0024f144, // n0x0384 c0x0000 (---------------) + I ruhr - 0x002044c3, // n0x0385 c0x0000 (---------------) + I run - 0x4ab0d882, // n0x0386 c0x012a (n0x1afa-n0x1b03) + I rw - 0x0031d103, // n0x0387 c0x0000 (---------------) + I rwe - 0x00289606, // n0x0388 c0x0000 (---------------) + I ryukyu - 0x4ae01a02, // n0x0389 c0x012b (n0x1b03-n0x1b0b) + I sa - 0x00272608, // n0x038a c0x0000 (---------------) + I saarland - 0x00234784, // n0x038b c0x0000 (---------------) + I safe - 0x00234786, // n0x038c c0x0000 (---------------) + I safety - 0x002f4d46, // n0x038d c0x0000 (---------------) + I sakura - 0x00244b04, // n0x038e c0x0000 (---------------) + I sale - 0x00340885, // n0x038f c0x0000 (---------------) + I salon - 0x00395107, // n0x0390 c0x0000 (---------------) + I samsung - 0x0029c407, // n0x0391 c0x0000 (---------------) + I sandvik - 0x0029c40f, // n0x0392 c0x0000 (---------------) + I sandvikcoromant - 0x002098c6, // n0x0393 c0x0000 (---------------) + I sanofi - 0x00210583, // n0x0394 c0x0000 (---------------) + I sap - 0x00210584, // n0x0395 c0x0000 (---------------) + I sapo - 0x0021d684, // n0x0396 c0x0000 (---------------) + I sarl - 0x002275c3, // n0x0397 c0x0000 (---------------) + I sas - 0x00219584, // n0x0398 c0x0000 (---------------) + I save - 0x002332c4, // n0x0399 c0x0000 (---------------) + I saxo - 0x4b2046c2, // n0x039a c0x012c (n0x1b0b-n0x1b10) + I sb - 0x00277ac3, // n0x039b c0x0000 (---------------) + I sbi - 0x002350c3, // n0x039c c0x0000 (---------------) + I sbs - 0x4b600982, // n0x039d c0x012d (n0x1b10-n0x1b15) + I sc - 0x00229183, // n0x039e c0x0000 (---------------) + I sca - 0x00355d83, // n0x039f c0x0000 (---------------) + I scb - 0x00206107, // n0x03a0 c0x0000 (---------------) + I schmidt - 0x0023514c, // n0x03a1 c0x0000 (---------------) + I scholarships - 0x00235406, // n0x03a2 c0x0000 (---------------) + I school - 0x002c39c6, // n0x03a3 c0x0000 (---------------) + I schule - 0x00370987, // n0x03a4 c0x0000 (---------------) + I schwarz - 0x00223b07, // n0x03a5 c0x0000 (---------------) + I science - 0x00212fc4, // n0x03a6 c0x0000 (---------------) + I scor - 0x00237984, // n0x03a7 c0x0000 (---------------) + I scot - 0x4ba4f842, // n0x03a8 c0x012e (n0x1b15-n0x1b1d) + I sd - 0x4be02e82, // n0x03a9 c0x012f (n0x1b1d-n0x1b46) + I se - 0x003004c4, // n0x03aa c0x0000 (---------------) + I seat - 0x00223f88, // n0x03ab c0x0000 (---------------) + I security - 0x00267bc4, // n0x03ac c0x0000 (---------------) + I seek - 0x002ba785, // n0x03ad c0x0000 (---------------) + I sener - 0x00243bc8, // n0x03ae c0x0000 (---------------) + I services - 0x002476c3, // n0x03af c0x0000 (---------------) + I sew - 0x0029acc3, // n0x03b0 c0x0000 (---------------) + I sex - 0x0029acc4, // n0x03b1 c0x0000 (---------------) + I sexy - 0x4c262dc2, // n0x03b2 c0x0130 (n0x1b46-n0x1b4d) + I sg - 0x4c6001c2, // n0x03b3 c0x0131 (n0x1b4d-n0x1b53) + I sh - 0x00255e05, // n0x03b4 c0x0000 (---------------) + I sharp - 0x00256344, // n0x03b5 c0x0000 (---------------) + I shaw - 0x00208c04, // n0x03b6 c0x0000 (---------------) + I shia - 0x002cb1c7, // n0x03b7 c0x0000 (---------------) + I shiksha - 0x00369905, // n0x03b8 c0x0000 (---------------) + I shoes - 0x002b0e86, // n0x03b9 c0x0000 (---------------) + I shouji - 0x002b3884, // n0x03ba c0x0000 (---------------) + I show - 0x002b6b87, // n0x03bb c0x0000 (---------------) + I shriram - 0x4ca09182, // n0x03bc c0x0132 (n0x1b53-n0x1b54) + I si - 0x0036b904, // n0x03bd c0x0000 (---------------) + I silk - 0x002914c4, // n0x03be c0x0000 (---------------) + I sina - 0x00274247, // n0x03bf c0x0000 (---------------) + I singles - 0x00242b84, // n0x03c0 c0x0000 (---------------) + I site - 0x0022e942, // n0x03c1 c0x0000 (---------------) + I sj - 0x4ce07b42, // n0x03c2 c0x0133 (n0x1b54-n0x1b55) + I sk - 0x00207b43, // n0x03c3 c0x0000 (---------------) + I ski - 0x002f3384, // n0x03c4 c0x0000 (---------------) + I skin - 0x00229043, // n0x03c5 c0x0000 (---------------) + I sky - 0x00229045, // n0x03c6 c0x0000 (---------------) + I skype - 0x4d212582, // n0x03c7 c0x0134 (n0x1b55-n0x1b5a) + I sl - 0x0023f582, // n0x03c8 c0x0000 (---------------) + I sm - 0x0034b305, // n0x03c9 c0x0000 (---------------) + I smile - 0x4d610b02, // n0x03ca c0x0135 (n0x1b5a-n0x1b62) + I sn - 0x00310444, // n0x03cb c0x0000 (---------------) + I sncf - 0x4da01102, // n0x03cc c0x0136 (n0x1b62-n0x1b65) + I so - 0x00240a06, // n0x03cd c0x0000 (---------------) + I soccer - 0x002c27c6, // n0x03ce c0x0000 (---------------) + I social - 0x00258008, // n0x03cf c0x0000 (---------------) + I softbank - 0x002a6c88, // n0x03d0 c0x0000 (---------------) + I software - 0x002de604, // n0x03d1 c0x0000 (---------------) + I sohu - 0x002d0205, // n0x03d2 c0x0000 (---------------) + I solar - 0x002d9149, // n0x03d3 c0x0000 (---------------) + I solutions - 0x00364504, // n0x03d4 c0x0000 (---------------) + I song - 0x002bc184, // n0x03d5 c0x0000 (---------------) + I sony - 0x00207fc3, // n0x03d6 c0x0000 (---------------) + I soy - 0x002101c5, // n0x03d7 c0x0000 (---------------) + I space - 0x00379247, // n0x03d8 c0x0000 (---------------) + I spiegel - 0x00236a04, // n0x03d9 c0x0000 (---------------) + I spot - 0x0033d80d, // n0x03da c0x0000 (---------------) + I spreadbetting - 0x002ceec2, // n0x03db c0x0000 (---------------) + I sr - 0x002ceec3, // n0x03dc c0x0000 (---------------) + I srl - 0x4de023c2, // n0x03dd c0x0137 (n0x1b65-n0x1b71) + I st - 0x0035bf05, // n0x03de c0x0000 (---------------) + I stada - 0x00232444, // n0x03df c0x0000 (---------------) + I star - 0x003191c7, // n0x03e0 c0x0000 (---------------) + I starhub - 0x002b1889, // n0x03e1 c0x0000 (---------------) + I statebank - 0x0029ca07, // n0x03e2 c0x0000 (---------------) + I statoil - 0x00264603, // n0x03e3 c0x0000 (---------------) + I stc - 0x00264608, // n0x03e4 c0x0000 (---------------) + I stcgroup - 0x00259f09, // n0x03e5 c0x0000 (---------------) + I stockholm - 0x002cf147, // n0x03e6 c0x0000 (---------------) + I storage - 0x002cf4c5, // n0x03e7 c0x0000 (---------------) + I store - 0x002cfc86, // n0x03e8 c0x0000 (---------------) + I studio - 0x002cfe05, // n0x03e9 c0x0000 (---------------) + I study - 0x00247945, // n0x03ea c0x0000 (---------------) + I style - 0x4e203a42, // n0x03eb c0x0138 (n0x1b71-n0x1b91) + I su - 0x002f0b45, // n0x03ec c0x0000 (---------------) + I sucks - 0x002acd0a, // n0x03ed c0x0000 (---------------) + I supersport - 0x002b49c8, // n0x03ee c0x0000 (---------------) + I supplies - 0x002cccc6, // n0x03ef c0x0000 (---------------) + I supply - 0x00243e87, // n0x03f0 c0x0000 (---------------) + I support - 0x00287c84, // n0x03f1 c0x0000 (---------------) + I surf - 0x00330647, // n0x03f2 c0x0000 (---------------) + I surgery - 0x002d2f46, // n0x03f3 c0x0000 (---------------) + I suzuki - 0x4e61d0c2, // n0x03f4 c0x0139 (n0x1b91-n0x1b96) + I sv - 0x0020ac86, // n0x03f5 c0x0000 (---------------) + I swatch - 0x002d6685, // n0x03f6 c0x0000 (---------------) + I swiss - 0x4ead6b42, // n0x03f7 c0x013a (n0x1b96-n0x1b97) + I sx - 0x4ee84ec2, // n0x03f8 c0x013b (n0x1b97-n0x1b9d) + I sy - 0x00368086, // n0x03f9 c0x0000 (---------------) + I sydney - 0x0029d448, // n0x03fa c0x0000 (---------------) + I symantec - 0x00392447, // n0x03fb c0x0000 (---------------) + I systems - 0x4f207582, // n0x03fc c0x013c (n0x1b9d-n0x1ba0) + I sz - 0x0020c083, // n0x03fd c0x0000 (---------------) + I tab - 0x00382f46, // n0x03fe c0x0000 (---------------) + I taipei - 0x00216944, // n0x03ff c0x0000 (---------------) + I talk - 0x003879c6, // n0x0400 c0x0000 (---------------) + I taobao - 0x0031cbca, // n0x0401 c0x0000 (---------------) + I tatamotors - 0x0031df05, // n0x0402 c0x0000 (---------------) + I tatar - 0x0020f886, // n0x0403 c0x0000 (---------------) + I tattoo - 0x00217c43, // n0x0404 c0x0000 (---------------) + I tax - 0x00217c44, // n0x0405 c0x0000 (---------------) + I taxi - 0x0020ad42, // n0x0406 c0x0000 (---------------) + I tc - 0x002f4203, // n0x0407 c0x0000 (---------------) + I tci - 0x4f600682, // n0x0408 c0x013d (n0x1ba0-n0x1ba1) + I td - 0x002c9803, // n0x0409 c0x0000 (---------------) + I tdk - 0x00354144, // n0x040a c0x0000 (---------------) + I team - 0x0029d584, // n0x040b c0x0000 (---------------) + I tech - 0x0029d58a, // n0x040c c0x0000 (---------------) + I technology - 0x0022ba83, // n0x040d c0x0000 (---------------) + I tel - 0x002734c8, // n0x040e c0x0000 (---------------) + I telecity - 0x00250a0a, // n0x040f c0x0000 (---------------) + I telefonica - 0x00325507, // n0x0410 c0x0000 (---------------) + I temasek - 0x002dab46, // n0x0411 c0x0000 (---------------) + I tennis - 0x0033f0c4, // n0x0412 c0x0000 (---------------) + I teva - 0x0027e202, // n0x0413 c0x0000 (---------------) + I tf - 0x0021e342, // n0x0414 c0x0000 (---------------) + I tg - 0x4fa01d82, // n0x0415 c0x013e (n0x1ba1-n0x1ba8) + I th - 0x00235c83, // n0x0416 c0x0000 (---------------) + I thd - 0x002f9147, // n0x0417 c0x0000 (---------------) + I theater - 0x00242d87, // n0x0418 c0x0000 (---------------) + I theatre - 0x00377f8b, // n0x0419 c0x0000 (---------------) + I theguardian - 0x00340707, // n0x041a c0x0000 (---------------) + I tickets - 0x0021bb06, // n0x041b c0x0000 (---------------) + I tienda - 0x00375107, // n0x041c c0x0000 (---------------) + I tiffany - 0x00354984, // n0x041d c0x0000 (---------------) + I tips - 0x00355585, // n0x041e c0x0000 (---------------) + I tires - 0x002a4985, // n0x041f c0x0000 (---------------) + I tirol - 0x4fe02bc2, // n0x0420 c0x013f (n0x1ba8-n0x1bb7) + I tj - 0x0023a7c2, // n0x0421 c0x0000 (---------------) + I tk - 0x5020fc42, // n0x0422 c0x0140 (n0x1bb7-n0x1bb8) + I tl - 0x50608902, // n0x0423 c0x0141 (n0x1bb8-n0x1bc0) + I tm - 0x0026a9c5, // n0x0424 c0x0000 (---------------) + I tmall - 0x50a1d1c2, // n0x0425 c0x0142 (n0x1bc0-n0x1bd4) + I tn - 0x50e01682, // n0x0426 c0x0143 (n0x1bd4-n0x1bda) + I to - 0x00312e85, // n0x0427 c0x0000 (---------------) + I today - 0x00316545, // n0x0428 c0x0000 (---------------) + I tokyo - 0x0020f945, // n0x0429 c0x0000 (---------------) + I tools - 0x002469c3, // n0x042a c0x0000 (---------------) + I top - 0x00338cc5, // n0x042b c0x0000 (---------------) + I toray - 0x002beb47, // n0x042c c0x0000 (---------------) + I toshiba - 0x00339905, // n0x042d c0x0000 (---------------) + I tours - 0x0021abc4, // n0x042e c0x0000 (---------------) + I town - 0x00338906, // n0x042f c0x0000 (---------------) + I toyota - 0x00247b04, // n0x0430 c0x0000 (---------------) + I toys - 0x00285142, // n0x0431 c0x0000 (---------------) + I tp - 0x51202402, // n0x0432 c0x0144 (n0x1bda-n0x1bef) + I tr - 0x00229a45, // n0x0433 c0x0000 (---------------) + I trade - 0x0028fe07, // n0x0434 c0x0000 (---------------) + I trading - 0x002b9748, // n0x0435 c0x0000 (---------------) + I training - 0x0027f186, // n0x0436 c0x0000 (---------------) + I travel - 0x0027f18d, // n0x0437 c0x0000 (---------------) + I travelchannel - 0x00280489, // n0x0438 c0x0000 (---------------) + I travelers - 0x00280492, // n0x0439 c0x0000 (---------------) + I travelersinsurance - 0x00313185, // n0x043a c0x0000 (---------------) + I trust - 0x0034a4c3, // n0x043b c0x0000 (---------------) + I trv - 0x51e06582, // n0x043c c0x0147 (n0x1bf1-n0x1c02) + I tt - 0x0035a104, // n0x043d c0x0000 (---------------) + I tube - 0x002d71c3, // n0x043e c0x0000 (---------------) + I tui - 0x002d83c5, // n0x043f c0x0000 (---------------) + I tunes - 0x002d8e45, // n0x0440 c0x0000 (---------------) + I tushu - 0x5220bf42, // n0x0441 c0x0148 (n0x1c02-n0x1c06) + I tv - 0x0020bf43, // n0x0442 c0x0000 (---------------) + I tvs - 0x52641ac2, // n0x0443 c0x0149 (n0x1c06-n0x1c14) + I tw - 0x52a17142, // n0x0444 c0x014a (n0x1c14-n0x1c20) + I tz - 0x52e17d82, // n0x0445 c0x014b (n0x1c20-n0x1c6e) + I ua - 0x0032ba03, // n0x0446 c0x0000 (---------------) + I ubs - 0x53205082, // n0x0447 c0x014c (n0x1c6e-n0x1c77) + I ug - 0x5360cf02, // n0x0448 c0x014d (n0x1c77-n0x1c82) + I uk - 0x0029f04a, // n0x0449 c0x0000 (---------------) + I university - 0x00203a83, // n0x044a c0x0000 (---------------) + I uno - 0x00245543, // n0x044b c0x0000 (---------------) + I uol - 0x002c16c3, // n0x044c c0x0000 (---------------) + I ups - 0x54209f42, // n0x044d c0x0150 (n0x1c84-n0x1cc3) + I us - 0x62606842, // n0x044e c0x0189 (n0x1d66-n0x1d6c) + I uy - 0x62e018c2, // n0x044f c0x018b (n0x1d6d-n0x1d71) + I uz - 0x002013c2, // n0x0450 c0x0000 (---------------) + I va - 0x00340209, // n0x0451 c0x0000 (---------------) + I vacations - 0x002aba84, // n0x0452 c0x0000 (---------------) + I vana - 0x6334a542, // n0x0453 c0x018c (n0x1d71-n0x1d77) + I vc - 0x636014c2, // n0x0454 c0x018d (n0x1d77-n0x1d88) + I ve - 0x0027d4c5, // n0x0455 c0x0000 (---------------) + I vegas - 0x00227248, // n0x0456 c0x0000 (---------------) + I ventures - 0x002d998c, // n0x0457 c0x0000 (---------------) + I versicherung - 0x0022b9c3, // n0x0458 c0x0000 (---------------) + I vet - 0x0024ad42, // n0x0459 c0x0000 (---------------) + I vg - 0x63a13602, // n0x045a c0x018e (n0x1d88-n0x1d8d) + I vi - 0x002b4346, // n0x045b c0x0000 (---------------) + I viajes - 0x002db9c5, // n0x045c c0x0000 (---------------) + I video - 0x002b1403, // n0x045d c0x0000 (---------------) + I vig - 0x002c7686, // n0x045e c0x0000 (---------------) + I viking - 0x002dbb06, // n0x045f c0x0000 (---------------) + I villas - 0x00213603, // n0x0460 c0x0000 (---------------) + I vin - 0x002dc703, // n0x0461 c0x0000 (---------------) + I vip - 0x002dd146, // n0x0462 c0x0000 (---------------) + I virgin - 0x00248b46, // n0x0463 c0x0000 (---------------) + I vision - 0x002b85c5, // n0x0464 c0x0000 (---------------) + I vista - 0x002dd6ca, // n0x0465 c0x0000 (---------------) + I vistaprint - 0x0022cf04, // n0x0466 c0x0000 (---------------) + I viva - 0x00332eca, // n0x0467 c0x0000 (---------------) + I vlaanderen - 0x63e08102, // n0x0468 c0x018f (n0x1d8d-n0x1d9a) + I vn - 0x002716c5, // n0x0469 c0x0000 (---------------) + I vodka - 0x002e0c8a, // n0x046a c0x0000 (---------------) + I volkswagen - 0x002e2484, // n0x046b c0x0000 (---------------) + I vote - 0x002e2586, // n0x046c c0x0000 (---------------) + I voting - 0x002e2704, // n0x046d c0x0000 (---------------) + I voto - 0x0030c486, // n0x046e c0x0000 (---------------) + I voyage - 0x6421d102, // n0x046f c0x0190 (n0x1d9a-n0x1d9e) + I vu - 0x002a4e86, // n0x0470 c0x0000 (---------------) + I vuelos - 0x0036cbc5, // n0x0471 c0x0000 (---------------) + I wales - 0x0038b0c6, // n0x0472 c0x0000 (---------------) + I walter - 0x003578c4, // n0x0473 c0x0000 (---------------) + I wang - 0x003578c7, // n0x0474 c0x0000 (---------------) + I wanggou - 0x00351a06, // n0x0475 c0x0000 (---------------) + I warman - 0x0020acc5, // n0x0476 c0x0000 (---------------) + I watch - 0x00293647, // n0x0477 c0x0000 (---------------) + I watches - 0x00384107, // n0x0478 c0x0000 (---------------) + I weather - 0x0038410e, // n0x0479 c0x0000 (---------------) + I weatherchannel - 0x00219fc6, // n0x047a c0x0000 (---------------) + I webcam - 0x00251cc5, // n0x047b c0x0000 (---------------) + I weber - 0x002af047, // n0x047c c0x0000 (---------------) + I website - 0x002d4bc3, // n0x047d c0x0000 (---------------) + I wed - 0x0031c007, // n0x047e c0x0000 (---------------) + I wedding - 0x003912c5, // n0x047f c0x0000 (---------------) + I weibo - 0x0020a184, // n0x0480 c0x0000 (---------------) + I weir - 0x0021f7c2, // n0x0481 c0x0000 (---------------) + I wf - 0x002c7207, // n0x0482 c0x0000 (---------------) + I whoswho - 0x002d2e44, // n0x0483 c0x0000 (---------------) + I wien - 0x0025a484, // n0x0484 c0x0000 (---------------) + I wiki - 0x0024910b, // n0x0485 c0x0000 (---------------) + I williamhill - 0x00213c83, // n0x0486 c0x0000 (---------------) + I win - 0x002b6a07, // n0x0487 c0x0000 (---------------) + I windows - 0x00213c84, // n0x0488 c0x0000 (---------------) + I wine - 0x00231fc3, // n0x0489 c0x0000 (---------------) + I wme - 0x00241b04, // n0x048a c0x0000 (---------------) + I work - 0x0029b085, // n0x048b c0x0000 (---------------) + I works - 0x00314905, // n0x048c c0x0000 (---------------) + I world - 0x6460ba82, // n0x048d c0x0191 (n0x1d9e-n0x1da5) + I ws - 0x002e34c3, // n0x048e c0x0000 (---------------) + I wtc - 0x002e3b03, // n0x048f c0x0000 (---------------) + I wtf - 0x0020a6c4, // n0x0490 c0x0000 (---------------) + I xbox - 0x0020a785, // n0x0491 c0x0000 (---------------) + I xerox - 0x00217cc6, // n0x0492 c0x0000 (---------------) + I xihuan - 0x00356e83, // n0x0493 c0x0000 (---------------) + I xin - 0x002358cb, // n0x0494 c0x0000 (---------------) + I xn--11b4c3d - 0x0023d74b, // n0x0495 c0x0000 (---------------) + I xn--1ck2e1b - 0x00291d4b, // n0x0496 c0x0000 (---------------) + I xn--1qqw23a - 0x002bfeca, // n0x0497 c0x0000 (---------------) + I xn--30rr7y - 0x0033588b, // n0x0498 c0x0000 (---------------) + I xn--3bst00m - 0x003942cb, // n0x0499 c0x0000 (---------------) + I xn--3ds443g - 0x0039658c, // n0x049a c0x0000 (---------------) + I xn--3e0b707e - 0x00397251, // n0x049b c0x0000 (---------------) + I xn--3oq18vl8pn36a - 0x002e480a, // n0x049c c0x0000 (---------------) + I xn--3pxu8k - 0x002e4bcb, // n0x049d c0x0000 (---------------) + I xn--42c2d9a - 0x002e4e8b, // n0x049e c0x0000 (---------------) + I xn--45brj9c - 0x002e6d4a, // n0x049f c0x0000 (---------------) + I xn--45q11c - 0x002e780a, // n0x04a0 c0x0000 (---------------) + I xn--4gbrim - 0x002e8b8e, // n0x04a1 c0x0000 (---------------) + I xn--54b7fta0cc - 0x002e9e4b, // n0x04a2 c0x0000 (---------------) + I xn--55qw42g - 0x002ea10a, // n0x04a3 c0x0000 (---------------) + I xn--55qx5d - 0x002eb14a, // n0x04a4 c0x0000 (---------------) + I xn--5tzm5g - 0x002eb64b, // n0x04a5 c0x0000 (---------------) + I xn--6frz82g - 0x002ebb8e, // n0x04a6 c0x0000 (---------------) + I xn--6qq986b3xl - 0x002ec6cc, // n0x04a7 c0x0000 (---------------) + I xn--80adxhks - 0x002ecb4b, // n0x04a8 c0x0000 (---------------) + I xn--80ao21a - 0x002ece0c, // n0x04a9 c0x0000 (---------------) + I xn--80asehdb - 0x002f108a, // n0x04aa c0x0000 (---------------) + I xn--80aswg - 0x002f228c, // n0x04ab c0x0000 (---------------) + I xn--8y0a063a - 0x64af258a, // n0x04ac c0x0192 (n0x1da5-n0x1dab) + I xn--90a3ac - 0x002f5849, // n0x04ad c0x0000 (---------------) + I xn--90ais - 0x002f664a, // n0x04ae c0x0000 (---------------) + I xn--9dbq2a - 0x002f68ca, // n0x04af c0x0000 (---------------) + I xn--9et52u - 0x002f6b4b, // n0x04b0 c0x0000 (---------------) + I xn--9krt00a - 0x002fa44e, // n0x04b1 c0x0000 (---------------) + I xn--b4w605ferd - 0x002fa7d1, // n0x04b2 c0x0000 (---------------) + I xn--bck1b9a5dre4c - 0x00303289, // n0x04b3 c0x0000 (---------------) + I xn--c1avg - 0x003034ca, // n0x04b4 c0x0000 (---------------) + I xn--c2br7g - 0x00303e0b, // n0x04b5 c0x0000 (---------------) + I xn--cck2b3b - 0x0030618a, // n0x04b6 c0x0000 (---------------) + I xn--cg4bki - 0x00306d16, // n0x04b7 c0x0000 (---------------) + I xn--clchc0ea0b2g2a9gcd - 0x003091cb, // n0x04b8 c0x0000 (---------------) + I xn--czr694b - 0x0030a9ca, // n0x04b9 c0x0000 (---------------) + I xn--czrs0t - 0x0030d48a, // n0x04ba c0x0000 (---------------) + I xn--czru2d - 0x0030f2cb, // n0x04bb c0x0000 (---------------) + I xn--d1acj3b - 0x003125c9, // n0x04bc c0x0000 (---------------) + I xn--d1alf - 0x0031508d, // n0x04bd c0x0000 (---------------) + I xn--eckvdtc9d - 0x003167cb, // n0x04be c0x0000 (---------------) + I xn--efvy88h - 0x003178cb, // n0x04bf c0x0000 (---------------) + I xn--estv75g - 0x0031828b, // n0x04c0 c0x0000 (---------------) + I xn--fct429k - 0x00319909, // n0x04c1 c0x0000 (---------------) + I xn--fhbei - 0x00319f4e, // n0x04c2 c0x0000 (---------------) + I xn--fiq228c5hs - 0x0031a48a, // n0x04c3 c0x0000 (---------------) + I xn--fiq64b - 0x0031ec0a, // n0x04c4 c0x0000 (---------------) + I xn--fiqs8s - 0x0031f0ca, // n0x04c5 c0x0000 (---------------) + I xn--fiqz9s - 0x0031fa8b, // n0x04c6 c0x0000 (---------------) + I xn--fjq720a - 0x003202cb, // n0x04c7 c0x0000 (---------------) + I xn--flw351e - 0x0032058d, // n0x04c8 c0x0000 (---------------) + I xn--fpcrj9c3d - 0x00321e0d, // n0x04c9 c0x0000 (---------------) + I xn--fzc2c9e2c - 0x00322dd0, // n0x04ca c0x0000 (---------------) + I xn--fzys8d69uvgm - 0x0032328b, // n0x04cb c0x0000 (---------------) + I xn--g2xx48c - 0x00323ecc, // n0x04cc c0x0000 (---------------) + I xn--gckr3f0f - 0x0032434b, // n0x04cd c0x0000 (---------------) + I xn--gecrj9c - 0x0032880b, // n0x04ce c0x0000 (---------------) + I xn--h2brj9c - 0x0032f14b, // n0x04cf c0x0000 (---------------) + I xn--hxt814e - 0x0032fbcf, // n0x04d0 c0x0000 (---------------) + I xn--i1b6b1a6a2e - 0x0032ff8b, // n0x04d1 c0x0000 (---------------) + I xn--imr513n - 0x0033080a, // n0x04d2 c0x0000 (---------------) + I xn--io0a7i - 0x00331249, // n0x04d3 c0x0000 (---------------) + I xn--j1aef - 0x003315c9, // n0x04d4 c0x0000 (---------------) + I xn--j1amh - 0x0033198b, // n0x04d5 c0x0000 (---------------) + I xn--j6w193g - 0x00331c4e, // n0x04d6 c0x0000 (---------------) + I xn--jlq61u9w7b - 0x0033354b, // n0x04d7 c0x0000 (---------------) + I xn--jvr189m - 0x0033444f, // n0x04d8 c0x0000 (---------------) + I xn--kcrx77d1x4a - 0x00337d8b, // n0x04d9 c0x0000 (---------------) + I xn--kprw13d - 0x0033804b, // n0x04da c0x0000 (---------------) + I xn--kpry57d - 0x0033830b, // n0x04db c0x0000 (---------------) + I xn--kpu716f - 0x00338e0a, // n0x04dc c0x0000 (---------------) + I xn--kput3i - 0x0033db49, // n0x04dd c0x0000 (---------------) + I xn--l1acc - 0x00344dcf, // n0x04de c0x0000 (---------------) + I xn--lgbbat1ad8j - 0x0034978c, // n0x04df c0x0000 (---------------) + I xn--mgb2ddes - 0x00349c8c, // n0x04e0 c0x0000 (---------------) + I xn--mgb9awbf - 0x0034a18e, // n0x04e1 c0x0000 (---------------) + I xn--mgba3a3ejt - 0x0034a88f, // n0x04e2 c0x0000 (---------------) + I xn--mgba3a4f16a - 0x0034ac4e, // n0x04e3 c0x0000 (---------------) + I xn--mgba3a4fra - 0x0034b750, // n0x04e4 c0x0000 (---------------) + I xn--mgba7c0bbn0a - 0x0034bb4e, // n0x04e5 c0x0000 (---------------) + I xn--mgbaam7a8h - 0x0034c10c, // n0x04e6 c0x0000 (---------------) + I xn--mgbab2bd - 0x0034c412, // n0x04e7 c0x0000 (---------------) + I xn--mgbai9a5eva00b - 0x0034f091, // n0x04e8 c0x0000 (---------------) + I xn--mgbai9azgqp6j - 0x0034f64e, // n0x04e9 c0x0000 (---------------) + I xn--mgbayh7gpa - 0x0034fa8e, // n0x04ea c0x0000 (---------------) + I xn--mgbb9fbpob - 0x0034ffce, // n0x04eb c0x0000 (---------------) + I xn--mgbbh1a71e - 0x0035034f, // n0x04ec c0x0000 (---------------) + I xn--mgbc0a9azcg - 0x00350713, // n0x04ed c0x0000 (---------------) + I xn--mgberp4a5d4a87g - 0x00350bd1, // n0x04ee c0x0000 (---------------) + I xn--mgberp4a5d4ar - 0x0035100c, // n0x04ef c0x0000 (---------------) + I xn--mgbpl2fh - 0x00351453, // n0x04f0 c0x0000 (---------------) + I xn--mgbqly7c0a67fbc - 0x00352310, // n0x04f1 c0x0000 (---------------) + I xn--mgbqly7cvafr - 0x00352e0c, // n0x04f2 c0x0000 (---------------) + I xn--mgbt3dhd - 0x0035310c, // n0x04f3 c0x0000 (---------------) + I xn--mgbtf8fl - 0x003535cb, // n0x04f4 c0x0000 (---------------) + I xn--mgbtx2b - 0x0035588e, // n0x04f5 c0x0000 (---------------) + I xn--mgbx4cd0ab - 0x00355e8b, // n0x04f6 c0x0000 (---------------) + I xn--mix082f - 0x003564cb, // n0x04f7 c0x0000 (---------------) + I xn--mix891f - 0x0035728c, // n0x04f8 c0x0000 (---------------) + I xn--mk1bu44c - 0x0035c6ca, // n0x04f9 c0x0000 (---------------) + I xn--mxtq1m - 0x0035ca8c, // n0x04fa c0x0000 (---------------) + I xn--ngbc5azd - 0x0035cd8c, // n0x04fb c0x0000 (---------------) + I xn--ngbe9e0a - 0x0035f64b, // n0x04fc c0x0000 (---------------) + I xn--nnx388a - 0x0035f908, // n0x04fd c0x0000 (---------------) + I xn--node - 0x00360249, // n0x04fe c0x0000 (---------------) + I xn--nqv7f - 0x0036024f, // n0x04ff c0x0000 (---------------) + I xn--nqv7fs00ema - 0x00361f8b, // n0x0500 c0x0000 (---------------) + I xn--nyqy26a - 0x003633ca, // n0x0501 c0x0000 (---------------) + I xn--o3cw4h - 0x00364d8c, // n0x0502 c0x0000 (---------------) + I xn--ogbpf8fl - 0x00366089, // n0x0503 c0x0000 (---------------) + I xn--p1acf - 0x00366308, // n0x0504 c0x0000 (---------------) + I xn--p1ai - 0x00366f8b, // n0x0505 c0x0000 (---------------) + I xn--pbt977c - 0x003676cb, // n0x0506 c0x0000 (---------------) + I xn--pgbs0dh - 0x00368a8a, // n0x0507 c0x0000 (---------------) + I xn--pssy2u - 0x00368d0b, // n0x0508 c0x0000 (---------------) + I xn--q9jyb4c - 0x0036944c, // n0x0509 c0x0000 (---------------) + I xn--qcka1pmc - 0x0036a988, // n0x050a c0x0000 (---------------) + I xn--qxam - 0x0037230b, // n0x050b c0x0000 (---------------) + I xn--rhqv96g - 0x00374d8b, // n0x050c c0x0000 (---------------) + I xn--rovu88b - 0x0037824b, // n0x050d c0x0000 (---------------) + I xn--s9brj9c - 0x00379a8b, // n0x050e c0x0000 (---------------) + I xn--ses554g - 0x00383c8b, // n0x050f c0x0000 (---------------) + I xn--t60b56a - 0x00383f49, // n0x0510 c0x0000 (---------------) + I xn--tckwe - 0x00387fca, // n0x0511 c0x0000 (---------------) + I xn--unup4y - 0x00388f17, // n0x0512 c0x0000 (---------------) + I xn--vermgensberater-ctb - 0x0038a918, // n0x0513 c0x0000 (---------------) + I xn--vermgensberatung-pwb - 0x0038dcc9, // n0x0514 c0x0000 (---------------) + I xn--vhquv - 0x0038f00b, // n0x0515 c0x0000 (---------------) + I xn--vuq861b - 0x0038fb94, // n0x0516 c0x0000 (---------------) + I xn--w4r85el8fhu5dnra - 0x0039034a, // n0x0517 c0x0000 (---------------) + I xn--wgbh1c - 0x0039090a, // n0x0518 c0x0000 (---------------) + I xn--wgbl6a - 0x00390b8b, // n0x0519 c0x0000 (---------------) + I xn--xhq521b - 0x00391a90, // n0x051a c0x0000 (---------------) + I xn--xkc2al3hye2a - 0x00391e91, // n0x051b c0x0000 (---------------) + I xn--xkc2dl3a5ee0h - 0x0039290a, // n0x051c c0x0000 (---------------) + I xn--y9a3aq - 0x003938cd, // n0x051d c0x0000 (---------------) + I xn--yfro4i67o - 0x00393fcd, // n0x051e c0x0000 (---------------) + I xn--ygbi2ammx - 0x0039688b, // n0x051f c0x0000 (---------------) + I xn--zfr164b - 0x00397046, // n0x0520 c0x0000 (---------------) + I xperia - 0x003971c3, // n0x0521 c0x0000 (---------------) + I xxx - 0x0029ad43, // n0x0522 c0x0000 (---------------) + I xyz - 0x00269586, // n0x0523 c0x0000 (---------------) + I yachts - 0x0027b905, // n0x0524 c0x0000 (---------------) + I yahoo - 0x002151c7, // n0x0525 c0x0000 (---------------) + I yamaxun - 0x00326dc6, // n0x0526 c0x0000 (---------------) + I yandex - 0x01614d82, // n0x0527 c0x0005 (---------------)* o I ye - 0x002e3609, // n0x0528 c0x0000 (---------------) + I yodobashi - 0x00301804, // n0x0529 c0x0000 (---------------) + I yoga - 0x0032b5c8, // n0x052a c0x0000 (---------------) + I yokohama - 0x00235bc3, // n0x052b c0x0000 (---------------) + I you - 0x0035a047, // n0x052c c0x0000 (---------------) + I youtube - 0x0022f542, // n0x052d c0x0000 (---------------) + I yt - 0x00201943, // n0x052e c0x0000 (---------------) + I yun - 0x64e043c2, // n0x052f c0x0193 (n0x1dab-n0x1dbc) o I za - 0x002b3106, // n0x0530 c0x0000 (---------------) + I zappos - 0x002b3c84, // n0x0531 c0x0000 (---------------) + I zara - 0x00311384, // n0x0532 c0x0000 (---------------) + I zero - 0x0023b443, // n0x0533 c0x0000 (---------------) + I zip - 0x0023b445, // n0x0534 c0x0000 (---------------) + I zippo - 0x016e4582, // n0x0535 c0x0005 (---------------)* o I zm - 0x002c7ec4, // n0x0536 c0x0000 (---------------) + I zone - 0x00261407, // n0x0537 c0x0000 (---------------) + I zuerich - 0x016a0202, // n0x0538 c0x0005 (---------------)* o I zw - 0x00222ac3, // n0x0539 c0x0000 (---------------) + I com - 0x002d75c3, // n0x053a c0x0000 (---------------) + I edu - 0x0021e283, // n0x053b c0x0000 (---------------) + I gov - 0x0023fa03, // n0x053c c0x0000 (---------------) + I mil - 0x002170c3, // n0x053d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x053e c0x0000 (---------------) + I org - 0x00207cc3, // n0x053f c0x0000 (---------------) + I nom - 0x00201e82, // n0x0540 c0x0000 (---------------) + I ac - 0x000e4188, // n0x0541 c0x0000 (---------------) + blogspot - 0x00200742, // n0x0542 c0x0000 (---------------) + I co - 0x0021e283, // n0x0543 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x0544 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0545 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0546 c0x0000 (---------------) + I org - 0x00206103, // n0x0547 c0x0000 (---------------) + I sch - 0x002ffad6, // n0x0548 c0x0000 (---------------) + I accident-investigation - 0x00301f93, // n0x0549 c0x0000 (---------------) + I accident-prevention - 0x00340589, // n0x054a c0x0000 (---------------) + I aerobatic - 0x002751c8, // n0x054b c0x0000 (---------------) + I aeroclub - 0x0036bb09, // n0x054c c0x0000 (---------------) + I aerodrome - 0x002e0e06, // n0x054d c0x0000 (---------------) + I agents - 0x0032cf10, // n0x054e c0x0000 (---------------) + I air-surveillance - 0x00211893, // n0x054f c0x0000 (---------------) + I air-traffic-control - 0x002fb3c8, // n0x0550 c0x0000 (---------------) + I aircraft - 0x00262307, // n0x0551 c0x0000 (---------------) + I airline - 0x00266e47, // n0x0552 c0x0000 (---------------) + I airport - 0x0028bd4a, // n0x0553 c0x0000 (---------------) + I airtraffic - 0x003541c9, // n0x0554 c0x0000 (---------------) + I ambulance - 0x00309f89, // n0x0555 c0x0000 (---------------) + I amusement - 0x002bbacb, // n0x0556 c0x0000 (---------------) + I association - 0x002f8406, // n0x0557 c0x0000 (---------------) + I author - 0x002ed6ca, // n0x0558 c0x0000 (---------------) + I ballooning - 0x00218046, // n0x0559 c0x0000 (---------------) + I broker - 0x00301403, // n0x055a c0x0000 (---------------) + I caa - 0x002dc1c5, // n0x055b c0x0000 (---------------) + I cargo - 0x003246c8, // n0x055c c0x0000 (---------------) + I catering - 0x00240acd, // n0x055d c0x0000 (---------------) + I certification - 0x0032cacc, // n0x055e c0x0000 (---------------) + I championship - 0x0036c887, // n0x055f c0x0000 (---------------) + I charter - 0x00328a8d, // n0x0560 c0x0000 (---------------) + I civilaviation - 0x002752c4, // n0x0561 c0x0000 (---------------) + I club - 0x0022498a, // n0x0562 c0x0000 (---------------) + I conference - 0x002255ca, // n0x0563 c0x0000 (---------------) + I consultant - 0x00225a8a, // n0x0564 c0x0000 (---------------) + I consulting - 0x00211b87, // n0x0565 c0x0000 (---------------) + I control - 0x0022cd47, // n0x0566 c0x0000 (---------------) + I council - 0x00231004, // n0x0567 c0x0000 (---------------) + I crew - 0x00232f46, // n0x0568 c0x0000 (---------------) + I design - 0x002727c4, // n0x0569 c0x0000 (---------------) + I dgca - 0x00336208, // n0x056a c0x0000 (---------------) + I educator - 0x00343bc9, // n0x056b c0x0000 (---------------) + I emergency - 0x002a8a86, // n0x056c c0x0000 (---------------) + I engine - 0x002a8a88, // n0x056d c0x0000 (---------------) + I engineer - 0x00233a4d, // n0x056e c0x0000 (---------------) + I entertainment - 0x0021f909, // n0x056f c0x0000 (---------------) + I equipment - 0x002f3908, // n0x0570 c0x0000 (---------------) + I exchange - 0x0029ab47, // n0x0571 c0x0000 (---------------) + I express - 0x0026ac0a, // n0x0572 c0x0000 (---------------) + I federation - 0x0023b146, // n0x0573 c0x0000 (---------------) + I flight - 0x00248ec7, // n0x0574 c0x0000 (---------------) + I freight - 0x0024d004, // n0x0575 c0x0000 (---------------) + I fuel - 0x00256007, // n0x0576 c0x0000 (---------------) + I gliding - 0x00259a0a, // n0x0577 c0x0000 (---------------) + I government - 0x0037868e, // n0x0578 c0x0000 (---------------) + I groundhandling - 0x002646c5, // n0x0579 c0x0000 (---------------) + I group - 0x0038718b, // n0x057a c0x0000 (---------------) + I hanggliding - 0x00278ac9, // n0x057b c0x0000 (---------------) + I homebuilt - 0x002806c9, // n0x057c c0x0000 (---------------) + I insurance - 0x00202987, // n0x057d c0x0000 (---------------) + I journal - 0x0020298a, // n0x057e c0x0000 (---------------) + I journalist - 0x00274187, // n0x057f c0x0000 (---------------) + I leasing - 0x002127c9, // n0x0580 c0x0000 (---------------) + I logistics - 0x00395948, // n0x0581 c0x0000 (---------------) + I magazine - 0x002a0c8b, // n0x0582 c0x0000 (---------------) + I maintenance - 0x003117cb, // n0x0583 c0x0000 (---------------) + I marketplace - 0x002dc385, // n0x0584 c0x0000 (---------------) + I media - 0x00236c8a, // n0x0585 c0x0000 (---------------) + I microlight - 0x002371c9, // n0x0586 c0x0000 (---------------) + I modelling - 0x00354cca, // n0x0587 c0x0000 (---------------) + I navigation - 0x0022948b, // n0x0588 c0x0000 (---------------) + I parachuting - 0x00255f0b, // n0x0589 c0x0000 (---------------) + I paragliding - 0x002bb855, // n0x058a c0x0000 (---------------) + I passenger-association - 0x002c1505, // n0x058b c0x0000 (---------------) + I pilot - 0x0029abc5, // n0x058c c0x0000 (---------------) + I press - 0x002cbe4a, // n0x058d c0x0000 (---------------) + I production - 0x002e634a, // n0x058e c0x0000 (---------------) + I recreation - 0x002e0107, // n0x058f c0x0000 (---------------) + I repbody - 0x00215503, // n0x0590 c0x0000 (---------------) + I res - 0x00296808, // n0x0591 c0x0000 (---------------) + I research - 0x002bc30a, // n0x0592 c0x0000 (---------------) + I rotorcraft - 0x00234786, // n0x0593 c0x0000 (---------------) + I safety - 0x0023f089, // n0x0594 c0x0000 (---------------) + I scientist - 0x00243bc8, // n0x0595 c0x0000 (---------------) + I services - 0x002b3884, // n0x0596 c0x0000 (---------------) + I show - 0x00253c09, // n0x0597 c0x0000 (---------------) + I skydiving - 0x002a6c88, // n0x0598 c0x0000 (---------------) + I software - 0x00298587, // n0x0599 c0x0000 (---------------) + I student - 0x00217c44, // n0x059a c0x0000 (---------------) + I taxi - 0x00229a46, // n0x059b c0x0000 (---------------) + I trader - 0x0028fe07, // n0x059c c0x0000 (---------------) + I trading - 0x0028aec7, // n0x059d c0x0000 (---------------) + I trainer - 0x00230a45, // n0x059e c0x0000 (---------------) + I union - 0x002e04cc, // n0x059f c0x0000 (---------------) + I workinggroup - 0x0029b085, // n0x05a0 c0x0000 (---------------) + I works - 0x00222ac3, // n0x05a1 c0x0000 (---------------) + I com - 0x002d75c3, // n0x05a2 c0x0000 (---------------) + I edu - 0x0021e283, // n0x05a3 c0x0000 (---------------) + I gov - 0x002170c3, // n0x05a4 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x05a5 c0x0000 (---------------) + I org - 0x00200742, // n0x05a6 c0x0000 (---------------) + I co - 0x00222ac3, // n0x05a7 c0x0000 (---------------) + I com - 0x002170c3, // n0x05a8 c0x0000 (---------------) + I net - 0x00207cc3, // n0x05a9 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x05aa c0x0000 (---------------) + I org - 0x00222ac3, // n0x05ab c0x0000 (---------------) + I com - 0x002170c3, // n0x05ac c0x0000 (---------------) + I net - 0x00219c43, // n0x05ad c0x0000 (---------------) + I off - 0x0021dcc3, // n0x05ae c0x0000 (---------------) + I org - 0x000e4188, // n0x05af c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x05b0 c0x0000 (---------------) + I com - 0x002d75c3, // n0x05b1 c0x0000 (---------------) + I edu - 0x0021e283, // n0x05b2 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x05b3 c0x0000 (---------------) + I mil - 0x002170c3, // n0x05b4 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x05b5 c0x0000 (---------------) + I org - 0x000e4188, // n0x05b6 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x05b7 c0x0000 (---------------) + I com - 0x002d75c3, // n0x05b8 c0x0000 (---------------) + I edu - 0x002170c3, // n0x05b9 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x05ba c0x0000 (---------------) + I org - 0x00200742, // n0x05bb c0x0000 (---------------) + I co - 0x00203fc2, // n0x05bc c0x0000 (---------------) + I ed - 0x00225cc2, // n0x05bd c0x0000 (---------------) + I gv - 0x00206e82, // n0x05be c0x0000 (---------------) + I it - 0x002003c2, // n0x05bf c0x0000 (---------------) + I og - 0x00268e82, // n0x05c0 c0x0000 (---------------) + I pb - 0x04a22ac3, // n0x05c1 c0x0012 (n0x05ca-n0x05cb) + I com - 0x002d75c3, // n0x05c2 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x05c3 c0x0000 (---------------) + I gob - 0x0021e283, // n0x05c4 c0x0000 (---------------) + I gov - 0x00238c03, // n0x05c5 c0x0000 (---------------) + I int - 0x0023fa03, // n0x05c6 c0x0000 (---------------) + I mil - 0x002170c3, // n0x05c7 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x05c8 c0x0000 (---------------) + I org - 0x00227303, // n0x05c9 c0x0000 (---------------) + I tur - 0x000e4188, // n0x05ca c0x0000 (---------------) + blogspot - 0x002f5744, // n0x05cb c0x0000 (---------------) + I e164 - 0x0034d5c7, // n0x05cc c0x0000 (---------------) + I in-addr - 0x00213a43, // n0x05cd c0x0000 (---------------) + I ip6 - 0x00234684, // n0x05ce c0x0000 (---------------) + I iris - 0x00202803, // n0x05cf c0x0000 (---------------) + I uri - 0x00202a03, // n0x05d0 c0x0000 (---------------) + I urn - 0x0021e283, // n0x05d1 c0x0000 (---------------) + I gov - 0x00201e82, // n0x05d2 c0x0000 (---------------) + I ac - 0x00110603, // n0x05d3 c0x0000 (---------------) + biz - 0x05a00742, // n0x05d4 c0x0016 (n0x05d9-n0x05da) + I co - 0x00225cc2, // n0x05d5 c0x0000 (---------------) + I gv - 0x00000304, // n0x05d6 c0x0000 (---------------) + info - 0x00200c42, // n0x05d7 c0x0000 (---------------) + I or - 0x000cba44, // n0x05d8 c0x0000 (---------------) + priv - 0x000e4188, // n0x05d9 c0x0000 (---------------) + blogspot - 0x00226043, // n0x05da c0x0000 (---------------) + I act - 0x002a00c3, // n0x05db c0x0000 (---------------) + I asn - 0x06222ac3, // n0x05dc c0x0018 (n0x05ec-n0x05ed) + I com - 0x00224984, // n0x05dd c0x0000 (---------------) + I conf - 0x066d75c3, // n0x05de c0x0019 (n0x05ed-n0x05f5) + I edu - 0x06a1e283, // n0x05df c0x001a (n0x05f5-n0x05fa) + I gov - 0x00206202, // n0x05e0 c0x0000 (---------------) + I id - 0x00200304, // n0x05e1 c0x0000 (---------------) + I info - 0x002170c3, // n0x05e2 c0x0000 (---------------) + I net - 0x0020ac43, // n0x05e3 c0x0000 (---------------) + I nsw - 0x00200e02, // n0x05e4 c0x0000 (---------------) + I nt - 0x0021dcc3, // n0x05e5 c0x0000 (---------------) + I org - 0x00212bc2, // n0x05e6 c0x0000 (---------------) + I oz - 0x002ce743, // n0x05e7 c0x0000 (---------------) + I qld - 0x00201a02, // n0x05e8 c0x0000 (---------------) + I sa - 0x00200143, // n0x05e9 c0x0000 (---------------) + I tas - 0x00243c83, // n0x05ea c0x0000 (---------------) + I vic - 0x00202542, // n0x05eb c0x0000 (---------------) + I wa - 0x000e4188, // n0x05ec c0x0000 (---------------) + blogspot - 0x00226043, // n0x05ed c0x0000 (---------------) + I act - 0x0020ac43, // n0x05ee c0x0000 (---------------) + I nsw - 0x00200e02, // n0x05ef c0x0000 (---------------) + I nt - 0x002ce743, // n0x05f0 c0x0000 (---------------) + I qld - 0x00201a02, // n0x05f1 c0x0000 (---------------) + I sa - 0x00200143, // n0x05f2 c0x0000 (---------------) + I tas - 0x00243c83, // n0x05f3 c0x0000 (---------------) + I vic - 0x00202542, // n0x05f4 c0x0000 (---------------) + I wa - 0x002ce743, // n0x05f5 c0x0000 (---------------) + I qld - 0x00201a02, // n0x05f6 c0x0000 (---------------) + I sa - 0x00200143, // n0x05f7 c0x0000 (---------------) + I tas - 0x00243c83, // n0x05f8 c0x0000 (---------------) + I vic - 0x00202542, // n0x05f9 c0x0000 (---------------) + I wa - 0x00222ac3, // n0x05fa c0x0000 (---------------) + I com - 0x00310603, // n0x05fb c0x0000 (---------------) + I biz - 0x00222ac3, // n0x05fc c0x0000 (---------------) + I com - 0x002d75c3, // n0x05fd c0x0000 (---------------) + I edu - 0x0021e283, // n0x05fe c0x0000 (---------------) + I gov - 0x00200304, // n0x05ff c0x0000 (---------------) + I info - 0x00238c03, // n0x0600 c0x0000 (---------------) + I int - 0x0023fa03, // n0x0601 c0x0000 (---------------) + I mil - 0x00298944, // n0x0602 c0x0000 (---------------) + I name - 0x002170c3, // n0x0603 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0604 c0x0000 (---------------) + I org - 0x00207742, // n0x0605 c0x0000 (---------------) + I pp - 0x00218243, // n0x0606 c0x0000 (---------------) + I pro - 0x000e4188, // n0x0607 c0x0000 (---------------) + blogspot - 0x00200742, // n0x0608 c0x0000 (---------------) + I co - 0x00222ac3, // n0x0609 c0x0000 (---------------) + I com - 0x002d75c3, // n0x060a c0x0000 (---------------) + I edu - 0x0021e283, // n0x060b c0x0000 (---------------) + I gov - 0x0023fa03, // n0x060c c0x0000 (---------------) + I mil - 0x002170c3, // n0x060d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x060e c0x0000 (---------------) + I org - 0x002060c2, // n0x060f c0x0000 (---------------) + I rs - 0x00262644, // n0x0610 c0x0000 (---------------) + I unbi - 0x00201984, // n0x0611 c0x0000 (---------------) + I unsa - 0x00310603, // n0x0612 c0x0000 (---------------) + I biz - 0x00200742, // n0x0613 c0x0000 (---------------) + I co - 0x00222ac3, // n0x0614 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0615 c0x0000 (---------------) + I edu - 0x0021e283, // n0x0616 c0x0000 (---------------) + I gov - 0x00200304, // n0x0617 c0x0000 (---------------) + I info - 0x002170c3, // n0x0618 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0619 c0x0000 (---------------) + I org - 0x002cf4c5, // n0x061a c0x0000 (---------------) + I store - 0x0020bf42, // n0x061b c0x0000 (---------------) + I tv - 0x00201e82, // n0x061c c0x0000 (---------------) + I ac - 0x000e4188, // n0x061d c0x0000 (---------------) + blogspot - 0x0021e283, // n0x061e c0x0000 (---------------) + I gov - 0x00225381, // n0x061f c0x0000 (---------------) + I 0 - 0x00223681, // n0x0620 c0x0000 (---------------) + I 1 - 0x0023d901, // n0x0621 c0x0000 (---------------) + I 2 - 0x00235b01, // n0x0622 c0x0000 (---------------) + I 3 - 0x00235a81, // n0x0623 c0x0000 (---------------) + I 4 - 0x002b1e01, // n0x0624 c0x0000 (---------------) + I 5 - 0x00213ac1, // n0x0625 c0x0000 (---------------) + I 6 - 0x00225481, // n0x0626 c0x0000 (---------------) + I 7 - 0x002e4a01, // n0x0627 c0x0000 (---------------) + I 8 - 0x002e4e01, // n0x0628 c0x0000 (---------------) + I 9 - 0x00200181, // n0x0629 c0x0000 (---------------) + I a - 0x00200001, // n0x062a c0x0000 (---------------) + I b - 0x000e4188, // n0x062b c0x0000 (---------------) + blogspot - 0x00200741, // n0x062c c0x0000 (---------------) + I c - 0x002005c1, // n0x062d c0x0000 (---------------) + I d - 0x00200701, // n0x062e c0x0000 (---------------) + I e - 0x00200381, // n0x062f c0x0000 (---------------) + I f - 0x00200401, // n0x0630 c0x0000 (---------------) + I g - 0x00200201, // n0x0631 c0x0000 (---------------) + I h - 0x00200041, // n0x0632 c0x0000 (---------------) + I i - 0x00201f81, // n0x0633 c0x0000 (---------------) + I j - 0x00201001, // n0x0634 c0x0000 (---------------) + I k - 0x002008c1, // n0x0635 c0x0000 (---------------) + I l - 0x002000c1, // n0x0636 c0x0000 (---------------) + I m - 0x00200281, // n0x0637 c0x0000 (---------------) + I n - 0x00200081, // n0x0638 c0x0000 (---------------) + I o - 0x00200b01, // n0x0639 c0x0000 (---------------) + I p - 0x00211181, // n0x063a c0x0000 (---------------) + I q - 0x00200581, // n0x063b c0x0000 (---------------) + I r - 0x002001c1, // n0x063c c0x0000 (---------------) + I s - 0x00200141, // n0x063d c0x0000 (---------------) + I t - 0x00200101, // n0x063e c0x0000 (---------------) + I u - 0x002013c1, // n0x063f c0x0000 (---------------) + I v - 0x00202541, // n0x0640 c0x0000 (---------------) + I w - 0x00203ec1, // n0x0641 c0x0000 (---------------) + I x - 0x00200801, // n0x0642 c0x0000 (---------------) + I y - 0x00201901, // n0x0643 c0x0000 (---------------) + I z - 0x00222ac3, // n0x0644 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0645 c0x0000 (---------------) + I edu - 0x0021e283, // n0x0646 c0x0000 (---------------) + I gov - 0x002170c3, // n0x0647 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0648 c0x0000 (---------------) + I org - 0x00200742, // n0x0649 c0x0000 (---------------) + I co - 0x00222ac3, // n0x064a c0x0000 (---------------) + I com - 0x002d75c3, // n0x064b c0x0000 (---------------) + I edu - 0x00200c42, // n0x064c c0x0000 (---------------) + I or - 0x0021dcc3, // n0x064d c0x0000 (---------------) + I org - 0x00009ac6, // n0x064e c0x0000 (---------------) + dyndns - 0x00041d4a, // n0x064f c0x0000 (---------------) + for-better - 0x00076a48, // n0x0650 c0x0000 (---------------) + for-more - 0x00042348, // n0x0651 c0x0000 (---------------) + for-some - 0x00042c87, // n0x0652 c0x0000 (---------------) + for-the - 0x00130f46, // n0x0653 c0x0000 (---------------) + selfip - 0x00110e86, // n0x0654 c0x0000 (---------------) + webhop - 0x002729c4, // n0x0655 c0x0000 (---------------) + I asso - 0x002f4347, // n0x0656 c0x0000 (---------------) + I barreau - 0x000e4188, // n0x0657 c0x0000 (---------------) + blogspot - 0x003579c4, // n0x0658 c0x0000 (---------------) + I gouv - 0x00222ac3, // n0x0659 c0x0000 (---------------) + I com - 0x002d75c3, // n0x065a c0x0000 (---------------) + I edu - 0x0021e283, // n0x065b c0x0000 (---------------) + I gov - 0x002170c3, // n0x065c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x065d c0x0000 (---------------) + I org - 0x00222ac3, // n0x065e c0x0000 (---------------) + I com - 0x002d75c3, // n0x065f c0x0000 (---------------) + I edu - 0x0034eb03, // n0x0660 c0x0000 (---------------) + I gob - 0x0021e283, // n0x0661 c0x0000 (---------------) + I gov - 0x00238c03, // n0x0662 c0x0000 (---------------) + I int - 0x0023fa03, // n0x0663 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0664 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0665 c0x0000 (---------------) + I org - 0x0020bf42, // n0x0666 c0x0000 (---------------) + I tv - 0x002b2643, // n0x0667 c0x0000 (---------------) + I adm - 0x002db303, // n0x0668 c0x0000 (---------------) + I adv - 0x00256e43, // n0x0669 c0x0000 (---------------) + I agr - 0x00204942, // n0x066a c0x0000 (---------------) + I am - 0x00323d83, // n0x066b c0x0000 (---------------) + I arq - 0x00200603, // n0x066c c0x0000 (---------------) + I art - 0x00201643, // n0x066d c0x0000 (---------------) + I ato - 0x00200001, // n0x066e c0x0000 (---------------) + I b - 0x00200003, // n0x066f c0x0000 (---------------) + I bio - 0x002d0084, // n0x0670 c0x0000 (---------------) + I blog - 0x0031b803, // n0x0671 c0x0000 (---------------) + I bmd - 0x002f4243, // n0x0672 c0x0000 (---------------) + I cim - 0x002dbfc3, // n0x0673 c0x0000 (---------------) + I cng - 0x002211c3, // n0x0674 c0x0000 (---------------) + I cnt - 0x0a622ac3, // n0x0675 c0x0029 (n0x06ad-n0x06ae) + I com - 0x00228d44, // n0x0676 c0x0000 (---------------) + I coop - 0x00305ec3, // n0x0677 c0x0000 (---------------) + I ecn - 0x00200703, // n0x0678 c0x0000 (---------------) + I eco - 0x002d75c3, // n0x0679 c0x0000 (---------------) + I edu - 0x00226343, // n0x067a c0x0000 (---------------) + I emp - 0x002674c3, // n0x067b c0x0000 (---------------) + I eng - 0x0028cac3, // n0x067c c0x0000 (---------------) + I esp - 0x002f41c3, // n0x067d c0x0000 (---------------) + I etc - 0x0021bac3, // n0x067e c0x0000 (---------------) + I eti - 0x0021f803, // n0x067f c0x0000 (---------------) + I far - 0x0023bdc4, // n0x0680 c0x0000 (---------------) + I flog - 0x00358002, // n0x0681 c0x0000 (---------------) + I fm - 0x002416c3, // n0x0682 c0x0000 (---------------) + I fnd - 0x00247a83, // n0x0683 c0x0000 (---------------) + I fot - 0x002645c3, // n0x0684 c0x0000 (---------------) + I fst - 0x0036f1c3, // n0x0685 c0x0000 (---------------) + I g12 - 0x00311b83, // n0x0686 c0x0000 (---------------) + I ggf - 0x0021e283, // n0x0687 c0x0000 (---------------) + I gov - 0x002b7c43, // n0x0688 c0x0000 (---------------) + I imb - 0x00215703, // n0x0689 c0x0000 (---------------) + I ind - 0x00200303, // n0x068a c0x0000 (---------------) + I inf - 0x00202c03, // n0x068b c0x0000 (---------------) + I jor - 0x002de8c3, // n0x068c c0x0000 (---------------) + I jus - 0x0021e843, // n0x068d c0x0000 (---------------) + I leg - 0x002e3403, // n0x068e c0x0000 (---------------) + I lel - 0x0020f583, // n0x068f c0x0000 (---------------) + I mat - 0x0020b403, // n0x0690 c0x0000 (---------------) + I med - 0x0023fa03, // n0x0691 c0x0000 (---------------) + I mil - 0x00214902, // n0x0692 c0x0000 (---------------) + I mp - 0x002bc903, // n0x0693 c0x0000 (---------------) + I mus - 0x002170c3, // n0x0694 c0x0000 (---------------) + I net - 0x01607cc3, // n0x0695 c0x0005 (---------------)* o I nom - 0x0023fdc3, // n0x0696 c0x0000 (---------------) + I not - 0x00211c03, // n0x0697 c0x0000 (---------------) + I ntr - 0x0024f003, // n0x0698 c0x0000 (---------------) + I odo - 0x0021dcc3, // n0x0699 c0x0000 (---------------) + I org - 0x002bf143, // n0x069a c0x0000 (---------------) + I ppg - 0x00218243, // n0x069b c0x0000 (---------------) + I pro - 0x002353c3, // n0x069c c0x0000 (---------------) + I psc - 0x002dc783, // n0x069d c0x0000 (---------------) + I psi - 0x002ce903, // n0x069e c0x0000 (---------------) + I qsl - 0x00250685, // n0x069f c0x0000 (---------------) + I radio - 0x002e6343, // n0x06a0 c0x0000 (---------------) + I rec - 0x002ce943, // n0x06a1 c0x0000 (---------------) + I slg - 0x002cef83, // n0x06a2 c0x0000 (---------------) + I srv - 0x00217c44, // n0x06a3 c0x0000 (---------------) + I taxi - 0x00362ec3, // n0x06a4 c0x0000 (---------------) + I teo - 0x002fb583, // n0x06a5 c0x0000 (---------------) + I tmp - 0x00283003, // n0x06a6 c0x0000 (---------------) + I trd - 0x00227303, // n0x06a7 c0x0000 (---------------) + I tur - 0x0020bf42, // n0x06a8 c0x0000 (---------------) + I tv - 0x0022b9c3, // n0x06a9 c0x0000 (---------------) + I vet - 0x002df504, // n0x06aa c0x0000 (---------------) + I vlog - 0x0025a484, // n0x06ab c0x0000 (---------------) + I wiki - 0x0024dc43, // n0x06ac c0x0000 (---------------) + I zlg - 0x000e4188, // n0x06ad c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x06ae c0x0000 (---------------) + I com - 0x002d75c3, // n0x06af c0x0000 (---------------) + I edu - 0x0021e283, // n0x06b0 c0x0000 (---------------) + I gov - 0x002170c3, // n0x06b1 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x06b2 c0x0000 (---------------) + I org - 0x00222ac3, // n0x06b3 c0x0000 (---------------) + I com - 0x002d75c3, // n0x06b4 c0x0000 (---------------) + I edu - 0x0021e283, // n0x06b5 c0x0000 (---------------) + I gov - 0x002170c3, // n0x06b6 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x06b7 c0x0000 (---------------) + I org - 0x00200742, // n0x06b8 c0x0000 (---------------) + I co - 0x0021dcc3, // n0x06b9 c0x0000 (---------------) + I org - 0x0ba22ac3, // n0x06ba c0x002e (n0x06be-n0x06bf) + I com - 0x0021e283, // n0x06bb c0x0000 (---------------) + I gov - 0x0023fa03, // n0x06bc c0x0000 (---------------) + I mil - 0x00209982, // n0x06bd c0x0000 (---------------) + I of - 0x000e4188, // n0x06be c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x06bf c0x0000 (---------------) + I com - 0x002d75c3, // n0x06c0 c0x0000 (---------------) + I edu - 0x0021e283, // n0x06c1 c0x0000 (---------------) + I gov - 0x002170c3, // n0x06c2 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x06c3 c0x0000 (---------------) + I org - 0x000043c2, // n0x06c4 c0x0000 (---------------) + za - 0x002004c2, // n0x06c5 c0x0000 (---------------) + I ab - 0x0021a042, // n0x06c6 c0x0000 (---------------) + I bc - 0x000e4188, // n0x06c7 c0x0000 (---------------) + blogspot - 0x00000742, // n0x06c8 c0x0000 (---------------) + co - 0x00227d42, // n0x06c9 c0x0000 (---------------) + I gc - 0x00205942, // n0x06ca c0x0000 (---------------) + I mb - 0x00210d42, // n0x06cb c0x0000 (---------------) + I nb - 0x00200342, // n0x06cc c0x0000 (---------------) + I nf - 0x00236482, // n0x06cd c0x0000 (---------------) + I nl - 0x002019c2, // n0x06ce c0x0000 (---------------) + I ns - 0x00200e02, // n0x06cf c0x0000 (---------------) + I nt - 0x00205bc2, // n0x06d0 c0x0000 (---------------) + I nu - 0x00200dc2, // n0x06d1 c0x0000 (---------------) + I on - 0x00214942, // n0x06d2 c0x0000 (---------------) + I pe - 0x00369542, // n0x06d3 c0x0000 (---------------) + I qc - 0x00207b42, // n0x06d4 c0x0000 (---------------) + I sk - 0x002202c2, // n0x06d5 c0x0000 (---------------) + I yk - 0x00085109, // n0x06d6 c0x0000 (---------------) + ftpaccess - 0x0001208b, // n0x06d7 c0x0000 (---------------) + game-server - 0x000bea08, // n0x06d8 c0x0000 (---------------) + myphotos - 0x00043609, // n0x06d9 c0x0000 (---------------) + scrapping - 0x0021e283, // n0x06da c0x0000 (---------------) + I gov - 0x000e4188, // n0x06db c0x0000 (---------------) + blogspot - 0x000e4188, // n0x06dc c0x0000 (---------------) + blogspot - 0x00201e82, // n0x06dd c0x0000 (---------------) + I ac - 0x002729c4, // n0x06de c0x0000 (---------------) + I asso - 0x00200742, // n0x06df c0x0000 (---------------) + I co - 0x00222ac3, // n0x06e0 c0x0000 (---------------) + I com - 0x00203fc2, // n0x06e1 c0x0000 (---------------) + I ed - 0x002d75c3, // n0x06e2 c0x0000 (---------------) + I edu - 0x00202342, // n0x06e3 c0x0000 (---------------) + I go - 0x003579c4, // n0x06e4 c0x0000 (---------------) + I gouv - 0x00238c03, // n0x06e5 c0x0000 (---------------) + I int - 0x00238602, // n0x06e6 c0x0000 (---------------) + I md - 0x002170c3, // n0x06e7 c0x0000 (---------------) + I net - 0x00200c42, // n0x06e8 c0x0000 (---------------) + I or - 0x0021dcc3, // n0x06e9 c0x0000 (---------------) + I org - 0x0029abc6, // n0x06ea c0x0000 (---------------) + I presse - 0x002f710f, // n0x06eb c0x0000 (---------------) + I xn--aroport-bya - 0x006e3e83, // n0x06ec c0x0001 (---------------) ! I www - 0x000e4188, // n0x06ed c0x0000 (---------------) + blogspot - 0x00200742, // n0x06ee c0x0000 (---------------) + I co - 0x0034eb03, // n0x06ef c0x0000 (---------------) + I gob - 0x0021e283, // n0x06f0 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x06f1 c0x0000 (---------------) + I mil - 0x00200742, // n0x06f2 c0x0000 (---------------) + I co - 0x00222ac3, // n0x06f3 c0x0000 (---------------) + I com - 0x0021e283, // n0x06f4 c0x0000 (---------------) + I gov - 0x002170c3, // n0x06f5 c0x0000 (---------------) + I net - 0x00201e82, // n0x06f6 c0x0000 (---------------) + I ac - 0x002076c2, // n0x06f7 c0x0000 (---------------) + I ah - 0x0ea72409, // n0x06f8 c0x003a (n0x0723-n0x0724) o I amazonaws - 0x00202642, // n0x06f9 c0x0000 (---------------) + I bj - 0x0f222ac3, // n0x06fa c0x003c (n0x0725-n0x0726) + I com - 0x0022e082, // n0x06fb c0x0000 (---------------) + I cq - 0x002d75c3, // n0x06fc c0x0000 (---------------) + I edu - 0x002241c2, // n0x06fd c0x0000 (---------------) + I fj - 0x0021b342, // n0x06fe c0x0000 (---------------) + I gd - 0x0021e283, // n0x06ff c0x0000 (---------------) + I gov - 0x0026cd02, // n0x0700 c0x0000 (---------------) + I gs - 0x0023d702, // n0x0701 c0x0000 (---------------) + I gx - 0x00243802, // n0x0702 c0x0000 (---------------) + I gz - 0x00202dc2, // n0x0703 c0x0000 (---------------) + I ha - 0x002f6242, // n0x0704 c0x0000 (---------------) + I hb - 0x00205202, // n0x0705 c0x0000 (---------------) + I he - 0x00200202, // n0x0706 c0x0000 (---------------) + I hi - 0x0022ea02, // n0x0707 c0x0000 (---------------) + I hk - 0x0020cc02, // n0x0708 c0x0000 (---------------) + I hl - 0x00217542, // n0x0709 c0x0000 (---------------) + I hn - 0x00297c82, // n0x070a c0x0000 (---------------) + I jl - 0x002bdf02, // n0x070b c0x0000 (---------------) + I js - 0x002fc642, // n0x070c c0x0000 (---------------) + I jx - 0x0021f442, // n0x070d c0x0000 (---------------) + I ln - 0x0023fa03, // n0x070e c0x0000 (---------------) + I mil - 0x00203602, // n0x070f c0x0000 (---------------) + I mo - 0x002170c3, // n0x0710 c0x0000 (---------------) + I net - 0x00233c42, // n0x0711 c0x0000 (---------------) + I nm - 0x0026d802, // n0x0712 c0x0000 (---------------) + I nx - 0x0021dcc3, // n0x0713 c0x0000 (---------------) + I org - 0x0022e0c2, // n0x0714 c0x0000 (---------------) + I qh - 0x00200982, // n0x0715 c0x0000 (---------------) + I sc - 0x0024f842, // n0x0716 c0x0000 (---------------) + I sd - 0x002001c2, // n0x0717 c0x0000 (---------------) + I sh - 0x00210b02, // n0x0718 c0x0000 (---------------) + I sn - 0x002d6b42, // n0x0719 c0x0000 (---------------) + I sx - 0x00202bc2, // n0x071a c0x0000 (---------------) + I tj - 0x00241ac2, // n0x071b c0x0000 (---------------) + I tw - 0x0020a882, // n0x071c c0x0000 (---------------) + I xj - 0x002ea10a, // n0x071d c0x0000 (---------------) + I xn--55qx5d - 0x0033080a, // n0x071e c0x0000 (---------------) + I xn--io0a7i - 0x0036394a, // n0x071f c0x0000 (---------------) + I xn--od0alg - 0x00397682, // n0x0720 c0x0000 (---------------) + I xz - 0x00200802, // n0x0721 c0x0000 (---------------) + I yn - 0x00243842, // n0x0722 c0x0000 (---------------) + I zj - 0x0ec23487, // n0x0723 c0x003b (n0x0724-n0x0725) + compute - 0x00105f0a, // n0x0724 c0x0000 (---------------) + cn-north-1 - 0x0f672409, // n0x0725 c0x003d (n0x0726-n0x0727) o I amazonaws - 0x0fb05f0a, // n0x0726 c0x003e (n0x0727-n0x0728) o I cn-north-1 - 0x000413c2, // n0x0727 c0x0000 (---------------) + s3 - 0x00246584, // n0x0728 c0x0000 (---------------) + I arts - 0x10222ac3, // n0x0729 c0x0040 (n0x0735-n0x0736) + I com - 0x002d75c3, // n0x072a c0x0000 (---------------) + I edu - 0x00238544, // n0x072b c0x0000 (---------------) + I firm - 0x0021e283, // n0x072c c0x0000 (---------------) + I gov - 0x00200304, // n0x072d c0x0000 (---------------) + I info - 0x00238c03, // n0x072e c0x0000 (---------------) + I int - 0x0023fa03, // n0x072f c0x0000 (---------------) + I mil - 0x002170c3, // n0x0730 c0x0000 (---------------) + I net - 0x00207cc3, // n0x0731 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x0732 c0x0000 (---------------) + I org - 0x002e6343, // n0x0733 c0x0000 (---------------) + I rec - 0x00219fc3, // n0x0734 c0x0000 (---------------) + I web - 0x000e4188, // n0x0735 c0x0000 (---------------) + blogspot - 0x000f00c5, // n0x0736 c0x0000 (---------------) + 1kapp - 0x000f2202, // n0x0737 c0x0000 (---------------) + 4u - 0x00167c06, // n0x0738 c0x0000 (---------------) + africa - 0x10a72409, // n0x0739 c0x0042 (n0x07ff-n0x0811) o I amazonaws - 0x00036947, // n0x073a c0x0000 (---------------) + appspot - 0x00000602, // n0x073b c0x0000 (---------------) + ar - 0x00163e4a, // n0x073c c0x0000 (---------------) + betainabox - 0x000d0087, // n0x073d c0x0000 (---------------) + blogdns - 0x000e4188, // n0x073e c0x0000 (---------------) + blogspot - 0x00012e82, // n0x073f c0x0000 (---------------) + br - 0x0012df87, // n0x0740 c0x0000 (---------------) + cechire - 0x0013220f, // n0x0741 c0x0000 (---------------) + cloudcontrolapp - 0x0018d44f, // n0x0742 c0x0000 (---------------) + cloudcontrolled - 0x000211c2, // n0x0743 c0x0000 (---------------) + cn - 0x00000742, // n0x0744 c0x0000 (---------------) + co - 0x0008ca08, // n0x0745 c0x0000 (---------------) + codespot - 0x000006c2, // n0x0746 c0x0000 (---------------) + de - 0x00146fc8, // n0x0747 c0x0000 (---------------) + dnsalias - 0x0006a247, // n0x0748 c0x0000 (---------------) + dnsdojo - 0x00010a4b, // n0x0749 c0x0000 (---------------) + doesntexist - 0x0015fdc9, // n0x074a c0x0000 (---------------) + dontexist - 0x00146ec7, // n0x074b c0x0000 (---------------) + doomdns - 0x000da58c, // n0x074c c0x0000 (---------------) + dreamhosters - 0x0015aeca, // n0x074d c0x0000 (---------------) + dyn-o-saur - 0x000007c8, // n0x074e c0x0000 (---------------) + dynalias - 0x000b8c0e, // n0x074f c0x0000 (---------------) + dyndns-at-home - 0x000e024e, // n0x0750 c0x0000 (---------------) + dyndns-at-work - 0x000cfecb, // n0x0751 c0x0000 (---------------) + dyndns-blog - 0x00009acb, // n0x0752 c0x0000 (---------------) + dyndns-free - 0x0000b1cb, // n0x0753 c0x0000 (---------------) + dyndns-home - 0x00013889, // n0x0754 c0x0000 (---------------) + dyndns-ip - 0x00018d4b, // n0x0755 c0x0000 (---------------) + dyndns-mail - 0x00019a8d, // n0x0756 c0x0000 (---------------) + dyndns-office - 0x0001ea4b, // n0x0757 c0x0000 (---------------) + dyndns-pics - 0x0001fd0d, // n0x0758 c0x0000 (---------------) + dyndns-remote - 0x00020d4d, // n0x0759 c0x0000 (---------------) + dyndns-server - 0x00051b0a, // n0x075a c0x0000 (---------------) + dyndns-web - 0x0005a2cb, // n0x075b c0x0000 (---------------) + dyndns-wiki - 0x0009aecb, // n0x075c c0x0000 (---------------) + dyndns-work - 0x00016650, // n0x075d c0x0000 (---------------) + elasticbeanstalk - 0x0013c78f, // n0x075e c0x0000 (---------------) + est-a-la-maison - 0x0002270f, // n0x075f c0x0000 (---------------) + est-a-la-masion - 0x000144cd, // n0x0760 c0x0000 (---------------) + est-le-patron - 0x000ef550, // n0x0761 c0x0000 (---------------) + est-mon-blogueur - 0x0001d5c2, // n0x0762 c0x0000 (---------------) + eu - 0x0003674b, // n0x0763 c0x0000 (---------------) + firebaseapp - 0x0003ffc8, // n0x0764 c0x0000 (---------------) + flynnhub - 0x0004d407, // n0x0765 c0x0000 (---------------) + from-ak - 0x0004d747, // n0x0766 c0x0000 (---------------) + from-al - 0x0004d907, // n0x0767 c0x0000 (---------------) + from-ar - 0x0004dd07, // n0x0768 c0x0000 (---------------) + from-ca - 0x0004f607, // n0x0769 c0x0000 (---------------) + from-ct - 0x00050247, // n0x076a c0x0000 (---------------) + from-dc - 0x00052787, // n0x076b c0x0000 (---------------) + from-de - 0x00052a47, // n0x076c c0x0000 (---------------) + from-fl - 0x00054187, // n0x076d c0x0000 (---------------) + from-ga - 0x00054487, // n0x076e c0x0000 (---------------) + from-hi - 0x00054ec7, // n0x076f c0x0000 (---------------) + from-ia - 0x00055087, // n0x0770 c0x0000 (---------------) + from-id - 0x00055247, // n0x0771 c0x0000 (---------------) + from-il - 0x00055407, // n0x0772 c0x0000 (---------------) + from-in - 0x000561c7, // n0x0773 c0x0000 (---------------) + from-ks - 0x00056787, // n0x0774 c0x0000 (---------------) + from-ky - 0x00057247, // n0x0775 c0x0000 (---------------) + from-ma - 0x00057647, // n0x0776 c0x0000 (---------------) + from-md - 0x00057d87, // n0x0777 c0x0000 (---------------) + from-mi - 0x00058887, // n0x0778 c0x0000 (---------------) + from-mn - 0x00058a47, // n0x0779 c0x0000 (---------------) + from-mo - 0x00059007, // n0x077a c0x0000 (---------------) + from-ms - 0x00059507, // n0x077b c0x0000 (---------------) + from-mt - 0x00059707, // n0x077c c0x0000 (---------------) + from-nc - 0x0005a607, // n0x077d c0x0000 (---------------) + from-nd - 0x0005a7c7, // n0x077e c0x0000 (---------------) + from-ne - 0x0005a987, // n0x077f c0x0000 (---------------) + from-nh - 0x0005b247, // n0x0780 c0x0000 (---------------) + from-nj - 0x0005b747, // n0x0781 c0x0000 (---------------) + from-nm - 0x0005c247, // n0x0782 c0x0000 (---------------) + from-nv - 0x0005c847, // n0x0783 c0x0000 (---------------) + from-oh - 0x0005cf07, // n0x0784 c0x0000 (---------------) + from-ok - 0x0005d407, // n0x0785 c0x0000 (---------------) + from-or - 0x0005d5c7, // n0x0786 c0x0000 (---------------) + from-pa - 0x0005d947, // n0x0787 c0x0000 (---------------) + from-pr - 0x0005e307, // n0x0788 c0x0000 (---------------) + from-ri - 0x0005e687, // n0x0789 c0x0000 (---------------) + from-sc - 0x0005ea87, // n0x078a c0x0000 (---------------) + from-sd - 0x000604c7, // n0x078b c0x0000 (---------------) + from-tn - 0x00060687, // n0x078c c0x0000 (---------------) + from-tx - 0x00061207, // n0x078d c0x0000 (---------------) + from-ut - 0x00062947, // n0x078e c0x0000 (---------------) + from-va - 0x00062f87, // n0x078f c0x0000 (---------------) + from-vt - 0x00063287, // n0x0790 c0x0000 (---------------) + from-wa - 0x00063447, // n0x0791 c0x0000 (---------------) + from-wi - 0x000637c7, // n0x0792 c0x0000 (---------------) + from-wv - 0x00063a07, // n0x0793 c0x0000 (---------------) + from-wy - 0x00005a42, // n0x0794 c0x0000 (---------------) + gb - 0x000c0587, // n0x0795 c0x0000 (---------------) + getmyip - 0x000b53d1, // n0x0796 c0x0000 (---------------) + githubusercontent - 0x000cd58a, // n0x0797 c0x0000 (---------------) + googleapis - 0x0008c88a, // n0x0798 c0x0000 (---------------) + googlecode - 0x00043a86, // n0x0799 c0x0000 (---------------) + gotdns - 0x0000dc82, // n0x079a c0x0000 (---------------) + gr - 0x0008f309, // n0x079b c0x0000 (---------------) + herokuapp - 0x0007fe89, // n0x079c c0x0000 (---------------) + herokussl - 0x0002ea02, // n0x079d c0x0000 (---------------) + hk - 0x0013eeca, // n0x079e c0x0000 (---------------) + hobby-site - 0x00090ec9, // n0x079f c0x0000 (---------------) + homelinux - 0x00091b88, // n0x07a0 c0x0000 (---------------) + homeunix - 0x00017d42, // n0x07a1 c0x0000 (---------------) + hu - 0x001008c9, // n0x07a2 c0x0000 (---------------) + iamallama - 0x0005db8e, // n0x07a3 c0x0000 (---------------) + is-a-anarchist - 0x000d5d8c, // n0x07a4 c0x0000 (---------------) + is-a-blogger - 0x000bf2cf, // n0x07a5 c0x0000 (---------------) + is-a-bookkeeper - 0x0017d14e, // n0x07a6 c0x0000 (---------------) + is-a-bulls-fan - 0x0000cf8c, // n0x07a7 c0x0000 (---------------) + is-a-caterer - 0x00166909, // n0x07a8 c0x0000 (---------------) + is-a-chef - 0x00099ad1, // n0x07a9 c0x0000 (---------------) + is-a-conservative - 0x0009a088, // n0x07aa c0x0000 (---------------) + is-a-cpa - 0x00169b92, // n0x07ab c0x0000 (---------------) + is-a-cubicle-slave - 0x0002e40d, // n0x07ac c0x0000 (---------------) + is-a-democrat - 0x00032e0d, // n0x07ad c0x0000 (---------------) + is-a-designer - 0x00138acb, // n0x07ae c0x0000 (---------------) + is-a-doctor - 0x001713d5, // n0x07af c0x0000 (---------------) + is-a-financialadvisor - 0x00052e49, // n0x07b0 c0x0000 (---------------) + is-a-geek - 0x0005afca, // n0x07b1 c0x0000 (---------------) + is-a-green - 0x0005bb09, // n0x07b2 c0x0000 (---------------) + is-a-guru - 0x00060e10, // n0x07b3 c0x0000 (---------------) + is-a-hard-worker - 0x00065f4b, // n0x07b4 c0x0000 (---------------) + is-a-hunter - 0x0006f74f, // n0x07b5 c0x0000 (---------------) + is-a-landscaper - 0x000702cb, // n0x07b6 c0x0000 (---------------) + is-a-lawyer - 0x00073b0c, // n0x07b7 c0x0000 (---------------) + is-a-liberal - 0x00077590, // n0x07b8 c0x0000 (---------------) + is-a-libertarian - 0x001370ca, // n0x07b9 c0x0000 (---------------) + is-a-llama - 0x00137a4d, // n0x07ba c0x0000 (---------------) + is-a-musician - 0x00174a0e, // n0x07bb c0x0000 (---------------) + is-a-nascarfan - 0x0007bf4a, // n0x07bc c0x0000 (---------------) + is-a-nurse - 0x0007d0cc, // n0x07bd c0x0000 (---------------) + is-a-painter - 0x0008ab94, // n0x07be c0x0000 (---------------) + is-a-personaltrainer - 0x0008ef91, // n0x07bf c0x0000 (---------------) + is-a-photographer - 0x00090c0b, // n0x07c0 c0x0000 (---------------) + is-a-player - 0x0009638f, // n0x07c1 c0x0000 (---------------) + is-a-republican - 0x00096fcd, // n0x07c2 c0x0000 (---------------) + is-a-rockstar - 0x000c268e, // n0x07c3 c0x0000 (---------------) + is-a-socialist - 0x0009844c, // n0x07c4 c0x0000 (---------------) + is-a-student - 0x0009d08c, // n0x07c5 c0x0000 (---------------) + is-a-teacher - 0x000c238b, // n0x07c6 c0x0000 (---------------) + is-a-techie - 0x000c3f4e, // n0x07c7 c0x0000 (---------------) + is-a-therapist - 0x000d7cd0, // n0x07c8 c0x0000 (---------------) + is-an-accountant - 0x0015d44b, // n0x07c9 c0x0000 (---------------) + is-an-actor - 0x000a110d, // n0x07ca c0x0000 (---------------) + is-an-actress - 0x000a768f, // n0x07cb c0x0000 (---------------) + is-an-anarchist - 0x000a814c, // n0x07cc c0x0000 (---------------) + is-an-artist - 0x000a890e, // n0x07cd c0x0000 (---------------) + is-an-engineer - 0x000a97d1, // n0x07ce c0x0000 (---------------) + is-an-entertainer - 0x00135f8c, // n0x07cf c0x0000 (---------------) + is-certified - 0x00133a07, // n0x07d0 c0x0000 (---------------) + is-gone - 0x000b0fcd, // n0x07d1 c0x0000 (---------------) + is-into-anime - 0x000b918c, // n0x07d2 c0x0000 (---------------) + is-into-cars - 0x000d1250, // n0x07d3 c0x0000 (---------------) + is-into-cartoons - 0x000d1f4d, // n0x07d4 c0x0000 (---------------) + is-into-games - 0x000d3087, // n0x07d5 c0x0000 (---------------) + is-leet - 0x000d7250, // n0x07d6 c0x0000 (---------------) + is-not-certified - 0x000f9e48, // n0x07d7 c0x0000 (---------------) + is-slick - 0x001063cb, // n0x07d8 c0x0000 (---------------) + is-uberleet - 0x00146b4f, // n0x07d9 c0x0000 (---------------) + is-with-theband - 0x00191648, // n0x07da c0x0000 (---------------) + isa-geek - 0x000cd78d, // n0x07db c0x0000 (---------------) + isa-hockeynut - 0x00159d10, // n0x07dc c0x0000 (---------------) + issmarterthanyou - 0x0009a703, // n0x07dd c0x0000 (---------------) + jpn - 0x000034c2, // n0x07de c0x0000 (---------------) + kr - 0x00061689, // n0x07df c0x0000 (---------------) + likes-pie - 0x0007878a, // n0x07e0 c0x0000 (---------------) + likescandy - 0x00032003, // n0x07e1 c0x0000 (---------------) + mex - 0x001024c8, // n0x07e2 c0x0000 (---------------) + neat-url - 0x00002f07, // n0x07e3 c0x0000 (---------------) + nfshost - 0x00000c02, // n0x07e4 c0x0000 (---------------) + no - 0x0005080a, // n0x07e5 c0x0000 (---------------) + operaunite - 0x0019238f, // n0x07e6 c0x0000 (---------------) + outsystemscloud - 0x00110fd2, // n0x07e7 c0x0000 (---------------) + pagespeedmobilizer - 0x00169542, // n0x07e8 c0x0000 (---------------) + qc - 0x00132187, // n0x07e9 c0x0000 (---------------) + rhcloud - 0x00000d82, // n0x07ea c0x0000 (---------------) + ro - 0x000044c2, // n0x07eb c0x0000 (---------------) + ru - 0x00001a02, // n0x07ec c0x0000 (---------------) + sa - 0x0002f650, // n0x07ed c0x0000 (---------------) + saves-the-whales - 0x00002e82, // n0x07ee c0x0000 (---------------) + se - 0x00130f46, // n0x07ef c0x0000 (---------------) + selfip - 0x000c368e, // n0x07f0 c0x0000 (---------------) + sells-for-less - 0x0007ac8b, // n0x07f1 c0x0000 (---------------) + sells-for-u - 0x00079088, // n0x07f2 c0x0000 (---------------) + servebbs - 0x000e0a0a, // n0x07f3 c0x0000 (---------------) + simple-url - 0x000dc7c7, // n0x07f4 c0x0000 (---------------) + sinaapp - 0x000101cd, // n0x07f5 c0x0000 (---------------) + space-to-rent - 0x0010160c, // n0x07f6 c0x0000 (---------------) + teaches-yoga - 0x0000cf02, // n0x07f7 c0x0000 (---------------) + uk - 0x00009f42, // n0x07f8 c0x0000 (---------------) + us - 0x00006842, // n0x07f9 c0x0000 (---------------) + uy - 0x000dc70a, // n0x07fa c0x0000 (---------------) + vipsinaapp - 0x000cd48a, // n0x07fb c0x0000 (---------------) + withgoogle - 0x000e3f0e, // n0x07fc c0x0000 (---------------) + writesthisblog - 0x000c9948, // n0x07fd c0x0000 (---------------) + yolasite - 0x000043c2, // n0x07fe c0x0000 (---------------) + za - 0x10c23487, // n0x07ff c0x0043 (n0x0811-n0x081a) + compute - 0x11023489, // n0x0800 c0x0044 (n0x081a-n0x081c) + compute-1 - 0x0000a503, // n0x0801 c0x0000 (---------------) + elb - 0x1172bb4c, // n0x0802 c0x0045 (n0x081c-n0x081d) o I eu-central-1 - 0x000413c2, // n0x0803 c0x0000 (---------------) + s3 - 0x000f0c51, // n0x0804 c0x0000 (---------------) + s3-ap-northeast-1 - 0x000f9411, // n0x0805 c0x0000 (---------------) + s3-ap-southeast-1 - 0x0010a591, // n0x0806 c0x0000 (---------------) + s3-ap-southeast-2 - 0x0012ba8f, // n0x0807 c0x0000 (---------------) + s3-eu-central-1 - 0x00072c0c, // n0x0808 c0x0000 (---------------) + s3-eu-west-1 - 0x0010d14d, // n0x0809 c0x0000 (---------------) + s3-external-1 - 0x0010ef8d, // n0x080a c0x0000 (---------------) + s3-external-2 - 0x0011e6d5, // n0x080b c0x0000 (---------------) + s3-fips-us-gov-west-1 - 0x000413cc, // n0x080c c0x0000 (---------------) + s3-sa-east-1 - 0x000696d0, // n0x080d c0x0000 (---------------) + s3-us-gov-west-1 - 0x0011960c, // n0x080e c0x0000 (---------------) + s3-us-west-1 - 0x000affcc, // n0x080f c0x0000 (---------------) + s3-us-west-2 - 0x0002b6c9, // n0x0810 c0x0000 (---------------) + us-east-1 - 0x000f0d0e, // n0x0811 c0x0000 (---------------) + ap-northeast-1 - 0x000f94ce, // n0x0812 c0x0000 (---------------) + ap-southeast-1 - 0x0010a64e, // n0x0813 c0x0000 (---------------) + ap-southeast-2 - 0x0012bb4c, // n0x0814 c0x0000 (---------------) + eu-central-1 - 0x00072cc9, // n0x0815 c0x0000 (---------------) + eu-west-1 - 0x00041489, // n0x0816 c0x0000 (---------------) + sa-east-1 - 0x0006978d, // n0x0817 c0x0000 (---------------) + us-gov-west-1 - 0x001196c9, // n0x0818 c0x0000 (---------------) + us-west-1 - 0x000b0089, // n0x0819 c0x0000 (---------------) + us-west-2 - 0x000f0043, // n0x081a c0x0000 (---------------) + z-1 - 0x000c8c03, // n0x081b c0x0000 (---------------) + z-2 - 0x000413c2, // n0x081c c0x0000 (---------------) + s3 - 0x00201e82, // n0x081d c0x0000 (---------------) + I ac - 0x00200742, // n0x081e c0x0000 (---------------) + I co - 0x00203fc2, // n0x081f c0x0000 (---------------) + I ed - 0x002099c2, // n0x0820 c0x0000 (---------------) + I fi - 0x00202342, // n0x0821 c0x0000 (---------------) + I go - 0x00200c42, // n0x0822 c0x0000 (---------------) + I or - 0x00201a02, // n0x0823 c0x0000 (---------------) + I sa - 0x00222ac3, // n0x0824 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0825 c0x0000 (---------------) + I edu - 0x0021e283, // n0x0826 c0x0000 (---------------) + I gov - 0x00200303, // n0x0827 c0x0000 (---------------) + I inf - 0x002170c3, // n0x0828 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0829 c0x0000 (---------------) + I org - 0x000e4188, // n0x082a c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x082b c0x0000 (---------------) + I com - 0x002d75c3, // n0x082c c0x0000 (---------------) + I edu - 0x002170c3, // n0x082d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x082e c0x0000 (---------------) + I org - 0x00078a43, // n0x082f c0x0000 (---------------) + ath - 0x0021e283, // n0x0830 c0x0000 (---------------) + I gov - 0x00201e82, // n0x0831 c0x0000 (---------------) + I ac - 0x00310603, // n0x0832 c0x0000 (---------------) + I biz - 0x13222ac3, // n0x0833 c0x004c (n0x083e-n0x083f) + I com - 0x00267c47, // n0x0834 c0x0000 (---------------) + I ekloges - 0x0021e283, // n0x0835 c0x0000 (---------------) + I gov - 0x003413c3, // n0x0836 c0x0000 (---------------) + I ltd - 0x00298944, // n0x0837 c0x0000 (---------------) + I name - 0x002170c3, // n0x0838 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0839 c0x0000 (---------------) + I org - 0x002647ca, // n0x083a c0x0000 (---------------) + I parliament - 0x0029abc5, // n0x083b c0x0000 (---------------) + I press - 0x00218243, // n0x083c c0x0000 (---------------) + I pro - 0x00208902, // n0x083d c0x0000 (---------------) + I tm - 0x000e4188, // n0x083e c0x0000 (---------------) + blogspot - 0x000e4188, // n0x083f c0x0000 (---------------) + blogspot - 0x000e4188, // n0x0840 c0x0000 (---------------) + blogspot - 0x00022ac3, // n0x0841 c0x0000 (---------------) + com - 0x0009fe8f, // n0x0842 c0x0000 (---------------) + fuettertdasnetz - 0x0015ff4a, // n0x0843 c0x0000 (---------------) + isteingeek - 0x000c2947, // n0x0844 c0x0000 (---------------) + istmein - 0x00016f4a, // n0x0845 c0x0000 (---------------) + lebtimnetz - 0x0006cb8a, // n0x0846 c0x0000 (---------------) + leitungsen - 0x000e8f4d, // n0x0847 c0x0000 (---------------) + traeumtgerade - 0x000e4188, // n0x0848 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x0849 c0x0000 (---------------) + I com - 0x002d75c3, // n0x084a c0x0000 (---------------) + I edu - 0x0021e283, // n0x084b c0x0000 (---------------) + I gov - 0x002170c3, // n0x084c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x084d c0x0000 (---------------) + I org - 0x00200603, // n0x084e c0x0000 (---------------) + I art - 0x00222ac3, // n0x084f c0x0000 (---------------) + I com - 0x002d75c3, // n0x0850 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x0851 c0x0000 (---------------) + I gob - 0x0021e283, // n0x0852 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x0853 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0854 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0855 c0x0000 (---------------) + I org - 0x00280043, // n0x0856 c0x0000 (---------------) + I sld - 0x00219fc3, // n0x0857 c0x0000 (---------------) + I web - 0x00200603, // n0x0858 c0x0000 (---------------) + I art - 0x002729c4, // n0x0859 c0x0000 (---------------) + I asso - 0x00222ac3, // n0x085a c0x0000 (---------------) + I com - 0x002d75c3, // n0x085b c0x0000 (---------------) + I edu - 0x0021e283, // n0x085c c0x0000 (---------------) + I gov - 0x002170c3, // n0x085d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x085e c0x0000 (---------------) + I org - 0x00218943, // n0x085f c0x0000 (---------------) + I pol - 0x00222ac3, // n0x0860 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0861 c0x0000 (---------------) + I edu - 0x00236403, // n0x0862 c0x0000 (---------------) + I fin - 0x0034eb03, // n0x0863 c0x0000 (---------------) + I gob - 0x0021e283, // n0x0864 c0x0000 (---------------) + I gov - 0x00200304, // n0x0865 c0x0000 (---------------) + I info - 0x00312503, // n0x0866 c0x0000 (---------------) + I k12 - 0x0020b403, // n0x0867 c0x0000 (---------------) + I med - 0x0023fa03, // n0x0868 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0869 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x086a c0x0000 (---------------) + I org - 0x00218243, // n0x086b c0x0000 (---------------) + I pro - 0x00382f83, // n0x086c c0x0000 (---------------) + I aip - 0x15622ac3, // n0x086d c0x0055 (n0x0876-n0x0877) + I com - 0x002d75c3, // n0x086e c0x0000 (---------------) + I edu - 0x002099c3, // n0x086f c0x0000 (---------------) + I fie - 0x0021e283, // n0x0870 c0x0000 (---------------) + I gov - 0x00273c43, // n0x0871 c0x0000 (---------------) + I lib - 0x0020b403, // n0x0872 c0x0000 (---------------) + I med - 0x0021dcc3, // n0x0873 c0x0000 (---------------) + I org - 0x0025f803, // n0x0874 c0x0000 (---------------) + I pri - 0x00375bc4, // n0x0875 c0x0000 (---------------) + I riik - 0x000e4188, // n0x0876 c0x0000 (---------------) + blogspot - 0x15e22ac3, // n0x0877 c0x0057 (n0x0880-n0x0881) + I com - 0x002d75c3, // n0x0878 c0x0000 (---------------) + I edu - 0x00291c43, // n0x0879 c0x0000 (---------------) + I eun - 0x0021e283, // n0x087a c0x0000 (---------------) + I gov - 0x0023fa03, // n0x087b c0x0000 (---------------) + I mil - 0x00298944, // n0x087c c0x0000 (---------------) + I name - 0x002170c3, // n0x087d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x087e c0x0000 (---------------) + I org - 0x00215583, // n0x087f c0x0000 (---------------) + I sci - 0x000e4188, // n0x0880 c0x0000 (---------------) + blogspot - 0x16622ac3, // n0x0881 c0x0059 (n0x0886-n0x0887) + I com - 0x002d75c3, // n0x0882 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x0883 c0x0000 (---------------) + I gob - 0x00207cc3, // n0x0884 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x0885 c0x0000 (---------------) + I org - 0x000e4188, // n0x0886 c0x0000 (---------------) + blogspot - 0x00310603, // n0x0887 c0x0000 (---------------) + I biz - 0x00222ac3, // n0x0888 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0889 c0x0000 (---------------) + I edu - 0x0021e283, // n0x088a c0x0000 (---------------) + I gov - 0x00200304, // n0x088b c0x0000 (---------------) + I info - 0x00298944, // n0x088c c0x0000 (---------------) + I name - 0x002170c3, // n0x088d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x088e c0x0000 (---------------) + I org - 0x002f85c5, // n0x088f c0x0000 (---------------) + I aland - 0x000e4188, // n0x0890 c0x0000 (---------------) + blogspot - 0x00006743, // n0x0891 c0x0000 (---------------) + iki - 0x0036e608, // n0x0892 c0x0000 (---------------) + I aeroport - 0x00383787, // n0x0893 c0x0000 (---------------) + I assedic - 0x002729c4, // n0x0894 c0x0000 (---------------) + I asso - 0x00310b86, // n0x0895 c0x0000 (---------------) + I avocat - 0x0031e586, // n0x0896 c0x0000 (---------------) + I avoues - 0x000e4188, // n0x0897 c0x0000 (---------------) + blogspot - 0x0025f743, // n0x0898 c0x0000 (---------------) + I cci - 0x003011c9, // n0x0899 c0x0000 (---------------) + I chambagri - 0x00234bd5, // n0x089a c0x0000 (---------------) + I chirurgiens-dentistes - 0x00222ac3, // n0x089b c0x0000 (---------------) + I com - 0x0030c7d2, // n0x089c c0x0000 (---------------) + I experts-comptables - 0x0030c58f, // n0x089d c0x0000 (---------------) + I geometre-expert - 0x003579c4, // n0x089e c0x0000 (---------------) + I gouv - 0x0020dc85, // n0x089f c0x0000 (---------------) + I greta - 0x002de690, // n0x08a0 c0x0000 (---------------) + I huissier-justice - 0x002753c7, // n0x08a1 c0x0000 (---------------) + I medecin - 0x00207cc3, // n0x08a2 c0x0000 (---------------) + I nom - 0x00265c08, // n0x08a3 c0x0000 (---------------) + I notaires - 0x002e078a, // n0x08a4 c0x0000 (---------------) + I pharmacien - 0x0021a444, // n0x08a5 c0x0000 (---------------) + I port - 0x002ca783, // n0x08a6 c0x0000 (---------------) + I prd - 0x0029abc6, // n0x08a7 c0x0000 (---------------) + I presse - 0x00208902, // n0x08a8 c0x0000 (---------------) + I tm - 0x0036b18b, // n0x08a9 c0x0000 (---------------) + I veterinaire - 0x00222ac3, // n0x08aa c0x0000 (---------------) + I com - 0x002d75c3, // n0x08ab c0x0000 (---------------) + I edu - 0x0021e283, // n0x08ac c0x0000 (---------------) + I gov - 0x0023fa03, // n0x08ad c0x0000 (---------------) + I mil - 0x002170c3, // n0x08ae c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08af c0x0000 (---------------) + I org - 0x002ce243, // n0x08b0 c0x0000 (---------------) + I pvt - 0x00200742, // n0x08b1 c0x0000 (---------------) + I co - 0x002170c3, // n0x08b2 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08b3 c0x0000 (---------------) + I org - 0x00222ac3, // n0x08b4 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08b5 c0x0000 (---------------) + I edu - 0x0021e283, // n0x08b6 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x08b7 c0x0000 (---------------) + I mil - 0x0021dcc3, // n0x08b8 c0x0000 (---------------) + I org - 0x00222ac3, // n0x08b9 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08ba c0x0000 (---------------) + I edu - 0x0021e283, // n0x08bb c0x0000 (---------------) + I gov - 0x003413c3, // n0x08bc c0x0000 (---------------) + I ltd - 0x00208483, // n0x08bd c0x0000 (---------------) + I mod - 0x0021dcc3, // n0x08be c0x0000 (---------------) + I org - 0x00200742, // n0x08bf c0x0000 (---------------) + I co - 0x00222ac3, // n0x08c0 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08c1 c0x0000 (---------------) + I edu - 0x002170c3, // n0x08c2 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08c3 c0x0000 (---------------) + I org - 0x00201e82, // n0x08c4 c0x0000 (---------------) + I ac - 0x00222ac3, // n0x08c5 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08c6 c0x0000 (---------------) + I edu - 0x0021e283, // n0x08c7 c0x0000 (---------------) + I gov - 0x002170c3, // n0x08c8 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08c9 c0x0000 (---------------) + I org - 0x002729c4, // n0x08ca c0x0000 (---------------) + I asso - 0x00222ac3, // n0x08cb c0x0000 (---------------) + I com - 0x002d75c3, // n0x08cc c0x0000 (---------------) + I edu - 0x00203604, // n0x08cd c0x0000 (---------------) + I mobi - 0x002170c3, // n0x08ce c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08cf c0x0000 (---------------) + I org - 0x000e4188, // n0x08d0 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x08d1 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08d2 c0x0000 (---------------) + I edu - 0x0021e283, // n0x08d3 c0x0000 (---------------) + I gov - 0x002170c3, // n0x08d4 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08d5 c0x0000 (---------------) + I org - 0x00222ac3, // n0x08d6 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08d7 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x08d8 c0x0000 (---------------) + I gob - 0x00215703, // n0x08d9 c0x0000 (---------------) + I ind - 0x0023fa03, // n0x08da c0x0000 (---------------) + I mil - 0x002170c3, // n0x08db c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08dc c0x0000 (---------------) + I org - 0x00200742, // n0x08dd c0x0000 (---------------) + I co - 0x00222ac3, // n0x08de c0x0000 (---------------) + I com - 0x002170c3, // n0x08df c0x0000 (---------------) + I net - 0x000e4188, // n0x08e0 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x08e1 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08e2 c0x0000 (---------------) + I edu - 0x0021e283, // n0x08e3 c0x0000 (---------------) + I gov - 0x00300b83, // n0x08e4 c0x0000 (---------------) + I idv - 0x00051e43, // n0x08e5 c0x0000 (---------------) + inc - 0x001413c3, // n0x08e6 c0x0000 (---------------) + ltd - 0x002170c3, // n0x08e7 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08e8 c0x0000 (---------------) + I org - 0x002ea10a, // n0x08e9 c0x0000 (---------------) + I xn--55qx5d - 0x00306ac9, // n0x08ea c0x0000 (---------------) + I xn--ciqpn - 0x0032788b, // n0x08eb c0x0000 (---------------) + I xn--gmq050i - 0x00327f0a, // n0x08ec c0x0000 (---------------) + I xn--gmqw5a - 0x0033080a, // n0x08ed c0x0000 (---------------) + I xn--io0a7i - 0x0033f6cb, // n0x08ee c0x0000 (---------------) + I xn--lcvr32d - 0x00356c8a, // n0x08ef c0x0000 (---------------) + I xn--mk0axi - 0x0035c6ca, // n0x08f0 c0x0000 (---------------) + I xn--mxtq1m - 0x0036394a, // n0x08f1 c0x0000 (---------------) + I xn--od0alg - 0x00363bcb, // n0x08f2 c0x0000 (---------------) + I xn--od0aq3b - 0x00384789, // n0x08f3 c0x0000 (---------------) + I xn--tn0ag - 0x003867ca, // n0x08f4 c0x0000 (---------------) + I xn--uc0atv - 0x00386c4b, // n0x08f5 c0x0000 (---------------) + I xn--uc0ay4a - 0x0039008b, // n0x08f6 c0x0000 (---------------) + I xn--wcvs22d - 0x0039634a, // n0x08f7 c0x0000 (---------------) + I xn--zf0avx - 0x00222ac3, // n0x08f8 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08f9 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x08fa c0x0000 (---------------) + I gob - 0x0023fa03, // n0x08fb c0x0000 (---------------) + I mil - 0x002170c3, // n0x08fc c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08fd c0x0000 (---------------) + I org - 0x000e4188, // n0x08fe c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x08ff c0x0000 (---------------) + I com - 0x0024d404, // n0x0900 c0x0000 (---------------) + I from - 0x00209782, // n0x0901 c0x0000 (---------------) + I iz - 0x00298944, // n0x0902 c0x0000 (---------------) + I name - 0x0036b745, // n0x0903 c0x0000 (---------------) + I adult - 0x00200603, // n0x0904 c0x0000 (---------------) + I art - 0x002729c4, // n0x0905 c0x0000 (---------------) + I asso - 0x00222ac3, // n0x0906 c0x0000 (---------------) + I com - 0x00228d44, // n0x0907 c0x0000 (---------------) + I coop - 0x002d75c3, // n0x0908 c0x0000 (---------------) + I edu - 0x00238544, // n0x0909 c0x0000 (---------------) + I firm - 0x003579c4, // n0x090a c0x0000 (---------------) + I gouv - 0x00200304, // n0x090b c0x0000 (---------------) + I info - 0x0020b403, // n0x090c c0x0000 (---------------) + I med - 0x002170c3, // n0x090d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x090e c0x0000 (---------------) + I org - 0x0028acc5, // n0x090f c0x0000 (---------------) + I perso - 0x00218943, // n0x0910 c0x0000 (---------------) + I pol - 0x00218243, // n0x0911 c0x0000 (---------------) + I pro - 0x00241283, // n0x0912 c0x0000 (---------------) + I rel - 0x0029b184, // n0x0913 c0x0000 (---------------) + I shop - 0x0036f244, // n0x0914 c0x0000 (---------------) + I 2000 - 0x00256e45, // n0x0915 c0x0000 (---------------) + I agrar - 0x000e4188, // n0x0916 c0x0000 (---------------) + blogspot - 0x002de404, // n0x0917 c0x0000 (---------------) + I bolt - 0x002112c6, // n0x0918 c0x0000 (---------------) + I casino - 0x002735c4, // n0x0919 c0x0000 (---------------) + I city - 0x00200742, // n0x091a c0x0000 (---------------) + I co - 0x003128c7, // n0x091b c0x0000 (---------------) + I erotica - 0x0023a507, // n0x091c c0x0000 (---------------) + I erotika - 0x00356104, // n0x091d c0x0000 (---------------) + I film - 0x00246b45, // n0x091e c0x0000 (---------------) + I forum - 0x002d2145, // n0x091f c0x0000 (---------------) + I games - 0x00294945, // n0x0920 c0x0000 (---------------) + I hotel - 0x00200304, // n0x0921 c0x0000 (---------------) + I info - 0x0032d888, // n0x0922 c0x0000 (---------------) + I ingatlan - 0x00207486, // n0x0923 c0x0000 (---------------) + I jogasz - 0x002c1d48, // n0x0924 c0x0000 (---------------) + I konyvelo - 0x0023b745, // n0x0925 c0x0000 (---------------) + I lakas - 0x002dc385, // n0x0926 c0x0000 (---------------) + I media - 0x00366d44, // n0x0927 c0x0000 (---------------) + I news - 0x0021dcc3, // n0x0928 c0x0000 (---------------) + I org - 0x002cba44, // n0x0929 c0x0000 (---------------) + I priv - 0x0033de86, // n0x092a c0x0000 (---------------) + I reklam - 0x0029acc3, // n0x092b c0x0000 (---------------) + I sex - 0x0029b184, // n0x092c c0x0000 (---------------) + I shop - 0x0027cac5, // n0x092d c0x0000 (---------------) + I sport - 0x00278704, // n0x092e c0x0000 (---------------) + I suli - 0x0020bac4, // n0x092f c0x0000 (---------------) + I szex - 0x00208902, // n0x0930 c0x0000 (---------------) + I tm - 0x0024f786, // n0x0931 c0x0000 (---------------) + I tozsde - 0x0037a486, // n0x0932 c0x0000 (---------------) + I utazas - 0x002db9c5, // n0x0933 c0x0000 (---------------) + I video - 0x00201e82, // n0x0934 c0x0000 (---------------) + I ac - 0x00310603, // n0x0935 c0x0000 (---------------) + I biz - 0x1b600742, // n0x0936 c0x006d (n0x093f-n0x0940) + I co - 0x00227544, // n0x0937 c0x0000 (---------------) + I desa - 0x00202342, // n0x0938 c0x0000 (---------------) + I go - 0x0023fa03, // n0x0939 c0x0000 (---------------) + I mil - 0x00220282, // n0x093a c0x0000 (---------------) + I my - 0x002170c3, // n0x093b c0x0000 (---------------) + I net - 0x00200c42, // n0x093c c0x0000 (---------------) + I or - 0x00206103, // n0x093d c0x0000 (---------------) + I sch - 0x00219fc3, // n0x093e c0x0000 (---------------) + I web - 0x000e4188, // n0x093f c0x0000 (---------------) + blogspot - 0x000e4188, // n0x0940 c0x0000 (---------------) + blogspot - 0x0021e283, // n0x0941 c0x0000 (---------------) + I gov - 0x1c200742, // n0x0942 c0x0070 (n0x0943-n0x0944) o I co - 0x000e4188, // n0x0943 c0x0000 (---------------) + blogspot - 0x00201e82, // n0x0944 c0x0000 (---------------) + I ac - 0x1ca00742, // n0x0945 c0x0072 (n0x094b-n0x094d) + I co - 0x00222ac3, // n0x0946 c0x0000 (---------------) + I com - 0x002170c3, // n0x0947 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0948 c0x0000 (---------------) + I org - 0x00206582, // n0x0949 c0x0000 (---------------) + I tt - 0x0020bf42, // n0x094a c0x0000 (---------------) + I tv - 0x003413c3, // n0x094b c0x0000 (---------------) + I ltd - 0x002c65c3, // n0x094c c0x0000 (---------------) + I plc - 0x00201e82, // n0x094d c0x0000 (---------------) + I ac - 0x000e4188, // n0x094e c0x0000 (---------------) + blogspot - 0x00200742, // n0x094f c0x0000 (---------------) + I co - 0x002d75c3, // n0x0950 c0x0000 (---------------) + I edu - 0x00238544, // n0x0951 c0x0000 (---------------) + I firm - 0x002012c3, // n0x0952 c0x0000 (---------------) + I gen - 0x0021e283, // n0x0953 c0x0000 (---------------) + I gov - 0x00215703, // n0x0954 c0x0000 (---------------) + I ind - 0x0023fa03, // n0x0955 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0956 c0x0000 (---------------) + I net - 0x0020e3c3, // n0x0957 c0x0000 (---------------) + I nic - 0x0021dcc3, // n0x0958 c0x0000 (---------------) + I org - 0x00215503, // n0x0959 c0x0000 (---------------) + I res - 0x000f7e53, // n0x095a c0x0000 (---------------) + barrel-of-knowledge - 0x00104094, // n0x095b c0x0000 (---------------) + barrell-of-knowledge - 0x00009ac6, // n0x095c c0x0000 (---------------) + dyndns - 0x00042187, // n0x095d c0x0000 (---------------) + for-our - 0x000f8fc9, // n0x095e c0x0000 (---------------) + groks-the - 0x0009b5ca, // n0x095f c0x0000 (---------------) + groks-this - 0x0007690d, // n0x0960 c0x0000 (---------------) + here-for-more - 0x0009bfca, // n0x0961 c0x0000 (---------------) + knowsitall - 0x00130f46, // n0x0962 c0x0000 (---------------) + selfip - 0x00110e86, // n0x0963 c0x0000 (---------------) + webhop - 0x0021d5c2, // n0x0964 c0x0000 (---------------) + I eu - 0x00222ac3, // n0x0965 c0x0000 (---------------) + I com - 0x000b53c6, // n0x0966 c0x0000 (---------------) + github - 0x000f9303, // n0x0967 c0x0000 (---------------) + nid - 0x00222ac3, // n0x0968 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0969 c0x0000 (---------------) + I edu - 0x0021e283, // n0x096a c0x0000 (---------------) + I gov - 0x0023fa03, // n0x096b c0x0000 (---------------) + I mil - 0x002170c3, // n0x096c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x096d c0x0000 (---------------) + I org - 0x00201e82, // n0x096e c0x0000 (---------------) + I ac - 0x00200742, // n0x096f c0x0000 (---------------) + I co - 0x0021e283, // n0x0970 c0x0000 (---------------) + I gov - 0x00206202, // n0x0971 c0x0000 (---------------) + I id - 0x002170c3, // n0x0972 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0973 c0x0000 (---------------) + I org - 0x00206103, // n0x0974 c0x0000 (---------------) + I sch - 0x0034a88f, // n0x0975 c0x0000 (---------------) + I xn--mgba3a4f16a - 0x0034ac4e, // n0x0976 c0x0000 (---------------) + I xn--mgba3a4fra - 0x000e4188, // n0x0977 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x0978 c0x0000 (---------------) + I com - 0x000356c7, // n0x0979 c0x0000 (---------------) + cupcake - 0x002d75c3, // n0x097a c0x0000 (---------------) + I edu - 0x0021e283, // n0x097b c0x0000 (---------------) + I gov - 0x00238c03, // n0x097c c0x0000 (---------------) + I int - 0x002170c3, // n0x097d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x097e c0x0000 (---------------) + I org - 0x00214a43, // n0x097f c0x0000 (---------------) + I abr - 0x0038b8c7, // n0x0980 c0x0000 (---------------) + I abruzzo - 0x002015c2, // n0x0981 c0x0000 (---------------) + I ag - 0x00384949, // n0x0982 c0x0000 (---------------) + I agrigento - 0x00200882, // n0x0983 c0x0000 (---------------) + I al - 0x0022f94b, // n0x0984 c0x0000 (---------------) + I alessandria - 0x002d344a, // n0x0985 c0x0000 (---------------) + I alto-adige - 0x002c0d89, // n0x0986 c0x0000 (---------------) + I altoadige - 0x00201242, // n0x0987 c0x0000 (---------------) + I an - 0x00295b46, // n0x0988 c0x0000 (---------------) + I ancona - 0x00264b95, // n0x0989 c0x0000 (---------------) + I andria-barletta-trani - 0x0022fa95, // n0x098a c0x0000 (---------------) + I andria-trani-barletta - 0x0026bc93, // n0x098b c0x0000 (---------------) + I andriabarlettatrani - 0x00230013, // n0x098c c0x0000 (---------------) + I andriatranibarletta - 0x0020fd82, // n0x098d c0x0000 (---------------) + I ao - 0x00218745, // n0x098e c0x0000 (---------------) + I aosta - 0x00341e0c, // n0x098f c0x0000 (---------------) + I aosta-valley - 0x0029a44b, // n0x0990 c0x0000 (---------------) + I aostavalley - 0x00258685, // n0x0991 c0x0000 (---------------) + I aoste - 0x002105c2, // n0x0992 c0x0000 (---------------) + I ap - 0x00273fc2, // n0x0993 c0x0000 (---------------) + I aq - 0x002d7986, // n0x0994 c0x0000 (---------------) + I aquila - 0x00200602, // n0x0995 c0x0000 (---------------) + I ar - 0x00363106, // n0x0996 c0x0000 (---------------) + I arezzo - 0x0020094d, // n0x0997 c0x0000 (---------------) + I ascoli-piceno - 0x0034714c, // n0x0998 c0x0000 (---------------) + I ascolipiceno - 0x002166c4, // n0x0999 c0x0000 (---------------) + I asti - 0x00201642, // n0x099a c0x0000 (---------------) + I at - 0x00201482, // n0x099b c0x0000 (---------------) + I av - 0x00369f48, // n0x099c c0x0000 (---------------) + I avellino - 0x00205a82, // n0x099d c0x0000 (---------------) + I ba - 0x00240186, // n0x099e c0x0000 (---------------) + I balsan - 0x0027eb84, // n0x099f c0x0000 (---------------) + I bari - 0x00264d55, // n0x09a0 c0x0000 (---------------) + I barletta-trani-andria - 0x0026be13, // n0x09a1 c0x0000 (---------------) + I barlettatraniandria - 0x0020a443, // n0x09a2 c0x0000 (---------------) + I bas - 0x0030d98a, // n0x09a3 c0x0000 (---------------) + I basilicata - 0x002c5dc7, // n0x09a4 c0x0000 (---------------) + I belluno - 0x0030fa49, // n0x09a5 c0x0000 (---------------) + I benevento - 0x0023dc87, // n0x09a6 c0x0000 (---------------) + I bergamo - 0x00355e02, // n0x09a7 c0x0000 (---------------) + I bg - 0x00200002, // n0x09a8 c0x0000 (---------------) + I bi - 0x00381ac6, // n0x09a9 c0x0000 (---------------) + I biella - 0x00205842, // n0x09aa c0x0000 (---------------) + I bl - 0x000e4188, // n0x09ab c0x0000 (---------------) + blogspot - 0x0020a282, // n0x09ac c0x0000 (---------------) + I bn - 0x0020a702, // n0x09ad c0x0000 (---------------) + I bo - 0x0034c987, // n0x09ae c0x0000 (---------------) + I bologna - 0x00391387, // n0x09af c0x0000 (---------------) + I bolzano - 0x00212b85, // n0x09b0 c0x0000 (---------------) + I bozen - 0x00212e82, // n0x09b1 c0x0000 (---------------) + I br - 0x002154c7, // n0x09b2 c0x0000 (---------------) + I brescia - 0x00215688, // n0x09b3 c0x0000 (---------------) + I brindisi - 0x00235102, // n0x09b4 c0x0000 (---------------) + I bs - 0x00216fc2, // n0x09b5 c0x0000 (---------------) + I bt - 0x002203c2, // n0x09b6 c0x0000 (---------------) + I bz - 0x002055c2, // n0x09b7 c0x0000 (---------------) + I ca - 0x00250c08, // n0x09b8 c0x0000 (---------------) + I cagliari - 0x0020e443, // n0x09b9 c0x0000 (---------------) + I cal - 0x00238348, // n0x09ba c0x0000 (---------------) + I calabria - 0x002e718d, // n0x09bb c0x0000 (---------------) + I caltanissetta - 0x0021a083, // n0x09bc c0x0000 (---------------) + I cam - 0x00300748, // n0x09bd c0x0000 (---------------) + I campania - 0x0022c60f, // n0x09be c0x0000 (---------------) + I campidano-medio - 0x0022c9ce, // n0x09bf c0x0000 (---------------) + I campidanomedio - 0x0027284a, // n0x09c0 c0x0000 (---------------) + I campobasso - 0x002d4e91, // n0x09c1 c0x0000 (---------------) + I carbonia-iglesias - 0x002d5310, // n0x09c2 c0x0000 (---------------) + I carboniaiglesias - 0x0031888d, // n0x09c3 c0x0000 (---------------) + I carrara-massa - 0x00318bcc, // n0x09c4 c0x0000 (---------------) + I carraramassa - 0x002055c7, // n0x09c5 c0x0000 (---------------) + I caserta - 0x0030db07, // n0x09c6 c0x0000 (---------------) + I catania - 0x00310c49, // n0x09c7 c0x0000 (---------------) + I catanzaro - 0x002167c2, // n0x09c8 c0x0000 (---------------) + I cb - 0x00200b82, // n0x09c9 c0x0000 (---------------) + I ce - 0x0024434c, // n0x09ca c0x0000 (---------------) + I cesena-forli - 0x0024464b, // n0x09cb c0x0000 (---------------) + I cesenaforli - 0x00204a02, // n0x09cc c0x0000 (---------------) + I ch - 0x002c2546, // n0x09cd c0x0000 (---------------) + I chieti - 0x002155c2, // n0x09ce c0x0000 (---------------) + I ci - 0x0020af42, // n0x09cf c0x0000 (---------------) + I cl - 0x002211c2, // n0x09d0 c0x0000 (---------------) + I cn - 0x00200742, // n0x09d1 c0x0000 (---------------) + I co - 0x002230c4, // n0x09d2 c0x0000 (---------------) + I como - 0x0022bdc7, // n0x09d3 c0x0000 (---------------) + I cosenza - 0x0020c502, // n0x09d4 c0x0000 (---------------) + I cr - 0x00230b87, // n0x09d5 c0x0000 (---------------) + I cremona - 0x00231e07, // n0x09d6 c0x0000 (---------------) + I crotone - 0x0020f142, // n0x09d7 c0x0000 (---------------) + I cs - 0x00223d82, // n0x09d8 c0x0000 (---------------) + I ct - 0x00235585, // n0x09d9 c0x0000 (---------------) + I cuneo - 0x00214442, // n0x09da c0x0000 (---------------) + I cz - 0x002e990e, // n0x09db c0x0000 (---------------) + I dell-ogliastra - 0x002297cd, // n0x09dc c0x0000 (---------------) + I dellogliastra - 0x002d75c3, // n0x09dd c0x0000 (---------------) + I edu - 0x0023f9ce, // n0x09de c0x0000 (---------------) + I emilia-romagna - 0x00261dcd, // n0x09df c0x0000 (---------------) + I emiliaromagna - 0x0034efc3, // n0x09e0 c0x0000 (---------------) + I emr - 0x00200bc2, // n0x09e1 c0x0000 (---------------) + I en - 0x00201504, // n0x09e2 c0x0000 (---------------) + I enna - 0x00235d42, // n0x09e3 c0x0000 (---------------) + I fc - 0x0020c742, // n0x09e4 c0x0000 (---------------) + I fe - 0x002cc345, // n0x09e5 c0x0000 (---------------) + I fermo - 0x002e3b87, // n0x09e6 c0x0000 (---------------) + I ferrara - 0x00331442, // n0x09e7 c0x0000 (---------------) + I fg - 0x002099c2, // n0x09e8 c0x0000 (---------------) + I fi - 0x00237b87, // n0x09e9 c0x0000 (---------------) + I firenze - 0x0023c248, // n0x09ea c0x0000 (---------------) + I florence - 0x00358002, // n0x09eb c0x0000 (---------------) + I fm - 0x00200386, // n0x09ec c0x0000 (---------------) + I foggia - 0x002441cc, // n0x09ed c0x0000 (---------------) + I forli-cesena - 0x0024450b, // n0x09ee c0x0000 (---------------) + I forlicesena - 0x00200d42, // n0x09ef c0x0000 (---------------) + I fr - 0x002495cf, // n0x09f0 c0x0000 (---------------) + I friuli-v-giulia - 0x00249990, // n0x09f1 c0x0000 (---------------) + I friuli-ve-giulia - 0x00249d8f, // n0x09f2 c0x0000 (---------------) + I friuli-vegiulia - 0x0024a155, // n0x09f3 c0x0000 (---------------) + I friuli-venezia-giulia - 0x0024a694, // n0x09f4 c0x0000 (---------------) + I friuli-veneziagiulia - 0x0024ab8e, // n0x09f5 c0x0000 (---------------) + I friuli-vgiulia - 0x0024af0e, // n0x09f6 c0x0000 (---------------) + I friuliv-giulia - 0x0024b28f, // n0x09f7 c0x0000 (---------------) + I friulive-giulia - 0x0024b64e, // n0x09f8 c0x0000 (---------------) + I friulivegiulia - 0x0024b9d4, // n0x09f9 c0x0000 (---------------) + I friulivenezia-giulia - 0x0024bed3, // n0x09fa c0x0000 (---------------) + I friuliveneziagiulia - 0x0024c38d, // n0x09fb c0x0000 (---------------) + I friulivgiulia - 0x00263bc9, // n0x09fc c0x0000 (---------------) + I frosinone - 0x00277443, // n0x09fd c0x0000 (---------------) + I fvg - 0x002012c2, // n0x09fe c0x0000 (---------------) + I ge - 0x0030bb05, // n0x09ff c0x0000 (---------------) + I genoa - 0x002012c6, // n0x0a00 c0x0000 (---------------) + I genova - 0x00202342, // n0x0a01 c0x0000 (---------------) + I go - 0x002473c7, // n0x0a02 c0x0000 (---------------) + I gorizia - 0x0021e283, // n0x0a03 c0x0000 (---------------) + I gov - 0x0020dc82, // n0x0a04 c0x0000 (---------------) + I gr - 0x002e9508, // n0x0a05 c0x0000 (---------------) + I grosseto - 0x002d50d1, // n0x0a06 c0x0000 (---------------) + I iglesias-carbonia - 0x002d5510, // n0x0a07 c0x0000 (---------------) + I iglesiascarbonia - 0x00203582, // n0x0a08 c0x0000 (---------------) + I im - 0x002148c7, // n0x0a09 c0x0000 (---------------) + I imperia - 0x00202b42, // n0x0a0a c0x0000 (---------------) + I is - 0x002ee307, // n0x0a0b c0x0000 (---------------) + I isernia - 0x002034c2, // n0x0a0c c0x0000 (---------------) + I kr - 0x0036dc89, // n0x0a0d c0x0000 (---------------) + I la-spezia - 0x002d7947, // n0x0a0e c0x0000 (---------------) + I laquila - 0x00257b88, // n0x0a0f c0x0000 (---------------) + I laspezia - 0x0035dc46, // n0x0a10 c0x0000 (---------------) + I latina - 0x002c64c3, // n0x0a11 c0x0000 (---------------) + I laz - 0x0035a705, // n0x0a12 c0x0000 (---------------) + I lazio - 0x002339c2, // n0x0a13 c0x0000 (---------------) + I lc - 0x00203c42, // n0x0a14 c0x0000 (---------------) + I le - 0x00381ec5, // n0x0a15 c0x0000 (---------------) + I lecce - 0x0021e6c5, // n0x0a16 c0x0000 (---------------) + I lecco - 0x002008c2, // n0x0a17 c0x0000 (---------------) + I li - 0x0021a583, // n0x0a18 c0x0000 (---------------) + I lig - 0x00244887, // n0x0a19 c0x0000 (---------------) + I liguria - 0x003436c7, // n0x0a1a c0x0000 (---------------) + I livorno - 0x00205882, // n0x0a1b c0x0000 (---------------) + I lo - 0x002455c4, // n0x0a1c c0x0000 (---------------) + I lodi - 0x00260a43, // n0x0a1d c0x0000 (---------------) + I lom - 0x002b0b49, // n0x0a1e c0x0000 (---------------) + I lombardia - 0x002b8a88, // n0x0a1f c0x0000 (---------------) + I lombardy - 0x00205ec2, // n0x0a20 c0x0000 (---------------) + I lt - 0x002071c2, // n0x0a21 c0x0000 (---------------) + I lu - 0x00219187, // n0x0a22 c0x0000 (---------------) + I lucania - 0x0021aa05, // n0x0a23 c0x0000 (---------------) + I lucca - 0x00300248, // n0x0a24 c0x0000 (---------------) + I macerata - 0x0029c6c7, // n0x0a25 c0x0000 (---------------) + I mantova - 0x00216503, // n0x0a26 c0x0000 (---------------) + I mar - 0x0028de06, // n0x0a27 c0x0000 (---------------) + I marche - 0x0031870d, // n0x0a28 c0x0000 (---------------) + I massa-carrara - 0x00318a8c, // n0x0a29 c0x0000 (---------------) + I massacarrara - 0x0029f6c6, // n0x0a2a c0x0000 (---------------) + I matera - 0x00205942, // n0x0a2b c0x0000 (---------------) + I mb - 0x0023a6c2, // n0x0a2c c0x0000 (---------------) + I mc - 0x00208942, // n0x0a2d c0x0000 (---------------) + I me - 0x0022c48f, // n0x0a2e c0x0000 (---------------) + I medio-campidano - 0x0022c88e, // n0x0a2f c0x0000 (---------------) + I mediocampidano - 0x00291407, // n0x0a30 c0x0000 (---------------) + I messina - 0x00204802, // n0x0a31 c0x0000 (---------------) + I mi - 0x002f1e85, // n0x0a32 c0x0000 (---------------) + I milan - 0x002f1e86, // n0x0a33 c0x0000 (---------------) + I milano - 0x00217082, // n0x0a34 c0x0000 (---------------) + I mn - 0x00203602, // n0x0a35 c0x0000 (---------------) + I mo - 0x00278386, // n0x0a36 c0x0000 (---------------) + I modena - 0x00285643, // n0x0a37 c0x0000 (---------------) + I mol - 0x002ee246, // n0x0a38 c0x0000 (---------------) + I molise - 0x002b1e85, // n0x0a39 c0x0000 (---------------) + I monza - 0x002b1e8d, // n0x0a3a c0x0000 (---------------) + I monza-brianza - 0x002b26d5, // n0x0a3b c0x0000 (---------------) + I monza-e-della-brianza - 0x002b2e8c, // n0x0a3c c0x0000 (---------------) + I monzabrianza - 0x002b39cd, // n0x0a3d c0x0000 (---------------) + I monzaebrianza - 0x002b3d92, // n0x0a3e c0x0000 (---------------) + I monzaedellabrianza - 0x00209282, // n0x0a3f c0x0000 (---------------) + I ms - 0x00259642, // n0x0a40 c0x0000 (---------------) + I mt - 0x00200282, // n0x0a41 c0x0000 (---------------) + I na - 0x002b7886, // n0x0a42 c0x0000 (---------------) + I naples - 0x002d5c46, // n0x0a43 c0x0000 (---------------) + I napoli - 0x00200c02, // n0x0a44 c0x0000 (---------------) + I no - 0x00201346, // n0x0a45 c0x0000 (---------------) + I novara - 0x00205bc2, // n0x0a46 c0x0000 (---------------) + I nu - 0x00205bc5, // n0x0a47 c0x0000 (---------------) + I nuoro - 0x002003c2, // n0x0a48 c0x0000 (---------------) + I og - 0x002298c9, // n0x0a49 c0x0000 (---------------) + I ogliastra - 0x0022840c, // n0x0a4a c0x0000 (---------------) + I olbia-tempio - 0x0022874b, // n0x0a4b c0x0000 (---------------) + I olbiatempio - 0x00200c42, // n0x0a4c c0x0000 (---------------) + I or - 0x0023c688, // n0x0a4d c0x0000 (---------------) + I oristano - 0x002031c2, // n0x0a4e c0x0000 (---------------) + I ot - 0x002052c2, // n0x0a4f c0x0000 (---------------) + I pa - 0x0029a206, // n0x0a50 c0x0000 (---------------) + I padova - 0x0034f945, // n0x0a51 c0x0000 (---------------) + I padua - 0x0021ce87, // n0x0a52 c0x0000 (---------------) + I palermo - 0x003927c5, // n0x0a53 c0x0000 (---------------) + I parma - 0x002c0705, // n0x0a54 c0x0000 (---------------) + I pavia - 0x00203e02, // n0x0a55 c0x0000 (---------------) + I pc - 0x0029b282, // n0x0a56 c0x0000 (---------------) + I pd - 0x00214942, // n0x0a57 c0x0000 (---------------) + I pe - 0x0026fa47, // n0x0a58 c0x0000 (---------------) + I perugia - 0x0030758d, // n0x0a59 c0x0000 (---------------) + I pesaro-urbino - 0x0030790c, // n0x0a5a c0x0000 (---------------) + I pesarourbino - 0x00229107, // n0x0a5b c0x0000 (---------------) + I pescara - 0x002bf182, // n0x0a5c c0x0000 (---------------) + I pg - 0x00200b02, // n0x0a5d c0x0000 (---------------) + I pi - 0x00207788, // n0x0a5e c0x0000 (---------------) + I piacenza - 0x00261808, // n0x0a5f c0x0000 (---------------) + I piedmont - 0x002c1308, // n0x0a60 c0x0000 (---------------) + I piemonte - 0x002cd744, // n0x0a61 c0x0000 (---------------) + I pisa - 0x002c41c7, // n0x0a62 c0x0000 (---------------) + I pistoia - 0x002c7d43, // n0x0a63 c0x0000 (---------------) + I pmn - 0x0023df82, // n0x0a64 c0x0000 (---------------) + I pn - 0x00203f02, // n0x0a65 c0x0000 (---------------) + I po - 0x002c9b49, // n0x0a66 c0x0000 (---------------) + I pordenone - 0x00236a47, // n0x0a67 c0x0000 (---------------) + I potenza - 0x00218242, // n0x0a68 c0x0000 (---------------) + I pr - 0x00346185, // n0x0a69 c0x0000 (---------------) + I prato - 0x00295982, // n0x0a6a c0x0000 (---------------) + I pt - 0x00223542, // n0x0a6b c0x0000 (---------------) + I pu - 0x0025cd83, // n0x0a6c c0x0000 (---------------) + I pug - 0x0025cd86, // n0x0a6d c0x0000 (---------------) + I puglia - 0x002ce242, // n0x0a6e c0x0000 (---------------) + I pv - 0x002ce6c2, // n0x0a6f c0x0000 (---------------) + I pz - 0x00201442, // n0x0a70 c0x0000 (---------------) + I ra - 0x0038c106, // n0x0a71 c0x0000 (---------------) + I ragusa - 0x00201447, // n0x0a72 c0x0000 (---------------) + I ravenna - 0x00227b82, // n0x0a73 c0x0000 (---------------) + I rc - 0x002030c2, // n0x0a74 c0x0000 (---------------) + I re - 0x0023818f, // n0x0a75 c0x0000 (---------------) + I reggio-calabria - 0x0023f80d, // n0x0a76 c0x0000 (---------------) + I reggio-emilia - 0x0025df8e, // n0x0a77 c0x0000 (---------------) + I reggiocalabria - 0x00261c4c, // n0x0a78 c0x0000 (---------------) + I reggioemilia - 0x00204782, // n0x0a79 c0x0000 (---------------) + I rg - 0x00202842, // n0x0a7a c0x0000 (---------------) + I ri - 0x0021ba45, // n0x0a7b c0x0000 (---------------) + I rieti - 0x002e79c6, // n0x0a7c c0x0000 (---------------) + I rimini - 0x002194c2, // n0x0a7d c0x0000 (---------------) + I rm - 0x00202182, // n0x0a7e c0x0000 (---------------) + I rn - 0x00200d82, // n0x0a7f c0x0000 (---------------) + I ro - 0x0023fb84, // n0x0a80 c0x0000 (---------------) + I roma - 0x002e7004, // n0x0a81 c0x0000 (---------------) + I rome - 0x002b1386, // n0x0a82 c0x0000 (---------------) + I rovigo - 0x00201a02, // n0x0a83 c0x0000 (---------------) + I sa - 0x002671c7, // n0x0a84 c0x0000 (---------------) + I salerno - 0x00218483, // n0x0a85 c0x0000 (---------------) + I sar - 0x0021c048, // n0x0a86 c0x0000 (---------------) + I sardegna - 0x0021ca08, // n0x0a87 c0x0000 (---------------) + I sardinia - 0x00369a07, // n0x0a88 c0x0000 (---------------) + I sassari - 0x00232a46, // n0x0a89 c0x0000 (---------------) + I savona - 0x00209182, // n0x0a8a c0x0000 (---------------) + I si - 0x00215803, // n0x0a8b c0x0000 (---------------) + I sic - 0x00215807, // n0x0a8c c0x0000 (---------------) + I sicilia - 0x0026b646, // n0x0a8d c0x0000 (---------------) + I sicily - 0x002b77c5, // n0x0a8e c0x0000 (---------------) + I siena - 0x002d0d88, // n0x0a8f c0x0000 (---------------) + I siracusa - 0x00201102, // n0x0a90 c0x0000 (---------------) + I so - 0x0033ca87, // n0x0a91 c0x0000 (---------------) + I sondrio - 0x002101c2, // n0x0a92 c0x0000 (---------------) + I sp - 0x002ceec2, // n0x0a93 c0x0000 (---------------) + I sr - 0x00211f02, // n0x0a94 c0x0000 (---------------) + I ss - 0x002b5a09, // n0x0a95 c0x0000 (---------------) + I suedtirol - 0x0021d0c2, // n0x0a96 c0x0000 (---------------) + I sv - 0x00200142, // n0x0a97 c0x0000 (---------------) + I ta - 0x00229383, // n0x0a98 c0x0000 (---------------) + I taa - 0x0036ec87, // n0x0a99 c0x0000 (---------------) + I taranto - 0x00203202, // n0x0a9a c0x0000 (---------------) + I te - 0x0022858c, // n0x0a9b c0x0000 (---------------) + I tempio-olbia - 0x0022888b, // n0x0a9c c0x0000 (---------------) + I tempioolbia - 0x0029f746, // n0x0a9d c0x0000 (---------------) + I teramo - 0x002f9245, // n0x0a9e c0x0000 (---------------) + I terni - 0x0021d1c2, // n0x0a9f c0x0000 (---------------) + I tn - 0x00201682, // n0x0aa0 c0x0000 (---------------) + I to - 0x0029f3c6, // n0x0aa1 c0x0000 (---------------) + I torino - 0x002520c3, // n0x0aa2 c0x0000 (---------------) + I tos - 0x003096c7, // n0x0aa3 c0x0000 (---------------) + I toscana - 0x00285142, // n0x0aa4 c0x0000 (---------------) + I tp - 0x00202402, // n0x0aa5 c0x0000 (---------------) + I tr - 0x00264a15, // n0x0aa6 c0x0000 (---------------) + I trani-andria-barletta - 0x0022fc55, // n0x0aa7 c0x0000 (---------------) + I trani-barletta-andria - 0x0026bb53, // n0x0aa8 c0x0000 (---------------) + I traniandriabarletta - 0x00230193, // n0x0aa9 c0x0000 (---------------) + I tranibarlettaandria - 0x0027cbc7, // n0x0aaa c0x0000 (---------------) + I trapani - 0x0028cbc8, // n0x0aab c0x0000 (---------------) + I trentino - 0x0028cbd0, // n0x0aac c0x0000 (---------------) + I trentino-a-adige - 0x0029458f, // n0x0aad c0x0000 (---------------) + I trentino-aadige - 0x002d3213, // n0x0aae c0x0000 (---------------) + I trentino-alto-adige - 0x00306652, // n0x0aaf c0x0000 (---------------) + I trentino-altoadige - 0x0033be90, // n0x0ab0 c0x0000 (---------------) + I trentino-s-tirol - 0x0033ac8f, // n0x0ab1 c0x0000 (---------------) + I trentino-stirol - 0x0038cd52, // n0x0ab2 c0x0000 (---------------) + I trentino-sud-tirol - 0x002a4691, // n0x0ab3 c0x0000 (---------------) + I trentino-sudtirol - 0x002acf53, // n0x0ab4 c0x0000 (---------------) + I trentino-sued-tirol - 0x002b57d2, // n0x0ab5 c0x0000 (---------------) + I trentino-suedtirol - 0x002bc54f, // n0x0ab6 c0x0000 (---------------) + I trentinoa-adige - 0x002bd2ce, // n0x0ab7 c0x0000 (---------------) + I trentinoaadige - 0x002dccd2, // n0x0ab8 c0x0000 (---------------) + I trentinoalto-adige - 0x002c0b91, // n0x0ab9 c0x0000 (---------------) + I trentinoaltoadige - 0x002cb48f, // n0x0aba c0x0000 (---------------) + I trentinos-tirol - 0x002cc70e, // n0x0abb c0x0000 (---------------) + I trentinostirol - 0x002cda91, // n0x0abc c0x0000 (---------------) + I trentinosud-tirol - 0x002ce2d0, // n0x0abd c0x0000 (---------------) + I trentinosudtirol - 0x002cea52, // n0x0abe c0x0000 (---------------) + I trentinosued-tirol - 0x002dde91, // n0x0abf c0x0000 (---------------) + I trentinosuedtirol - 0x002d0946, // n0x0ac0 c0x0000 (---------------) + I trento - 0x002de4c7, // n0x0ac1 c0x0000 (---------------) + I treviso - 0x00354007, // n0x0ac2 c0x0000 (---------------) + I trieste - 0x00203a02, // n0x0ac3 c0x0000 (---------------) + I ts - 0x002af6c5, // n0x0ac4 c0x0000 (---------------) + I turin - 0x002d8c87, // n0x0ac5 c0x0000 (---------------) + I tuscany - 0x0020bf42, // n0x0ac6 c0x0000 (---------------) + I tv - 0x002070c2, // n0x0ac7 c0x0000 (---------------) + I ud - 0x00319045, // n0x0ac8 c0x0000 (---------------) + I udine - 0x00215fc3, // n0x0ac9 c0x0000 (---------------) + I umb - 0x002570c6, // n0x0aca c0x0000 (---------------) + I umbria - 0x0030774d, // n0x0acb c0x0000 (---------------) + I urbino-pesaro - 0x00307a8c, // n0x0acc c0x0000 (---------------) + I urbinopesaro - 0x002013c2, // n0x0acd c0x0000 (---------------) + I va - 0x00341c8b, // n0x0ace c0x0000 (---------------) + I val-d-aosta - 0x0029a30a, // n0x0acf c0x0000 (---------------) + I val-daosta - 0x0030ae0a, // n0x0ad0 c0x0000 (---------------) + I vald-aosta - 0x0029e789, // n0x0ad1 c0x0000 (---------------) + I valdaosta - 0x0029c80b, // n0x0ad2 c0x0000 (---------------) + I valle-aosta - 0x002c904d, // n0x0ad3 c0x0000 (---------------) + I valle-d-aosta - 0x002d958c, // n0x0ad4 c0x0000 (---------------) + I valle-daosta - 0x0021860a, // n0x0ad5 c0x0000 (---------------) + I valleaosta - 0x00244e8c, // n0x0ad6 c0x0000 (---------------) + I valled-aosta - 0x0024cc8b, // n0x0ad7 c0x0000 (---------------) + I valledaosta - 0x002584cc, // n0x0ad8 c0x0000 (---------------) + I vallee-aoste - 0x0025be8b, // n0x0ad9 c0x0000 (---------------) + I valleeaoste - 0x00263943, // n0x0ada c0x0000 (---------------) + I vao - 0x00278f86, // n0x0adb c0x0000 (---------------) + I varese - 0x0030b742, // n0x0adc c0x0000 (---------------) + I vb - 0x0034a542, // n0x0add c0x0000 (---------------) + I vc - 0x00211603, // n0x0ade c0x0000 (---------------) + I vda - 0x002014c2, // n0x0adf c0x0000 (---------------) + I ve - 0x002014c3, // n0x0ae0 c0x0000 (---------------) + I ven - 0x003546c6, // n0x0ae1 c0x0000 (---------------) + I veneto - 0x0024a307, // n0x0ae2 c0x0000 (---------------) + I venezia - 0x0025c506, // n0x0ae3 c0x0000 (---------------) + I venice - 0x00220fc8, // n0x0ae4 c0x0000 (---------------) + I verbania - 0x002a5e88, // n0x0ae5 c0x0000 (---------------) + I vercelli - 0x00248346, // n0x0ae6 c0x0000 (---------------) + I verona - 0x00213602, // n0x0ae7 c0x0000 (---------------) + I vi - 0x002db38d, // n0x0ae8 c0x0000 (---------------) + I vibo-valentia - 0x002db6cc, // n0x0ae9 c0x0000 (---------------) + I vibovalentia - 0x00357a87, // n0x0aea c0x0000 (---------------) + I vicenza - 0x002de2c7, // n0x0aeb c0x0000 (---------------) + I viterbo - 0x00211782, // n0x0aec c0x0000 (---------------) + I vr - 0x0020bf82, // n0x0aed c0x0000 (---------------) + I vs - 0x0021e302, // n0x0aee c0x0000 (---------------) + I vt - 0x0024ebc2, // n0x0aef c0x0000 (---------------) + I vv - 0x00200742, // n0x0af0 c0x0000 (---------------) + I co - 0x002170c3, // n0x0af1 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0af2 c0x0000 (---------------) + I org - 0x00222ac3, // n0x0af3 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0af4 c0x0000 (---------------) + I edu - 0x0021e283, // n0x0af5 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x0af6 c0x0000 (---------------) + I mil - 0x00298944, // n0x0af7 c0x0000 (---------------) + I name - 0x002170c3, // n0x0af8 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0af9 c0x0000 (---------------) + I org - 0x00206103, // n0x0afa c0x0000 (---------------) + I sch - 0x00201e82, // n0x0afb c0x0000 (---------------) + I ac - 0x00210a02, // n0x0afc c0x0000 (---------------) + I ad - 0x1fa34b45, // n0x0afd c0x007e (n0x0b6a-n0x0b9e) + I aichi - 0x1fe06e05, // n0x0afe c0x007f (n0x0b9e-n0x0bba) + I akita - 0x20387ac6, // n0x0aff c0x0080 (n0x0bba-n0x0bd0) + I aomori - 0x000e4188, // n0x0b00 c0x0000 (---------------) + blogspot - 0x206a0745, // n0x0b01 c0x0081 (n0x0bd0-n0x0c0a) + I chiba - 0x00200742, // n0x0b02 c0x0000 (---------------) + I co - 0x00203fc2, // n0x0b03 c0x0000 (---------------) + I ed - 0x20b1c945, // n0x0b04 c0x0082 (n0x0c0a-n0x0c20) + I ehime - 0x20e6b7c5, // n0x0b05 c0x0083 (n0x0c20-n0x0c2f) + I fukui - 0x2126c587, // n0x0b06 c0x0084 (n0x0c2f-n0x0c6e) + I fukuoka - 0x2166d5c9, // n0x0b07 c0x0085 (n0x0c6e-n0x0ca1) + I fukushima - 0x21a89804, // n0x0b08 c0x0086 (n0x0ca1-n0x0cc7) + I gifu - 0x00202342, // n0x0b09 c0x0000 (---------------) + I go - 0x0020dc82, // n0x0b0a c0x0000 (---------------) + I gr - 0x21e36f85, // n0x0b0b c0x0087 (n0x0cc7-n0x0ceb) + I gunma - 0x2227c649, // n0x0b0c c0x0088 (n0x0ceb-n0x0d04) + I hiroshima - 0x2275fc48, // n0x0b0d c0x0089 (n0x0d04-n0x0d92) + I hokkaido - 0x22a96e45, // n0x0b0e c0x008a (n0x0d92-n0x0dc0) + I hyogo - 0x22f16ac7, // n0x0b0f c0x008b (n0x0dc0-n0x0df3) + I ibaraki - 0x23214e48, // n0x0b10 c0x008c (n0x0df3-n0x0e06) + I ishikawa - 0x236c3b85, // n0x0b11 c0x008d (n0x0e06-n0x0e28) + I iwate - 0x23a81f06, // n0x0b12 c0x008e (n0x0e28-n0x0e37) + I kagawa - 0x23e71789, // n0x0b13 c0x008f (n0x0e37-n0x0e4b) + I kagoshima - 0x24332808, // n0x0b14 c0x0090 (n0x0e4b-n0x0e69) + I kanagawa - 0x246a8748, // n0x0b15 c0x0091 (n0x0e69-n0x0e6a)* o I kawasaki - 0x24a8294a, // n0x0b16 c0x0092 (n0x0e6a-n0x0e6b)* o I kitakyushu - 0x24e43484, // n0x0b17 c0x0093 (n0x0e6b-n0x0e6c)* o I kobe - 0x252ba445, // n0x0b18 c0x0094 (n0x0e6c-n0x0e8b) + I kochi - 0x256a2d48, // n0x0b19 c0x0095 (n0x0e8b-n0x0ea5) + I kumamoto - 0x25aacb05, // n0x0b1a c0x0096 (n0x0ea5-n0x0ec4) + I kyoto - 0x0020e4c2, // n0x0b1b c0x0000 (---------------) + I lg - 0x25e28143, // n0x0b1c c0x0097 (n0x0ec4-n0x0ee2) + I mie - 0x2628d746, // n0x0b1d c0x0098 (n0x0ee2-n0x0f03) + I miyagi - 0x26771208, // n0x0b1e c0x0099 (n0x0f03-n0x0f1e) + I miyazaki - 0x26b4e4c6, // n0x0b1f c0x009a (n0x0f1e-n0x0f69) + I nagano - 0x26f6c108, // n0x0b20 c0x009b (n0x0f69-n0x0f7f) + I nagasaki - 0x2732b206, // n0x0b21 c0x009c (n0x0f7f-n0x0f80)* o I nagoya - 0x276da0c4, // n0x0b22 c0x009d (n0x0f80-n0x0fa6) + I nara - 0x00201082, // n0x0b23 c0x0000 (---------------) + I ne - 0x27a5f907, // n0x0b24 c0x009e (n0x0fa6-n0x0fc8) + I niigata - 0x27e98d04, // n0x0b25 c0x009f (n0x0fc8-n0x0fdb) + I oita - 0x28266607, // n0x0b26 c0x00a0 (n0x0fdb-n0x0ff5) + I okayama - 0x287954c7, // n0x0b27 c0x00a1 (n0x0ff5-n0x101f) + I okinawa - 0x00200c42, // n0x0b28 c0x0000 (---------------) + I or - 0x28a864c5, // n0x0b29 c0x00a2 (n0x101f-n0x1051) + I osaka - 0x28e75104, // n0x0b2a c0x00a3 (n0x1051-n0x106b) + I saga - 0x292d0f07, // n0x0b2b c0x00a4 (n0x106b-n0x10b0) + I saitama - 0x296129c7, // n0x0b2c c0x00a5 (n0x10b0-n0x10b1)* o I sapporo - 0x29a6f286, // n0x0b2d c0x00a6 (n0x10b1-n0x10b2)* o I sendai - 0x29e525c5, // n0x0b2e c0x00a7 (n0x10b2-n0x10c9) + I shiga - 0x2a281087, // n0x0b2f c0x00a8 (n0x10c9-n0x10e0) + I shimane - 0x2a6b4b88, // n0x0b30 c0x00a9 (n0x10e0-n0x1104) + I shizuoka - 0x2ab0f5c7, // n0x0b31 c0x00aa (n0x1104-n0x1123) + I tochigi - 0x2ae8e2c9, // n0x0b32 c0x00ab (n0x1123-n0x1134) + I tokushima - 0x2b316545, // n0x0b33 c0x00ac (n0x1134-n0x116d) + I tokyo - 0x2b6e2787, // n0x0b34 c0x00ad (n0x116d-n0x117a) + I tottori - 0x2ba7c346, // n0x0b35 c0x00ae (n0x117a-n0x1192) + I toyama - 0x2bf2dc48, // n0x0b36 c0x00af (n0x1192-n0x11af) + I wakayama - 0x0022528d, // n0x0b37 c0x0000 (---------------) + I xn--0trq7p7nn - 0x00260809, // n0x0b38 c0x0000 (---------------) + I xn--1ctwo - 0x0026d84b, // n0x0b39 c0x0000 (---------------) + I xn--1lqs03n - 0x002910cb, // n0x0b3a c0x0000 (---------------) + I xn--1lqs71d - 0x002b1bcb, // n0x0b3b c0x0000 (---------------) + I xn--2m4a15e - 0x002d6b8b, // n0x0b3c c0x0000 (---------------) + I xn--32vp30h - 0x002e7bcb, // n0x0b3d c0x0000 (---------------) + I xn--4it168d - 0x002e7e8b, // n0x0b3e c0x0000 (---------------) + I xn--4it797k - 0x002e8689, // n0x0b3f c0x0000 (---------------) + I xn--4pvxs - 0x002ea38b, // n0x0b40 c0x0000 (---------------) + I xn--5js045d - 0x002ea64b, // n0x0b41 c0x0000 (---------------) + I xn--5rtp49c - 0x002ead0b, // n0x0b42 c0x0000 (---------------) + I xn--5rtq34k - 0x002eb3ca, // n0x0b43 c0x0000 (---------------) + I xn--6btw5a - 0x002eb90a, // n0x0b44 c0x0000 (---------------) + I xn--6orx2r - 0x002ebf0c, // n0x0b45 c0x0000 (---------------) + I xn--7t0a264c - 0x002f16cb, // n0x0b46 c0x0000 (---------------) + I xn--8ltr62k - 0x002f200a, // n0x0b47 c0x0000 (---------------) + I xn--8pvr4u - 0x0030374a, // n0x0b48 c0x0000 (---------------) + I xn--c3s14m - 0x0031334e, // n0x0b49 c0x0000 (---------------) + I xn--d5qv7z876c - 0x00313d4e, // n0x0b4a c0x0000 (---------------) + I xn--djrs72d6uy - 0x003140ca, // n0x0b4b c0x0000 (---------------) + I xn--djty4k - 0x003153ca, // n0x0b4c c0x0000 (---------------) + I xn--efvn9s - 0x0031700b, // n0x0b4d c0x0000 (---------------) + I xn--ehqz56n - 0x003172cb, // n0x0b4e c0x0000 (---------------) + I xn--elqq16h - 0x00317fcb, // n0x0b4f c0x0000 (---------------) + I xn--f6qx53a - 0x00333bcb, // n0x0b50 c0x0000 (---------------) + I xn--k7yn95e - 0x003341ca, // n0x0b51 c0x0000 (---------------) + I xn--kbrq7o - 0x00334e8b, // n0x0b52 c0x0000 (---------------) + I xn--klt787d - 0x0033514a, // n0x0b53 c0x0000 (---------------) + I xn--kltp7d - 0x003353ca, // n0x0b54 c0x0000 (---------------) + I xn--kltx9a - 0x0033564a, // n0x0b55 c0x0000 (---------------) + I xn--klty5x - 0x00357c4b, // n0x0b56 c0x0000 (---------------) + I xn--mkru45i - 0x0035d08b, // n0x0b57 c0x0000 (---------------) + I xn--nit225k - 0x0036094e, // n0x0b58 c0x0000 (---------------) + I xn--ntso0iqx3a - 0x00360ccb, // n0x0b59 c0x0000 (---------------) + I xn--ntsq17g - 0x003687cb, // n0x0b5a c0x0000 (---------------) + I xn--pssu33l - 0x0036a44b, // n0x0b5b c0x0000 (---------------) + I xn--qqqt11m - 0x003725ca, // n0x0b5c c0x0000 (---------------) + I xn--rht27z - 0x00372849, // n0x0b5d c0x0000 (---------------) + I xn--rht3d - 0x00372a8a, // n0x0b5e c0x0000 (---------------) + I xn--rht61e - 0x0037410a, // n0x0b5f c0x0000 (---------------) + I xn--rny31h - 0x0038548b, // n0x0b60 c0x0000 (---------------) + I xn--tor131o - 0x00386f0b, // n0x0b61 c0x0000 (---------------) + I xn--uist22h - 0x0038744a, // n0x0b62 c0x0000 (---------------) + I xn--uisz3g - 0x0038824b, // n0x0b63 c0x0000 (---------------) + I xn--uuwu58a - 0x0038d1cb, // n0x0b64 c0x0000 (---------------) + I xn--vgu402c - 0x00395d8b, // n0x0b65 c0x0000 (---------------) + I xn--zbx025d - 0x2c26dc08, // n0x0b66 c0x00b0 (n0x11af-n0x11d1) + I yamagata - 0x2c676089, // n0x0b67 c0x00b1 (n0x11d1-n0x11e1) + I yamaguchi - 0x2ca9b889, // n0x0b68 c0x00b2 (n0x11e1-n0x11fd) + I yamanashi - 0x2cf2b5c8, // n0x0b69 c0x00b3 (n0x11fd-n0x11fe)* o I yokohama - 0x002a2345, // n0x0b6a c0x0000 (---------------) + I aisai - 0x002068c3, // n0x0b6b c0x0000 (---------------) + I ama - 0x00203884, // n0x0b6c c0x0000 (---------------) + I anjo - 0x0034cb85, // n0x0b6d c0x0000 (---------------) + I asuke - 0x00289546, // n0x0b6e c0x0000 (---------------) + I chiryu - 0x002932c5, // n0x0b6f c0x0000 (---------------) + I chita - 0x00274d84, // n0x0b70 c0x0000 (---------------) + I fuso - 0x002472c8, // n0x0b71 c0x0000 (---------------) + I gamagori - 0x00242045, // n0x0b72 c0x0000 (---------------) + I handa - 0x0027ed44, // n0x0b73 c0x0000 (---------------) + I hazu - 0x002b2387, // n0x0b74 c0x0000 (---------------) + I hekinan - 0x00288d0a, // n0x0b75 c0x0000 (---------------) + I higashiura - 0x002a580a, // n0x0b76 c0x0000 (---------------) + I ichinomiya - 0x0031f587, // n0x0b77 c0x0000 (---------------) + I inazawa - 0x002067c7, // n0x0b78 c0x0000 (---------------) + I inuyama - 0x002d6707, // n0x0b79 c0x0000 (---------------) + I isshiki - 0x00248887, // n0x0b7a c0x0000 (---------------) + I iwakura - 0x00203cc5, // n0x0b7b c0x0000 (---------------) + I kanie - 0x00311ec6, // n0x0b7c c0x0000 (---------------) + I kariya - 0x0027cf47, // n0x0b7d c0x0000 (---------------) + I kasugai - 0x0025a504, // n0x0b7e c0x0000 (---------------) + I kira - 0x002fe646, // n0x0b7f c0x0000 (---------------) + I kiyosu - 0x002977c6, // n0x0b80 c0x0000 (---------------) + I komaki - 0x00204cc5, // n0x0b81 c0x0000 (---------------) + I konan - 0x0024c9c4, // n0x0b82 c0x0000 (---------------) + I kota - 0x00292a46, // n0x0b83 c0x0000 (---------------) + I mihama - 0x00288107, // n0x0b84 c0x0000 (---------------) + I miyoshi - 0x002209c6, // n0x0b85 c0x0000 (---------------) + I nishio - 0x002e6987, // n0x0b86 c0x0000 (---------------) + I nisshin - 0x0027e743, // n0x0b87 c0x0000 (---------------) + I obu - 0x0023be46, // n0x0b88 c0x0000 (---------------) + I oguchi - 0x0024f085, // n0x0b89 c0x0000 (---------------) + I oharu - 0x0026c687, // n0x0b8a c0x0000 (---------------) + I okazaki - 0x002ad48a, // n0x0b8b c0x0000 (---------------) + I owariasahi - 0x002e9604, // n0x0b8c c0x0000 (---------------) + I seto - 0x00213308, // n0x0b8d c0x0000 (---------------) + I shikatsu - 0x0028d309, // n0x0b8e c0x0000 (---------------) + I shinshiro - 0x002a4307, // n0x0b8f c0x0000 (---------------) + I shitara - 0x0026a586, // n0x0b90 c0x0000 (---------------) + I tahara - 0x00248648, // n0x0b91 c0x0000 (---------------) + I takahama - 0x0030be89, // n0x0b92 c0x0000 (---------------) + I tobishima - 0x00366704, // n0x0b93 c0x0000 (---------------) + I toei - 0x0025d104, // n0x0b94 c0x0000 (---------------) + I togo - 0x002df1c5, // n0x0b95 c0x0000 (---------------) + I tokai - 0x00376b08, // n0x0b96 c0x0000 (---------------) + I tokoname - 0x002aeb47, // n0x0b97 c0x0000 (---------------) + I toyoake - 0x00286c89, // n0x0b98 c0x0000 (---------------) + I toyohashi - 0x00322bc8, // n0x0b99 c0x0000 (---------------) + I toyokawa - 0x00221246, // n0x0b9a c0x0000 (---------------) + I toyone - 0x00338906, // n0x0b9b c0x0000 (---------------) + I toyota - 0x00283308, // n0x0b9c c0x0000 (---------------) + I tsushima - 0x00359906, // n0x0b9d c0x0000 (---------------) + I yatomi - 0x00206e05, // n0x0b9e c0x0000 (---------------) + I akita - 0x0026f346, // n0x0b9f c0x0000 (---------------) + I daisen - 0x00266b48, // n0x0ba0 c0x0000 (---------------) + I fujisato - 0x002dc286, // n0x0ba1 c0x0000 (---------------) + I gojome - 0x0024608b, // n0x0ba2 c0x0000 (---------------) + I hachirogata - 0x00279ac6, // n0x0ba3 c0x0000 (---------------) + I happou - 0x00284b0d, // n0x0ba4 c0x0000 (---------------) + I higashinaruse - 0x002028c5, // n0x0ba5 c0x0000 (---------------) + I honjo - 0x00292e46, // n0x0ba6 c0x0000 (---------------) + I honjyo - 0x00214f05, // n0x0ba7 c0x0000 (---------------) + I ikawa - 0x00281889, // n0x0ba8 c0x0000 (---------------) + I kamikoani - 0x0022ea47, // n0x0ba9 c0x0000 (---------------) + I kamioka - 0x0033ecc8, // n0x0baa c0x0000 (---------------) + I katagami - 0x0022bc46, // n0x0bab c0x0000 (---------------) + I kazuno - 0x00283c89, // n0x0bac c0x0000 (---------------) + I kitaakita - 0x0036b9c6, // n0x0bad c0x0000 (---------------) + I kosaka - 0x002ad405, // n0x0bae c0x0000 (---------------) + I kyowa - 0x0028b246, // n0x0baf c0x0000 (---------------) + I misato - 0x002bf786, // n0x0bb0 c0x0000 (---------------) + I mitane - 0x002b5c49, // n0x0bb1 c0x0000 (---------------) + I moriyoshi - 0x00226806, // n0x0bb2 c0x0000 (---------------) + I nikaho - 0x0023a007, // n0x0bb3 c0x0000 (---------------) + I noshiro - 0x0027bd85, // n0x0bb4 c0x0000 (---------------) + I odate - 0x00204043, // n0x0bb5 c0x0000 (---------------) + I oga - 0x00246205, // n0x0bb6 c0x0000 (---------------) + I ogata - 0x00293cc7, // n0x0bb7 c0x0000 (---------------) + I semboku - 0x0023ed06, // n0x0bb8 c0x0000 (---------------) + I yokote - 0x002027c9, // n0x0bb9 c0x0000 (---------------) + I yurihonjo - 0x00387ac6, // n0x0bba c0x0000 (---------------) + I aomori - 0x0026f586, // n0x0bbb c0x0000 (---------------) + I gonohe - 0x0022e109, // n0x0bbc c0x0000 (---------------) + I hachinohe - 0x0026ed49, // n0x0bbd c0x0000 (---------------) + I hashikami - 0x0028bc07, // n0x0bbe c0x0000 (---------------) + I hiranai - 0x00305a08, // n0x0bbf c0x0000 (---------------) + I hirosaki - 0x00273909, // n0x0bc0 c0x0000 (---------------) + I itayanagi - 0x0026ce88, // n0x0bc1 c0x0000 (---------------) + I kuroishi - 0x0035c906, // n0x0bc2 c0x0000 (---------------) + I misawa - 0x002bda45, // n0x0bc3 c0x0000 (---------------) + I mutsu - 0x0021638a, // n0x0bc4 c0x0000 (---------------) + I nakadomari - 0x0026f606, // n0x0bc5 c0x0000 (---------------) + I noheji - 0x0035e1c6, // n0x0bc6 c0x0000 (---------------) + I oirase - 0x0028d905, // n0x0bc7 c0x0000 (---------------) + I owani - 0x00205c88, // n0x0bc8 c0x0000 (---------------) + I rokunohe - 0x002092c7, // n0x0bc9 c0x0000 (---------------) + I sannohe - 0x0029ba0a, // n0x0bca c0x0000 (---------------) + I shichinohe - 0x00238986, // n0x0bcb c0x0000 (---------------) + I shingo - 0x0024cec5, // n0x0bcc c0x0000 (---------------) + I takko - 0x0023e846, // n0x0bcd c0x0000 (---------------) + I towada - 0x002e1a47, // n0x0bce c0x0000 (---------------) + I tsugaru - 0x0026a447, // n0x0bcf c0x0000 (---------------) + I tsuruta - 0x002041c5, // n0x0bd0 c0x0000 (---------------) + I abiko - 0x002ad5c5, // n0x0bd1 c0x0000 (---------------) + I asahi - 0x002c6646, // n0x0bd2 c0x0000 (---------------) + I chonan - 0x002c6e86, // n0x0bd3 c0x0000 (---------------) + I chosei - 0x0034a586, // n0x0bd4 c0x0000 (---------------) + I choshi - 0x002be904, // n0x0bd5 c0x0000 (---------------) + I chuo - 0x0026e2c9, // n0x0bd6 c0x0000 (---------------) + I funabashi - 0x00276f46, // n0x0bd7 c0x0000 (---------------) + I futtsu - 0x002d6f4a, // n0x0bd8 c0x0000 (---------------) + I hanamigawa - 0x0027df48, // n0x0bd9 c0x0000 (---------------) + I ichihara - 0x00312b88, // n0x0bda c0x0000 (---------------) + I ichikawa - 0x002a580a, // n0x0bdb c0x0000 (---------------) + I ichinomiya - 0x00329b05, // n0x0bdc c0x0000 (---------------) + I inzai - 0x00288045, // n0x0bdd c0x0000 (---------------) + I isumi - 0x00269408, // n0x0bde c0x0000 (---------------) + I kamagaya - 0x002ba1c8, // n0x0bdf c0x0000 (---------------) + I kamogawa - 0x00375c87, // n0x0be0 c0x0000 (---------------) + I kashiwa - 0x00335e46, // n0x0be1 c0x0000 (---------------) + I katori - 0x002fd408, // n0x0be2 c0x0000 (---------------) + I katsuura - 0x0027d607, // n0x0be3 c0x0000 (---------------) + I kimitsu - 0x0026c7c8, // n0x0be4 c0x0000 (---------------) + I kisarazu - 0x0035d306, // n0x0be5 c0x0000 (---------------) + I kozaki - 0x0026ff48, // n0x0be6 c0x0000 (---------------) + I kujukuri - 0x0027e846, // n0x0be7 c0x0000 (---------------) + I kyonan - 0x0023b8c7, // n0x0be8 c0x0000 (---------------) + I matsudo - 0x002846c6, // n0x0be9 c0x0000 (---------------) + I midori - 0x00292a46, // n0x0bea c0x0000 (---------------) + I mihama - 0x00213fca, // n0x0beb c0x0000 (---------------) + I minamiboso - 0x00223146, // n0x0bec c0x0000 (---------------) + I mobara - 0x002bda49, // n0x0bed c0x0000 (---------------) + I mutsuzawa - 0x0032a1c6, // n0x0bee c0x0000 (---------------) + I nagara - 0x002a0a8a, // n0x0bef c0x0000 (---------------) + I nagareyama - 0x002da0c9, // n0x0bf0 c0x0000 (---------------) + I narashino - 0x0025ac46, // n0x0bf1 c0x0000 (---------------) + I narita - 0x00384f84, // n0x0bf2 c0x0000 (---------------) + I noda - 0x0030bbcd, // n0x0bf3 c0x0000 (---------------) + I oamishirasato - 0x00276307, // n0x0bf4 c0x0000 (---------------) + I omigawa - 0x002fffc6, // n0x0bf5 c0x0000 (---------------) + I onjuku - 0x002a8605, // n0x0bf6 c0x0000 (---------------) + I otaki - 0x0036ba45, // n0x0bf7 c0x0000 (---------------) + I sakae - 0x002f4d46, // n0x0bf8 c0x0000 (---------------) + I sakura - 0x002a73c9, // n0x0bf9 c0x0000 (---------------) + I shimofusa - 0x002b9447, // n0x0bfa c0x0000 (---------------) + I shirako - 0x00268406, // n0x0bfb c0x0000 (---------------) + I shiroi - 0x0029fd06, // n0x0bfc c0x0000 (---------------) + I shisui - 0x00274e09, // n0x0bfd c0x0000 (---------------) + I sodegaura - 0x0022a904, // n0x0bfe c0x0000 (---------------) + I sosa - 0x0021f304, // n0x0bff c0x0000 (---------------) + I tako - 0x0038a708, // n0x0c00 c0x0000 (---------------) + I tateyama - 0x002e5fc6, // n0x0c01 c0x0000 (---------------) + I togane - 0x00340e08, // n0x0c02 c0x0000 (---------------) + I tohnosho - 0x003163c8, // n0x0c03 c0x0000 (---------------) + I tomisato - 0x00206f47, // n0x0c04 c0x0000 (---------------) + I urayasu - 0x00382d89, // n0x0c05 c0x0000 (---------------) + I yachimata - 0x002e38c7, // n0x0c06 c0x0000 (---------------) + I yachiyo - 0x002a060a, // n0x0c07 c0x0000 (---------------) + I yokaichiba - 0x00315d8f, // n0x0c08 c0x0000 (---------------) + I yokoshibahikari - 0x002394ca, // n0x0c09 c0x0000 (---------------) + I yotsukaido - 0x0021b845, // n0x0c0a c0x0000 (---------------) + I ainan - 0x00266d85, // n0x0c0b c0x0000 (---------------) + I honai - 0x0020f345, // n0x0c0c c0x0000 (---------------) + I ikata - 0x0027eac7, // n0x0c0d c0x0000 (---------------) + I imabari - 0x00253503, // n0x0c0e c0x0000 (---------------) + I iyo - 0x00305c08, // n0x0c0f c0x0000 (---------------) + I kamijima - 0x0037aec6, // n0x0c10 c0x0000 (---------------) + I kihoku - 0x0037afc9, // n0x0c11 c0x0000 (---------------) + I kumakogen - 0x002e5286, // n0x0c12 c0x0000 (---------------) + I masaki - 0x00392e07, // n0x0c13 c0x0000 (---------------) + I matsuno - 0x00283a49, // n0x0c14 c0x0000 (---------------) + I matsuyama - 0x0033ebc8, // n0x0c15 c0x0000 (---------------) + I namikata - 0x0028d9c7, // n0x0c16 c0x0000 (---------------) + I niihama - 0x002e3dc3, // n0x0c17 c0x0000 (---------------) + I ozu - 0x002a23c5, // n0x0c18 c0x0000 (---------------) + I saijo - 0x00315cc5, // n0x0c19 c0x0000 (---------------) + I seiyo - 0x002be74b, // n0x0c1a c0x0000 (---------------) + I shikokuchuo - 0x002acbc4, // n0x0c1b c0x0000 (---------------) + I tobe - 0x002d1504, // n0x0c1c c0x0000 (---------------) + I toon - 0x00265706, // n0x0c1d c0x0000 (---------------) + I uchiko - 0x002e4647, // n0x0c1e c0x0000 (---------------) + I uwajima - 0x003804ca, // n0x0c1f c0x0000 (---------------) + I yawatahama - 0x002281c7, // n0x0c20 c0x0000 (---------------) + I echizen - 0x00366787, // n0x0c21 c0x0000 (---------------) + I eiheiji - 0x0026b7c5, // n0x0c22 c0x0000 (---------------) + I fukui - 0x00390e45, // n0x0c23 c0x0000 (---------------) + I ikeda - 0x00260149, // n0x0c24 c0x0000 (---------------) + I katsuyama - 0x00292a46, // n0x0c25 c0x0000 (---------------) + I mihama - 0x0022804d, // n0x0c26 c0x0000 (---------------) + I minamiechizen - 0x00395885, // n0x0c27 c0x0000 (---------------) + I obama - 0x00285a43, // n0x0c28 c0x0000 (---------------) + I ohi - 0x00207e83, // n0x0c29 c0x0000 (---------------) + I ono - 0x003404c5, // n0x0c2a c0x0000 (---------------) + I sabae - 0x003396c5, // n0x0c2b c0x0000 (---------------) + I sakai - 0x00248648, // n0x0c2c c0x0000 (---------------) + I takahama - 0x00277007, // n0x0c2d c0x0000 (---------------) + I tsuruga - 0x0021f086, // n0x0c2e c0x0000 (---------------) + I wakasa - 0x00289c86, // n0x0c2f c0x0000 (---------------) + I ashiya - 0x0021de85, // n0x0c30 c0x0000 (---------------) + I buzen - 0x00375807, // n0x0c31 c0x0000 (---------------) + I chikugo - 0x00206a47, // n0x0c32 c0x0000 (---------------) + I chikuho - 0x002a5bc7, // n0x0c33 c0x0000 (---------------) + I chikujo - 0x002ba4ca, // n0x0c34 c0x0000 (---------------) + I chikushino - 0x0023bf08, // n0x0c35 c0x0000 (---------------) + I chikuzen - 0x002be904, // n0x0c36 c0x0000 (---------------) + I chuo - 0x0024ed47, // n0x0c37 c0x0000 (---------------) + I dazaifu - 0x0026ae87, // n0x0c38 c0x0000 (---------------) + I fukuchi - 0x00317546, // n0x0c39 c0x0000 (---------------) + I hakata - 0x002545c7, // n0x0c3a c0x0000 (---------------) + I higashi - 0x002c5b48, // n0x0c3b c0x0000 (---------------) + I hirokawa - 0x0029b788, // n0x0c3c c0x0000 (---------------) + I hisayama - 0x00246d86, // n0x0c3d c0x0000 (---------------) + I iizuka - 0x0023abc8, // n0x0c3e c0x0000 (---------------) + I inatsuki - 0x00226884, // n0x0c3f c0x0000 (---------------) + I kaho - 0x0027cf46, // n0x0c40 c0x0000 (---------------) + I kasuga - 0x0020d3c6, // n0x0c41 c0x0000 (---------------) + I kasuya - 0x003824c6, // n0x0c42 c0x0000 (---------------) + I kawara - 0x00295dc6, // n0x0c43 c0x0000 (---------------) + I keisen - 0x00232c84, // n0x0c44 c0x0000 (---------------) + I koga - 0x00248946, // n0x0c45 c0x0000 (---------------) + I kurate - 0x002a67c6, // n0x0c46 c0x0000 (---------------) + I kurogi - 0x00282e46, // n0x0c47 c0x0000 (---------------) + I kurume - 0x00213fc6, // n0x0c48 c0x0000 (---------------) + I minami - 0x00207d46, // n0x0c49 c0x0000 (---------------) + I miyako - 0x00272346, // n0x0c4a c0x0000 (---------------) + I miyama - 0x0021ef88, // n0x0c4b c0x0000 (---------------) + I miyawaka - 0x002fe4c8, // n0x0c4c c0x0000 (---------------) + I mizumaki - 0x002bb0c8, // n0x0c4d c0x0000 (---------------) + I munakata - 0x002934c8, // n0x0c4e c0x0000 (---------------) + I nakagawa - 0x00269386, // n0x0c4f c0x0000 (---------------) + I nakama - 0x00208b85, // n0x0c50 c0x0000 (---------------) + I nishi - 0x0031b486, // n0x0c51 c0x0000 (---------------) + I nogata - 0x00296ec5, // n0x0c52 c0x0000 (---------------) + I ogori - 0x0035c047, // n0x0c53 c0x0000 (---------------) + I okagaki - 0x0022ecc5, // n0x0c54 c0x0000 (---------------) + I okawa - 0x00201bc3, // n0x0c55 c0x0000 (---------------) + I oki - 0x00200085, // n0x0c56 c0x0000 (---------------) + I omuta - 0x002c7844, // n0x0c57 c0x0000 (---------------) + I onga - 0x00207e85, // n0x0c58 c0x0000 (---------------) + I onojo - 0x0020fdc3, // n0x0c59 c0x0000 (---------------) + I oto - 0x002d47c7, // n0x0c5a c0x0000 (---------------) + I saigawa - 0x00333848, // n0x0c5b c0x0000 (---------------) + I sasaguri - 0x002e6a46, // n0x0c5c c0x0000 (---------------) + I shingu - 0x0029230d, // n0x0c5d c0x0000 (---------------) + I shinyoshitomi - 0x00266d46, // n0x0c5e c0x0000 (---------------) + I shonai - 0x002823c5, // n0x0c5f c0x0000 (---------------) + I soeda - 0x002ad183, // n0x0c60 c0x0000 (---------------) + I sue - 0x002a2189, // n0x0c61 c0x0000 (---------------) + I tachiarai - 0x0020e146, // n0x0c62 c0x0000 (---------------) + I tagawa - 0x002344c6, // n0x0c63 c0x0000 (---------------) + I takata - 0x00253644, // n0x0c64 c0x0000 (---------------) + I toho - 0x00239447, // n0x0c65 c0x0000 (---------------) + I toyotsu - 0x00227786, // n0x0c66 c0x0000 (---------------) + I tsuiki - 0x00289985, // n0x0c67 c0x0000 (---------------) + I ukiha - 0x00209803, // n0x0c68 c0x0000 (---------------) + I umi - 0x00211e04, // n0x0c69 c0x0000 (---------------) + I usui - 0x0026b046, // n0x0c6a c0x0000 (---------------) + I yamada - 0x002d81c4, // n0x0c6b c0x0000 (---------------) + I yame - 0x002f7448, // n0x0c6c c0x0000 (---------------) + I yanagawa - 0x0038f4c9, // n0x0c6d c0x0000 (---------------) + I yukuhashi - 0x0022ef49, // n0x0c6e c0x0000 (---------------) + I aizubange - 0x0028b14a, // n0x0c6f c0x0000 (---------------) + I aizumisato - 0x0023124d, // n0x0c70 c0x0000 (---------------) + I aizuwakamatsu - 0x00240607, // n0x0c71 c0x0000 (---------------) + I asakawa - 0x00255706, // n0x0c72 c0x0000 (---------------) + I bandai - 0x00209004, // n0x0c73 c0x0000 (---------------) + I date - 0x0026d5c9, // n0x0c74 c0x0000 (---------------) + I fukushima - 0x00274788, // n0x0c75 c0x0000 (---------------) + I furudono - 0x00275f06, // n0x0c76 c0x0000 (---------------) + I futaba - 0x002e9cc6, // n0x0c77 c0x0000 (---------------) + I hanawa - 0x002545c7, // n0x0c78 c0x0000 (---------------) + I higashi - 0x0029cdc6, // n0x0c79 c0x0000 (---------------) + I hirata - 0x0021af86, // n0x0c7a c0x0000 (---------------) + I hirono - 0x00329c06, // n0x0c7b c0x0000 (---------------) + I iitate - 0x0039554a, // n0x0c7c c0x0000 (---------------) + I inawashiro - 0x00214e48, // n0x0c7d c0x0000 (---------------) + I ishikawa - 0x002999c5, // n0x0c7e c0x0000 (---------------) + I iwaki - 0x00254a09, // n0x0c7f c0x0000 (---------------) + I izumizaki - 0x002af2ca, // n0x0c80 c0x0000 (---------------) + I kagamiishi - 0x002150c8, // n0x0c81 c0x0000 (---------------) + I kaneyama - 0x00287448, // n0x0c82 c0x0000 (---------------) + I kawamata - 0x002815c8, // n0x0c83 c0x0000 (---------------) + I kitakata - 0x00293e8c, // n0x0c84 c0x0000 (---------------) + I kitashiobara - 0x002c3e45, // n0x0c85 c0x0000 (---------------) + I koori - 0x00289f08, // n0x0c86 c0x0000 (---------------) + I koriyama - 0x002f1d86, // n0x0c87 c0x0000 (---------------) + I kunimi - 0x002d1906, // n0x0c88 c0x0000 (---------------) + I miharu - 0x00392cc7, // n0x0c89 c0x0000 (---------------) + I mishima - 0x002280c5, // n0x0c8a c0x0000 (---------------) + I namie - 0x0026f4c5, // n0x0c8b c0x0000 (---------------) + I nango - 0x0022ee09, // n0x0c8c c0x0000 (---------------) + I nishiaizu - 0x0020bd87, // n0x0c8d c0x0000 (---------------) + I nishigo - 0x0037af85, // n0x0c8e c0x0000 (---------------) + I okuma - 0x0021e147, // n0x0c8f c0x0000 (---------------) + I omotego - 0x00207e83, // n0x0c90 c0x0000 (---------------) + I ono - 0x002af985, // n0x0c91 c0x0000 (---------------) + I otama - 0x00355688, // n0x0c92 c0x0000 (---------------) + I samegawa - 0x0026e047, // n0x0c93 c0x0000 (---------------) + I shimogo - 0x00287309, // n0x0c94 c0x0000 (---------------) + I shirakawa - 0x002b3885, // n0x0c95 c0x0000 (---------------) + I showa - 0x0038e104, // n0x0c96 c0x0000 (---------------) + I soma - 0x0028c348, // n0x0c97 c0x0000 (---------------) + I sukagawa - 0x0025fa47, // n0x0c98 c0x0000 (---------------) + I taishin - 0x0028db88, // n0x0c99 c0x0000 (---------------) + I tamakawa - 0x003109c8, // n0x0c9a c0x0000 (---------------) + I tanagura - 0x0034d1c5, // n0x0c9b c0x0000 (---------------) + I tenei - 0x00389946, // n0x0c9c c0x0000 (---------------) + I yabuki - 0x0022afc6, // n0x0c9d c0x0000 (---------------) + I yamato - 0x00346949, // n0x0c9e c0x0000 (---------------) + I yamatsuri - 0x002fdc47, // n0x0c9f c0x0000 (---------------) + I yanaizu - 0x00297546, // n0x0ca0 c0x0000 (---------------) + I yugawa - 0x00383347, // n0x0ca1 c0x0000 (---------------) + I anpachi - 0x00244403, // n0x0ca2 c0x0000 (---------------) + I ena - 0x00289804, // n0x0ca3 c0x0000 (---------------) + I gifu - 0x003746c5, // n0x0ca4 c0x0000 (---------------) + I ginan - 0x0024efc4, // n0x0ca5 c0x0000 (---------------) + I godo - 0x00232644, // n0x0ca6 c0x0000 (---------------) + I gujo - 0x0023ca07, // n0x0ca7 c0x0000 (---------------) + I hashima - 0x002e5907, // n0x0ca8 c0x0000 (---------------) + I hichiso - 0x002685c4, // n0x0ca9 c0x0000 (---------------) + I hida - 0x00287150, // n0x0caa c0x0000 (---------------) + I higashishirakawa - 0x002f4ec7, // n0x0cab c0x0000 (---------------) + I ibigawa - 0x00390e45, // n0x0cac c0x0000 (---------------) + I ikeda - 0x00271acc, // n0x0cad c0x0000 (---------------) + I kakamigahara - 0x00203cc4, // n0x0cae c0x0000 (---------------) + I kani - 0x0028f7c8, // n0x0caf c0x0000 (---------------) + I kasahara - 0x0023b7c9, // n0x0cb0 c0x0000 (---------------) + I kasamatsu - 0x00298ac6, // n0x0cb1 c0x0000 (---------------) + I kawaue - 0x0022aa08, // n0x0cb2 c0x0000 (---------------) + I kitagata - 0x0022ec04, // n0x0cb3 c0x0000 (---------------) + I mino - 0x002fb148, // n0x0cb4 c0x0000 (---------------) + I minokamo - 0x002adf86, // n0x0cb5 c0x0000 (---------------) + I mitake - 0x00252288, // n0x0cb6 c0x0000 (---------------) + I mizunami - 0x00289146, // n0x0cb7 c0x0000 (---------------) + I motosu - 0x0021d20b, // n0x0cb8 c0x0000 (---------------) + I nakatsugawa - 0x00394b85, // n0x0cb9 c0x0000 (---------------) + I ogaki - 0x002b5248, // n0x0cba c0x0000 (---------------) + I sakahogi - 0x0020d984, // n0x0cbb c0x0000 (---------------) + I seki - 0x0038f90a, // n0x0cbc c0x0000 (---------------) + I sekigahara - 0x00287309, // n0x0cbd c0x0000 (---------------) + I shirakawa - 0x0024f946, // n0x0cbe c0x0000 (---------------) + I tajimi - 0x0020f408, // n0x0cbf c0x0000 (---------------) + I takayama - 0x002b9085, // n0x0cc0 c0x0000 (---------------) + I tarui - 0x002add84, // n0x0cc1 c0x0000 (---------------) + I toki - 0x0028f6c6, // n0x0cc2 c0x0000 (---------------) + I tomika - 0x002e55c8, // n0x0cc3 c0x0000 (---------------) + I wanouchi - 0x0026dc08, // n0x0cc4 c0x0000 (---------------) + I yamagata - 0x00330546, // n0x0cc5 c0x0000 (---------------) + I yaotsu - 0x00396e84, // n0x0cc6 c0x0000 (---------------) + I yoro - 0x00216306, // n0x0cc7 c0x0000 (---------------) + I annaka - 0x002e3947, // n0x0cc8 c0x0000 (---------------) + I chiyoda - 0x00266507, // n0x0cc9 c0x0000 (---------------) + I fujioka - 0x002545cf, // n0x0cca c0x0000 (---------------) + I higashiagatsuma - 0x0037a987, // n0x0ccb c0x0000 (---------------) + I isesaki - 0x0025ad07, // n0x0ccc c0x0000 (---------------) + I itakura - 0x002d17c5, // n0x0ccd c0x0000 (---------------) + I kanna - 0x002cc145, // n0x0cce c0x0000 (---------------) + I kanra - 0x0028b8c9, // n0x0ccf c0x0000 (---------------) + I katashina - 0x00343106, // n0x0cd0 c0x0000 (---------------) + I kawaba - 0x00258d45, // n0x0cd1 c0x0000 (---------------) + I kiryu - 0x0026f047, // n0x0cd2 c0x0000 (---------------) + I kusatsu - 0x002cb088, // n0x0cd3 c0x0000 (---------------) + I maebashi - 0x002cae05, // n0x0cd4 c0x0000 (---------------) + I meiwa - 0x002846c6, // n0x0cd5 c0x0000 (---------------) + I midori - 0x00204808, // n0x0cd6 c0x0000 (---------------) + I minakami - 0x0034e4ca, // n0x0cd7 c0x0000 (---------------) + I naganohara - 0x00364808, // n0x0cd8 c0x0000 (---------------) + I nakanojo - 0x00278107, // n0x0cd9 c0x0000 (---------------) + I nanmoku - 0x003161c6, // n0x0cda c0x0000 (---------------) + I numata - 0x002549c6, // n0x0cdb c0x0000 (---------------) + I oizumi - 0x0020ca43, // n0x0cdc c0x0000 (---------------) + I ora - 0x00203943, // n0x0cdd c0x0000 (---------------) + I ota - 0x0034a649, // n0x0cde c0x0000 (---------------) + I shibukawa - 0x00273789, // n0x0cdf c0x0000 (---------------) + I shimonita - 0x0028e1c6, // n0x0ce0 c0x0000 (---------------) + I shinto - 0x002b3885, // n0x0ce1 c0x0000 (---------------) + I showa - 0x00298d88, // n0x0ce2 c0x0000 (---------------) + I takasaki - 0x0020f408, // n0x0ce3 c0x0000 (---------------) + I takayama - 0x003936c8, // n0x0ce4 c0x0000 (---------------) + I tamamura - 0x00329c8b, // n0x0ce5 c0x0000 (---------------) + I tatebayashi - 0x00292547, // n0x0ce6 c0x0000 (---------------) + I tomioka - 0x0030b489, // n0x0ce7 c0x0000 (---------------) + I tsukiyono - 0x00254848, // n0x0ce8 c0x0000 (---------------) + I tsumagoi - 0x0038dac4, // n0x0ce9 c0x0000 (---------------) + I ueno - 0x002b5d48, // n0x0cea c0x0000 (---------------) + I yoshioka - 0x0027a909, // n0x0ceb c0x0000 (---------------) + I asaminami - 0x002557c5, // n0x0cec c0x0000 (---------------) + I daiwa - 0x0020dd07, // n0x0ced c0x0000 (---------------) + I etajima - 0x002ab685, // n0x0cee c0x0000 (---------------) + I fuchu - 0x0026db08, // n0x0cef c0x0000 (---------------) + I fukuyama - 0x0027dd8b, // n0x0cf0 c0x0000 (---------------) + I hatsukaichi - 0x00280dd0, // n0x0cf1 c0x0000 (---------------) + I higashihiroshima - 0x00292c45, // n0x0cf2 c0x0000 (---------------) + I hongo - 0x0020d8cc, // n0x0cf3 c0x0000 (---------------) + I jinsekikogen - 0x0021f245, // n0x0cf4 c0x0000 (---------------) + I kaita - 0x0026b843, // n0x0cf5 c0x0000 (---------------) + I kui - 0x00285906, // n0x0cf6 c0x0000 (---------------) + I kumano - 0x002a4544, // n0x0cf7 c0x0000 (---------------) + I kure - 0x003637c6, // n0x0cf8 c0x0000 (---------------) + I mihara - 0x00288107, // n0x0cf9 c0x0000 (---------------) + I miyoshi - 0x00204884, // n0x0cfa c0x0000 (---------------) + I naka - 0x002a5708, // n0x0cfb c0x0000 (---------------) + I onomichi - 0x00305acd, // n0x0cfc c0x0000 (---------------) + I osakikamijima - 0x00335c85, // n0x0cfd c0x0000 (---------------) + I otake - 0x00201a04, // n0x0cfe c0x0000 (---------------) + I saka - 0x0021b584, // n0x0cff c0x0000 (---------------) + I sera - 0x00325cc9, // n0x0d00 c0x0000 (---------------) + I seranishi - 0x0027f9c8, // n0x0d01 c0x0000 (---------------) + I shinichi - 0x002f5a47, // n0x0d02 c0x0000 (---------------) + I shobara - 0x002ae008, // n0x0d03 c0x0000 (---------------) + I takehara - 0x0026e388, // n0x0d04 c0x0000 (---------------) + I abashiri - 0x00268705, // n0x0d05 c0x0000 (---------------) + I abira - 0x0031acc7, // n0x0d06 c0x0000 (---------------) + I aibetsu - 0x00268687, // n0x0d07 c0x0000 (---------------) + I akabira - 0x00300f87, // n0x0d08 c0x0000 (---------------) + I akkeshi - 0x002ad5c9, // n0x0d09 c0x0000 (---------------) + I asahikawa - 0x00227609, // n0x0d0a c0x0000 (---------------) + I ashibetsu - 0x00230d06, // n0x0d0b c0x0000 (---------------) + I ashoro - 0x00318dc6, // n0x0d0c c0x0000 (---------------) + I assabu - 0x00254806, // n0x0d0d c0x0000 (---------------) + I atsuma - 0x00323c05, // n0x0d0e c0x0000 (---------------) + I bibai - 0x002626c4, // n0x0d0f c0x0000 (---------------) + I biei - 0x0038aec6, // n0x0d10 c0x0000 (---------------) + I bifuka - 0x0038f286, // n0x0d11 c0x0000 (---------------) + I bihoro - 0x00268748, // n0x0d12 c0x0000 (---------------) + I biratori - 0x002e170b, // n0x0d13 c0x0000 (---------------) + I chippubetsu - 0x00366547, // n0x0d14 c0x0000 (---------------) + I chitose - 0x00209004, // n0x0d15 c0x0000 (---------------) + I date - 0x0032d2c6, // n0x0d16 c0x0000 (---------------) + I ebetsu - 0x00337807, // n0x0d17 c0x0000 (---------------) + I embetsu - 0x00271f45, // n0x0d18 c0x0000 (---------------) + I eniwa - 0x002f35c5, // n0x0d19 c0x0000 (---------------) + I erimo - 0x00202244, // n0x0d1a c0x0000 (---------------) + I esan - 0x00227586, // n0x0d1b c0x0000 (---------------) + I esashi - 0x0038af48, // n0x0d1c c0x0000 (---------------) + I fukagawa - 0x0026d5c9, // n0x0d1d c0x0000 (---------------) + I fukushima - 0x00239f06, // n0x0d1e c0x0000 (---------------) + I furano - 0x00273e08, // n0x0d1f c0x0000 (---------------) + I furubira - 0x002e3146, // n0x0d20 c0x0000 (---------------) + I haboro - 0x00325388, // n0x0d21 c0x0000 (---------------) + I hakodate - 0x002a154c, // n0x0d22 c0x0000 (---------------) + I hamatonbetsu - 0x002685c6, // n0x0d23 c0x0000 (---------------) + I hidaka - 0x0028208d, // n0x0d24 c0x0000 (---------------) + I higashikagura - 0x0028250b, // n0x0d25 c0x0000 (---------------) + I higashikawa - 0x0023a0c5, // n0x0d26 c0x0000 (---------------) + I hiroo - 0x00206b87, // n0x0d27 c0x0000 (---------------) + I hokuryu - 0x00226906, // n0x0d28 c0x0000 (---------------) + I hokuto - 0x00305188, // n0x0d29 c0x0000 (---------------) + I honbetsu - 0x00230d89, // n0x0d2a c0x0000 (---------------) + I horokanai - 0x00346588, // n0x0d2b c0x0000 (---------------) + I horonobe - 0x00390e45, // n0x0d2c c0x0000 (---------------) + I ikeda - 0x0020de07, // n0x0d2d c0x0000 (---------------) + I imakane - 0x002af448, // n0x0d2e c0x0000 (---------------) + I ishikari - 0x0023e509, // n0x0d2f c0x0000 (---------------) + I iwamizawa - 0x002e74c6, // n0x0d30 c0x0000 (---------------) + I iwanai - 0x00239e0a, // n0x0d31 c0x0000 (---------------) + I kamifurano - 0x00304f08, // n0x0d32 c0x0000 (---------------) + I kamikawa - 0x003463cb, // n0x0d33 c0x0000 (---------------) + I kamishihoro - 0x002ae7cc, // n0x0d34 c0x0000 (---------------) + I kamisunagawa - 0x002fb248, // n0x0d35 c0x0000 (---------------) + I kamoenai - 0x00269e06, // n0x0d36 c0x0000 (---------------) + I kayabe - 0x002a5a88, // n0x0d37 c0x0000 (---------------) + I kembuchi - 0x0035e007, // n0x0d38 c0x0000 (---------------) + I kikonai - 0x002e5389, // n0x0d39 c0x0000 (---------------) + I kimobetsu - 0x0027c54d, // n0x0d3a c0x0000 (---------------) + I kitahiroshima - 0x002885c6, // n0x0d3b c0x0000 (---------------) + I kitami - 0x002534c8, // n0x0d3c c0x0000 (---------------) + I kiyosato - 0x002fe389, // n0x0d3d c0x0000 (---------------) + I koshimizu - 0x002a3148, // n0x0d3e c0x0000 (---------------) + I kunneppu - 0x00270048, // n0x0d3f c0x0000 (---------------) + I kuriyama - 0x002a7e8c, // n0x0d40 c0x0000 (---------------) + I kuromatsunai - 0x002a9347, // n0x0d41 c0x0000 (---------------) + I kushiro - 0x002a9e47, // n0x0d42 c0x0000 (---------------) + I kutchan - 0x002ad405, // n0x0d43 c0x0000 (---------------) + I kyowa - 0x00260307, // n0x0d44 c0x0000 (---------------) + I mashike - 0x002caf48, // n0x0d45 c0x0000 (---------------) + I matsumae - 0x0028f746, // n0x0d46 c0x0000 (---------------) + I mikasa - 0x003561cc, // n0x0d47 c0x0000 (---------------) + I minamifurano - 0x002ccb48, // n0x0d48 c0x0000 (---------------) + I mombetsu - 0x002b7108, // n0x0d49 c0x0000 (---------------) + I moseushi - 0x0024e806, // n0x0d4a c0x0000 (---------------) + I mukawa - 0x002a6187, // n0x0d4b c0x0000 (---------------) + I muroran - 0x00230f04, // n0x0d4c c0x0000 (---------------) + I naie - 0x002934c8, // n0x0d4d c0x0000 (---------------) + I nakagawa - 0x0026208c, // n0x0d4e c0x0000 (---------------) + I nakasatsunai - 0x0027848c, // n0x0d4f c0x0000 (---------------) + I nakatombetsu - 0x0021b8c5, // n0x0d50 c0x0000 (---------------) + I nanae - 0x0037c587, // n0x0d51 c0x0000 (---------------) + I nanporo - 0x00396e06, // n0x0d52 c0x0000 (---------------) + I nayoro - 0x002a6106, // n0x0d53 c0x0000 (---------------) + I nemuro - 0x00281a48, // n0x0d54 c0x0000 (---------------) + I niikappu - 0x0037ae44, // n0x0d55 c0x0000 (---------------) + I niki - 0x002209cb, // n0x0d56 c0x0000 (---------------) + I nishiokoppe - 0x002f090b, // n0x0d57 c0x0000 (---------------) + I noboribetsu - 0x003161c6, // n0x0d58 c0x0000 (---------------) + I numata - 0x00305947, // n0x0d59 c0x0000 (---------------) + I obihiro - 0x00311445, // n0x0d5a c0x0000 (---------------) + I obira - 0x0025d045, // n0x0d5b c0x0000 (---------------) + I oketo - 0x00220b06, // n0x0d5c c0x0000 (---------------) + I okoppe - 0x002b9045, // n0x0d5d c0x0000 (---------------) + I otaru - 0x002acb85, // n0x0d5e c0x0000 (---------------) + I otobe - 0x002c4a07, // n0x0d5f c0x0000 (---------------) + I otofuke - 0x0025cbc9, // n0x0d60 c0x0000 (---------------) + I otoineppu - 0x002f3c44, // n0x0d61 c0x0000 (---------------) + I oumu - 0x0035f085, // n0x0d62 c0x0000 (---------------) + I ozora - 0x002c2c45, // n0x0d63 c0x0000 (---------------) + I pippu - 0x0028eb48, // n0x0d64 c0x0000 (---------------) + I rankoshi - 0x002a5545, // n0x0d65 c0x0000 (---------------) + I rebun - 0x002b4809, // n0x0d66 c0x0000 (---------------) + I rikubetsu - 0x00294c47, // n0x0d67 c0x0000 (---------------) + I rishiri - 0x00294c4b, // n0x0d68 c0x0000 (---------------) + I rishirifuji - 0x00307c86, // n0x0d69 c0x0000 (---------------) + I saroma - 0x0021ecc9, // n0x0d6a c0x0000 (---------------) + I sarufutsu - 0x0024c908, // n0x0d6b c0x0000 (---------------) + I shakotan - 0x00252d45, // n0x0d6c c0x0000 (---------------) + I shari - 0x00301088, // n0x0d6d c0x0000 (---------------) + I shibecha - 0x00227648, // n0x0d6e c0x0000 (---------------) + I shibetsu - 0x00251507, // n0x0d6f c0x0000 (---------------) + I shikabe - 0x002d3e87, // n0x0d70 c0x0000 (---------------) + I shikaoi - 0x0023ca89, // n0x0d71 c0x0000 (---------------) + I shimamaki - 0x002521c7, // n0x0d72 c0x0000 (---------------) + I shimizu - 0x00266909, // n0x0d73 c0x0000 (---------------) + I shimokawa - 0x00287a0c, // n0x0d74 c0x0000 (---------------) + I shinshinotsu - 0x0028e1c8, // n0x0d75 c0x0000 (---------------) + I shintoku - 0x002d1609, // n0x0d76 c0x0000 (---------------) + I shiranuka - 0x002d2247, // n0x0d77 c0x0000 (---------------) + I shiraoi - 0x0026e449, // n0x0d78 c0x0000 (---------------) + I shiriuchi - 0x002e5a47, // n0x0d79 c0x0000 (---------------) + I sobetsu - 0x002ae8c8, // n0x0d7a c0x0000 (---------------) + I sunagawa - 0x0028ee85, // n0x0d7b c0x0000 (---------------) + I taiki - 0x0027cec6, // n0x0d7c c0x0000 (---------------) + I takasu - 0x002a8648, // n0x0d7d c0x0000 (---------------) + I takikawa - 0x00245108, // n0x0d7e c0x0000 (---------------) + I takinoue - 0x002af189, // n0x0d7f c0x0000 (---------------) + I teshikaga - 0x002acbc7, // n0x0d80 c0x0000 (---------------) + I tobetsu - 0x0028b345, // n0x0d81 c0x0000 (---------------) + I tohma - 0x002b9dc9, // n0x0d82 c0x0000 (---------------) + I tomakomai - 0x0036edc6, // n0x0d83 c0x0000 (---------------) + I tomari - 0x0027c344, // n0x0d84 c0x0000 (---------------) + I toya - 0x00346246, // n0x0d85 c0x0000 (---------------) + I toyako - 0x00371088, // n0x0d86 c0x0000 (---------------) + I toyotomi - 0x00244007, // n0x0d87 c0x0000 (---------------) + I toyoura - 0x002e1908, // n0x0d88 c0x0000 (---------------) + I tsubetsu - 0x0023ac89, // n0x0d89 c0x0000 (---------------) + I tsukigata - 0x0024e587, // n0x0d8a c0x0000 (---------------) + I urakawa - 0x00288ec6, // n0x0d8b c0x0000 (---------------) + I urausu - 0x00206c44, // n0x0d8c c0x0000 (---------------) + I uryu - 0x00200109, // n0x0d8d c0x0000 (---------------) + I utashinai - 0x00342f08, // n0x0d8e c0x0000 (---------------) + I wakkanai - 0x0024e6c7, // n0x0d8f c0x0000 (---------------) + I wassamu - 0x00311fc6, // n0x0d90 c0x0000 (---------------) + I yakumo - 0x00292f46, // n0x0d91 c0x0000 (---------------) + I yoichi - 0x0035e144, // n0x0d92 c0x0000 (---------------) + I aioi - 0x00341846, // n0x0d93 c0x0000 (---------------) + I akashi - 0x00207e03, // n0x0d94 c0x0000 (---------------) + I ako - 0x0038bd09, // n0x0d95 c0x0000 (---------------) + I amagasaki - 0x00394b46, // n0x0d96 c0x0000 (---------------) + I aogaki - 0x0028c7c5, // n0x0d97 c0x0000 (---------------) + I asago - 0x00289c86, // n0x0d98 c0x0000 (---------------) + I ashiya - 0x0028dcc5, // n0x0d99 c0x0000 (---------------) + I awaji - 0x0026d348, // n0x0d9a c0x0000 (---------------) + I fukusaki - 0x002faf87, // n0x0d9b c0x0000 (---------------) + I goshiki - 0x002f8c46, // n0x0d9c c0x0000 (---------------) + I harima - 0x0031c986, // n0x0d9d c0x0000 (---------------) + I himeji - 0x00312b88, // n0x0d9e c0x0000 (---------------) + I ichikawa - 0x0028ba47, // n0x0d9f c0x0000 (---------------) + I inagawa - 0x00288605, // n0x0da0 c0x0000 (---------------) + I itami - 0x0028a188, // n0x0da1 c0x0000 (---------------) + I kakogawa - 0x003744c8, // n0x0da2 c0x0000 (---------------) + I kamigori - 0x00304f08, // n0x0da3 c0x0000 (---------------) + I kamikawa - 0x0021f105, // n0x0da4 c0x0000 (---------------) + I kasai - 0x0027cf46, // n0x0da5 c0x0000 (---------------) + I kasuga - 0x0022ed09, // n0x0da6 c0x0000 (---------------) + I kawanishi - 0x0022ae44, // n0x0da7 c0x0000 (---------------) + I miki - 0x00359a0b, // n0x0da8 c0x0000 (---------------) + I minamiawaji - 0x0021ac8b, // n0x0da9 c0x0000 (---------------) + I nishinomiya - 0x002998c9, // n0x0daa c0x0000 (---------------) + I nishiwaki - 0x00207e83, // n0x0dab c0x0000 (---------------) + I ono - 0x002453c5, // n0x0dac c0x0000 (---------------) + I sanda - 0x00208a46, // n0x0dad c0x0000 (---------------) + I sannan - 0x002937c8, // n0x0dae c0x0000 (---------------) + I sasayama - 0x002349c4, // n0x0daf c0x0000 (---------------) + I sayo - 0x002e6a46, // n0x0db0 c0x0000 (---------------) + I shingu - 0x002ba609, // n0x0db1 c0x0000 (---------------) + I shinonsen - 0x003081c5, // n0x0db2 c0x0000 (---------------) + I shiso - 0x002c4946, // n0x0db3 c0x0000 (---------------) + I sumoto - 0x0025fa46, // n0x0db4 c0x0000 (---------------) + I taishi - 0x00209604, // n0x0db5 c0x0000 (---------------) + I taka - 0x002875ca, // n0x0db6 c0x0000 (---------------) + I takarazuka - 0x0028c708, // n0x0db7 c0x0000 (---------------) + I takasago - 0x00245106, // n0x0db8 c0x0000 (---------------) + I takino - 0x0035ee85, // n0x0db9 c0x0000 (---------------) + I tamba - 0x00203987, // n0x0dba c0x0000 (---------------) + I tatsuno - 0x0022e707, // n0x0dbb c0x0000 (---------------) + I toyooka - 0x00389944, // n0x0dbc c0x0000 (---------------) + I yabu - 0x0021aec7, // n0x0dbd c0x0000 (---------------) + I yashiro - 0x002a0604, // n0x0dbe c0x0000 (---------------) + I yoka - 0x00322c46, // n0x0dbf c0x0000 (---------------) + I yokawa - 0x00204943, // n0x0dc0 c0x0000 (---------------) + I ami - 0x002ad5c5, // n0x0dc1 c0x0000 (---------------) + I asahi - 0x00346e05, // n0x0dc2 c0x0000 (---------------) + I bando - 0x002e5708, // n0x0dc3 c0x0000 (---------------) + I chikusei - 0x0024ef05, // n0x0dc4 c0x0000 (---------------) + I daigo - 0x00268309, // n0x0dc5 c0x0000 (---------------) + I fujishiro - 0x0028d547, // n0x0dc6 c0x0000 (---------------) + I hitachi - 0x0029330b, // n0x0dc7 c0x0000 (---------------) + I hitachinaka - 0x0028d54c, // n0x0dc8 c0x0000 (---------------) + I hitachiomiya - 0x0028e50a, // n0x0dc9 c0x0000 (---------------) + I hitachiota - 0x00316ac7, // n0x0dca c0x0000 (---------------) + I ibaraki - 0x00200243, // n0x0dcb c0x0000 (---------------) + I ina - 0x00291508, // n0x0dcc c0x0000 (---------------) + I inashiki - 0x0021f2c5, // n0x0dcd c0x0000 (---------------) + I itako - 0x002cae85, // n0x0dce c0x0000 (---------------) + I iwama - 0x00207f44, // n0x0dcf c0x0000 (---------------) + I joso - 0x002ae7c6, // n0x0dd0 c0x0000 (---------------) + I kamisu - 0x0023b7c6, // n0x0dd1 c0x0000 (---------------) + I kasama - 0x00341887, // n0x0dd2 c0x0000 (---------------) + I kashima - 0x0020b60b, // n0x0dd3 c0x0000 (---------------) + I kasumigaura - 0x00232c84, // n0x0dd4 c0x0000 (---------------) + I koga - 0x0033ee44, // n0x0dd5 c0x0000 (---------------) + I miho - 0x00246f04, // n0x0dd6 c0x0000 (---------------) + I mito - 0x002b4f86, // n0x0dd7 c0x0000 (---------------) + I moriya - 0x00204884, // n0x0dd8 c0x0000 (---------------) + I naka - 0x00376c08, // n0x0dd9 c0x0000 (---------------) + I namegata - 0x00321385, // n0x0dda c0x0000 (---------------) + I oarai - 0x00204045, // n0x0ddb c0x0000 (---------------) + I ogawa - 0x00393607, // n0x0ddc c0x0000 (---------------) + I omitama - 0x00206c89, // n0x0ddd c0x0000 (---------------) + I ryugasaki - 0x003396c5, // n0x0dde c0x0000 (---------------) + I sakai - 0x0030cc0a, // n0x0ddf c0x0000 (---------------) + I sakuragawa - 0x0027bc89, // n0x0de0 c0x0000 (---------------) + I shimodate - 0x0027db0a, // n0x0de1 c0x0000 (---------------) + I shimotsuma - 0x00395689, // n0x0de2 c0x0000 (---------------) + I shirosato - 0x00339a04, // n0x0de3 c0x0000 (---------------) + I sowa - 0x0029fdc5, // n0x0de4 c0x0000 (---------------) + I suifu - 0x0029cec8, // n0x0de5 c0x0000 (---------------) + I takahagi - 0x002d0fcb, // n0x0de6 c0x0000 (---------------) + I tamatsukuri - 0x002df1c5, // n0x0de7 c0x0000 (---------------) + I tokai - 0x00352046, // n0x0de8 c0x0000 (---------------) + I tomobe - 0x0021a304, // n0x0de9 c0x0000 (---------------) + I tone - 0x00268846, // n0x0dea c0x0000 (---------------) + I toride - 0x0024e409, // n0x0deb c0x0000 (---------------) + I tsuchiura - 0x0032d387, // n0x0dec c0x0000 (---------------) + I tsukuba - 0x00387c88, // n0x0ded c0x0000 (---------------) + I uchihara - 0x002315c6, // n0x0dee c0x0000 (---------------) + I ushiku - 0x002e38c7, // n0x0def c0x0000 (---------------) + I yachiyo - 0x0026dc08, // n0x0df0 c0x0000 (---------------) + I yamagata - 0x00377b86, // n0x0df1 c0x0000 (---------------) + I yawara - 0x00260d44, // n0x0df2 c0x0000 (---------------) + I yuki - 0x0034af87, // n0x0df3 c0x0000 (---------------) + I anamizu - 0x00336fc5, // n0x0df4 c0x0000 (---------------) + I hakui - 0x0034be87, // n0x0df5 c0x0000 (---------------) + I hakusan - 0x00281f04, // n0x0df6 c0x0000 (---------------) + I kaga - 0x00226886, // n0x0df7 c0x0000 (---------------) + I kahoku - 0x0037ffc8, // n0x0df8 c0x0000 (---------------) + I kanazawa - 0x002826c8, // n0x0df9 c0x0000 (---------------) + I kawakita - 0x002be447, // n0x0dfa c0x0000 (---------------) + I komatsu - 0x0023fcc8, // n0x0dfb c0x0000 (---------------) + I nakanoto - 0x0027e905, // n0x0dfc c0x0000 (---------------) + I nanao - 0x00207cc4, // n0x0dfd c0x0000 (---------------) + I nomi - 0x00312a88, // n0x0dfe c0x0000 (---------------) + I nonoichi - 0x0023fdc4, // n0x0dff c0x0000 (---------------) + I noto - 0x0020f2c5, // n0x0e00 c0x0000 (---------------) + I shika - 0x002d2b84, // n0x0e01 c0x0000 (---------------) + I suzu - 0x0027d707, // n0x0e02 c0x0000 (---------------) + I tsubata - 0x0031c3c7, // n0x0e03 c0x0000 (---------------) + I tsurugi - 0x0026e588, // n0x0e04 c0x0000 (---------------) + I uchinada - 0x0028dd06, // n0x0e05 c0x0000 (---------------) + I wajima - 0x0024ee85, // n0x0e06 c0x0000 (---------------) + I fudai - 0x00268108, // n0x0e07 c0x0000 (---------------) + I fujisawa - 0x00364a08, // n0x0e08 c0x0000 (---------------) + I hanamaki - 0x0028b089, // n0x0e09 c0x0000 (---------------) + I hiraizumi - 0x0021af86, // n0x0e0a c0x0000 (---------------) + I hirono - 0x0029ba88, // n0x0e0b c0x0000 (---------------) + I ichinohe - 0x0038f78a, // n0x0e0c c0x0000 (---------------) + I ichinoseki - 0x00271fc8, // n0x0e0d c0x0000 (---------------) + I iwaizumi - 0x002c3b85, // n0x0e0e c0x0000 (---------------) + I iwate - 0x0031b686, // n0x0e0f c0x0000 (---------------) + I joboji - 0x0027bb48, // n0x0e10 c0x0000 (---------------) + I kamaishi - 0x0020deca, // n0x0e11 c0x0000 (---------------) + I kanegasaki - 0x0032a887, // n0x0e12 c0x0000 (---------------) + I karumai - 0x00273345, // n0x0e13 c0x0000 (---------------) + I kawai - 0x00209588, // n0x0e14 c0x0000 (---------------) + I kitakami - 0x00224704, // n0x0e15 c0x0000 (---------------) + I kuji - 0x00205d06, // n0x0e16 c0x0000 (---------------) + I kunohe - 0x002aa5c8, // n0x0e17 c0x0000 (---------------) + I kuzumaki - 0x00207d46, // n0x0e18 c0x0000 (---------------) + I miyako - 0x00304788, // n0x0e19 c0x0000 (---------------) + I mizusawa - 0x0022ac87, // n0x0e1a c0x0000 (---------------) + I morioka - 0x00205106, // n0x0e1b c0x0000 (---------------) + I ninohe - 0x00384f84, // n0x0e1c c0x0000 (---------------) + I noda - 0x0029a847, // n0x0e1d c0x0000 (---------------) + I ofunato - 0x002e13c4, // n0x0e1e c0x0000 (---------------) + I oshu - 0x0024e3c7, // n0x0e1f c0x0000 (---------------) + I otsuchi - 0x0023430d, // n0x0e20 c0x0000 (---------------) + I rikuzentakata - 0x0026d185, // n0x0e21 c0x0000 (---------------) + I shiwa - 0x002a71cb, // n0x0e22 c0x0000 (---------------) + I shizukuishi - 0x002fe746, // n0x0e23 c0x0000 (---------------) + I sumita - 0x0023c788, // n0x0e24 c0x0000 (---------------) + I tanohata - 0x00369804, // n0x0e25 c0x0000 (---------------) + I tono - 0x00264306, // n0x0e26 c0x0000 (---------------) + I yahaba - 0x0026b046, // n0x0e27 c0x0000 (---------------) + I yamada - 0x0036c587, // n0x0e28 c0x0000 (---------------) + I ayagawa - 0x00281d4d, // n0x0e29 c0x0000 (---------------) + I higashikagawa - 0x002982c7, // n0x0e2a c0x0000 (---------------) + I kanonji - 0x002e8108, // n0x0e2b c0x0000 (---------------) + I kotohira - 0x00257385, // n0x0e2c c0x0000 (---------------) + I manno - 0x00283488, // n0x0e2d c0x0000 (---------------) + I marugame - 0x002aeac6, // n0x0e2e c0x0000 (---------------) + I mitoyo - 0x0027e988, // n0x0e2f c0x0000 (---------------) + I naoshima - 0x0020ce46, // n0x0e30 c0x0000 (---------------) + I sanuki - 0x0031c2c7, // n0x0e31 c0x0000 (---------------) + I tadotsu - 0x0026e909, // n0x0e32 c0x0000 (---------------) + I takamatsu - 0x00369807, // n0x0e33 c0x0000 (---------------) + I tonosho - 0x002761c8, // n0x0e34 c0x0000 (---------------) + I uchinomi - 0x00261345, // n0x0e35 c0x0000 (---------------) + I utazu - 0x00212c08, // n0x0e36 c0x0000 (---------------) + I zentsuji - 0x00305dc5, // n0x0e37 c0x0000 (---------------) + I akune - 0x00236bc5, // n0x0e38 c0x0000 (---------------) + I amami - 0x0030fcc5, // n0x0e39 c0x0000 (---------------) + I hioki - 0x00209883, // n0x0e3a c0x0000 (---------------) + I isa - 0x0026f3c4, // n0x0e3b c0x0000 (---------------) + I isen - 0x00209785, // n0x0e3c c0x0000 (---------------) + I izumi - 0x00271789, // n0x0e3d c0x0000 (---------------) + I kagoshima - 0x002b4d06, // n0x0e3e c0x0000 (---------------) + I kanoya - 0x002c5c48, // n0x0e3f c0x0000 (---------------) + I kawanabe - 0x002d3c45, // n0x0e40 c0x0000 (---------------) + I kinko - 0x00314307, // n0x0e41 c0x0000 (---------------) + I kouyama - 0x002d3a4a, // n0x0e42 c0x0000 (---------------) + I makurazaki - 0x002c4889, // n0x0e43 c0x0000 (---------------) + I matsumoto - 0x002bf68a, // n0x0e44 c0x0000 (---------------) + I minamitane - 0x002bb148, // n0x0e45 c0x0000 (---------------) + I nakatane - 0x0021df8c, // n0x0e46 c0x0000 (---------------) + I nishinoomote - 0x0026f0cd, // n0x0e47 c0x0000 (---------------) + I satsumasendai - 0x002da843, // n0x0e48 c0x0000 (---------------) + I soo - 0x00304688, // n0x0e49 c0x0000 (---------------) + I tarumizu - 0x00211dc5, // n0x0e4a c0x0000 (---------------) + I yusui - 0x00343086, // n0x0e4b c0x0000 (---------------) + I aikawa - 0x0033ea46, // n0x0e4c c0x0000 (---------------) + I atsugi - 0x002c35c5, // n0x0e4d c0x0000 (---------------) + I ayase - 0x00383449, // n0x0e4e c0x0000 (---------------) + I chigasaki - 0x00240845, // n0x0e4f c0x0000 (---------------) + I ebina - 0x00268108, // n0x0e50 c0x0000 (---------------) + I fujisawa - 0x00265b06, // n0x0e51 c0x0000 (---------------) + I hadano - 0x00328686, // n0x0e52 c0x0000 (---------------) + I hakone - 0x0028c209, // n0x0e53 c0x0000 (---------------) + I hiratsuka - 0x00377387, // n0x0e54 c0x0000 (---------------) + I isehara - 0x00315c06, // n0x0e55 c0x0000 (---------------) + I kaisei - 0x002d39c8, // n0x0e56 c0x0000 (---------------) + I kamakura - 0x003823c8, // n0x0e57 c0x0000 (---------------) + I kiyokawa - 0x0032b7c7, // n0x0e58 c0x0000 (---------------) + I matsuda - 0x0025240e, // n0x0e59 c0x0000 (---------------) + I minamiashigara - 0x002aed05, // n0x0e5a c0x0000 (---------------) + I miura - 0x0023e405, // n0x0e5b c0x0000 (---------------) + I nakai - 0x00207c48, // n0x0e5c c0x0000 (---------------) + I ninomiya - 0x00202487, // n0x0e5d c0x0000 (---------------) + I odawara - 0x00238bc2, // n0x0e5e c0x0000 (---------------) + I oi - 0x002a6c04, // n0x0e5f c0x0000 (---------------) + I oiso - 0x003636ca, // n0x0e60 c0x0000 (---------------) + I sagamihara - 0x0024e788, // n0x0e61 c0x0000 (---------------) + I samukawa - 0x00337906, // n0x0e62 c0x0000 (---------------) + I tsukui - 0x00283b88, // n0x0e63 c0x0000 (---------------) + I yamakita - 0x0022afc6, // n0x0e64 c0x0000 (---------------) + I yamato - 0x00311d48, // n0x0e65 c0x0000 (---------------) + I yokosuka - 0x00297548, // n0x0e66 c0x0000 (---------------) + I yugawara - 0x00236b84, // n0x0e67 c0x0000 (---------------) + I zama - 0x003185c5, // n0x0e68 c0x0000 (---------------) + I zushi - 0x006735c4, // n0x0e69 c0x0001 (---------------) ! I city - 0x006735c4, // n0x0e6a c0x0001 (---------------) ! I city - 0x006735c4, // n0x0e6b c0x0001 (---------------) ! I city - 0x00201ac3, // n0x0e6c c0x0000 (---------------) + I aki - 0x002f3a86, // n0x0e6d c0x0000 (---------------) + I geisei - 0x002685c6, // n0x0e6e c0x0000 (---------------) + I hidaka - 0x0028888c, // n0x0e6f c0x0000 (---------------) + I higashitsuno - 0x00201b43, // n0x0e70 c0x0000 (---------------) + I ino - 0x002ab006, // n0x0e71 c0x0000 (---------------) + I kagami - 0x00204904, // n0x0e72 c0x0000 (---------------) + I kami - 0x0020e0c8, // n0x0e73 c0x0000 (---------------) + I kitagawa - 0x002ba445, // n0x0e74 c0x0000 (---------------) + I kochi - 0x003637c6, // n0x0e75 c0x0000 (---------------) + I mihara - 0x002a2e48, // n0x0e76 c0x0000 (---------------) + I motoyama - 0x002bc286, // n0x0e77 c0x0000 (---------------) + I muroto - 0x002f8bc6, // n0x0e78 c0x0000 (---------------) + I nahari - 0x00248448, // n0x0e79 c0x0000 (---------------) + I nakamura - 0x00374747, // n0x0e7a c0x0000 (---------------) + I nankoku - 0x00251f89, // n0x0e7b c0x0000 (---------------) + I nishitosa - 0x00328d8a, // n0x0e7c c0x0000 (---------------) + I niyodogawa - 0x00240384, // n0x0e7d c0x0000 (---------------) + I ochi - 0x0022ecc5, // n0x0e7e c0x0000 (---------------) + I okawa - 0x00286c45, // n0x0e7f c0x0000 (---------------) + I otoyo - 0x0022a786, // n0x0e80 c0x0000 (---------------) + I otsuki - 0x00240646, // n0x0e81 c0x0000 (---------------) + I sakawa - 0x00291906, // n0x0e82 c0x0000 (---------------) + I sukumo - 0x002d1e06, // n0x0e83 c0x0000 (---------------) + I susaki - 0x002520c4, // n0x0e84 c0x0000 (---------------) + I tosa - 0x002520cb, // n0x0e85 c0x0000 (---------------) + I tosashimizu - 0x00221244, // n0x0e86 c0x0000 (---------------) + I toyo - 0x00203a05, // n0x0e87 c0x0000 (---------------) + I tsuno - 0x00296285, // n0x0e88 c0x0000 (---------------) + I umaji - 0x00207006, // n0x0e89 c0x0000 (---------------) + I yasuda - 0x00209f08, // n0x0e8a c0x0000 (---------------) + I yusuhara - 0x0026ef87, // n0x0e8b c0x0000 (---------------) + I amakusa - 0x0034e684, // n0x0e8c c0x0000 (---------------) + I arao - 0x00209dc3, // n0x0e8d c0x0000 (---------------) + I aso - 0x002e3545, // n0x0e8e c0x0000 (---------------) + I choyo - 0x00351f07, // n0x0e8f c0x0000 (---------------) + I gyokuto - 0x0028f9c9, // n0x0e90 c0x0000 (---------------) + I hitoyoshi - 0x0026ee8b, // n0x0e91 c0x0000 (---------------) + I kamiamakusa - 0x00341887, // n0x0e92 c0x0000 (---------------) + I kashima - 0x0036c287, // n0x0e93 c0x0000 (---------------) + I kikuchi - 0x002d4744, // n0x0e94 c0x0000 (---------------) + I kosa - 0x002a2d48, // n0x0e95 c0x0000 (---------------) + I kumamoto - 0x00253387, // n0x0e96 c0x0000 (---------------) + I mashiki - 0x0028fc06, // n0x0e97 c0x0000 (---------------) + I mifune - 0x00260ac8, // n0x0e98 c0x0000 (---------------) + I minamata - 0x0029ee4b, // n0x0e99 c0x0000 (---------------) + I minamioguni - 0x0034cac6, // n0x0e9a c0x0000 (---------------) + I nagasu - 0x0020e649, // n0x0e9b c0x0000 (---------------) + I nishihara - 0x0029efc5, // n0x0e9c c0x0000 (---------------) + I oguni - 0x002e3dc3, // n0x0e9d c0x0000 (---------------) + I ozu - 0x002c4946, // n0x0e9e c0x0000 (---------------) + I sumoto - 0x0022ab88, // n0x0e9f c0x0000 (---------------) + I takamori - 0x0020cf03, // n0x0ea0 c0x0000 (---------------) + I uki - 0x002269c3, // n0x0ea1 c0x0000 (---------------) + I uto - 0x0026dc06, // n0x0ea2 c0x0000 (---------------) + I yamaga - 0x0022afc6, // n0x0ea3 c0x0000 (---------------) + I yamato - 0x00373e8a, // n0x0ea4 c0x0000 (---------------) + I yatsushiro - 0x00269e45, // n0x0ea5 c0x0000 (---------------) + I ayabe - 0x0026ae8b, // n0x0ea6 c0x0000 (---------------) + I fukuchiyama - 0x00289bcb, // n0x0ea7 c0x0000 (---------------) + I higashiyama - 0x00229783, // n0x0ea8 c0x0000 (---------------) + I ide - 0x00213cc3, // n0x0ea9 c0x0000 (---------------) + I ine - 0x00298c44, // n0x0eaa c0x0000 (---------------) + I joyo - 0x0023a807, // n0x0eab c0x0000 (---------------) + I kameoka - 0x0022ac04, // n0x0eac c0x0000 (---------------) + I kamo - 0x00206e44, // n0x0ead c0x0000 (---------------) + I kita - 0x002f1c04, // n0x0eae c0x0000 (---------------) + I kizu - 0x002722c8, // n0x0eaf c0x0000 (---------------) + I kumiyama - 0x0035edc8, // n0x0eb0 c0x0000 (---------------) + I kyotamba - 0x0030f889, // n0x0eb1 c0x0000 (---------------) + I kyotanabe - 0x003165c8, // n0x0eb2 c0x0000 (---------------) + I kyotango - 0x0030c047, // n0x0eb3 c0x0000 (---------------) + I maizuru - 0x00213fc6, // n0x0eb4 c0x0000 (---------------) + I minami - 0x002c588f, // n0x0eb5 c0x0000 (---------------) + I minamiyamashiro - 0x002aee46, // n0x0eb6 c0x0000 (---------------) + I miyazu - 0x002ba3c4, // n0x0eb7 c0x0000 (---------------) + I muko - 0x0035ec0a, // n0x0eb8 c0x0000 (---------------) + I nagaokakyo - 0x00351e07, // n0x0eb9 c0x0000 (---------------) + I nakagyo - 0x00204d46, // n0x0eba c0x0000 (---------------) + I nantan - 0x0027c389, // n0x0ebb c0x0000 (---------------) + I oyamazaki - 0x0030f805, // n0x0ebc c0x0000 (---------------) + I sakyo - 0x002c6f45, // n0x0ebd c0x0000 (---------------) + I seika - 0x0030f946, // n0x0ebe c0x0000 (---------------) + I tanabe - 0x00212d43, // n0x0ebf c0x0000 (---------------) + I uji - 0x00224749, // n0x0ec0 c0x0000 (---------------) + I ujitawara - 0x00214fc6, // n0x0ec1 c0x0000 (---------------) + I wazuka - 0x0023aa49, // n0x0ec2 c0x0000 (---------------) + I yamashina - 0x003804c6, // n0x0ec3 c0x0000 (---------------) + I yawata - 0x002ad5c5, // n0x0ec4 c0x0000 (---------------) + I asahi - 0x0035dd05, // n0x0ec5 c0x0000 (---------------) + I inabe - 0x00233203, // n0x0ec6 c0x0000 (---------------) + I ise - 0x0023a948, // n0x0ec7 c0x0000 (---------------) + I kameyama - 0x002406c7, // n0x0ec8 c0x0000 (---------------) + I kawagoe - 0x0037aec4, // n0x0ec9 c0x0000 (---------------) + I kiho - 0x0022a888, // n0x0eca c0x0000 (---------------) + I kisosaki - 0x002927c4, // n0x0ecb c0x0000 (---------------) + I kiwa - 0x002d4306, // n0x0ecc c0x0000 (---------------) + I komono - 0x00285906, // n0x0ecd c0x0000 (---------------) + I kumano - 0x0022f386, // n0x0ece c0x0000 (---------------) + I kuwana - 0x002b5109, // n0x0ecf c0x0000 (---------------) + I matsusaka - 0x002cae05, // n0x0ed0 c0x0000 (---------------) + I meiwa - 0x00292a46, // n0x0ed1 c0x0000 (---------------) + I mihama - 0x00370d89, // n0x0ed2 c0x0000 (---------------) + I minamiise - 0x002adc06, // n0x0ed3 c0x0000 (---------------) + I misugi - 0x00272346, // n0x0ed4 c0x0000 (---------------) + I miyama - 0x0036fe46, // n0x0ed5 c0x0000 (---------------) + I nabari - 0x0021f645, // n0x0ed6 c0x0000 (---------------) + I shima - 0x002d2b86, // n0x0ed7 c0x0000 (---------------) + I suzuka - 0x0031c2c4, // n0x0ed8 c0x0000 (---------------) + I tado - 0x0028ee85, // n0x0ed9 c0x0000 (---------------) + I taiki - 0x00245104, // n0x0eda c0x0000 (---------------) + I taki - 0x002f1b06, // n0x0edb c0x0000 (---------------) + I tamaki - 0x00395844, // n0x0edc c0x0000 (---------------) + I toba - 0x00203a03, // n0x0edd c0x0000 (---------------) + I tsu - 0x00274845, // n0x0ede c0x0000 (---------------) + I udono - 0x00227348, // n0x0edf c0x0000 (---------------) + I ureshino - 0x00253ec7, // n0x0ee0 c0x0000 (---------------) + I watarai - 0x00234a49, // n0x0ee1 c0x0000 (---------------) + I yokkaichi - 0x00274a88, // n0x0ee2 c0x0000 (---------------) + I furukawa - 0x002830d1, // n0x0ee3 c0x0000 (---------------) + I higashimatsushima - 0x0025faca, // n0x0ee4 c0x0000 (---------------) + I ishinomaki - 0x00316107, // n0x0ee5 c0x0000 (---------------) + I iwanuma - 0x0038d846, // n0x0ee6 c0x0000 (---------------) + I kakuda - 0x00204904, // n0x0ee7 c0x0000 (---------------) + I kami - 0x002a8748, // n0x0ee8 c0x0000 (---------------) + I kawasaki - 0x0034cc49, // n0x0ee9 c0x0000 (---------------) + I kesennuma - 0x0028b408, // n0x0eea c0x0000 (---------------) + I marumori - 0x0028328a, // n0x0eeb c0x0000 (---------------) + I matsushima - 0x002b45cd, // n0x0eec c0x0000 (---------------) + I minamisanriku - 0x0028b246, // n0x0eed c0x0000 (---------------) + I misato - 0x00248546, // n0x0eee c0x0000 (---------------) + I murata - 0x0029a906, // n0x0eef c0x0000 (---------------) + I natori - 0x00204047, // n0x0ef0 c0x0000 (---------------) + I ogawara - 0x002e81c5, // n0x0ef1 c0x0000 (---------------) + I ohira - 0x00295c07, // n0x0ef2 c0x0000 (---------------) + I onagawa - 0x0022a945, // n0x0ef3 c0x0000 (---------------) + I osaki - 0x00294d84, // n0x0ef4 c0x0000 (---------------) + I rifu - 0x0027c146, // n0x0ef5 c0x0000 (---------------) + I semine - 0x003416c7, // n0x0ef6 c0x0000 (---------------) + I shibata - 0x0022444d, // n0x0ef7 c0x0000 (---------------) + I shichikashuku - 0x0027ba87, // n0x0ef8 c0x0000 (---------------) + I shikama - 0x002471c8, // n0x0ef9 c0x0000 (---------------) + I shiogama - 0x00268409, // n0x0efa c0x0000 (---------------) + I shiroishi - 0x0031b586, // n0x0efb c0x0000 (---------------) + I tagajo - 0x002e7445, // n0x0efc c0x0000 (---------------) + I taiwa - 0x0020fe04, // n0x0efd c0x0000 (---------------) + I tome - 0x00371186, // n0x0efe c0x0000 (---------------) + I tomiya - 0x00389846, // n0x0eff c0x0000 (---------------) + I wakuya - 0x0024e906, // n0x0f00 c0x0000 (---------------) + I watari - 0x00286688, // n0x0f01 c0x0000 (---------------) + I yamamoto - 0x00395443, // n0x0f02 c0x0000 (---------------) + I zao - 0x00206fc3, // n0x0f03 c0x0000 (---------------) + I aya - 0x0036cf45, // n0x0f04 c0x0000 (---------------) + I ebino - 0x00375946, // n0x0f05 c0x0000 (---------------) + I gokase - 0x00297505, // n0x0f06 c0x0000 (---------------) + I hyuga - 0x002317c8, // n0x0f07 c0x0000 (---------------) + I kadogawa - 0x002882ca, // n0x0f08 c0x0000 (---------------) + I kawaminami - 0x00389a44, // n0x0f09 c0x0000 (---------------) + I kijo - 0x0020e0c8, // n0x0f0a c0x0000 (---------------) + I kitagawa - 0x002815c8, // n0x0f0b c0x0000 (---------------) + I kitakata - 0x00206e47, // n0x0f0c c0x0000 (---------------) + I kitaura - 0x002d3d09, // n0x0f0d c0x0000 (---------------) + I kobayashi - 0x002a2a48, // n0x0f0e c0x0000 (---------------) + I kunitomi - 0x0026d647, // n0x0f0f c0x0000 (---------------) + I kushima - 0x0027cdc6, // n0x0f10 c0x0000 (---------------) + I mimata - 0x00207d4a, // n0x0f11 c0x0000 (---------------) + I miyakonojo - 0x00371208, // n0x0f12 c0x0000 (---------------) + I miyazaki - 0x002ae609, // n0x0f13 c0x0000 (---------------) + I morotsuka - 0x0027fa88, // n0x0f14 c0x0000 (---------------) + I nichinan - 0x00217e09, // n0x0f15 c0x0000 (---------------) + I nishimera - 0x00346687, // n0x0f16 c0x0000 (---------------) + I nobeoka - 0x00302b45, // n0x0f17 c0x0000 (---------------) + I saito - 0x00329e86, // n0x0f18 c0x0000 (---------------) + I shiiba - 0x0028f5c8, // n0x0f19 c0x0000 (---------------) + I shintomi - 0x0023ae48, // n0x0f1a c0x0000 (---------------) + I takaharu - 0x002462c8, // n0x0f1b c0x0000 (---------------) + I takanabe - 0x002f9c88, // n0x0f1c c0x0000 (---------------) + I takazaki - 0x00203a05, // n0x0f1d c0x0000 (---------------) + I tsuno - 0x0022e144, // n0x0f1e c0x0000 (---------------) + I achi - 0x0034e008, // n0x0f1f c0x0000 (---------------) + I agematsu - 0x00204e44, // n0x0f20 c0x0000 (---------------) + I anan - 0x00395484, // n0x0f21 c0x0000 (---------------) + I aoki - 0x002ad5c5, // n0x0f22 c0x0000 (---------------) + I asahi - 0x0027ed87, // n0x0f23 c0x0000 (---------------) + I azumino - 0x00206a49, // n0x0f24 c0x0000 (---------------) + I chikuhoku - 0x0036c387, // n0x0f25 c0x0000 (---------------) + I chikuma - 0x0022e185, // n0x0f26 c0x0000 (---------------) + I chino - 0x00265906, // n0x0f27 c0x0000 (---------------) + I fujimi - 0x003317c6, // n0x0f28 c0x0000 (---------------) + I hakuba - 0x0020a004, // n0x0f29 c0x0000 (---------------) + I hara - 0x0028c546, // n0x0f2a c0x0000 (---------------) + I hiraya - 0x0024ecc4, // n0x0f2b c0x0000 (---------------) + I iida - 0x00256486, // n0x0f2c c0x0000 (---------------) + I iijima - 0x0034d2c6, // n0x0f2d c0x0000 (---------------) + I iiyama - 0x0020ec86, // n0x0f2e c0x0000 (---------------) + I iizuna - 0x00390e45, // n0x0f2f c0x0000 (---------------) + I ikeda - 0x00231687, // n0x0f30 c0x0000 (---------------) + I ikusaka - 0x00200243, // n0x0f31 c0x0000 (---------------) + I ina - 0x0031e389, // n0x0f32 c0x0000 (---------------) + I karuizawa - 0x00315908, // n0x0f33 c0x0000 (---------------) + I kawakami - 0x0022a884, // n0x0f34 c0x0000 (---------------) + I kiso - 0x0026d4cd, // n0x0f35 c0x0000 (---------------) + I kisofukushima - 0x002827c8, // n0x0f36 c0x0000 (---------------) + I kitaaiki - 0x002fa008, // n0x0f37 c0x0000 (---------------) + I komagane - 0x002ae586, // n0x0f38 c0x0000 (---------------) + I komoro - 0x0026ea09, // n0x0f39 c0x0000 (---------------) + I matsukawa - 0x002c4889, // n0x0f3a c0x0000 (---------------) + I matsumoto - 0x0024e105, // n0x0f3b c0x0000 (---------------) + I miasa - 0x002883ca, // n0x0f3c c0x0000 (---------------) + I minamiaiki - 0x0025b8ca, // n0x0f3d c0x0000 (---------------) + I minamimaki - 0x002b064c, // n0x0f3e c0x0000 (---------------) + I minamiminowa - 0x002b07c6, // n0x0f3f c0x0000 (---------------) + I minowa - 0x00266386, // n0x0f40 c0x0000 (---------------) + I miyada - 0x002af8c6, // n0x0f41 c0x0000 (---------------) + I miyota - 0x00258b89, // n0x0f42 c0x0000 (---------------) + I mochizuki - 0x0034e4c6, // n0x0f43 c0x0000 (---------------) + I nagano - 0x0028ba86, // n0x0f44 c0x0000 (---------------) + I nagawa - 0x00240906, // n0x0f45 c0x0000 (---------------) + I nagiso - 0x002934c8, // n0x0f46 c0x0000 (---------------) + I nakagawa - 0x0023fcc6, // n0x0f47 c0x0000 (---------------) + I nakano - 0x002fe9cb, // n0x0f48 c0x0000 (---------------) + I nozawaonsen - 0x0027ef05, // n0x0f49 c0x0000 (---------------) + I obuse - 0x00204045, // n0x0f4a c0x0000 (---------------) + I ogawa - 0x00266605, // n0x0f4b c0x0000 (---------------) + I okaya - 0x00353c06, // n0x0f4c c0x0000 (---------------) + I omachi - 0x00207d03, // n0x0f4d c0x0000 (---------------) + I omi - 0x0022f306, // n0x0f4e c0x0000 (---------------) + I ookuwa - 0x0027ba07, // n0x0f4f c0x0000 (---------------) + I ooshika - 0x002a8605, // n0x0f50 c0x0000 (---------------) + I otaki - 0x003389c5, // n0x0f51 c0x0000 (---------------) + I otari - 0x0036ba45, // n0x0f52 c0x0000 (---------------) + I sakae - 0x00201a06, // n0x0f53 c0x0000 (---------------) + I sakaki - 0x0024e1c4, // n0x0f54 c0x0000 (---------------) + I saku - 0x0035fb46, // n0x0f55 c0x0000 (---------------) + I sakuho - 0x00325709, // n0x0f56 c0x0000 (---------------) + I shimosuwa - 0x00353a8c, // n0x0f57 c0x0000 (---------------) + I shinanomachi - 0x00294ac8, // n0x0f58 c0x0000 (---------------) + I shiojiri - 0x002e5544, // n0x0f59 c0x0000 (---------------) + I suwa - 0x002d2806, // n0x0f5a c0x0000 (---------------) + I suzaka - 0x002fe846, // n0x0f5b c0x0000 (---------------) + I takagi - 0x0022ab88, // n0x0f5c c0x0000 (---------------) + I takamori - 0x0020f408, // n0x0f5d c0x0000 (---------------) + I takayama - 0x00353989, // n0x0f5e c0x0000 (---------------) + I tateshina - 0x00203987, // n0x0f5f c0x0000 (---------------) + I tatsuno - 0x002e5d09, // n0x0f60 c0x0000 (---------------) + I togakushi - 0x0025e506, // n0x0f61 c0x0000 (---------------) + I togura - 0x002204c4, // n0x0f62 c0x0000 (---------------) + I tomi - 0x00207204, // n0x0f63 c0x0000 (---------------) + I ueda - 0x0023e8c4, // n0x0f64 c0x0000 (---------------) + I wada - 0x0026dc08, // n0x0f65 c0x0000 (---------------) + I yamagata - 0x0020688a, // n0x0f66 c0x0000 (---------------) + I yamanouchi - 0x00339646, // n0x0f67 c0x0000 (---------------) + I yasaka - 0x0033e847, // n0x0f68 c0x0000 (---------------) + I yasuoka - 0x002e9747, // n0x0f69 c0x0000 (---------------) + I chijiwa - 0x0021edc5, // n0x0f6a c0x0000 (---------------) + I futsu - 0x00286c04, // n0x0f6b c0x0000 (---------------) + I goto - 0x0027a8c6, // n0x0f6c c0x0000 (---------------) + I hasami - 0x002e8206, // n0x0f6d c0x0000 (---------------) + I hirado - 0x00206743, // n0x0f6e c0x0000 (---------------) + I iki - 0x00315747, // n0x0f6f c0x0000 (---------------) + I isahaya - 0x003108c8, // n0x0f70 c0x0000 (---------------) + I kawatana - 0x0024e24a, // n0x0f71 c0x0000 (---------------) + I kuchinotsu - 0x002bcc48, // n0x0f72 c0x0000 (---------------) + I matsuura - 0x0036c108, // n0x0f73 c0x0000 (---------------) + I nagasaki - 0x00395885, // n0x0f74 c0x0000 (---------------) + I obama - 0x0023a1c5, // n0x0f75 c0x0000 (---------------) + I omura - 0x00366645, // n0x0f76 c0x0000 (---------------) + I oseto - 0x0021f186, // n0x0f77 c0x0000 (---------------) + I saikai - 0x0029be46, // n0x0f78 c0x0000 (---------------) + I sasebo - 0x002e5845, // n0x0f79 c0x0000 (---------------) + I seihi - 0x0038bf49, // n0x0f7a c0x0000 (---------------) + I shimabara - 0x00286a0c, // n0x0f7b c0x0000 (---------------) + I shinkamigoto - 0x00226a07, // n0x0f7c c0x0000 (---------------) + I togitsu - 0x00283308, // n0x0f7d c0x0000 (---------------) + I tsushima - 0x00279c05, // n0x0f7e c0x0000 (---------------) + I unzen - 0x006735c4, // n0x0f7f c0x0001 (---------------) ! I city - 0x00346e44, // n0x0f80 c0x0000 (---------------) + I ando - 0x0026e184, // n0x0f81 c0x0000 (---------------) + I gose - 0x0022e2c6, // n0x0f82 c0x0000 (---------------) + I heguri - 0x0028a74e, // n0x0f83 c0x0000 (---------------) + I higashiyoshino - 0x00344187, // n0x0f84 c0x0000 (---------------) + I ikaruga - 0x00204245, // n0x0f85 c0x0000 (---------------) + I ikoma - 0x0022adcc, // n0x0f86 c0x0000 (---------------) + I kamikitayama - 0x00292687, // n0x0f87 c0x0000 (---------------) + I kanmaki - 0x00341647, // n0x0f88 c0x0000 (---------------) + I kashiba - 0x00344809, // n0x0f89 c0x0000 (---------------) + I kashihara - 0x002133c9, // n0x0f8a c0x0000 (---------------) + I katsuragi - 0x00273345, // n0x0f8b c0x0000 (---------------) + I kawai - 0x00315908, // n0x0f8c c0x0000 (---------------) + I kawakami - 0x0022ed09, // n0x0f8d c0x0000 (---------------) + I kawanishi - 0x002c9885, // n0x0f8e c0x0000 (---------------) + I koryo - 0x002a8548, // n0x0f8f c0x0000 (---------------) + I kurotaki - 0x002b5f46, // n0x0f90 c0x0000 (---------------) + I mitsue - 0x002a5986, // n0x0f91 c0x0000 (---------------) + I miyake - 0x002da0c4, // n0x0f92 c0x0000 (---------------) + I nara - 0x00257448, // n0x0f93 c0x0000 (---------------) + I nosegawa - 0x002432c3, // n0x0f94 c0x0000 (---------------) + I oji - 0x00392684, // n0x0f95 c0x0000 (---------------) + I ouda - 0x002e35c5, // n0x0f96 c0x0000 (---------------) + I oyodo - 0x002f4d47, // n0x0f97 c0x0000 (---------------) + I sakurai - 0x00202285, // n0x0f98 c0x0000 (---------------) + I sango - 0x0038f649, // n0x0f99 c0x0000 (---------------) + I shimoichi - 0x00267dcd, // n0x0f9a c0x0000 (---------------) + I shimokitayama - 0x00285306, // n0x0f9b c0x0000 (---------------) + I shinjo - 0x00220944, // n0x0f9c c0x0000 (---------------) + I soni - 0x00335dc8, // n0x0f9d c0x0000 (---------------) + I takatori - 0x0025ca0a, // n0x0f9e c0x0000 (---------------) + I tawaramoto - 0x00203207, // n0x0f9f c0x0000 (---------------) + I tenkawa - 0x0027be45, // n0x0fa0 c0x0000 (---------------) + I tenri - 0x002070c3, // n0x0fa1 c0x0000 (---------------) + I uda - 0x00289d8e, // n0x0fa2 c0x0000 (---------------) + I yamatokoriyama - 0x0022afcc, // n0x0fa3 c0x0000 (---------------) + I yamatotakada - 0x0027b147, // n0x0fa4 c0x0000 (---------------) + I yamazoe - 0x0028a907, // n0x0fa5 c0x0000 (---------------) + I yoshino - 0x002015c3, // n0x0fa6 c0x0000 (---------------) + I aga - 0x0034e505, // n0x0fa7 c0x0000 (---------------) + I agano - 0x0026e185, // n0x0fa8 c0x0000 (---------------) + I gosen - 0x00283f48, // n0x0fa9 c0x0000 (---------------) + I itoigawa - 0x00281409, // n0x0faa c0x0000 (---------------) + I izumozaki - 0x0026a386, // n0x0fab c0x0000 (---------------) + I joetsu - 0x0022ac04, // n0x0fac c0x0000 (---------------) + I kamo - 0x00316046, // n0x0fad c0x0000 (---------------) + I kariwa - 0x0038218b, // n0x0fae c0x0000 (---------------) + I kashiwazaki - 0x002c460c, // n0x0faf c0x0000 (---------------) + I minamiuonuma - 0x0026c3c7, // n0x0fb0 c0x0000 (---------------) + I mitsuke - 0x002ba105, // n0x0fb1 c0x0000 (---------------) + I muika - 0x003743c8, // n0x0fb2 c0x0000 (---------------) + I murakami - 0x0032b585, // n0x0fb3 c0x0000 (---------------) + I myoko - 0x0035ec07, // n0x0fb4 c0x0000 (---------------) + I nagaoka - 0x0025f907, // n0x0fb5 c0x0000 (---------------) + I niigata - 0x002432c5, // n0x0fb6 c0x0000 (---------------) + I ojiya - 0x00207d03, // n0x0fb7 c0x0000 (---------------) + I omi - 0x002109c4, // n0x0fb8 c0x0000 (---------------) + I sado - 0x00203845, // n0x0fb9 c0x0000 (---------------) + I sanjo - 0x002f3b45, // n0x0fba c0x0000 (---------------) + I seiro - 0x002f3b46, // n0x0fbb c0x0000 (---------------) + I seirou - 0x00274588, // n0x0fbc c0x0000 (---------------) + I sekikawa - 0x003416c7, // n0x0fbd c0x0000 (---------------) + I shibata - 0x0033ed46, // n0x0fbe c0x0000 (---------------) + I tagami - 0x0031abc6, // n0x0fbf c0x0000 (---------------) + I tainai - 0x0030fc06, // n0x0fc0 c0x0000 (---------------) + I tochio - 0x002e1589, // n0x0fc1 c0x0000 (---------------) + I tokamachi - 0x0031adc7, // n0x0fc2 c0x0000 (---------------) + I tsubame - 0x00207306, // n0x0fc3 c0x0000 (---------------) + I tsunan - 0x002c4786, // n0x0fc4 c0x0000 (---------------) + I uonuma - 0x00243386, // n0x0fc5 c0x0000 (---------------) + I yahiko - 0x00298cc5, // n0x0fc6 c0x0000 (---------------) + I yoita - 0x00216b86, // n0x0fc7 c0x0000 (---------------) + I yuzawa - 0x0034c845, // n0x0fc8 c0x0000 (---------------) + I beppu - 0x002a55c8, // n0x0fc9 c0x0000 (---------------) + I bungoono - 0x0024facb, // n0x0fca c0x0000 (---------------) + I bungotakada - 0x0027a6c6, // n0x0fcb c0x0000 (---------------) + I hasama - 0x002e9784, // n0x0fcc c0x0000 (---------------) + I hiji - 0x00336449, // n0x0fcd c0x0000 (---------------) + I himeshima - 0x0028d544, // n0x0fce c0x0000 (---------------) + I hita - 0x002b5ec8, // n0x0fcf c0x0000 (---------------) + I kamitsue - 0x0027b5c7, // n0x0fd0 c0x0000 (---------------) + I kokonoe - 0x0026ff44, // n0x0fd1 c0x0000 (---------------) + I kuju - 0x002a0f48, // n0x0fd2 c0x0000 (---------------) + I kunisaki - 0x002a9c04, // n0x0fd3 c0x0000 (---------------) + I kusu - 0x00298d04, // n0x0fd4 c0x0000 (---------------) + I oita - 0x002a7585, // n0x0fd5 c0x0000 (---------------) + I saiki - 0x00335cc6, // n0x0fd6 c0x0000 (---------------) + I taketa - 0x00272207, // n0x0fd7 c0x0000 (---------------) + I tsukumi - 0x00222503, // n0x0fd8 c0x0000 (---------------) + I usa - 0x00288f85, // n0x0fd9 c0x0000 (---------------) + I usuki - 0x002ab604, // n0x0fda c0x0000 (---------------) + I yufu - 0x0023e446, // n0x0fdb c0x0000 (---------------) + I akaiwa - 0x0024e188, // n0x0fdc c0x0000 (---------------) + I asakuchi - 0x00310605, // n0x0fdd c0x0000 (---------------) + I bizen - 0x0027e449, // n0x0fde c0x0000 (---------------) + I hayashima - 0x002b9fc5, // n0x0fdf c0x0000 (---------------) + I ibara - 0x002ab008, // n0x0fe0 c0x0000 (---------------) + I kagamino - 0x00340b47, // n0x0fe1 c0x0000 (---------------) + I kasaoka - 0x0035c188, // n0x0fe2 c0x0000 (---------------) + I kibichuo - 0x002a0447, // n0x0fe3 c0x0000 (---------------) + I kumenan - 0x0025adc9, // n0x0fe4 c0x0000 (---------------) + I kurashiki - 0x002487c6, // n0x0fe5 c0x0000 (---------------) + I maniwa - 0x00303986, // n0x0fe6 c0x0000 (---------------) + I misaki - 0x00240904, // n0x0fe7 c0x0000 (---------------) + I nagi - 0x0027cd05, // n0x0fe8 c0x0000 (---------------) + I niimi - 0x002dac0c, // n0x0fe9 c0x0000 (---------------) + I nishiawakura - 0x00266607, // n0x0fea c0x0000 (---------------) + I okayama - 0x00266c47, // n0x0feb c0x0000 (---------------) + I satosho - 0x002e9608, // n0x0fec c0x0000 (---------------) + I setouchi - 0x00285306, // n0x0fed c0x0000 (---------------) + I shinjo - 0x00340f44, // n0x0fee c0x0000 (---------------) + I shoo - 0x0030ad04, // n0x0fef c0x0000 (---------------) + I soja - 0x0023c909, // n0x0ff0 c0x0000 (---------------) + I takahashi - 0x002af9c6, // n0x0ff1 c0x0000 (---------------) + I tamano - 0x002601c7, // n0x0ff2 c0x0000 (---------------) + I tsuyama - 0x00295d44, // n0x0ff3 c0x0000 (---------------) + I wake - 0x002b4e06, // n0x0ff4 c0x0000 (---------------) + I yakage - 0x00342185, // n0x0ff5 c0x0000 (---------------) + I aguni - 0x0028d847, // n0x0ff6 c0x0000 (---------------) + I ginowan - 0x002fe946, // n0x0ff7 c0x0000 (---------------) + I ginoza - 0x00239cc9, // n0x0ff8 c0x0000 (---------------) + I gushikami - 0x002b0487, // n0x0ff9 c0x0000 (---------------) + I haebaru - 0x002545c7, // n0x0ffa c0x0000 (---------------) + I higashi - 0x0028c086, // n0x0ffb c0x0000 (---------------) + I hirara - 0x00231145, // n0x0ffc c0x0000 (---------------) + I iheya - 0x0026cf88, // n0x0ffd c0x0000 (---------------) + I ishigaki - 0x00214e48, // n0x0ffe c0x0000 (---------------) + I ishikawa - 0x0022a5c6, // n0x0fff c0x0000 (---------------) + I itoman - 0x00310645, // n0x1000 c0x0000 (---------------) + I izena - 0x002f0446, // n0x1001 c0x0000 (---------------) + I kadena - 0x00201b03, // n0x1002 c0x0000 (---------------) + I kin - 0x00283dc9, // n0x1003 c0x0000 (---------------) + I kitadaito - 0x0029168e, // n0x1004 c0x0000 (---------------) + I kitanakagusuku - 0x0029f548, // n0x1005 c0x0000 (---------------) + I kumejima - 0x002928c8, // n0x1006 c0x0000 (---------------) + I kunigami - 0x0022a3cb, // n0x1007 c0x0000 (---------------) + I minamidaito - 0x0027e686, // n0x1008 c0x0000 (---------------) + I motobu - 0x002402c4, // n0x1009 c0x0000 (---------------) + I nago - 0x0026ecc4, // n0x100a c0x0000 (---------------) + I naha - 0x0029178a, // n0x100b c0x0000 (---------------) + I nakagusuku - 0x0020d7c7, // n0x100c c0x0000 (---------------) + I nakijin - 0x002073c5, // n0x100d c0x0000 (---------------) + I nanjo - 0x0020e649, // n0x100e c0x0000 (---------------) + I nishihara - 0x002a6885, // n0x100f c0x0000 (---------------) + I ogimi - 0x003954c7, // n0x1010 c0x0000 (---------------) + I okinawa - 0x002988c4, // n0x1011 c0x0000 (---------------) + I onna - 0x00265dc7, // n0x1012 c0x0000 (---------------) + I shimoji - 0x003162c8, // n0x1013 c0x0000 (---------------) + I taketomi - 0x002a43c6, // n0x1014 c0x0000 (---------------) + I tarama - 0x002065c9, // n0x1015 c0x0000 (---------------) + I tokashiki - 0x002a2b4a, // n0x1016 c0x0000 (---------------) + I tomigusuku - 0x0020d746, // n0x1017 c0x0000 (---------------) + I tonaki - 0x00282306, // n0x1018 c0x0000 (---------------) + I urasoe - 0x00296205, // n0x1019 c0x0000 (---------------) + I uruma - 0x00361285, // n0x101a c0x0000 (---------------) + I yaese - 0x00305787, // n0x101b c0x0000 (---------------) + I yomitan - 0x00309c08, // n0x101c c0x0000 (---------------) + I yonabaru - 0x003420c8, // n0x101d c0x0000 (---------------) + I yonaguni - 0x00236b86, // n0x101e c0x0000 (---------------) + I zamami - 0x0031d9c5, // n0x101f c0x0000 (---------------) + I abeno - 0x002403ce, // n0x1020 c0x0000 (---------------) + I chihayaakasaka - 0x002be904, // n0x1021 c0x0000 (---------------) + I chuo - 0x0022a545, // n0x1022 c0x0000 (---------------) + I daito - 0x00265289, // n0x1023 c0x0000 (---------------) + I fujiidera - 0x00273148, // n0x1024 c0x0000 (---------------) + I habikino - 0x00278046, // n0x1025 c0x0000 (---------------) + I hannan - 0x0028630c, // n0x1026 c0x0000 (---------------) + I higashiosaka - 0x00287ed0, // n0x1027 c0x0000 (---------------) + I higashisumiyoshi - 0x0028a38f, // n0x1028 c0x0000 (---------------) + I higashiyodogawa - 0x0028b7c8, // n0x1029 c0x0000 (---------------) + I hirakata - 0x00316ac7, // n0x102a c0x0000 (---------------) + I ibaraki - 0x00390e45, // n0x102b c0x0000 (---------------) + I ikeda - 0x00209785, // n0x102c c0x0000 (---------------) + I izumi - 0x00272089, // n0x102d c0x0000 (---------------) + I izumiotsu - 0x00209789, // n0x102e c0x0000 (---------------) + I izumisano - 0x00216406, // n0x102f c0x0000 (---------------) + I kadoma - 0x002df247, // n0x1030 c0x0000 (---------------) + I kaizuka - 0x0037c505, // n0x1031 c0x0000 (---------------) + I kanan - 0x00375c89, // n0x1032 c0x0000 (---------------) + I kashiwara - 0x003175c6, // n0x1033 c0x0000 (---------------) + I katano - 0x0034e30d, // n0x1034 c0x0000 (---------------) + I kawachinagano - 0x0026d109, // n0x1035 c0x0000 (---------------) + I kishiwada - 0x00206e44, // n0x1036 c0x0000 (---------------) + I kita - 0x0029f2c8, // n0x1037 c0x0000 (---------------) + I kumatori - 0x0034e0c9, // n0x1038 c0x0000 (---------------) + I matsubara - 0x00339806, // n0x1039 c0x0000 (---------------) + I minato - 0x00265a05, // n0x103a c0x0000 (---------------) + I minoh - 0x00303986, // n0x103b c0x0000 (---------------) + I misaki - 0x00387b49, // n0x103c c0x0000 (---------------) + I moriguchi - 0x003896c8, // n0x103d c0x0000 (---------------) + I neyagawa - 0x00208b85, // n0x103e c0x0000 (---------------) + I nishi - 0x00257444, // n0x103f c0x0000 (---------------) + I nose - 0x002864cb, // n0x1040 c0x0000 (---------------) + I osakasayama - 0x003396c5, // n0x1041 c0x0000 (---------------) + I sakai - 0x00286606, // n0x1042 c0x0000 (---------------) + I sayama - 0x0026f406, // n0x1043 c0x0000 (---------------) + I sennan - 0x00243d86, // n0x1044 c0x0000 (---------------) + I settsu - 0x003260cb, // n0x1045 c0x0000 (---------------) + I shijonawate - 0x0027e549, // n0x1046 c0x0000 (---------------) + I shimamoto - 0x002e5b85, // n0x1047 c0x0000 (---------------) + I suita - 0x0035bf47, // n0x1048 c0x0000 (---------------) + I tadaoka - 0x0025fa46, // n0x1049 c0x0000 (---------------) + I taishi - 0x002345c6, // n0x104a c0x0000 (---------------) + I tajiri - 0x0026df08, // n0x104b c0x0000 (---------------) + I takaishi - 0x00376d89, // n0x104c c0x0000 (---------------) + I takatsuki - 0x00246f8c, // n0x104d c0x0000 (---------------) + I tondabayashi - 0x00351d08, // n0x104e c0x0000 (---------------) + I toyonaka - 0x002260c6, // n0x104f c0x0000 (---------------) + I toyono - 0x00330543, // n0x1050 c0x0000 (---------------) + I yao - 0x0027ebc6, // n0x1051 c0x0000 (---------------) + I ariake - 0x0025ac85, // n0x1052 c0x0000 (---------------) + I arita - 0x0026b1c8, // n0x1053 c0x0000 (---------------) + I fukudomi - 0x0021b746, // n0x1054 c0x0000 (---------------) + I genkai - 0x0028da88, // n0x1055 c0x0000 (---------------) + I hamatama - 0x00228245, // n0x1056 c0x0000 (---------------) + I hizen - 0x00352985, // n0x1057 c0x0000 (---------------) + I imari - 0x002877c8, // n0x1058 c0x0000 (---------------) + I kamimine - 0x002d2c87, // n0x1059 c0x0000 (---------------) + I kanzaki - 0x0033e987, // n0x105a c0x0000 (---------------) + I karatsu - 0x00341887, // n0x105b c0x0000 (---------------) + I kashima - 0x0022aa08, // n0x105c c0x0000 (---------------) + I kitagata - 0x00316c08, // n0x105d c0x0000 (---------------) + I kitahata - 0x00253286, // n0x105e c0x0000 (---------------) + I kiyama - 0x002f1947, // n0x105f c0x0000 (---------------) + I kouhoku - 0x002896c7, // n0x1060 c0x0000 (---------------) + I kyuragi - 0x00325dca, // n0x1061 c0x0000 (---------------) + I nishiarita - 0x00212803, // n0x1062 c0x0000 (---------------) + I ogi - 0x00353c06, // n0x1063 c0x0000 (---------------) + I omachi - 0x002069c5, // n0x1064 c0x0000 (---------------) + I ouchi - 0x00275104, // n0x1065 c0x0000 (---------------) + I saga - 0x00268409, // n0x1066 c0x0000 (---------------) + I shiroishi - 0x0025ad44, // n0x1067 c0x0000 (---------------) + I taku - 0x00253f44, // n0x1068 c0x0000 (---------------) + I tara - 0x002891c4, // n0x1069 c0x0000 (---------------) + I tosu - 0x0028a90b, // n0x106a c0x0000 (---------------) + I yoshinogari - 0x0034e247, // n0x106b c0x0000 (---------------) + I arakawa - 0x00240605, // n0x106c c0x0000 (---------------) + I asaka - 0x00280ac8, // n0x106d c0x0000 (---------------) + I chichibu - 0x00265906, // n0x106e c0x0000 (---------------) + I fujimi - 0x00265908, // n0x106f c0x0000 (---------------) + I fujimino - 0x00269d86, // n0x1070 c0x0000 (---------------) + I fukaya - 0x00278e45, // n0x1071 c0x0000 (---------------) + I hanno - 0x002794c5, // n0x1072 c0x0000 (---------------) + I hanyu - 0x0027b306, // n0x1073 c0x0000 (---------------) + I hasuda - 0x0027b788, // n0x1074 c0x0000 (---------------) + I hatogaya - 0x0027c2c8, // n0x1075 c0x0000 (---------------) + I hatoyama - 0x002685c6, // n0x1076 c0x0000 (---------------) + I hidaka - 0x0028090f, // n0x1077 c0x0000 (---------------) + I higashichichibu - 0x00283890, // n0x1078 c0x0000 (---------------) + I higashimatsuyama - 0x002028c5, // n0x1079 c0x0000 (---------------) + I honjo - 0x00200243, // n0x107a c0x0000 (---------------) + I ina - 0x002797c5, // n0x107b c0x0000 (---------------) + I iruma - 0x0030b3c8, // n0x107c c0x0000 (---------------) + I iwatsuki - 0x00209689, // n0x107d c0x0000 (---------------) + I kamiizumi - 0x00304f08, // n0x107e c0x0000 (---------------) + I kamikawa - 0x00340c88, // n0x107f c0x0000 (---------------) + I kamisato - 0x00391808, // n0x1080 c0x0000 (---------------) + I kasukabe - 0x002406c7, // n0x1081 c0x0000 (---------------) + I kawagoe - 0x002655c9, // n0x1082 c0x0000 (---------------) + I kawaguchi - 0x0028dc88, // n0x1083 c0x0000 (---------------) + I kawajima - 0x00369344, // n0x1084 c0x0000 (---------------) + I kazo - 0x00289048, // n0x1085 c0x0000 (---------------) + I kitamoto - 0x0028ec09, // n0x1086 c0x0000 (---------------) + I koshigaya - 0x00307ec7, // n0x1087 c0x0000 (---------------) + I kounosu - 0x00293e04, // n0x1088 c0x0000 (---------------) + I kuki - 0x0036c448, // n0x1089 c0x0000 (---------------) + I kumagaya - 0x0023144a, // n0x108a c0x0000 (---------------) + I matsubushi - 0x0031ef46, // n0x108b c0x0000 (---------------) + I minano - 0x0028b246, // n0x108c c0x0000 (---------------) + I misato - 0x0021ae49, // n0x108d c0x0000 (---------------) + I miyashiro - 0x00288107, // n0x108e c0x0000 (---------------) + I miyoshi - 0x002b62c8, // n0x108f c0x0000 (---------------) + I moroyama - 0x00201588, // n0x1090 c0x0000 (---------------) + I nagatoro - 0x00342d88, // n0x1091 c0x0000 (---------------) + I namegawa - 0x003721c5, // n0x1092 c0x0000 (---------------) + I niiza - 0x00362605, // n0x1093 c0x0000 (---------------) + I ogano - 0x00204045, // n0x1094 c0x0000 (---------------) + I ogawa - 0x0026e145, // n0x1095 c0x0000 (---------------) + I ogose - 0x00259347, // n0x1096 c0x0000 (---------------) + I okegawa - 0x00207d05, // n0x1097 c0x0000 (---------------) + I omiya - 0x002a8605, // n0x1098 c0x0000 (---------------) + I otaki - 0x00386ac6, // n0x1099 c0x0000 (---------------) + I ranzan - 0x00304e47, // n0x109a c0x0000 (---------------) + I ryokami - 0x002d0f07, // n0x109b c0x0000 (---------------) + I saitama - 0x00231746, // n0x109c c0x0000 (---------------) + I sakado - 0x002bb685, // n0x109d c0x0000 (---------------) + I satte - 0x00286606, // n0x109e c0x0000 (---------------) + I sayama - 0x002066c5, // n0x109f c0x0000 (---------------) + I shiki - 0x00298148, // n0x10a0 c0x0000 (---------------) + I shiraoka - 0x002cc0c4, // n0x10a1 c0x0000 (---------------) + I soka - 0x002adc86, // n0x10a2 c0x0000 (---------------) + I sugito - 0x00312e84, // n0x10a3 c0x0000 (---------------) + I toda - 0x002add88, // n0x10a4 c0x0000 (---------------) + I tokigawa - 0x00302c0a, // n0x10a5 c0x0000 (---------------) + I tokorozawa - 0x0027700c, // n0x10a6 c0x0000 (---------------) + I tsurugashima - 0x0020b805, // n0x10a7 c0x0000 (---------------) + I urawa - 0x00204106, // n0x10a8 c0x0000 (---------------) + I warabi - 0x00247146, // n0x10a9 c0x0000 (---------------) + I yashio - 0x002f5606, // n0x10aa c0x0000 (---------------) + I yokoze - 0x00226144, // n0x10ab c0x0000 (---------------) + I yono - 0x00375b45, // n0x10ac c0x0000 (---------------) + I yorii - 0x00269bc7, // n0x10ad c0x0000 (---------------) + I yoshida - 0x00288189, // n0x10ae c0x0000 (---------------) + I yoshikawa - 0x0028fac7, // n0x10af c0x0000 (---------------) + I yoshimi - 0x006735c4, // n0x10b0 c0x0001 (---------------) ! I city - 0x006735c4, // n0x10b1 c0x0001 (---------------) ! I city - 0x002f59c5, // n0x10b2 c0x0000 (---------------) + I aisho - 0x0023dd44, // n0x10b3 c0x0000 (---------------) + I gamo - 0x00285cca, // n0x10b4 c0x0000 (---------------) + I higashiomi - 0x00265786, // n0x10b5 c0x0000 (---------------) + I hikone - 0x00346344, // n0x10b6 c0x0000 (---------------) + I koka - 0x00204cc5, // n0x10b7 c0x0000 (---------------) + I konan - 0x002d7bc5, // n0x10b8 c0x0000 (---------------) + I kosei - 0x002e8104, // n0x10b9 c0x0000 (---------------) + I koto - 0x0026f047, // n0x10ba c0x0000 (---------------) + I kusatsu - 0x002b9f47, // n0x10bb c0x0000 (---------------) + I maibara - 0x002b4f88, // n0x10bc c0x0000 (---------------) + I moriyama - 0x0036df48, // n0x10bd c0x0000 (---------------) + I nagahama - 0x00208b89, // n0x10be c0x0000 (---------------) + I nishiazai - 0x003176c8, // n0x10bf c0x0000 (---------------) + I notogawa - 0x00285e8b, // n0x10c0 c0x0000 (---------------) + I omihachiman - 0x0022a784, // n0x10c1 c0x0000 (---------------) + I otsu - 0x0025e445, // n0x10c2 c0x0000 (---------------) + I ritto - 0x00258dc5, // n0x10c3 c0x0000 (---------------) + I ryuoh - 0x00341809, // n0x10c4 c0x0000 (---------------) + I takashima - 0x00376d89, // n0x10c5 c0x0000 (---------------) + I takatsuki - 0x00336348, // n0x10c6 c0x0000 (---------------) + I torahime - 0x00233d48, // n0x10c7 c0x0000 (---------------) + I toyosato - 0x00207004, // n0x10c8 c0x0000 (---------------) + I yasu - 0x002fe885, // n0x10c9 c0x0000 (---------------) + I akagi - 0x002068c3, // n0x10ca c0x0000 (---------------) + I ama - 0x0022a745, // n0x10cb c0x0000 (---------------) + I gotsu - 0x00292ac6, // n0x10cc c0x0000 (---------------) + I hamada - 0x0028124c, // n0x10cd c0x0000 (---------------) + I higashiizumo - 0x00214ec6, // n0x10ce c0x0000 (---------------) + I hikawa - 0x002fb046, // n0x10cf c0x0000 (---------------) + I hikimi - 0x002782c5, // n0x10d0 c0x0000 (---------------) + I izumo - 0x00201a88, // n0x10d1 c0x0000 (---------------) + I kakinoki - 0x002a2fc6, // n0x10d2 c0x0000 (---------------) + I masuda - 0x0038d9c6, // n0x10d3 c0x0000 (---------------) + I matsue - 0x0028b246, // n0x10d4 c0x0000 (---------------) + I misato - 0x0021f48c, // n0x10d5 c0x0000 (---------------) + I nishinoshima - 0x0024eac4, // n0x10d6 c0x0000 (---------------) + I ohda - 0x0030fd4a, // n0x10d7 c0x0000 (---------------) + I okinoshima - 0x00278208, // n0x10d8 c0x0000 (---------------) + I okuizumo - 0x00281087, // n0x10d9 c0x0000 (---------------) + I shimane - 0x00260c46, // n0x10da c0x0000 (---------------) + I tamayu - 0x002e5507, // n0x10db c0x0000 (---------------) + I tsuwano - 0x002ca4c5, // n0x10dc c0x0000 (---------------) + I unnan - 0x00311fc6, // n0x10dd c0x0000 (---------------) + I yakumo - 0x0033ba46, // n0x10de c0x0000 (---------------) + I yasugi - 0x00365987, // n0x10df c0x0000 (---------------) + I yatsuka - 0x00253f84, // n0x10e0 c0x0000 (---------------) + I arai - 0x0027d805, // n0x10e1 c0x0000 (---------------) + I atami - 0x00265284, // n0x10e2 c0x0000 (---------------) + I fuji - 0x00294e07, // n0x10e3 c0x0000 (---------------) + I fujieda - 0x002654c8, // n0x10e4 c0x0000 (---------------) + I fujikawa - 0x0026620a, // n0x10e5 c0x0000 (---------------) + I fujinomiya - 0x0026ce07, // n0x10e6 c0x0000 (---------------) + I fukuroi - 0x00271047, // n0x10e7 c0x0000 (---------------) + I gotemba - 0x00316a47, // n0x10e8 c0x0000 (---------------) + I haibara - 0x0032b6c9, // n0x10e9 c0x0000 (---------------) + I hamamatsu - 0x0028124a, // n0x10ea c0x0000 (---------------) + I higashiizu - 0x00220483, // n0x10eb c0x0000 (---------------) + I ito - 0x00253e85, // n0x10ec c0x0000 (---------------) + I iwata - 0x00209783, // n0x10ed c0x0000 (---------------) + I izu - 0x002f1c49, // n0x10ee c0x0000 (---------------) + I izunokuni - 0x002c7008, // n0x10ef c0x0000 (---------------) + I kakegawa - 0x002d17c7, // n0x10f0 c0x0000 (---------------) + I kannami - 0x00305009, // n0x10f1 c0x0000 (---------------) + I kawanehon - 0x00214f46, // n0x10f2 c0x0000 (---------------) + I kawazu - 0x0025fcc8, // n0x10f3 c0x0000 (---------------) + I kikugawa - 0x002d4745, // n0x10f4 c0x0000 (---------------) + I kosai - 0x00364b0a, // n0x10f5 c0x0000 (---------------) + I makinohara - 0x00355209, // n0x10f6 c0x0000 (---------------) + I matsuzaki - 0x00246c49, // n0x10f7 c0x0000 (---------------) + I minamiizu - 0x00392cc7, // n0x10f8 c0x0000 (---------------) + I mishima - 0x0028b509, // n0x10f9 c0x0000 (---------------) + I morimachi - 0x0020eb88, // n0x10fa c0x0000 (---------------) + I nishiizu - 0x002d2986, // n0x10fb c0x0000 (---------------) + I numazu - 0x002042c8, // n0x10fc c0x0000 (---------------) + I omaezaki - 0x0034e807, // n0x10fd c0x0000 (---------------) + I shimada - 0x002521c7, // n0x10fe c0x0000 (---------------) + I shimizu - 0x0027bc87, // n0x10ff c0x0000 (---------------) + I shimoda - 0x002b4b88, // n0x1100 c0x0000 (---------------) + I shizuoka - 0x002d2686, // n0x1101 c0x0000 (---------------) + I susono - 0x00231205, // n0x1102 c0x0000 (---------------) + I yaizu - 0x00269bc7, // n0x1103 c0x0000 (---------------) + I yoshida - 0x00281e08, // n0x1104 c0x0000 (---------------) + I ashikaga - 0x0030f544, // n0x1105 c0x0000 (---------------) + I bato - 0x002d6e04, // n0x1106 c0x0000 (---------------) + I haga - 0x00315b07, // n0x1107 c0x0000 (---------------) + I ichikai - 0x00255847, // n0x1108 c0x0000 (---------------) + I iwafune - 0x0022eb8a, // n0x1109 c0x0000 (---------------) + I kaminokawa - 0x002d2906, // n0x110a c0x0000 (---------------) + I kanuma - 0x0027afca, // n0x110b c0x0000 (---------------) + I karasuyama - 0x002a6b47, // n0x110c c0x0000 (---------------) + I kuroiso - 0x002be6c7, // n0x110d c0x0000 (---------------) + I mashiko - 0x0024fa44, // n0x110e c0x0000 (---------------) + I mibu - 0x002669c4, // n0x110f c0x0000 (---------------) + I moka - 0x0021ff46, // n0x1110 c0x0000 (---------------) + I motegi - 0x002efac4, // n0x1111 c0x0000 (---------------) + I nasu - 0x002efacc, // n0x1112 c0x0000 (---------------) + I nasushiobara - 0x0033e185, // n0x1113 c0x0000 (---------------) + I nikko - 0x0020f249, // n0x1114 c0x0000 (---------------) + I nishikata - 0x00267304, // n0x1115 c0x0000 (---------------) + I nogi - 0x002e81c5, // n0x1116 c0x0000 (---------------) + I ohira - 0x0025c988, // n0x1117 c0x0000 (---------------) + I ohtawara - 0x0027c385, // n0x1118 c0x0000 (---------------) + I oyama - 0x002f4d46, // n0x1119 c0x0000 (---------------) + I sakura - 0x002098c4, // n0x111a c0x0000 (---------------) + I sano - 0x0027924a, // n0x111b c0x0000 (---------------) + I shimotsuke - 0x002d80c6, // n0x111c c0x0000 (---------------) + I shioya - 0x00316d8a, // n0x111d c0x0000 (---------------) + I takanezawa - 0x0030f5c7, // n0x111e c0x0000 (---------------) + I tochigi - 0x0021d305, // n0x111f c0x0000 (---------------) + I tsuga - 0x00212d45, // n0x1120 c0x0000 (---------------) + I ujiie - 0x0021ee0a, // n0x1121 c0x0000 (---------------) + I utsunomiya - 0x0028c645, // n0x1122 c0x0000 (---------------) + I yaita - 0x00272046, // n0x1123 c0x0000 (---------------) + I aizumi - 0x00204e44, // n0x1124 c0x0000 (---------------) + I anan - 0x002a0706, // n0x1125 c0x0000 (---------------) + I ichiba - 0x00305845, // n0x1126 c0x0000 (---------------) + I itano - 0x0021b806, // n0x1127 c0x0000 (---------------) + I kainan - 0x002be44c, // n0x1128 c0x0000 (---------------) + I komatsushima - 0x002b644a, // n0x1129 c0x0000 (---------------) + I matsushige - 0x0025b9c4, // n0x112a c0x0000 (---------------) + I mima - 0x00213fc6, // n0x112b c0x0000 (---------------) + I minami - 0x00288107, // n0x112c c0x0000 (---------------) + I miyoshi - 0x002b9b44, // n0x112d c0x0000 (---------------) + I mugi - 0x002934c8, // n0x112e c0x0000 (---------------) + I nakagawa - 0x00376a06, // n0x112f c0x0000 (---------------) + I naruto - 0x00240249, // n0x1130 c0x0000 (---------------) + I sanagochi - 0x002c2189, // n0x1131 c0x0000 (---------------) + I shishikui - 0x0028e2c9, // n0x1132 c0x0000 (---------------) + I tokushima - 0x00359bc6, // n0x1133 c0x0000 (---------------) + I wajiki - 0x0034e906, // n0x1134 c0x0000 (---------------) + I adachi - 0x00204407, // n0x1135 c0x0000 (---------------) + I akiruno - 0x0038be88, // n0x1136 c0x0000 (---------------) + I akishima - 0x0034e709, // n0x1137 c0x0000 (---------------) + I aogashima - 0x0034e247, // n0x1138 c0x0000 (---------------) + I arakawa - 0x0027e786, // n0x1139 c0x0000 (---------------) + I bunkyo - 0x002e3947, // n0x113a c0x0000 (---------------) + I chiyoda - 0x0029a7c5, // n0x113b c0x0000 (---------------) + I chofu - 0x002be904, // n0x113c c0x0000 (---------------) + I chuo - 0x00203fc7, // n0x113d c0x0000 (---------------) + I edogawa - 0x002ab685, // n0x113e c0x0000 (---------------) + I fuchu - 0x00275045, // n0x113f c0x0000 (---------------) + I fussa - 0x00389ec7, // n0x1140 c0x0000 (---------------) + I hachijo - 0x00243188, // n0x1141 c0x0000 (---------------) + I hachioji - 0x00374346, // n0x1142 c0x0000 (---------------) + I hamura - 0x00282c8d, // n0x1143 c0x0000 (---------------) + I higashikurume - 0x0028414f, // n0x1144 c0x0000 (---------------) + I higashimurayama - 0x00289bcd, // n0x1145 c0x0000 (---------------) + I higashiyamato - 0x0021ad44, // n0x1146 c0x0000 (---------------) + I hino - 0x00227446, // n0x1147 c0x0000 (---------------) + I hinode - 0x002bcf88, // n0x1148 c0x0000 (---------------) + I hinohara - 0x002408c5, // n0x1149 c0x0000 (---------------) + I inagi - 0x00325f88, // n0x114a c0x0000 (---------------) + I itabashi - 0x002513ca, // n0x114b c0x0000 (---------------) + I katsushika - 0x00206e44, // n0x114c c0x0000 (---------------) + I kita - 0x002978c6, // n0x114d c0x0000 (---------------) + I kiyose - 0x002a3687, // n0x114e c0x0000 (---------------) + I kodaira - 0x00232c87, // n0x114f c0x0000 (---------------) + I koganei - 0x00374809, // n0x1150 c0x0000 (---------------) + I kokubunji - 0x00204285, // n0x1151 c0x0000 (---------------) + I komae - 0x002e8104, // n0x1152 c0x0000 (---------------) + I koto - 0x0031850a, // n0x1153 c0x0000 (---------------) + I kouzushima - 0x002a2089, // n0x1154 c0x0000 (---------------) + I kunitachi - 0x0028b607, // n0x1155 c0x0000 (---------------) + I machida - 0x002b1286, // n0x1156 c0x0000 (---------------) + I meguro - 0x00339806, // n0x1157 c0x0000 (---------------) + I minato - 0x002fe7c6, // n0x1158 c0x0000 (---------------) + I mitaka - 0x0034b046, // n0x1159 c0x0000 (---------------) + I mizuho - 0x002bc90f, // n0x115a c0x0000 (---------------) + I musashimurayama - 0x002bce49, // n0x115b c0x0000 (---------------) + I musashino - 0x0023fcc6, // n0x115c c0x0000 (---------------) + I nakano - 0x003528c6, // n0x115d c0x0000 (---------------) + I nerima - 0x00301849, // n0x115e c0x0000 (---------------) + I ogasawara - 0x002f1a47, // n0x115f c0x0000 (---------------) + I okutama - 0x0020b3c3, // n0x1160 c0x0000 (---------------) + I ome - 0x0021f606, // n0x1161 c0x0000 (---------------) + I oshima - 0x00203943, // n0x1162 c0x0000 (---------------) + I ota - 0x002c3488, // n0x1163 c0x0000 (---------------) + I setagaya - 0x002e3787, // n0x1164 c0x0000 (---------------) + I shibuya - 0x0028b9c9, // n0x1165 c0x0000 (---------------) + I shinagawa - 0x00285788, // n0x1166 c0x0000 (---------------) + I shinjuku - 0x0033eac8, // n0x1167 c0x0000 (---------------) + I suginami - 0x00289246, // n0x1168 c0x0000 (---------------) + I sumida - 0x0032da89, // n0x1169 c0x0000 (---------------) + I tachikawa - 0x002e5c45, // n0x116a c0x0000 (---------------) + I taito - 0x00260c44, // n0x116b c0x0000 (---------------) + I tama - 0x002d0a47, // n0x116c c0x0000 (---------------) + I toshima - 0x00258c05, // n0x116d c0x0000 (---------------) + I chizu - 0x0021ad44, // n0x116e c0x0000 (---------------) + I hino - 0x00274b88, // n0x116f c0x0000 (---------------) + I kawahara - 0x0020da84, // n0x1170 c0x0000 (---------------) + I koge - 0x002eaf87, // n0x1171 c0x0000 (---------------) + I kotoura - 0x003337c6, // n0x1172 c0x0000 (---------------) + I misasa - 0x002c6705, // n0x1173 c0x0000 (---------------) + I nanbu - 0x0027fa88, // n0x1174 c0x0000 (---------------) + I nichinan - 0x003396cb, // n0x1175 c0x0000 (---------------) + I sakaiminato - 0x002e2787, // n0x1176 c0x0000 (---------------) + I tottori - 0x0021f086, // n0x1177 c0x0000 (---------------) + I wakasa - 0x002aeec4, // n0x1178 c0x0000 (---------------) + I yazu - 0x0032b186, // n0x1179 c0x0000 (---------------) + I yonago - 0x002ad5c5, // n0x117a c0x0000 (---------------) + I asahi - 0x002ab685, // n0x117b c0x0000 (---------------) + I fuchu - 0x0026c2c9, // n0x117c c0x0000 (---------------) + I fukumitsu - 0x0026ec49, // n0x117d c0x0000 (---------------) + I funahashi - 0x00252204, // n0x117e c0x0000 (---------------) + I himi - 0x00252245, // n0x117f c0x0000 (---------------) + I imizu - 0x00214005, // n0x1180 c0x0000 (---------------) + I inami - 0x00364986, // n0x1181 c0x0000 (---------------) + I johana - 0x00315a08, // n0x1182 c0x0000 (---------------) + I kamiichi - 0x002a4c46, // n0x1183 c0x0000 (---------------) + I kurobe - 0x0031070b, // n0x1184 c0x0000 (---------------) + I nakaniikawa - 0x0029894a, // n0x1185 c0x0000 (---------------) + I namerikawa - 0x002e14c5, // n0x1186 c0x0000 (---------------) + I nanto - 0x00279546, // n0x1187 c0x0000 (---------------) + I nyuzen - 0x0031d945, // n0x1188 c0x0000 (---------------) + I oyabe - 0x00205705, // n0x1189 c0x0000 (---------------) + I taira - 0x00281747, // n0x118a c0x0000 (---------------) + I takaoka - 0x0038a708, // n0x118b c0x0000 (---------------) + I tateyama - 0x0027b804, // n0x118c c0x0000 (---------------) + I toga - 0x0024e006, // n0x118d c0x0000 (---------------) + I tonami - 0x0027c346, // n0x118e c0x0000 (---------------) + I toyama - 0x0020ed47, // n0x118f c0x0000 (---------------) + I unazuki - 0x002e3d84, // n0x1190 c0x0000 (---------------) + I uozu - 0x0026b046, // n0x1191 c0x0000 (---------------) + I yamada - 0x00250d45, // n0x1192 c0x0000 (---------------) + I arida - 0x00250d49, // n0x1193 c0x0000 (---------------) + I aridagawa - 0x0034eb04, // n0x1194 c0x0000 (---------------) + I gobo - 0x00286d89, // n0x1195 c0x0000 (---------------) + I hashimoto - 0x002685c6, // n0x1196 c0x0000 (---------------) + I hidaka - 0x002a9408, // n0x1197 c0x0000 (---------------) + I hirogawa - 0x00214005, // n0x1198 c0x0000 (---------------) + I inami - 0x002e9845, // n0x1199 c0x0000 (---------------) + I iwade - 0x0021b806, // n0x119a c0x0000 (---------------) + I kainan - 0x00246e89, // n0x119b c0x0000 (---------------) + I kamitonda - 0x002133c9, // n0x119c c0x0000 (---------------) + I katsuragi - 0x002fb0c6, // n0x119d c0x0000 (---------------) + I kimino - 0x00273248, // n0x119e c0x0000 (---------------) + I kinokawa - 0x0022aec8, // n0x119f c0x0000 (---------------) + I kitayama - 0x0031d904, // n0x11a0 c0x0000 (---------------) + I koya - 0x0034b544, // n0x11a1 c0x0000 (---------------) + I koza - 0x0034b548, // n0x11a2 c0x0000 (---------------) + I kozagawa - 0x003000c8, // n0x11a3 c0x0000 (---------------) + I kudoyama - 0x002e5e09, // n0x11a4 c0x0000 (---------------) + I kushimoto - 0x00292a46, // n0x11a5 c0x0000 (---------------) + I mihama - 0x0028b246, // n0x11a6 c0x0000 (---------------) + I misato - 0x002fd2cd, // n0x11a7 c0x0000 (---------------) + I nachikatsuura - 0x002e6a46, // n0x11a8 c0x0000 (---------------) + I shingu - 0x002a1409, // n0x11a9 c0x0000 (---------------) + I shirahama - 0x00353dc5, // n0x11aa c0x0000 (---------------) + I taiji - 0x0030f946, // n0x11ab c0x0000 (---------------) + I tanabe - 0x0032dc48, // n0x11ac c0x0000 (---------------) + I wakayama - 0x002f9ac5, // n0x11ad c0x0000 (---------------) + I yuasa - 0x00289704, // n0x11ae c0x0000 (---------------) + I yura - 0x002ad5c5, // n0x11af c0x0000 (---------------) + I asahi - 0x0026e788, // n0x11b0 c0x0000 (---------------) + I funagata - 0x00285a89, // n0x11b1 c0x0000 (---------------) + I higashine - 0x00265344, // n0x11b2 c0x0000 (---------------) + I iide - 0x00226886, // n0x11b3 c0x0000 (---------------) + I kahoku - 0x003467ca, // n0x11b4 c0x0000 (---------------) + I kaminoyama - 0x002150c8, // n0x11b5 c0x0000 (---------------) + I kaneyama - 0x0022ed09, // n0x11b6 c0x0000 (---------------) + I kawanishi - 0x002f8d4a, // n0x11b7 c0x0000 (---------------) + I mamurogawa - 0x00304f86, // n0x11b8 c0x0000 (---------------) + I mikawa - 0x00284308, // n0x11b9 c0x0000 (---------------) + I murayama - 0x0035e9c5, // n0x11ba c0x0000 (---------------) + I nagai - 0x00355088, // n0x11bb c0x0000 (---------------) + I nakayama - 0x002a0545, // n0x11bc c0x0000 (---------------) + I nanyo - 0x00214e09, // n0x11bd c0x0000 (---------------) + I nishikawa - 0x0034fd89, // n0x11be c0x0000 (---------------) + I obanazawa - 0x00210a82, // n0x11bf c0x0000 (---------------) + I oe - 0x0029efc5, // n0x11c0 c0x0000 (---------------) + I oguni - 0x00258e86, // n0x11c1 c0x0000 (---------------) + I ohkura - 0x00268507, // n0x11c2 c0x0000 (---------------) + I oishida - 0x00275105, // n0x11c3 c0x0000 (---------------) + I sagae - 0x002f9b86, // n0x11c4 c0x0000 (---------------) + I sakata - 0x00359408, // n0x11c5 c0x0000 (---------------) + I sakegawa - 0x00285306, // n0x11c6 c0x0000 (---------------) + I shinjo - 0x0029cd89, // n0x11c7 c0x0000 (---------------) + I shirataka - 0x00266d46, // n0x11c8 c0x0000 (---------------) + I shonai - 0x0026dd88, // n0x11c9 c0x0000 (---------------) + I takahata - 0x00294245, // n0x11ca c0x0000 (---------------) + I tendo - 0x00247ec6, // n0x11cb c0x0000 (---------------) + I tozawa - 0x003052c8, // n0x11cc c0x0000 (---------------) + I tsuruoka - 0x0026dc08, // n0x11cd c0x0000 (---------------) + I yamagata - 0x0034d348, // n0x11ce c0x0000 (---------------) + I yamanobe - 0x002212c8, // n0x11cf c0x0000 (---------------) + I yonezawa - 0x00216b84, // n0x11d0 c0x0000 (---------------) + I yuza - 0x0021bc43, // n0x11d1 c0x0000 (---------------) + I abu - 0x0029cfc4, // n0x11d2 c0x0000 (---------------) + I hagi - 0x002af4c6, // n0x11d3 c0x0000 (---------------) + I hikari - 0x0029a804, // n0x11d4 c0x0000 (---------------) + I hofu - 0x00292807, // n0x11d5 c0x0000 (---------------) + I iwakuni - 0x0038d8c9, // n0x11d6 c0x0000 (---------------) + I kudamatsu - 0x002ae205, // n0x11d7 c0x0000 (---------------) + I mitou - 0x00201586, // n0x11d8 c0x0000 (---------------) + I nagato - 0x0021f606, // n0x11d9 c0x0000 (---------------) + I oshima - 0x002743cb, // n0x11da c0x0000 (---------------) + I shimonoseki - 0x002e1406, // n0x11db c0x0000 (---------------) + I shunan - 0x003003c6, // n0x11dc c0x0000 (---------------) + I tabuse - 0x00286f48, // n0x11dd c0x0000 (---------------) + I tokuyama - 0x00338906, // n0x11de c0x0000 (---------------) + I toyota - 0x002b48c3, // n0x11df c0x0000 (---------------) + I ube - 0x00213ec3, // n0x11e0 c0x0000 (---------------) + I yuu - 0x002be904, // n0x11e1 c0x0000 (---------------) + I chuo - 0x002243c5, // n0x11e2 c0x0000 (---------------) + I doshi - 0x00289887, // n0x11e3 c0x0000 (---------------) + I fuefuki - 0x002654c8, // n0x11e4 c0x0000 (---------------) + I fujikawa - 0x002654cf, // n0x11e5 c0x0000 (---------------) + I fujikawaguchiko - 0x00269acb, // n0x11e6 c0x0000 (---------------) + I fujiyoshida - 0x00315808, // n0x11e7 c0x0000 (---------------) + I hayakawa - 0x00226906, // n0x11e8 c0x0000 (---------------) + I hokuto - 0x00312b8e, // n0x11e9 c0x0000 (---------------) + I ichikawamisato - 0x0021b803, // n0x11ea c0x0000 (---------------) + I kai - 0x0024cf84, // n0x11eb c0x0000 (---------------) + I kofu - 0x002e1385, // n0x11ec c0x0000 (---------------) + I koshu - 0x002e4a46, // n0x11ed c0x0000 (---------------) + I kosuge - 0x0027a9cb, // n0x11ee c0x0000 (---------------) + I minami-alps - 0x0027ee46, // n0x11ef c0x0000 (---------------) + I minobu - 0x00204889, // n0x11f0 c0x0000 (---------------) + I nakamichi - 0x002c6705, // n0x11f1 c0x0000 (---------------) + I nanbu - 0x00372f88, // n0x11f2 c0x0000 (---------------) + I narusawa - 0x00208608, // n0x11f3 c0x0000 (---------------) + I nirasaki - 0x0021328c, // n0x11f4 c0x0000 (---------------) + I nishikatsura - 0x0028a946, // n0x11f5 c0x0000 (---------------) + I oshino - 0x0022a786, // n0x11f6 c0x0000 (---------------) + I otsuki - 0x002b3885, // n0x11f7 c0x0000 (---------------) + I showa - 0x00275f88, // n0x11f8 c0x0000 (---------------) + I tabayama - 0x0026a445, // n0x11f9 c0x0000 (---------------) + I tsuru - 0x0038dac8, // n0x11fa c0x0000 (---------------) + I uenohara - 0x0028a00a, // n0x11fb c0x0000 (---------------) + I yamanakako - 0x0029b889, // n0x11fc c0x0000 (---------------) + I yamanashi - 0x006735c4, // n0x11fd c0x0001 (---------------) ! I city - 0x2d600742, // n0x11fe c0x00b5 (n0x11ff-n0x1200) o I co - 0x000e4188, // n0x11ff c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1200 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1201 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1202 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1203 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1204 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1205 c0x0000 (---------------) + I org - 0x00310603, // n0x1206 c0x0000 (---------------) + I biz - 0x00222ac3, // n0x1207 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1208 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1209 c0x0000 (---------------) + I gov - 0x00200304, // n0x120a c0x0000 (---------------) + I info - 0x002170c3, // n0x120b c0x0000 (---------------) + I net - 0x0021dcc3, // n0x120c c0x0000 (---------------) + I org - 0x002362c3, // n0x120d c0x0000 (---------------) + I ass - 0x002729c4, // n0x120e c0x0000 (---------------) + I asso - 0x00222ac3, // n0x120f c0x0000 (---------------) + I com - 0x00228d44, // n0x1210 c0x0000 (---------------) + I coop - 0x002d75c3, // n0x1211 c0x0000 (---------------) + I edu - 0x003579c4, // n0x1212 c0x0000 (---------------) + I gouv - 0x0021e283, // n0x1213 c0x0000 (---------------) + I gov - 0x002753c7, // n0x1214 c0x0000 (---------------) + I medecin - 0x0023fa03, // n0x1215 c0x0000 (---------------) + I mil - 0x00207cc3, // n0x1216 c0x0000 (---------------) + I nom - 0x00265c08, // n0x1217 c0x0000 (---------------) + I notaires - 0x0021dcc3, // n0x1218 c0x0000 (---------------) + I org - 0x002e078b, // n0x1219 c0x0000 (---------------) + I pharmaciens - 0x002ca783, // n0x121a c0x0000 (---------------) + I prd - 0x0029abc6, // n0x121b c0x0000 (---------------) + I presse - 0x00208902, // n0x121c c0x0000 (---------------) + I tm - 0x0036b18b, // n0x121d c0x0000 (---------------) + I veterinaire - 0x002d75c3, // n0x121e c0x0000 (---------------) + I edu - 0x0021e283, // n0x121f c0x0000 (---------------) + I gov - 0x002170c3, // n0x1220 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1221 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1222 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1223 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1224 c0x0000 (---------------) + I gov - 0x0021dcc3, // n0x1225 c0x0000 (---------------) + I org - 0x002117c3, // n0x1226 c0x0000 (---------------) + I rep - 0x00210103, // n0x1227 c0x0000 (---------------) + I tra - 0x00201e82, // n0x1228 c0x0000 (---------------) + I ac - 0x000e4188, // n0x1229 c0x0000 (---------------) + blogspot - 0x002224c5, // n0x122a c0x0000 (---------------) + I busan - 0x002ea8c8, // n0x122b c0x0000 (---------------) + I chungbuk - 0x002ec1c8, // n0x122c c0x0000 (---------------) + I chungnam - 0x00200742, // n0x122d c0x0000 (---------------) + I co - 0x0032b905, // n0x122e c0x0000 (---------------) + I daegu - 0x0023e947, // n0x122f c0x0000 (---------------) + I daejeon - 0x002010c2, // n0x1230 c0x0000 (---------------) + I es - 0x00204ac7, // n0x1231 c0x0000 (---------------) + I gangwon - 0x00202342, // n0x1232 c0x0000 (---------------) + I go - 0x00370b47, // n0x1233 c0x0000 (---------------) + I gwangju - 0x00384c89, // n0x1234 c0x0000 (---------------) + I gyeongbuk - 0x0035e588, // n0x1235 c0x0000 (---------------) + I gyeonggi - 0x00342c09, // n0x1236 c0x0000 (---------------) + I gyeongnam - 0x00203802, // n0x1237 c0x0000 (---------------) + I hs - 0x002c2a87, // n0x1238 c0x0000 (---------------) + I incheon - 0x002fae44, // n0x1239 c0x0000 (---------------) + I jeju - 0x0023ea07, // n0x123a c0x0000 (---------------) + I jeonbuk - 0x00298847, // n0x123b c0x0000 (---------------) + I jeonnam - 0x002a3fc2, // n0x123c c0x0000 (---------------) + I kg - 0x0023fa03, // n0x123d c0x0000 (---------------) + I mil - 0x00209282, // n0x123e c0x0000 (---------------) + I ms - 0x00201082, // n0x123f c0x0000 (---------------) + I ne - 0x00200c42, // n0x1240 c0x0000 (---------------) + I or - 0x00214942, // n0x1241 c0x0000 (---------------) + I pe - 0x002030c2, // n0x1242 c0x0000 (---------------) + I re - 0x00200982, // n0x1243 c0x0000 (---------------) + I sc - 0x002baac5, // n0x1244 c0x0000 (---------------) + I seoul - 0x002376c5, // n0x1245 c0x0000 (---------------) + I ulsan - 0x00222ac3, // n0x1246 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1247 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1248 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1249 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x124a c0x0000 (---------------) + I org - 0x00222ac3, // n0x124b c0x0000 (---------------) + I com - 0x002d75c3, // n0x124c c0x0000 (---------------) + I edu - 0x0021e283, // n0x124d c0x0000 (---------------) + I gov - 0x0023fa03, // n0x124e c0x0000 (---------------) + I mil - 0x002170c3, // n0x124f c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1250 c0x0000 (---------------) + I org - 0x00000741, // n0x1251 c0x0000 (---------------) + c - 0x00222ac3, // n0x1252 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1253 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1254 c0x0000 (---------------) + I gov - 0x00200304, // n0x1255 c0x0000 (---------------) + I info - 0x00238c03, // n0x1256 c0x0000 (---------------) + I int - 0x002170c3, // n0x1257 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1258 c0x0000 (---------------) + I org - 0x00214943, // n0x1259 c0x0000 (---------------) + I per - 0x00222ac3, // n0x125a c0x0000 (---------------) + I com - 0x002d75c3, // n0x125b c0x0000 (---------------) + I edu - 0x0021e283, // n0x125c c0x0000 (---------------) + I gov - 0x002170c3, // n0x125d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x125e c0x0000 (---------------) + I org - 0x00200742, // n0x125f c0x0000 (---------------) + I co - 0x00222ac3, // n0x1260 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1261 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1262 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1263 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1264 c0x0000 (---------------) + I org - 0x000e4188, // n0x1265 c0x0000 (---------------) + blogspot - 0x00201e82, // n0x1266 c0x0000 (---------------) + I ac - 0x002aa2c4, // n0x1267 c0x0000 (---------------) + I assn - 0x00222ac3, // n0x1268 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1269 c0x0000 (---------------) + I edu - 0x0021e283, // n0x126a c0x0000 (---------------) + I gov - 0x00221d03, // n0x126b c0x0000 (---------------) + I grp - 0x00294945, // n0x126c c0x0000 (---------------) + I hotel - 0x00238c03, // n0x126d c0x0000 (---------------) + I int - 0x003413c3, // n0x126e c0x0000 (---------------) + I ltd - 0x002170c3, // n0x126f c0x0000 (---------------) + I net - 0x00202303, // n0x1270 c0x0000 (---------------) + I ngo - 0x0021dcc3, // n0x1271 c0x0000 (---------------) + I org - 0x00206103, // n0x1272 c0x0000 (---------------) + I sch - 0x00240a03, // n0x1273 c0x0000 (---------------) + I soc - 0x00219fc3, // n0x1274 c0x0000 (---------------) + I web - 0x00222ac3, // n0x1275 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1276 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1277 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1278 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1279 c0x0000 (---------------) + I org - 0x00200742, // n0x127a c0x0000 (---------------) + I co - 0x0021dcc3, // n0x127b c0x0000 (---------------) + I org - 0x000e4188, // n0x127c c0x0000 (---------------) + blogspot - 0x0021e283, // n0x127d c0x0000 (---------------) + I gov - 0x000e4188, // n0x127e c0x0000 (---------------) + blogspot - 0x002a00c3, // n0x127f c0x0000 (---------------) + I asn - 0x00222ac3, // n0x1280 c0x0000 (---------------) + I com - 0x00224984, // n0x1281 c0x0000 (---------------) + I conf - 0x002d75c3, // n0x1282 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1283 c0x0000 (---------------) + I gov - 0x00206202, // n0x1284 c0x0000 (---------------) + I id - 0x0023fa03, // n0x1285 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1286 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1287 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1288 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1289 c0x0000 (---------------) + I edu - 0x0021e283, // n0x128a c0x0000 (---------------) + I gov - 0x00206202, // n0x128b c0x0000 (---------------) + I id - 0x0020b403, // n0x128c c0x0000 (---------------) + I med - 0x002170c3, // n0x128d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x128e c0x0000 (---------------) + I org - 0x002c65c3, // n0x128f c0x0000 (---------------) + I plc - 0x00206103, // n0x1290 c0x0000 (---------------) + I sch - 0x00201e82, // n0x1291 c0x0000 (---------------) + I ac - 0x00200742, // n0x1292 c0x0000 (---------------) + I co - 0x0021e283, // n0x1293 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1294 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1295 c0x0000 (---------------) + I org - 0x0029abc5, // n0x1296 c0x0000 (---------------) + I press - 0x002729c4, // n0x1297 c0x0000 (---------------) + I asso - 0x00208902, // n0x1298 c0x0000 (---------------) + I tm - 0x000e4188, // n0x1299 c0x0000 (---------------) + blogspot - 0x00201e82, // n0x129a c0x0000 (---------------) + I ac - 0x00200742, // n0x129b c0x0000 (---------------) + I co - 0x002d75c3, // n0x129c c0x0000 (---------------) + I edu - 0x0021e283, // n0x129d c0x0000 (---------------) + I gov - 0x00226ac3, // n0x129e c0x0000 (---------------) + I its - 0x002170c3, // n0x129f c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12a0 c0x0000 (---------------) + I org - 0x002cba44, // n0x12a1 c0x0000 (---------------) + I priv - 0x00222ac3, // n0x12a2 c0x0000 (---------------) + I com - 0x002d75c3, // n0x12a3 c0x0000 (---------------) + I edu - 0x0021e283, // n0x12a4 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x12a5 c0x0000 (---------------) + I mil - 0x00207cc3, // n0x12a6 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x12a7 c0x0000 (---------------) + I org - 0x002ca783, // n0x12a8 c0x0000 (---------------) + I prd - 0x00208902, // n0x12a9 c0x0000 (---------------) + I tm - 0x000e4188, // n0x12aa c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x12ab c0x0000 (---------------) + I com - 0x002d75c3, // n0x12ac c0x0000 (---------------) + I edu - 0x0021e283, // n0x12ad c0x0000 (---------------) + I gov - 0x00200303, // n0x12ae c0x0000 (---------------) + I inf - 0x00298944, // n0x12af c0x0000 (---------------) + I name - 0x002170c3, // n0x12b0 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12b1 c0x0000 (---------------) + I org - 0x00222ac3, // n0x12b2 c0x0000 (---------------) + I com - 0x002d75c3, // n0x12b3 c0x0000 (---------------) + I edu - 0x003579c4, // n0x12b4 c0x0000 (---------------) + I gouv - 0x0021e283, // n0x12b5 c0x0000 (---------------) + I gov - 0x002170c3, // n0x12b6 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12b7 c0x0000 (---------------) + I org - 0x0029abc6, // n0x12b8 c0x0000 (---------------) + I presse - 0x002d75c3, // n0x12b9 c0x0000 (---------------) + I edu - 0x0021e283, // n0x12ba c0x0000 (---------------) + I gov - 0x00023403, // n0x12bb c0x0000 (---------------) + nyc - 0x0021dcc3, // n0x12bc c0x0000 (---------------) + I org - 0x00222ac3, // n0x12bd c0x0000 (---------------) + I com - 0x002d75c3, // n0x12be c0x0000 (---------------) + I edu - 0x0021e283, // n0x12bf c0x0000 (---------------) + I gov - 0x002170c3, // n0x12c0 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12c1 c0x0000 (---------------) + I org - 0x000e4188, // n0x12c2 c0x0000 (---------------) + blogspot - 0x0021e283, // n0x12c3 c0x0000 (---------------) + I gov - 0x00222ac3, // n0x12c4 c0x0000 (---------------) + I com - 0x002d75c3, // n0x12c5 c0x0000 (---------------) + I edu - 0x0021e283, // n0x12c6 c0x0000 (---------------) + I gov - 0x002170c3, // n0x12c7 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12c8 c0x0000 (---------------) + I org - 0x35622ac3, // n0x12c9 c0x00d5 (n0x12cd-n0x12ce) + I com - 0x002d75c3, // n0x12ca c0x0000 (---------------) + I edu - 0x002170c3, // n0x12cb c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12cc c0x0000 (---------------) + I org - 0x000e4188, // n0x12cd c0x0000 (---------------) + blogspot - 0x00201e82, // n0x12ce c0x0000 (---------------) + I ac - 0x00200742, // n0x12cf c0x0000 (---------------) + I co - 0x00222ac3, // n0x12d0 c0x0000 (---------------) + I com - 0x0021e283, // n0x12d1 c0x0000 (---------------) + I gov - 0x002170c3, // n0x12d2 c0x0000 (---------------) + I net - 0x00200c42, // n0x12d3 c0x0000 (---------------) + I or - 0x0021dcc3, // n0x12d4 c0x0000 (---------------) + I org - 0x002f2787, // n0x12d5 c0x0000 (---------------) + I academy - 0x0033c2cb, // n0x12d6 c0x0000 (---------------) + I agriculture - 0x00205743, // n0x12d7 c0x0000 (---------------) + I air - 0x0022c148, // n0x12d8 c0x0000 (---------------) + I airguard - 0x0038bc07, // n0x12d9 c0x0000 (---------------) + I alabama - 0x00267646, // n0x12da c0x0000 (---------------) + I alaska - 0x002b6e85, // n0x12db c0x0000 (---------------) + I amber - 0x003541c9, // n0x12dc c0x0000 (---------------) + I ambulance - 0x002757c8, // n0x12dd c0x0000 (---------------) + I american - 0x002757c9, // n0x12de c0x0000 (---------------) + I americana - 0x002757d0, // n0x12df c0x0000 (---------------) + I americanantiques - 0x0031aecb, // n0x12e0 c0x0000 (---------------) + I americanart - 0x002b6cc9, // n0x12e1 c0x0000 (---------------) + I amsterdam - 0x00208f03, // n0x12e2 c0x0000 (---------------) + I and - 0x003228c9, // n0x12e3 c0x0000 (---------------) + I annefrank - 0x00225786, // n0x12e4 c0x0000 (---------------) + I anthro - 0x0022578c, // n0x12e5 c0x0000 (---------------) + I anthropology - 0x00222588, // n0x12e6 c0x0000 (---------------) + I antiques - 0x00392b08, // n0x12e7 c0x0000 (---------------) + I aquarium - 0x00256f09, // n0x12e8 c0x0000 (---------------) + I arboretum - 0x0029690e, // n0x12e9 c0x0000 (---------------) + I archaeological - 0x003429cb, // n0x12ea c0x0000 (---------------) + I archaeology - 0x002a52cc, // n0x12eb c0x0000 (---------------) + I architecture - 0x00200603, // n0x12ec c0x0000 (---------------) + I art - 0x0031b0cc, // n0x12ed c0x0000 (---------------) + I artanddesign - 0x0037a6c9, // n0x12ee c0x0000 (---------------) + I artcenter - 0x00200607, // n0x12ef c0x0000 (---------------) + I artdeco - 0x0037548c, // n0x12f0 c0x0000 (---------------) + I arteducation - 0x0022654a, // n0x12f1 c0x0000 (---------------) + I artgallery - 0x00246584, // n0x12f2 c0x0000 (---------------) + I arts - 0x0024658d, // n0x12f3 c0x0000 (---------------) + I artsandcrafts - 0x0037a588, // n0x12f4 c0x0000 (---------------) + I asmatart - 0x0034db0d, // n0x12f5 c0x0000 (---------------) + I assassination - 0x0037ac46, // n0x12f6 c0x0000 (---------------) + I assisi - 0x002bbacb, // n0x12f7 c0x0000 (---------------) + I association - 0x0032b3c9, // n0x12f8 c0x0000 (---------------) + I astronomy - 0x0032d947, // n0x12f9 c0x0000 (---------------) + I atlanta - 0x0030ce46, // n0x12fa c0x0000 (---------------) + I austin - 0x002ee489, // n0x12fb c0x0000 (---------------) + I australia - 0x0030494a, // n0x12fc c0x0000 (---------------) + I automotive - 0x00328bc8, // n0x12fd c0x0000 (---------------) + I aviation - 0x0025db04, // n0x12fe c0x0000 (---------------) + I axis - 0x0035ef47, // n0x12ff c0x0000 (---------------) + I badajoz - 0x00264407, // n0x1300 c0x0000 (---------------) + I baghdad - 0x00295f44, // n0x1301 c0x0000 (---------------) + I bahn - 0x0023d9c4, // n0x1302 c0x0000 (---------------) + I bale - 0x002708c9, // n0x1303 c0x0000 (---------------) + I baltimore - 0x0036bf49, // n0x1304 c0x0000 (---------------) + I barcelona - 0x002ed5c8, // n0x1305 c0x0000 (---------------) + I baseball - 0x0020a445, // n0x1306 c0x0000 (---------------) + I basel - 0x002dbe45, // n0x1307 c0x0000 (---------------) + I baths - 0x00205a86, // n0x1308 c0x0000 (---------------) + I bauern - 0x00246449, // n0x1309 c0x0000 (---------------) + I beauxarts - 0x0035a18d, // n0x130a c0x0000 (---------------) + I beeldengeluid - 0x002a4d48, // n0x130b c0x0000 (---------------) + I bellevue - 0x00205987, // n0x130c c0x0000 (---------------) + I bergbau - 0x002b6f08, // n0x130d c0x0000 (---------------) + I berkeley - 0x00251d46, // n0x130e c0x0000 (---------------) + I berlin - 0x00353844, // n0x130f c0x0000 (---------------) + I bern - 0x003628c5, // n0x1310 c0x0000 (---------------) + I bible - 0x00394a46, // n0x1311 c0x0000 (---------------) + I bilbao - 0x00396b04, // n0x1312 c0x0000 (---------------) + I bill - 0x00200507, // n0x1313 c0x0000 (---------------) + I birdart - 0x00201cca, // n0x1314 c0x0000 (---------------) + I birthplace - 0x0020bcc4, // n0x1315 c0x0000 (---------------) + I bonn - 0x0020d686, // n0x1316 c0x0000 (---------------) + I boston - 0x0020e2c9, // n0x1317 c0x0000 (---------------) + I botanical - 0x0020e2cf, // n0x1318 c0x0000 (---------------) + I botanicalgarden - 0x0020e88d, // n0x1319 c0x0000 (---------------) + I botanicgarden - 0x002107c6, // n0x131a c0x0000 (---------------) + I botany - 0x00213b10, // n0x131b c0x0000 (---------------) + I brandywinevalley - 0x00214a86, // n0x131c c0x0000 (---------------) + I brasil - 0x002159c7, // n0x131d c0x0000 (---------------) + I bristol - 0x00215d47, // n0x131e c0x0000 (---------------) + I british - 0x00215d4f, // n0x131f c0x0000 (---------------) + I britishcolumbia - 0x00216d09, // n0x1320 c0x0000 (---------------) + I broadcast - 0x0021b106, // n0x1321 c0x0000 (---------------) + I brunel - 0x0021be87, // n0x1322 c0x0000 (---------------) + I brussel - 0x0021be88, // n0x1323 c0x0000 (---------------) + I brussels - 0x0021c809, // n0x1324 c0x0000 (---------------) + I bruxelles - 0x002c67c8, // n0x1325 c0x0000 (---------------) + I building - 0x002c2fc7, // n0x1326 c0x0000 (---------------) + I burghof - 0x002224c3, // n0x1327 c0x0000 (---------------) + I bus - 0x00280c46, // n0x1328 c0x0000 (---------------) + I bushey - 0x0027d948, // n0x1329 c0x0000 (---------------) + I cadaques - 0x00296bca, // n0x132a c0x0000 (---------------) + I california - 0x0021a089, // n0x132b c0x0000 (---------------) + I cambridge - 0x00208ec3, // n0x132c c0x0000 (---------------) + I can - 0x00309786, // n0x132d c0x0000 (---------------) + I canada - 0x0024de4a, // n0x132e c0x0000 (---------------) + I capebreton - 0x0031bb87, // n0x132f c0x0000 (---------------) + I carrier - 0x003752ca, // n0x1330 c0x0000 (---------------) + I cartoonart - 0x0038390e, // n0x1331 c0x0000 (---------------) + I casadelamoneda - 0x00216e46, // n0x1332 c0x0000 (---------------) + I castle - 0x0021c487, // n0x1333 c0x0000 (---------------) + I castres - 0x0020f006, // n0x1334 c0x0000 (---------------) + I celtic - 0x00233a06, // n0x1335 c0x0000 (---------------) + I center - 0x0036240b, // n0x1336 c0x0000 (---------------) + I chattanooga - 0x002503ca, // n0x1337 c0x0000 (---------------) + I cheltenham - 0x002eeccd, // n0x1338 c0x0000 (---------------) + I chesapeakebay - 0x0034e9c7, // n0x1339 c0x0000 (---------------) + I chicago - 0x00262bc8, // n0x133a c0x0000 (---------------) + I children - 0x00262bc9, // n0x133b c0x0000 (---------------) + I childrens - 0x00262bcf, // n0x133c c0x0000 (---------------) + I childrensgarden - 0x0029300c, // n0x133d c0x0000 (---------------) + I chiropractic - 0x00299309, // n0x133e c0x0000 (---------------) + I chocolate - 0x0022d30e, // n0x133f c0x0000 (---------------) + I christiansburg - 0x002754ca, // n0x1340 c0x0000 (---------------) + I cincinnati - 0x00343506, // n0x1341 c0x0000 (---------------) + I cinema - 0x00323506, // n0x1342 c0x0000 (---------------) + I circus - 0x0034564c, // n0x1343 c0x0000 (---------------) + I civilisation - 0x0034878c, // n0x1344 c0x0000 (---------------) + I civilization - 0x003518c8, // n0x1345 c0x0000 (---------------) + I civilwar - 0x00369707, // n0x1346 c0x0000 (---------------) + I clinton - 0x0020af45, // n0x1347 c0x0000 (---------------) + I clock - 0x00387ec4, // n0x1348 c0x0000 (---------------) + I coal - 0x0032ac0e, // n0x1349 c0x0000 (---------------) + I coastaldefence - 0x00200744, // n0x134a c0x0000 (---------------) + I cody - 0x00232107, // n0x134b c0x0000 (---------------) + I coldwar - 0x0024f38a, // n0x134c c0x0000 (---------------) + I collection - 0x00221854, // n0x134d c0x0000 (---------------) + I colonialwilliamsburg - 0x00221f0f, // n0x134e c0x0000 (---------------) + I coloradoplateau - 0x00215f08, // n0x134f c0x0000 (---------------) + I columbia - 0x00222388, // n0x1350 c0x0000 (---------------) + I columbus - 0x002b354d, // n0x1351 c0x0000 (---------------) + I communication - 0x002b354e, // n0x1352 c0x0000 (---------------) + I communications - 0x00222ac9, // n0x1353 c0x0000 (---------------) + I community - 0x002236c8, // n0x1354 c0x0000 (---------------) + I computer - 0x002236cf, // n0x1355 c0x0000 (---------------) + I computerhistory - 0x0022624c, // n0x1356 c0x0000 (---------------) + I contemporary - 0x0022624f, // n0x1357 c0x0000 (---------------) + I contemporaryart - 0x00227187, // n0x1358 c0x0000 (---------------) + I convent - 0x00229bca, // n0x1359 c0x0000 (---------------) + I copenhagen - 0x0021300b, // n0x135a c0x0000 (---------------) + I corporation - 0x0022b908, // n0x135b c0x0000 (---------------) + I corvette - 0x0022c347, // n0x135c c0x0000 (---------------) + I costume - 0x00362c0d, // n0x135d c0x0000 (---------------) + I countryestate - 0x002f8886, // n0x135e c0x0000 (---------------) + I county - 0x00246746, // n0x135f c0x0000 (---------------) + I crafts - 0x0022f189, // n0x1360 c0x0000 (---------------) + I cranbrook - 0x002e63c8, // n0x1361 c0x0000 (---------------) + I creation - 0x00233808, // n0x1362 c0x0000 (---------------) + I cultural - 0x0023380e, // n0x1363 c0x0000 (---------------) + I culturalcenter - 0x00323687, // n0x1364 c0x0000 (---------------) + I culture - 0x00343d85, // n0x1365 c0x0000 (---------------) + I cyber - 0x002dcac5, // n0x1366 c0x0000 (---------------) + I cymru - 0x00270d04, // n0x1367 c0x0000 (---------------) + I dali - 0x00267906, // n0x1368 c0x0000 (---------------) + I dallas - 0x002ed4c8, // n0x1369 c0x0000 (---------------) + I database - 0x0034d6c3, // n0x136a c0x0000 (---------------) + I ddr - 0x00255ace, // n0x136b c0x0000 (---------------) + I decorativearts - 0x00362fc8, // n0x136c c0x0000 (---------------) + I delaware - 0x0029f90b, // n0x136d c0x0000 (---------------) + I delmenhorst - 0x00311707, // n0x136e c0x0000 (---------------) + I denmark - 0x002b8f85, // n0x136f c0x0000 (---------------) + I depot - 0x00232f46, // n0x1370 c0x0000 (---------------) + I design - 0x00295507, // n0x1371 c0x0000 (---------------) + I detroit - 0x002dff48, // n0x1372 c0x0000 (---------------) + I dinosaur - 0x00304c89, // n0x1373 c0x0000 (---------------) + I discovery - 0x002250c5, // n0x1374 c0x0000 (---------------) + I dolls - 0x00274888, // n0x1375 c0x0000 (---------------) + I donostia - 0x0038a206, // n0x1376 c0x0000 (---------------) + I durham - 0x00367b0a, // n0x1377 c0x0000 (---------------) + I eastafrica - 0x0032ab09, // n0x1378 c0x0000 (---------------) + I eastcoast - 0x00375549, // n0x1379 c0x0000 (---------------) + I education - 0x0037554b, // n0x137a c0x0000 (---------------) + I educational - 0x002958c8, // n0x137b c0x0000 (---------------) + I egyptian - 0x00295e09, // n0x137c c0x0000 (---------------) + I eisenbahn - 0x0020a506, // n0x137d c0x0000 (---------------) + I elburg - 0x0034cf0a, // n0x137e c0x0000 (---------------) + I elvendrell - 0x0032af4a, // n0x137f c0x0000 (---------------) + I embroidery - 0x00229dcc, // n0x1380 c0x0000 (---------------) + I encyclopedic - 0x0037b187, // n0x1381 c0x0000 (---------------) + I england - 0x00384a8a, // n0x1382 c0x0000 (---------------) + I entomology - 0x0030de4b, // n0x1383 c0x0000 (---------------) + I environment - 0x0030de59, // n0x1384 c0x0000 (---------------) + I environmentalconservation - 0x003543c8, // n0x1385 c0x0000 (---------------) + I epilepsy - 0x0029ac45, // n0x1386 c0x0000 (---------------) + I essex - 0x002b1846, // n0x1387 c0x0000 (---------------) + I estate - 0x002f6409, // n0x1388 c0x0000 (---------------) + I ethnology - 0x0020bb46, // n0x1389 c0x0000 (---------------) + I exeter - 0x00326eca, // n0x138a c0x0000 (---------------) + I exhibition - 0x00311c06, // n0x138b c0x0000 (---------------) + I family - 0x0021f804, // n0x138c c0x0000 (---------------) + I farm - 0x0021f80d, // n0x138d c0x0000 (---------------) + I farmequipment - 0x00366b07, // n0x138e c0x0000 (---------------) + I farmers - 0x002fb8c9, // n0x138f c0x0000 (---------------) + I farmstead - 0x002099c5, // n0x1390 c0x0000 (---------------) + I field - 0x00338588, // n0x1391 c0x0000 (---------------) + I figueres - 0x00349f49, // n0x1392 c0x0000 (---------------) + I filatelia - 0x00356104, // n0x1393 c0x0000 (---------------) + I film - 0x003707c7, // n0x1394 c0x0000 (---------------) + I fineart - 0x003707c8, // n0x1395 c0x0000 (---------------) + I finearts - 0x00236407, // n0x1396 c0x0000 (---------------) + I finland - 0x00252b88, // n0x1397 c0x0000 (---------------) + I flanders - 0x0023c447, // n0x1398 c0x0000 (---------------) + I florida - 0x002e7685, // n0x1399 c0x0000 (---------------) + I force - 0x002457cc, // n0x139a c0x0000 (---------------) + I fortmissoula - 0x00245e89, // n0x139b c0x0000 (---------------) + I fortworth - 0x00303b8a, // n0x139c c0x0000 (---------------) + I foundation - 0x00377209, // n0x139d c0x0000 (---------------) + I francaise - 0x003229c9, // n0x139e c0x0000 (---------------) + I frankfurt - 0x0035268c, // n0x139f c0x0000 (---------------) + I franziskaner - 0x00209c8b, // n0x13a0 c0x0000 (---------------) + I freemasonry - 0x00248cc8, // n0x13a1 c0x0000 (---------------) + I freiburg - 0x002493c8, // n0x13a2 c0x0000 (---------------) + I fribourg - 0x0024c784, // n0x13a3 c0x0000 (---------------) + I frog - 0x0026fc08, // n0x13a4 c0x0000 (---------------) + I fundacio - 0x00272f09, // n0x13a5 c0x0000 (---------------) + I furniture - 0x00226607, // n0x13a6 c0x0000 (---------------) + I gallery - 0x0020e506, // n0x13a7 c0x0000 (---------------) + I garden - 0x0021a607, // n0x13a8 c0x0000 (---------------) + I gateway - 0x00268b89, // n0x13a9 c0x0000 (---------------) + I geelvinck - 0x002a634b, // n0x13aa c0x0000 (---------------) + I gemological - 0x00309a87, // n0x13ab c0x0000 (---------------) + I geology - 0x002f8287, // n0x13ac c0x0000 (---------------) + I georgia - 0x00267387, // n0x13ad c0x0000 (---------------) + I giessen - 0x0034da84, // n0x13ae c0x0000 (---------------) + I glas - 0x0034da85, // n0x13af c0x0000 (---------------) + I glass - 0x00292d05, // n0x13b0 c0x0000 (---------------) + I gorge - 0x00320b0b, // n0x13b1 c0x0000 (---------------) + I grandrapids - 0x00380d44, // n0x13b2 c0x0000 (---------------) + I graz - 0x002e6b48, // n0x13b3 c0x0000 (---------------) + I guernsey - 0x002a19ca, // n0x13b4 c0x0000 (---------------) + I halloffame - 0x0038a2c7, // n0x13b5 c0x0000 (---------------) + I hamburg - 0x00372047, // n0x13b6 c0x0000 (---------------) + I handson - 0x0027a252, // n0x13b7 c0x0000 (---------------) + I harvestcelebration - 0x00256386, // n0x13b8 c0x0000 (---------------) + I hawaii - 0x00205e06, // n0x13b9 c0x0000 (---------------) + I health - 0x002f518e, // n0x13ba c0x0000 (---------------) + I heimatunduhren - 0x00257ac6, // n0x13bb c0x0000 (---------------) + I hellas - 0x00209408, // n0x13bc c0x0000 (---------------) + I helsinki - 0x0027f4cf, // n0x13bd c0x0000 (---------------) + I hembygdsforbund - 0x0034dec8, // n0x13be c0x0000 (---------------) + I heritage - 0x0025de08, // n0x13bf c0x0000 (---------------) + I histoire - 0x002a794a, // n0x13c0 c0x0000 (---------------) + I historical - 0x002a7951, // n0x13c1 c0x0000 (---------------) + I historicalsociety - 0x0028cfce, // n0x13c2 c0x0000 (---------------) + I historichouses - 0x0024268a, // n0x13c3 c0x0000 (---------------) + I historisch - 0x0024268c, // n0x13c4 c0x0000 (---------------) + I historisches - 0x002238c7, // n0x13c5 c0x0000 (---------------) + I history - 0x002238d0, // n0x13c6 c0x0000 (---------------) + I historyofscience - 0x0038f308, // n0x13c7 c0x0000 (---------------) + I horology - 0x0021da05, // n0x13c8 c0x0000 (---------------) + I house - 0x002d8f0a, // n0x13c9 c0x0000 (---------------) + I humanities - 0x00396b4c, // n0x13ca c0x0000 (---------------) + I illustration - 0x003365cd, // n0x13cb c0x0000 (---------------) + I imageandsound - 0x002d5b06, // n0x13cc c0x0000 (---------------) + I indian - 0x002d5b07, // n0x13cd c0x0000 (---------------) + I indiana - 0x002d5b0c, // n0x13ce c0x0000 (---------------) + I indianapolis - 0x00356ecc, // n0x13cf c0x0000 (---------------) + I indianmarket - 0x00238c0c, // n0x13d0 c0x0000 (---------------) + I intelligence - 0x0027d28b, // n0x13d1 c0x0000 (---------------) + I interactive - 0x00273f44, // n0x13d2 c0x0000 (---------------) + I iraq - 0x0021afc4, // n0x13d3 c0x0000 (---------------) + I iron - 0x00357ec9, // n0x13d4 c0x0000 (---------------) + I isleofman - 0x002bc087, // n0x13d5 c0x0000 (---------------) + I jamison - 0x002207c9, // n0x13d6 c0x0000 (---------------) + I jefferson - 0x00337649, // n0x13d7 c0x0000 (---------------) + I jerusalem - 0x0034f487, // n0x13d8 c0x0000 (---------------) + I jewelry - 0x0038cb46, // n0x13d9 c0x0000 (---------------) + I jewish - 0x0038cb49, // n0x13da c0x0000 (---------------) + I jewishart - 0x00297743, // n0x13db c0x0000 (---------------) + I jfk - 0x0028540a, // n0x13dc c0x0000 (---------------) + I journalism - 0x0036e9c7, // n0x13dd c0x0000 (---------------) + I judaica - 0x0035f38b, // n0x13de c0x0000 (---------------) + I judygarland - 0x002eeb4a, // n0x13df c0x0000 (---------------) + I juedisches - 0x00370c84, // n0x13e0 c0x0000 (---------------) + I juif - 0x002df386, // n0x13e1 c0x0000 (---------------) + I karate - 0x002af549, // n0x13e2 c0x0000 (---------------) + I karikatur - 0x00394c44, // n0x13e3 c0x0000 (---------------) + I kids - 0x0033e24a, // n0x13e4 c0x0000 (---------------) + I koebenhavn - 0x0021f385, // n0x13e5 c0x0000 (---------------) + I koeln - 0x002a3845, // n0x13e6 c0x0000 (---------------) + I kunst - 0x002a384d, // n0x13e7 c0x0000 (---------------) + I kunstsammlung - 0x002a3b8e, // n0x13e8 c0x0000 (---------------) + I kunstunddesign - 0x002feec5, // n0x13e9 c0x0000 (---------------) + I labor - 0x0037c986, // n0x13ea c0x0000 (---------------) + I labour - 0x00323a07, // n0x13eb c0x0000 (---------------) + I lajolla - 0x00261a4a, // n0x13ec c0x0000 (---------------) + I lancashire - 0x0035b146, // n0x13ed c0x0000 (---------------) + I landes - 0x002856c4, // n0x13ee c0x0000 (---------------) + I lans - 0x002d0287, // n0x13ef c0x0000 (---------------) + I larsson - 0x0029eacb, // n0x13f0 c0x0000 (---------------) + I lewismiller - 0x00251e07, // n0x13f1 c0x0000 (---------------) + I lincoln - 0x00329ac4, // n0x13f2 c0x0000 (---------------) + I linz - 0x002a1d46, // n0x13f3 c0x0000 (---------------) + I living - 0x002a1d4d, // n0x13f4 c0x0000 (---------------) + I livinghistory - 0x0032254c, // n0x13f5 c0x0000 (---------------) + I localhistory - 0x00340906, // n0x13f6 c0x0000 (---------------) + I london - 0x002a4f4a, // n0x13f7 c0x0000 (---------------) + I losangeles - 0x002116c6, // n0x13f8 c0x0000 (---------------) + I louvre - 0x00259d88, // n0x13f9 c0x0000 (---------------) + I loyalist - 0x0021d747, // n0x13fa c0x0000 (---------------) + I lucerne - 0x00222d8a, // n0x13fb c0x0000 (---------------) + I luxembourg - 0x00226c86, // n0x13fc c0x0000 (---------------) + I luzern - 0x0026b0c3, // n0x13fd c0x0000 (---------------) + I mad - 0x00300a86, // n0x13fe c0x0000 (---------------) + I madrid - 0x0026aa08, // n0x13ff c0x0000 (---------------) + I mallorca - 0x0028608a, // n0x1400 c0x0000 (---------------) + I manchester - 0x00266747, // n0x1401 c0x0000 (---------------) + I mansion - 0x00266748, // n0x1402 c0x0000 (---------------) + I mansions - 0x0026d784, // n0x1403 c0x0000 (---------------) + I manx - 0x00277287, // n0x1404 c0x0000 (---------------) + I marburg - 0x0036ee48, // n0x1405 c0x0000 (---------------) + I maritime - 0x00237048, // n0x1406 c0x0000 (---------------) + I maritimo - 0x00256588, // n0x1407 c0x0000 (---------------) + I maryland - 0x003372ca, // n0x1408 c0x0000 (---------------) + I marylhurst - 0x002dc385, // n0x1409 c0x0000 (---------------) + I media - 0x002e7087, // n0x140a c0x0000 (---------------) + I medical - 0x002424d3, // n0x140b c0x0000 (---------------) + I medizinhistorisches - 0x00257946, // n0x140c c0x0000 (---------------) + I meeres - 0x002edac8, // n0x140d c0x0000 (---------------) + I memorial - 0x00219509, // n0x140e c0x0000 (---------------) + I mesaverde - 0x00204988, // n0x140f c0x0000 (---------------) + I michigan - 0x002892cb, // n0x1410 c0x0000 (---------------) + I midatlantic - 0x002a6948, // n0x1411 c0x0000 (---------------) + I military - 0x0029ec04, // n0x1412 c0x0000 (---------------) + I mill - 0x002878c6, // n0x1413 c0x0000 (---------------) + I miners - 0x002e7a46, // n0x1414 c0x0000 (---------------) + I mining - 0x00335b09, // n0x1415 c0x0000 (---------------) + I minnesota - 0x002ad807, // n0x1416 c0x0000 (---------------) + I missile - 0x002458c8, // n0x1417 c0x0000 (---------------) + I missoula - 0x00291a06, // n0x1418 c0x0000 (---------------) + I modern - 0x0021cfc4, // n0x1419 c0x0000 (---------------) + I moma - 0x002b6185, // n0x141a c0x0000 (---------------) + I money - 0x002b02c8, // n0x141b c0x0000 (---------------) + I monmouth - 0x002b094a, // n0x141c c0x0000 (---------------) + I monticello - 0x002b1648, // n0x141d c0x0000 (---------------) + I montreal - 0x002b68c6, // n0x141e c0x0000 (---------------) + I moscow - 0x0028678a, // n0x141f c0x0000 (---------------) + I motorcycle - 0x002f3cc8, // n0x1420 c0x0000 (---------------) + I muenchen - 0x002b9948, // n0x1421 c0x0000 (---------------) + I muenster - 0x002ba948, // n0x1422 c0x0000 (---------------) + I mulhouse - 0x002bb346, // n0x1423 c0x0000 (---------------) + I muncie - 0x002bd186, // n0x1424 c0x0000 (---------------) + I museet - 0x0030e7cc, // n0x1425 c0x0000 (---------------) + I museumcenter - 0x002bd650, // n0x1426 c0x0000 (---------------) + I museumvereniging - 0x00337b85, // n0x1427 c0x0000 (---------------) + I music - 0x002dd9c8, // n0x1428 c0x0000 (---------------) + I national - 0x002dd9d0, // n0x1429 c0x0000 (---------------) + I nationalfirearms - 0x0034dcd0, // n0x142a c0x0000 (---------------) + I nationalheritage - 0x0027564e, // n0x142b c0x0000 (---------------) + I nativeamerican - 0x0030e44e, // n0x142c c0x0000 (---------------) + I naturalhistory - 0x0030e454, // n0x142d c0x0000 (---------------) + I naturalhistorymuseum - 0x00240dcf, // n0x142e c0x0000 (---------------) + I naturalsciences - 0x00241186, // n0x142f c0x0000 (---------------) + I nature - 0x002f4951, // n0x1430 c0x0000 (---------------) + I naturhistorisches - 0x0031cfd3, // n0x1431 c0x0000 (---------------) + I natuurwetenschappen - 0x0031d448, // n0x1432 c0x0000 (---------------) + I naumburg - 0x00341c05, // n0x1433 c0x0000 (---------------) + I naval - 0x00262448, // n0x1434 c0x0000 (---------------) + I nebraska - 0x0021d585, // n0x1435 c0x0000 (---------------) + I neues - 0x002e60cc, // n0x1436 c0x0000 (---------------) + I newhampshire - 0x00221609, // n0x1437 c0x0000 (---------------) + I newjersey - 0x00231f49, // n0x1438 c0x0000 (---------------) + I newmexico - 0x0021a387, // n0x1439 c0x0000 (---------------) + I newport - 0x00366d49, // n0x143a c0x0000 (---------------) + I newspaper - 0x00237f07, // n0x143b c0x0000 (---------------) + I newyork - 0x00203d46, // n0x143c c0x0000 (---------------) + I niepce - 0x003626c7, // n0x143d c0x0000 (---------------) + I norfolk - 0x002f0dc5, // n0x143e c0x0000 (---------------) + I north - 0x00345903, // n0x143f c0x0000 (---------------) + I nrw - 0x0034d889, // n0x1440 c0x0000 (---------------) + I nuernberg - 0x002e9309, // n0x1441 c0x0000 (---------------) + I nuremberg - 0x00223403, // n0x1442 c0x0000 (---------------) + I nyc - 0x002108c4, // n0x1443 c0x0000 (---------------) + I nyny - 0x0034100d, // n0x1444 c0x0000 (---------------) + I oceanographic - 0x0034384f, // n0x1445 c0x0000 (---------------) + I oceanographique - 0x002e3085, // n0x1446 c0x0000 (---------------) + I omaha - 0x003023c6, // n0x1447 c0x0000 (---------------) + I online - 0x0032a587, // n0x1448 c0x0000 (---------------) + I ontario - 0x0032ce07, // n0x1449 c0x0000 (---------------) + I openair - 0x00276b86, // n0x144a c0x0000 (---------------) + I oregon - 0x00276b8b, // n0x144b c0x0000 (---------------) + I oregontrail - 0x0028e6c5, // n0x144c c0x0000 (---------------) + I otago - 0x00364046, // n0x144d c0x0000 (---------------) + I oxford - 0x0031ba07, // n0x144e c0x0000 (---------------) + I pacific - 0x0025d709, // n0x144f c0x0000 (---------------) + I paderborn - 0x0036ce06, // n0x1450 c0x0000 (---------------) + I palace - 0x002052c5, // n0x1451 c0x0000 (---------------) + I paleo - 0x00324b4b, // n0x1452 c0x0000 (---------------) + I palmsprings - 0x00221d86, // n0x1453 c0x0000 (---------------) + I panama - 0x0025b445, // n0x1454 c0x0000 (---------------) + I paris - 0x002a3348, // n0x1455 c0x0000 (---------------) + I pasadena - 0x002dc948, // n0x1456 c0x0000 (---------------) + I pharmacy - 0x0036150c, // n0x1457 c0x0000 (---------------) + I philadelphia - 0x00361510, // n0x1458 c0x0000 (---------------) + I philadelphiaarea - 0x002bf909, // n0x1459 c0x0000 (---------------) + I philately - 0x002bfd47, // n0x145a c0x0000 (---------------) + I phoenix - 0x002c014b, // n0x145b c0x0000 (---------------) + I photography - 0x002c1506, // n0x145c c0x0000 (---------------) + I pilots - 0x002c2e8a, // n0x145d c0x0000 (---------------) + I pittsburgh - 0x002c438b, // n0x145e c0x0000 (---------------) + I planetarium - 0x002c4bca, // n0x145f c0x0000 (---------------) + I plantation - 0x002c4e46, // n0x1460 c0x0000 (---------------) + I plants - 0x002c6485, // n0x1461 c0x0000 (---------------) + I plaza - 0x0036e706, // n0x1462 c0x0000 (---------------) + I portal - 0x00266f08, // n0x1463 c0x0000 (---------------) + I portland - 0x0021a44a, // n0x1464 c0x0000 (---------------) + I portlligat - 0x002b31dc, // n0x1465 c0x0000 (---------------) + I posts-and-telecommunications - 0x002ca84c, // n0x1466 c0x0000 (---------------) + I preservation - 0x002cab48, // n0x1467 c0x0000 (---------------) + I presidio - 0x0029abc5, // n0x1468 c0x0000 (---------------) + I press - 0x002cc587, // n0x1469 c0x0000 (---------------) + I project - 0x00296546, // n0x146a c0x0000 (---------------) + I public - 0x0034c905, // n0x146b c0x0000 (---------------) + I pubol - 0x00211186, // n0x146c c0x0000 (---------------) + I quebec - 0x00276d48, // n0x146d c0x0000 (---------------) + I railroad - 0x00253fc7, // n0x146e c0x0000 (---------------) + I railway - 0x00296808, // n0x146f c0x0000 (---------------) + I research - 0x0021c58a, // n0x1470 c0x0000 (---------------) + I resistance - 0x0033cb8c, // n0x1471 c0x0000 (---------------) + I riodejaneiro - 0x0033ce09, // n0x1472 c0x0000 (---------------) + I rochester - 0x00201707, // n0x1473 c0x0000 (---------------) + I rockart - 0x0023fb84, // n0x1474 c0x0000 (---------------) + I roma - 0x0023afc6, // n0x1475 c0x0000 (---------------) + I russia - 0x002c508a, // n0x1476 c0x0000 (---------------) + I saintlouis - 0x00337745, // n0x1477 c0x0000 (---------------) + I salem - 0x0034250c, // n0x1478 c0x0000 (---------------) + I salvadordali - 0x0034ec88, // n0x1479 c0x0000 (---------------) + I salzburg - 0x00270ec8, // n0x147a c0x0000 (---------------) + I sandiego - 0x0023774c, // n0x147b c0x0000 (---------------) + I sanfrancisco - 0x0020bfcc, // n0x147c c0x0000 (---------------) + I santabarbara - 0x0020c3c9, // n0x147d c0x0000 (---------------) + I santacruz - 0x0020c607, // n0x147e c0x0000 (---------------) + I santafe - 0x0035768c, // n0x147f c0x0000 (---------------) + I saskatchewan - 0x002251c4, // n0x1480 c0x0000 (---------------) + I satx - 0x0022de0a, // n0x1481 c0x0000 (---------------) + I savannahga - 0x0020cb8c, // n0x1482 c0x0000 (---------------) + I schlesisches - 0x00354a4b, // n0x1483 c0x0000 (---------------) + I schoenbrunn - 0x0025e7cb, // n0x1484 c0x0000 (---------------) + I schokoladen - 0x00235406, // n0x1485 c0x0000 (---------------) + I school - 0x0023b2c7, // n0x1486 c0x0000 (---------------) + I schweiz - 0x00223b07, // n0x1487 c0x0000 (---------------) + I science - 0x00223b0f, // n0x1488 c0x0000 (---------------) + I science-fiction - 0x002d6251, // n0x1489 c0x0000 (---------------) + I scienceandhistory - 0x0037f9d2, // n0x148a c0x0000 (---------------) + I scienceandindustry - 0x0023ce0d, // n0x148b c0x0000 (---------------) + I sciencecenter - 0x0023ce0e, // n0x148c c0x0000 (---------------) + I sciencecenters - 0x0023d14e, // n0x148d c0x0000 (---------------) + I sciencehistory - 0x00240f88, // n0x148e c0x0000 (---------------) + I sciences - 0x00240f92, // n0x148f c0x0000 (---------------) + I sciencesnaturelles - 0x00237988, // n0x1490 c0x0000 (---------------) + I scotland - 0x002dfc87, // n0x1491 c0x0000 (---------------) + I seaport - 0x0023920a, // n0x1492 c0x0000 (---------------) + I settlement - 0x0020fb88, // n0x1493 c0x0000 (---------------) + I settlers - 0x00257a85, // n0x1494 c0x0000 (---------------) + I shell - 0x0025918a, // n0x1495 c0x0000 (---------------) + I sherbrooke - 0x0037ad47, // n0x1496 c0x0000 (---------------) + I sibenik - 0x0036b904, // n0x1497 c0x0000 (---------------) + I silk - 0x00207b43, // n0x1498 c0x0000 (---------------) + I ski - 0x002e3345, // n0x1499 c0x0000 (---------------) + I skole - 0x002a7bc7, // n0x149a c0x0000 (---------------) + I society - 0x002d84c7, // n0x149b c0x0000 (---------------) + I sologne - 0x003367ce, // n0x149c c0x0000 (---------------) + I soundandvision - 0x0031f30d, // n0x149d c0x0000 (---------------) + I southcarolina - 0x00320d89, // n0x149e c0x0000 (---------------) + I southwest - 0x002101c5, // n0x149f c0x0000 (---------------) + I space - 0x00349a43, // n0x14a0 c0x0000 (---------------) + I spy - 0x00275b86, // n0x14a1 c0x0000 (---------------) + I square - 0x00248205, // n0x14a2 c0x0000 (---------------) + I stadt - 0x0029fb48, // n0x14a3 c0x0000 (---------------) + I stalbans - 0x00232449, // n0x14a4 c0x0000 (---------------) + I starnberg - 0x002b1885, // n0x14a5 c0x0000 (---------------) + I state - 0x00362e0f, // n0x14a6 c0x0000 (---------------) + I stateofdelaware - 0x002c62c7, // n0x14a7 c0x0000 (---------------) + I station - 0x00354105, // n0x14a8 c0x0000 (---------------) + I steam - 0x002f2f8a, // n0x14a9 c0x0000 (---------------) + I steiermark - 0x002a83c6, // n0x14aa c0x0000 (---------------) + I stjohn - 0x00259f09, // n0x14ab c0x0000 (---------------) + I stockholm - 0x002cf98c, // n0x14ac c0x0000 (---------------) + I stpetersburg - 0x002d0749, // n0x14ad c0x0000 (---------------) + I stuttgart - 0x00211e46, // n0x14ae c0x0000 (---------------) + I suisse - 0x002a17cc, // n0x14af c0x0000 (---------------) + I surgeonshall - 0x002d1c86, // n0x14b0 c0x0000 (---------------) + I surrey - 0x002d4988, // n0x14b1 c0x0000 (---------------) + I svizzera - 0x002d4b86, // n0x14b2 c0x0000 (---------------) + I sweden - 0x00368086, // n0x14b3 c0x0000 (---------------) + I sydney - 0x0024ca44, // n0x14b4 c0x0000 (---------------) + I tank - 0x00249043, // n0x14b5 c0x0000 (---------------) + I tcm - 0x0029d58a, // n0x14b6 c0x0000 (---------------) + I technology - 0x002994d1, // n0x14b7 c0x0000 (---------------) + I telekommunikation - 0x00248a4a, // n0x14b8 c0x0000 (---------------) + I television - 0x00209085, // n0x14b9 c0x0000 (---------------) + I texas - 0x00326307, // n0x14ba c0x0000 (---------------) + I textile - 0x002f9147, // n0x14bb c0x0000 (---------------) + I theater - 0x0036ef44, // n0x14bc c0x0000 (---------------) + I time - 0x0036ef4b, // n0x14bd c0x0000 (---------------) + I timekeeping - 0x0035e408, // n0x14be c0x0000 (---------------) + I topology - 0x0029f3c6, // n0x14bf c0x0000 (---------------) + I torino - 0x002e9685, // n0x14c0 c0x0000 (---------------) + I touch - 0x0021abc4, // n0x14c1 c0x0000 (---------------) + I town - 0x0027c9c9, // n0x14c2 c0x0000 (---------------) + I transport - 0x00242e84, // n0x14c3 c0x0000 (---------------) + I tree - 0x00211c47, // n0x14c4 c0x0000 (---------------) + I trolley - 0x00313185, // n0x14c5 c0x0000 (---------------) + I trust - 0x00313187, // n0x14c6 c0x0000 (---------------) + I trustee - 0x002f53c5, // n0x14c7 c0x0000 (---------------) + I uhren - 0x00213f43, // n0x14c8 c0x0000 (---------------) + I ulm - 0x002dfb48, // n0x14c9 c0x0000 (---------------) + I undersea - 0x0029f04a, // n0x14ca c0x0000 (---------------) + I university - 0x00222503, // n0x14cb c0x0000 (---------------) + I usa - 0x0022250a, // n0x14cc c0x0000 (---------------) + I usantiques - 0x0038c1c6, // n0x14cd c0x0000 (---------------) + I usarts - 0x00362b8f, // n0x14ce c0x0000 (---------------) + I uscountryestate - 0x00323609, // n0x14cf c0x0000 (---------------) + I usculture - 0x00255a50, // n0x14d0 c0x0000 (---------------) + I usdecorativearts - 0x002ada08, // n0x14d1 c0x0000 (---------------) + I usgarden - 0x002b7209, // n0x14d2 c0x0000 (---------------) + I ushistory - 0x00282ac7, // n0x14d3 c0x0000 (---------------) + I ushuaia - 0x002a1ccf, // n0x14d4 c0x0000 (---------------) + I uslivinghistory - 0x0026a544, // n0x14d5 c0x0000 (---------------) + I utah - 0x00357a44, // n0x14d6 c0x0000 (---------------) + I uvic - 0x00213d86, // n0x14d7 c0x0000 (---------------) + I valley - 0x002292c6, // n0x14d8 c0x0000 (---------------) + I vantaa - 0x0038deca, // n0x14d9 c0x0000 (---------------) + I versailles - 0x002c7686, // n0x14da c0x0000 (---------------) + I viking - 0x00327d47, // n0x14db c0x0000 (---------------) + I village - 0x002dd148, // n0x14dc c0x0000 (---------------) + I virginia - 0x002dd347, // n0x14dd c0x0000 (---------------) + I virtual - 0x002dd507, // n0x14de c0x0000 (---------------) + I virtuel - 0x00332eca, // n0x14df c0x0000 (---------------) + I vlaanderen - 0x002df98b, // n0x14e0 c0x0000 (---------------) + I volkenkunde - 0x0036cbc5, // n0x14e1 c0x0000 (---------------) + I wales - 0x0037f608, // n0x14e2 c0x0000 (---------------) + I wallonie - 0x00202543, // n0x14e3 c0x0000 (---------------) + I war - 0x0025108c, // n0x14e4 c0x0000 (---------------) + I washingtondc - 0x0020accf, // n0x14e5 c0x0000 (---------------) + I watch-and-clock - 0x0025fe4d, // n0x14e6 c0x0000 (---------------) + I watchandclock - 0x0036d147, // n0x14e7 c0x0000 (---------------) + I western - 0x00320ec9, // n0x14e8 c0x0000 (---------------) + I westfalen - 0x0029b447, // n0x14e9 c0x0000 (---------------) + I whaling - 0x00247748, // n0x14ea c0x0000 (---------------) + I wildlife - 0x00221a4c, // n0x14eb c0x0000 (---------------) + I williamsburg - 0x002a0248, // n0x14ec c0x0000 (---------------) + I windmill - 0x0029b088, // n0x14ed c0x0000 (---------------) + I workshop - 0x002f608e, // n0x14ee c0x0000 (---------------) + I xn--9dbhblg6di - 0x003083d4, // n0x14ef c0x0000 (---------------) + I xn--comunicaes-v6a2o - 0x003088e4, // n0x14f0 c0x0000 (---------------) + I xn--correios-e-telecomunicaes-ghc29a - 0x0032844a, // n0x14f1 c0x0000 (---------------) + I xn--h1aegh - 0x0034760b, // n0x14f2 c0x0000 (---------------) + I xn--lns-qla - 0x00237fc4, // n0x14f3 c0x0000 (---------------) + I york - 0x00237fc9, // n0x14f4 c0x0000 (---------------) + I yorkshire - 0x00297948, // n0x14f5 c0x0000 (---------------) + I yosemite - 0x00235bc5, // n0x14f6 c0x0000 (---------------) + I youth - 0x0038ba0a, // n0x14f7 c0x0000 (---------------) + I zoological - 0x00363207, // n0x14f8 c0x0000 (---------------) + I zoology - 0x002751c4, // n0x14f9 c0x0000 (---------------) + I aero - 0x00310603, // n0x14fa c0x0000 (---------------) + I biz - 0x00222ac3, // n0x14fb c0x0000 (---------------) + I com - 0x00228d44, // n0x14fc c0x0000 (---------------) + I coop - 0x002d75c3, // n0x14fd c0x0000 (---------------) + I edu - 0x0021e283, // n0x14fe c0x0000 (---------------) + I gov - 0x00200304, // n0x14ff c0x0000 (---------------) + I info - 0x00238c03, // n0x1500 c0x0000 (---------------) + I int - 0x0023fa03, // n0x1501 c0x0000 (---------------) + I mil - 0x002bd646, // n0x1502 c0x0000 (---------------) + I museum - 0x00298944, // n0x1503 c0x0000 (---------------) + I name - 0x002170c3, // n0x1504 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1505 c0x0000 (---------------) + I org - 0x00218243, // n0x1506 c0x0000 (---------------) + I pro - 0x00201e82, // n0x1507 c0x0000 (---------------) + I ac - 0x00310603, // n0x1508 c0x0000 (---------------) + I biz - 0x00200742, // n0x1509 c0x0000 (---------------) + I co - 0x00222ac3, // n0x150a c0x0000 (---------------) + I com - 0x00228d44, // n0x150b c0x0000 (---------------) + I coop - 0x002d75c3, // n0x150c c0x0000 (---------------) + I edu - 0x0021e283, // n0x150d c0x0000 (---------------) + I gov - 0x00238c03, // n0x150e c0x0000 (---------------) + I int - 0x002bd646, // n0x150f c0x0000 (---------------) + I museum - 0x002170c3, // n0x1510 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1511 c0x0000 (---------------) + I org - 0x000e4188, // n0x1512 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1513 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1514 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x1515 c0x0000 (---------------) + I gob - 0x002170c3, // n0x1516 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1517 c0x0000 (---------------) + I org - 0x000e4188, // n0x1518 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1519 c0x0000 (---------------) + I com - 0x002d75c3, // n0x151a c0x0000 (---------------) + I edu - 0x0021e283, // n0x151b c0x0000 (---------------) + I gov - 0x0023fa03, // n0x151c c0x0000 (---------------) + I mil - 0x00298944, // n0x151d c0x0000 (---------------) + I name - 0x002170c3, // n0x151e c0x0000 (---------------) + I net - 0x0021dcc3, // n0x151f c0x0000 (---------------) + I org - 0x006ed3c8, // n0x1520 c0x0001 (---------------) ! I teledata - 0x002055c2, // n0x1521 c0x0000 (---------------) + I ca - 0x0021aa82, // n0x1522 c0x0000 (---------------) + I cc - 0x00200742, // n0x1523 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1524 c0x0000 (---------------) + I com - 0x0022fb02, // n0x1525 c0x0000 (---------------) + I dr - 0x00200242, // n0x1526 c0x0000 (---------------) + I in - 0x00200304, // n0x1527 c0x0000 (---------------) + I info - 0x00203604, // n0x1528 c0x0000 (---------------) + I mobi - 0x0020a682, // n0x1529 c0x0000 (---------------) + I mx - 0x00298944, // n0x152a c0x0000 (---------------) + I name - 0x00200c42, // n0x152b c0x0000 (---------------) + I or - 0x0021dcc3, // n0x152c c0x0000 (---------------) + I org - 0x00218243, // n0x152d c0x0000 (---------------) + I pro - 0x00235406, // n0x152e c0x0000 (---------------) + I school - 0x0020bf42, // n0x152f c0x0000 (---------------) + I tv - 0x00209f42, // n0x1530 c0x0000 (---------------) + I us - 0x0020ba82, // n0x1531 c0x0000 (---------------) + I ws - 0x37e19443, // n0x1532 c0x00df (n0x1534-n0x1535) o I her - 0x382238c3, // n0x1533 c0x00e0 (n0x1535-n0x1536) o I his - 0x000439c6, // n0x1534 c0x0000 (---------------) + forgot - 0x000439c6, // n0x1535 c0x0000 (---------------) + forgot - 0x002729c4, // n0x1536 c0x0000 (---------------) + I asso - 0x0010054c, // n0x1537 c0x0000 (---------------) + at-band-camp - 0x0006c90c, // n0x1538 c0x0000 (---------------) + azure-mobile - 0x000aef0d, // n0x1539 c0x0000 (---------------) + azurewebsites - 0x000d0087, // n0x153a c0x0000 (---------------) + blogdns - 0x00017a88, // n0x153b c0x0000 (---------------) + broke-it - 0x0001d90a, // n0x153c c0x0000 (---------------) + buyshouses - 0x38e2a085, // n0x153d c0x00e3 (n0x1568-n0x1569) o I cdn77 - 0x0002a089, // n0x153e c0x0000 (---------------) + cdn77-ssl - 0x00192608, // n0x153f c0x0000 (---------------) + cloudapp - 0x0019058a, // n0x1540 c0x0000 (---------------) + cloudfront - 0x00146fc8, // n0x1541 c0x0000 (---------------) + dnsalias - 0x0006a247, // n0x1542 c0x0000 (---------------) + dnsdojo - 0x0018a587, // n0x1543 c0x0000 (---------------) + does-it - 0x0015fdc9, // n0x1544 c0x0000 (---------------) + dontexist - 0x000007c8, // n0x1545 c0x0000 (---------------) + dynalias - 0x00078989, // n0x1546 c0x0000 (---------------) + dynathome - 0x0009428d, // n0x1547 c0x0000 (---------------) + endofinternet - 0x39287d46, // n0x1548 c0x00e4 (n0x1569-n0x156b) o I fastly - 0x0004dac7, // n0x1549 c0x0000 (---------------) + from-az - 0x0004f247, // n0x154a c0x0000 (---------------) + from-co - 0x00056b87, // n0x154b c0x0000 (---------------) + from-la - 0x0005c687, // n0x154c c0x0000 (---------------) + from-ny - 0x00005a42, // n0x154d c0x0000 (---------------) + gb - 0x00104507, // n0x154e c0x0000 (---------------) + gets-it - 0x0005058c, // n0x154f c0x0000 (---------------) + ham-radio-op - 0x00085007, // n0x1550 c0x0000 (---------------) + homeftp - 0x000909c6, // n0x1551 c0x0000 (---------------) + homeip - 0x00090ec9, // n0x1552 c0x0000 (---------------) + homelinux - 0x00091b88, // n0x1553 c0x0000 (---------------) + homeunix - 0x00017d42, // n0x1554 c0x0000 (---------------) + hu - 0x00000242, // n0x1555 c0x0000 (---------------) + in - 0x0005554b, // n0x1556 c0x0000 (---------------) + in-the-band - 0x00166909, // n0x1557 c0x0000 (---------------) + is-a-chef - 0x00052e49, // n0x1558 c0x0000 (---------------) + is-a-geek - 0x00191648, // n0x1559 c0x0000 (---------------) + isa-geek - 0x000990c2, // n0x155a c0x0000 (---------------) + jp - 0x00183609, // n0x155b c0x0000 (---------------) + kicks-ass - 0x00019c4d, // n0x155c c0x0000 (---------------) + office-on-the - 0x000c7e07, // n0x155d c0x0000 (---------------) + podzone - 0x0004294d, // n0x155e c0x0000 (---------------) + scrapper-site - 0x00002e82, // n0x155f c0x0000 (---------------) + se - 0x00130f46, // n0x1560 c0x0000 (---------------) + selfip - 0x0007efc8, // n0x1561 c0x0000 (---------------) + sells-it - 0x00079088, // n0x1562 c0x0000 (---------------) + servebbs - 0x00161348, // n0x1563 c0x0000 (---------------) + serveftp - 0x0003f688, // n0x1564 c0x0000 (---------------) + thruhere - 0x0000cf02, // n0x1565 c0x0000 (---------------) + uk - 0x00110e86, // n0x1566 c0x0000 (---------------) + webhop - 0x000043c2, // n0x1567 c0x0000 (---------------) + za - 0x00000581, // n0x1568 c0x0000 (---------------) + r - 0x396cbe44, // n0x1569 c0x00e5 (n0x156b-n0x156d) o I prod - 0x39a2a203, // n0x156a c0x00e6 (n0x156d-n0x1570) o I ssl - 0x00000181, // n0x156b c0x0000 (---------------) + a - 0x00189c06, // n0x156c c0x0000 (---------------) + global - 0x00000181, // n0x156d c0x0000 (---------------) + a - 0x00000001, // n0x156e c0x0000 (---------------) + b - 0x00189c06, // n0x156f c0x0000 (---------------) + global - 0x00246584, // n0x1570 c0x0000 (---------------) + I arts - 0x00222ac3, // n0x1571 c0x0000 (---------------) + I com - 0x00238544, // n0x1572 c0x0000 (---------------) + I firm - 0x00200304, // n0x1573 c0x0000 (---------------) + I info - 0x002170c3, // n0x1574 c0x0000 (---------------) + I net - 0x002193c5, // n0x1575 c0x0000 (---------------) + I other - 0x00214943, // n0x1576 c0x0000 (---------------) + I per - 0x002e6343, // n0x1577 c0x0000 (---------------) + I rec - 0x002cf4c5, // n0x1578 c0x0000 (---------------) + I store - 0x00219fc3, // n0x1579 c0x0000 (---------------) + I web - 0x3a622ac3, // n0x157a c0x00e9 (n0x1583-n0x1584) + I com - 0x002d75c3, // n0x157b c0x0000 (---------------) + I edu - 0x0021e283, // n0x157c c0x0000 (---------------) + I gov - 0x0023fa03, // n0x157d c0x0000 (---------------) + I mil - 0x00203604, // n0x157e c0x0000 (---------------) + I mobi - 0x00298944, // n0x157f c0x0000 (---------------) + I name - 0x002170c3, // n0x1580 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1581 c0x0000 (---------------) + I org - 0x00206103, // n0x1582 c0x0000 (---------------) + I sch - 0x000e4188, // n0x1583 c0x0000 (---------------) + blogspot - 0x000e4188, // n0x1584 c0x0000 (---------------) + blogspot - 0x003401c2, // n0x1585 c0x0000 (---------------) + I bv - 0x00000742, // n0x1586 c0x0000 (---------------) + co - 0x3b21b502, // n0x1587 c0x00ec (n0x185d-n0x185e) + I aa - 0x00301488, // n0x1588 c0x0000 (---------------) + I aarborte - 0x0021b986, // n0x1589 c0x0000 (---------------) + I aejrie - 0x002aa946, // n0x158a c0x0000 (---------------) + I afjord - 0x0021b307, // n0x158b c0x0000 (---------------) + I agdenes - 0x3b6076c2, // n0x158c c0x00ed (n0x185e-n0x185f) + I ah - 0x3ba2b548, // n0x158d c0x00ee (n0x185f-n0x1860) o I akershus - 0x0031a9ca, // n0x158e c0x0000 (---------------) + I aknoluokta - 0x0024d548, // n0x158f c0x0000 (---------------) + I akrehamn - 0x00200882, // n0x1590 c0x0000 (---------------) + I al - 0x0036e809, // n0x1591 c0x0000 (---------------) + I alaheadju - 0x0036cc07, // n0x1592 c0x0000 (---------------) + I alesund - 0x0020e486, // n0x1593 c0x0000 (---------------) + I algard - 0x00219749, // n0x1594 c0x0000 (---------------) + I alstahaug - 0x0028ee04, // n0x1595 c0x0000 (---------------) + I alta - 0x002ab3c6, // n0x1596 c0x0000 (---------------) + I alvdal - 0x002aad44, // n0x1597 c0x0000 (---------------) + I amli - 0x0025cb44, // n0x1598 c0x0000 (---------------) + I amot - 0x00245409, // n0x1599 c0x0000 (---------------) + I andasuolo - 0x002ee906, // n0x159a c0x0000 (---------------) + I andebu - 0x0034bfc5, // n0x159b c0x0000 (---------------) + I andoy - 0x00279985, // n0x159c c0x0000 (---------------) + I ardal - 0x002a6dc7, // n0x159d c0x0000 (---------------) + I aremark - 0x00275c47, // n0x159e c0x0000 (---------------) + I arendal - 0x002798c4, // n0x159f c0x0000 (---------------) + I arna - 0x0021b546, // n0x15a0 c0x0000 (---------------) + I aseral - 0x00212605, // n0x15a1 c0x0000 (---------------) + I asker - 0x0027d585, // n0x15a2 c0x0000 (---------------) + I askim - 0x0031d885, // n0x15a3 c0x0000 (---------------) + I askoy - 0x002dbc07, // n0x15a4 c0x0000 (---------------) + I askvoll - 0x00311545, // n0x15a5 c0x0000 (---------------) + I asnes - 0x002f1489, // n0x15a6 c0x0000 (---------------) + I audnedaln - 0x00271305, // n0x15a7 c0x0000 (---------------) + I aukra - 0x002e0084, // n0x15a8 c0x0000 (---------------) + I aure - 0x0035b087, // n0x15a9 c0x0000 (---------------) + I aurland - 0x0036d70e, // n0x15aa c0x0000 (---------------) + I aurskog-holand - 0x003298c9, // n0x15ab c0x0000 (---------------) + I austevoll - 0x002f5049, // n0x15ac c0x0000 (---------------) + I austrheim - 0x0030dc86, // n0x15ad c0x0000 (---------------) + I averoy - 0x00321688, // n0x15ae c0x0000 (---------------) + I badaddja - 0x00329f8b, // n0x15af c0x0000 (---------------) + I bahcavuotna - 0x002a080c, // n0x15b0 c0x0000 (---------------) + I bahccavuotna - 0x00323c86, // n0x15b1 c0x0000 (---------------) + I baidar - 0x00342887, // n0x15b2 c0x0000 (---------------) + I bajddar - 0x0035dbc5, // n0x15b3 c0x0000 (---------------) + I balat - 0x0023d9ca, // n0x15b4 c0x0000 (---------------) + I balestrand - 0x0030b989, // n0x15b5 c0x0000 (---------------) + I ballangen - 0x00268ec9, // n0x15b6 c0x0000 (---------------) + I balsfjord - 0x002c8706, // n0x15b7 c0x0000 (---------------) + I bamble - 0x002d37c5, // n0x15b8 c0x0000 (---------------) + I bardu - 0x002b0545, // n0x15b9 c0x0000 (---------------) + I barum - 0x0031a6c9, // n0x15ba c0x0000 (---------------) + I batsfjord - 0x0035ddcb, // n0x15bb c0x0000 (---------------) + I bearalvahki - 0x00269f06, // n0x15bc c0x0000 (---------------) + I beardu - 0x00319a86, // n0x15bd c0x0000 (---------------) + I beiarn - 0x00204704, // n0x15be c0x0000 (---------------) + I berg - 0x00279f06, // n0x15bf c0x0000 (---------------) + I bergen - 0x00343e08, // n0x15c0 c0x0000 (---------------) + I berlevag - 0x00389486, // n0x15c1 c0x0000 (---------------) + I bievat - 0x00219046, // n0x15c2 c0x0000 (---------------) + I bindal - 0x00200f48, // n0x15c3 c0x0000 (---------------) + I birkenes - 0x00202647, // n0x15c4 c0x0000 (---------------) + I bjarkoy - 0x002033c9, // n0x15c5 c0x0000 (---------------) + I bjerkreim - 0x00205005, // n0x15c6 c0x0000 (---------------) + I bjugn - 0x000e4188, // n0x15c7 c0x0000 (---------------) + blogspot - 0x0038a504, // n0x15c8 c0x0000 (---------------) + I bodo - 0x0029bf44, // n0x15c9 c0x0000 (---------------) + I bokn - 0x0020aac5, // n0x15ca c0x0000 (---------------) + I bomlo - 0x0037dc49, // n0x15cb c0x0000 (---------------) + I bremanger - 0x00218ac7, // n0x15cc c0x0000 (---------------) + I bronnoy - 0x00218acb, // n0x15cd c0x0000 (---------------) + I bronnoysund - 0x0021a7ca, // n0x15ce c0x0000 (---------------) + I brumunddal - 0x0021d4c5, // n0x15cf c0x0000 (---------------) + I bryne - 0x3be0a582, // n0x15d0 c0x00ef (n0x1860-n0x1861) + I bu - 0x002eea07, // n0x15d1 c0x0000 (---------------) + I budejju - 0x3c318ec8, // n0x15d2 c0x00f0 (n0x1861-n0x1862) o I buskerud - 0x00251987, // n0x15d3 c0x0000 (---------------) + I bygland - 0x0025f245, // n0x15d4 c0x0000 (---------------) + I bykle - 0x0032234a, // n0x15d5 c0x0000 (---------------) + I cahcesuolo - 0x00000742, // n0x15d6 c0x0000 (---------------) + co - 0x0024fd0b, // n0x15d7 c0x0000 (---------------) + I davvenjarga - 0x0024eb4a, // n0x15d8 c0x0000 (---------------) + I davvesiida - 0x002e9206, // n0x15d9 c0x0000 (---------------) + I deatnu - 0x002b8f83, // n0x15da c0x0000 (---------------) + I dep - 0x0023404d, // n0x15db c0x0000 (---------------) + I dielddanuorri - 0x0023e18c, // n0x15dc c0x0000 (---------------) + I divtasvuodna - 0x002690cd, // n0x15dd c0x0000 (---------------) + I divttasvuotna - 0x002f8b05, // n0x15de c0x0000 (---------------) + I donna - 0x002396c5, // n0x15df c0x0000 (---------------) + I dovre - 0x0034d707, // n0x15e0 c0x0000 (---------------) + I drammen - 0x002edfc9, // n0x15e1 c0x0000 (---------------) + I drangedal - 0x0031a8c6, // n0x15e2 c0x0000 (---------------) + I drobak - 0x002c7505, // n0x15e3 c0x0000 (---------------) + I dyroy - 0x0021e888, // n0x15e4 c0x0000 (---------------) + I egersund - 0x00262743, // n0x15e5 c0x0000 (---------------) + I eid - 0x002ec4c8, // n0x15e6 c0x0000 (---------------) + I eidfjord - 0x00279e08, // n0x15e7 c0x0000 (---------------) + I eidsberg - 0x002ac2c7, // n0x15e8 c0x0000 (---------------) + I eidskog - 0x00262748, // n0x15e9 c0x0000 (---------------) + I eidsvoll - 0x00383049, // n0x15ea c0x0000 (---------------) + I eigersund - 0x00227ec7, // n0x15eb c0x0000 (---------------) + I elverum - 0x00300e87, // n0x15ec c0x0000 (---------------) + I enebakk - 0x002674c8, // n0x15ed c0x0000 (---------------) + I engerdal - 0x002569c4, // n0x15ee c0x0000 (---------------) + I etne - 0x002569c7, // n0x15ef c0x0000 (---------------) + I etnedal - 0x0037ab48, // n0x15f0 c0x0000 (---------------) + I evenassi - 0x0030a446, // n0x15f1 c0x0000 (---------------) + I evenes - 0x00201f0f, // n0x15f2 c0x0000 (---------------) + I evje-og-hornnes - 0x00345a07, // n0x15f3 c0x0000 (---------------) + I farsund - 0x002c3146, // n0x15f4 c0x0000 (---------------) + I fauske - 0x0020c745, // n0x15f5 c0x0000 (---------------) + I fedje - 0x00234803, // n0x15f6 c0x0000 (---------------) + I fet - 0x00324187, // n0x15f7 c0x0000 (---------------) + I fetsund - 0x00235ec3, // n0x15f8 c0x0000 (---------------) + I fhs - 0x002365c6, // n0x15f9 c0x0000 (---------------) + I finnoy - 0x00238f06, // n0x15fa c0x0000 (---------------) + I fitjar - 0x00239986, // n0x15fb c0x0000 (---------------) + I fjaler - 0x0027e245, // n0x15fc c0x0000 (---------------) + I fjell - 0x00252b83, // n0x15fd c0x0000 (---------------) + I fla - 0x0035be08, // n0x15fe c0x0000 (---------------) + I flakstad - 0x00353389, // n0x15ff c0x0000 (---------------) + I flatanger - 0x0036500b, // n0x1600 c0x0000 (---------------) + I flekkefjord - 0x00239b08, // n0x1601 c0x0000 (---------------) + I flesberg - 0x0023c105, // n0x1602 c0x0000 (---------------) + I flora - 0x0023d4c5, // n0x1603 c0x0000 (---------------) + I floro - 0x3c758002, // n0x1604 c0x00f1 (n0x1862-n0x1863) + I fm - 0x00362789, // n0x1605 c0x0000 (---------------) + I folkebibl - 0x00241787, // n0x1606 c0x0000 (---------------) + I folldal - 0x003640c5, // n0x1607 c0x0000 (---------------) + I forde - 0x00245307, // n0x1608 c0x0000 (---------------) + I forsand - 0x00247586, // n0x1609 c0x0000 (---------------) + I fosnes - 0x0034af05, // n0x160a c0x0000 (---------------) + I frana - 0x0024804b, // n0x160b c0x0000 (---------------) + I fredrikstad - 0x00248cc4, // n0x160c c0x0000 (---------------) + I frei - 0x0024d105, // n0x160d c0x0000 (---------------) + I frogn - 0x0024d247, // n0x160e c0x0000 (---------------) + I froland - 0x00263e06, // n0x160f c0x0000 (---------------) + I frosta - 0x00264245, // n0x1610 c0x0000 (---------------) + I froya - 0x0026fe07, // n0x1611 c0x0000 (---------------) + I fuoisku - 0x00270587, // n0x1612 c0x0000 (---------------) + I fuossko - 0x002a7504, // n0x1613 c0x0000 (---------------) + I fusa - 0x0027798a, // n0x1614 c0x0000 (---------------) + I fylkesbibl - 0x00277e48, // n0x1615 c0x0000 (---------------) + I fyresdal - 0x0035ea49, // n0x1616 c0x0000 (---------------) + I gaivuotna - 0x00215b85, // n0x1617 c0x0000 (---------------) + I galsa - 0x0024ff46, // n0x1618 c0x0000 (---------------) + I gamvik - 0x00343fca, // n0x1619 c0x0000 (---------------) + I gangaviika - 0x003442c6, // n0x161a c0x0000 (---------------) + I gaular - 0x002542c7, // n0x161b c0x0000 (---------------) + I gausdal - 0x0035e70d, // n0x161c c0x0000 (---------------) + I giehtavuoatna - 0x00220049, // n0x161d c0x0000 (---------------) + I gildeskal - 0x00347945, // n0x161e c0x0000 (---------------) + I giske - 0x0030ee07, // n0x161f c0x0000 (---------------) + I gjemnes - 0x002ed908, // n0x1620 c0x0000 (---------------) + I gjerdrum - 0x0031c188, // n0x1621 c0x0000 (---------------) + I gjerstad - 0x0031d607, // n0x1622 c0x0000 (---------------) + I gjesdal - 0x003446c6, // n0x1623 c0x0000 (---------------) + I gjovik - 0x00395287, // n0x1624 c0x0000 (---------------) + I gloppen - 0x00238a83, // n0x1625 c0x0000 (---------------) + I gol - 0x00320b04, // n0x1626 c0x0000 (---------------) + I gran - 0x00348cc5, // n0x1627 c0x0000 (---------------) + I grane - 0x00376107, // n0x1628 c0x0000 (---------------) + I granvin - 0x00379f89, // n0x1629 c0x0000 (---------------) + I gratangen - 0x002136c8, // n0x162a c0x0000 (---------------) + I grimstad - 0x002c77c5, // n0x162b c0x0000 (---------------) + I grong - 0x00222fc4, // n0x162c c0x0000 (---------------) + I grue - 0x00331485, // n0x162d c0x0000 (---------------) + I gulen - 0x002373cd, // n0x162e c0x0000 (---------------) + I guovdageaidnu - 0x00202dc2, // n0x162f c0x0000 (---------------) + I ha - 0x00289a46, // n0x1630 c0x0000 (---------------) + I habmer - 0x00330e86, // n0x1631 c0x0000 (---------------) + I hadsel - 0x002f5e0a, // n0x1632 c0x0000 (---------------) + I hagebostad - 0x0035b7c6, // n0x1633 c0x0000 (---------------) + I halden - 0x00363605, // n0x1634 c0x0000 (---------------) + I halsa - 0x0036e045, // n0x1635 c0x0000 (---------------) + I hamar - 0x0036e047, // n0x1636 c0x0000 (---------------) + I hamaroy - 0x0036794c, // n0x1637 c0x0000 (---------------) + I hammarfeasta - 0x002ef38a, // n0x1638 c0x0000 (---------------) + I hammerfest - 0x002796c6, // n0x1639 c0x0000 (---------------) + I hapmir - 0x002ae105, // n0x163a c0x0000 (---------------) + I haram - 0x00279d46, // n0x163b c0x0000 (---------------) + I hareid - 0x0027a087, // n0x163c c0x0000 (---------------) + I harstad - 0x0027b486, // n0x163d c0x0000 (---------------) + I hasvik - 0x0027e14c, // n0x163e c0x0000 (---------------) + I hattfjelldal - 0x00219889, // n0x163f c0x0000 (---------------) + I haugesund - 0x3ca9bc07, // n0x1640 c0x00f2 (n0x1863-n0x1866) o I hedmark - 0x0027f885, // n0x1641 c0x0000 (---------------) + I hemne - 0x0027f886, // n0x1642 c0x0000 (---------------) + I hemnes - 0x0027fc88, // n0x1643 c0x0000 (---------------) + I hemsedal - 0x0022db45, // n0x1644 c0x0000 (---------------) + I herad - 0x0028fd85, // n0x1645 c0x0000 (---------------) + I hitra - 0x0028ffc8, // n0x1646 c0x0000 (---------------) + I hjartdal - 0x002901ca, // n0x1647 c0x0000 (---------------) + I hjelmeland - 0x3ce0cc02, // n0x1648 c0x00f3 (n0x1866-n0x1867) + I hl - 0x3d206182, // n0x1649 c0x00f4 (n0x1867-n0x1868) + I hm - 0x002536c5, // n0x164a c0x0000 (---------------) + I hobol - 0x0029a803, // n0x164b c0x0000 (---------------) + I hof - 0x002c7348, // n0x164c c0x0000 (---------------) + I hokksund - 0x002351c3, // n0x164d c0x0000 (---------------) + I hol - 0x00290444, // n0x164e c0x0000 (---------------) + I hole - 0x0025a04b, // n0x164f c0x0000 (---------------) + I holmestrand - 0x00271dc8, // n0x1650 c0x0000 (---------------) + I holtalen - 0x00292148, // n0x1651 c0x0000 (---------------) + I honefoss - 0x3d6f84c9, // n0x1652 c0x00f5 (n0x1868-n0x1869) o I hordaland - 0x002939c9, // n0x1653 c0x0000 (---------------) + I hornindal - 0x00294186, // n0x1654 c0x0000 (---------------) + I horten - 0x00295188, // n0x1655 c0x0000 (---------------) + I hoyanger - 0x00295389, // n0x1656 c0x0000 (---------------) + I hoylandet - 0x00296046, // n0x1657 c0x0000 (---------------) + I hurdal - 0x002961c5, // n0x1658 c0x0000 (---------------) + I hurum - 0x003512c6, // n0x1659 c0x0000 (---------------) + I hvaler - 0x0036b589, // n0x165a c0x0000 (---------------) + I hyllestad - 0x0030a287, // n0x165b c0x0000 (---------------) + I ibestad - 0x00247d86, // n0x165c c0x0000 (---------------) + I idrett - 0x002f3407, // n0x165d c0x0000 (---------------) + I inderoy - 0x00304b07, // n0x165e c0x0000 (---------------) + I iveland - 0x0025f644, // n0x165f c0x0000 (---------------) + I ivgu - 0x3da14c09, // n0x1660 c0x00f6 (n0x1869-n0x186a) + I jan-mayen - 0x002b4408, // n0x1661 c0x0000 (---------------) + I jessheim - 0x00345148, // n0x1662 c0x0000 (---------------) + I jevnaker - 0x002326c7, // n0x1663 c0x0000 (---------------) + I jolster - 0x002afb86, // n0x1664 c0x0000 (---------------) + I jondal - 0x0038a009, // n0x1665 c0x0000 (---------------) + I jorpeland - 0x002ab887, // n0x1666 c0x0000 (---------------) + I kafjord - 0x0022e84a, // n0x1667 c0x0000 (---------------) + I karasjohka - 0x002d8848, // n0x1668 c0x0000 (---------------) + I karasjok - 0x0023eb87, // n0x1669 c0x0000 (---------------) + I karlsoy - 0x00305646, // n0x166a c0x0000 (---------------) + I karmoy - 0x002eaa8a, // n0x166b c0x0000 (---------------) + I kautokeino - 0x0023cc48, // n0x166c c0x0000 (---------------) + I kirkenes - 0x0025ef45, // n0x166d c0x0000 (---------------) + I klabu - 0x0021cd85, // n0x166e c0x0000 (---------------) + I klepp - 0x002ac947, // n0x166f c0x0000 (---------------) + I kommune - 0x002b7dc9, // n0x1670 c0x0000 (---------------) + I kongsberg - 0x002b814b, // n0x1671 c0x0000 (---------------) + I kongsvinger - 0x002c83c8, // n0x1672 c0x0000 (---------------) + I kopervik - 0x00271389, // n0x1673 c0x0000 (---------------) + I kraanghke - 0x0023a407, // n0x1674 c0x0000 (---------------) + I kragero - 0x0029db0c, // n0x1675 c0x0000 (---------------) + I kristiansand - 0x0029df8c, // n0x1676 c0x0000 (---------------) + I kristiansund - 0x0029e28a, // n0x1677 c0x0000 (---------------) + I krodsherad - 0x0029e50c, // n0x1678 c0x0000 (---------------) + I krokstadelva - 0x002aa8c8, // n0x1679 c0x0000 (---------------) + I kvafjord - 0x002aaac8, // n0x167a c0x0000 (---------------) + I kvalsund - 0x002aacc4, // n0x167b c0x0000 (---------------) + I kvam - 0x002aba49, // n0x167c c0x0000 (---------------) + I kvanangen - 0x002abc89, // n0x167d c0x0000 (---------------) + I kvinesdal - 0x002abeca, // n0x167e c0x0000 (---------------) + I kvinnherad - 0x002ac149, // n0x167f c0x0000 (---------------) + I kviteseid - 0x002ac487, // n0x1680 c0x0000 (---------------) + I kvitsoy - 0x00381bcc, // n0x1681 c0x0000 (---------------) + I laakesvuemie - 0x00207686, // n0x1682 c0x0000 (---------------) + I lahppi - 0x00256cc8, // n0x1683 c0x0000 (---------------) + I langevag - 0x00344386, // n0x1684 c0x0000 (---------------) + I lardal - 0x002d7a86, // n0x1685 c0x0000 (---------------) + I larvik - 0x00347847, // n0x1686 c0x0000 (---------------) + I lavagis - 0x00358888, // n0x1687 c0x0000 (---------------) + I lavangen - 0x002f020b, // n0x1688 c0x0000 (---------------) + I leangaviika - 0x00251847, // n0x1689 c0x0000 (---------------) + I lebesby - 0x00227989, // n0x168a c0x0000 (---------------) + I leikanger - 0x002386c9, // n0x168b c0x0000 (---------------) + I leirfjord - 0x00244b87, // n0x168c c0x0000 (---------------) + I leirvik - 0x00203c44, // n0x168d c0x0000 (---------------) + I leka - 0x0034b3c7, // n0x168e c0x0000 (---------------) + I leksvik - 0x00364686, // n0x168f c0x0000 (---------------) + I lenvik - 0x00364246, // n0x1690 c0x0000 (---------------) + I lerdal - 0x002a5105, // n0x1691 c0x0000 (---------------) + I lesja - 0x00326448, // n0x1692 c0x0000 (---------------) + I levanger - 0x002a6004, // n0x1693 c0x0000 (---------------) + I lier - 0x002a6006, // n0x1694 c0x0000 (---------------) + I lierne - 0x002ef24b, // n0x1695 c0x0000 (---------------) + I lillehammer - 0x00270d89, // n0x1696 c0x0000 (---------------) + I lillesand - 0x0031d786, // n0x1697 c0x0000 (---------------) + I lindas - 0x0031dc09, // n0x1698 c0x0000 (---------------) + I lindesnes - 0x002dbd86, // n0x1699 c0x0000 (---------------) + I loabat - 0x002455c8, // n0x169a c0x0000 (---------------) + I lodingen - 0x00260a43, // n0x169b c0x0000 (---------------) + I lom - 0x0031b945, // n0x169c c0x0000 (---------------) + I loppa - 0x003444c9, // n0x169d c0x0000 (---------------) + I lorenskog - 0x0034d145, // n0x169e c0x0000 (---------------) + I loten - 0x002d8b84, // n0x169f c0x0000 (---------------) + I lund - 0x00263646, // n0x16a0 c0x0000 (---------------) + I lunner - 0x0029cb85, // n0x16a1 c0x0000 (---------------) + I luroy - 0x002c7bc6, // n0x16a2 c0x0000 (---------------) + I luster - 0x002e1c87, // n0x16a3 c0x0000 (---------------) + I lyngdal - 0x0029c206, // n0x16a4 c0x0000 (---------------) + I lyngen - 0x0028448b, // n0x16a5 c0x0000 (---------------) + I malatvuopmi - 0x0034ce07, // n0x16a6 c0x0000 (---------------) + I malselv - 0x00307d86, // n0x16a7 c0x0000 (---------------) + I malvik - 0x00358046, // n0x16a8 c0x0000 (---------------) + I mandal - 0x002a6e86, // n0x16a9 c0x0000 (---------------) + I marker - 0x00279889, // n0x16aa c0x0000 (---------------) + I marnardal - 0x003419ca, // n0x16ab c0x0000 (---------------) + I masfjorden - 0x00314445, // n0x16ac c0x0000 (---------------) + I masoy - 0x0020f58d, // n0x16ad c0x0000 (---------------) + I matta-varjjat - 0x002902c6, // n0x16ae c0x0000 (---------------) + I meland - 0x002d8246, // n0x16af c0x0000 (---------------) + I meldal - 0x002a1bc6, // n0x16b0 c0x0000 (---------------) + I melhus - 0x00259d05, // n0x16b1 c0x0000 (---------------) + I meloy - 0x0022b487, // n0x16b2 c0x0000 (---------------) + I meraker - 0x002886c7, // n0x16b3 c0x0000 (---------------) + I midsund - 0x002061ce, // n0x16b4 c0x0000 (---------------) + I midtre-gauldal - 0x0023fa03, // n0x16b5 c0x0000 (---------------) + I mil - 0x002afb49, // n0x16b6 c0x0000 (---------------) + I mjondalen - 0x002f3689, // n0x16b7 c0x0000 (---------------) + I mo-i-rana - 0x0023ddc7, // n0x16b8 c0x0000 (---------------) + I moareke - 0x00208487, // n0x16b9 c0x0000 (---------------) + I modalen - 0x003120c5, // n0x16ba c0x0000 (---------------) + I modum - 0x0029f845, // n0x16bb c0x0000 (---------------) + I molde - 0x3de70a0f, // n0x16bc c0x00f7 (n0x186a-n0x186c) o I more-og-romsdal - 0x002b7447, // n0x16bd c0x0000 (---------------) + I mosjoen - 0x002b7608, // n0x16be c0x0000 (---------------) + I moskenes - 0x002b7b44, // n0x16bf c0x0000 (---------------) + I moss - 0x002b8006, // n0x16c0 c0x0000 (---------------) + I mosvik - 0x3e2dcb42, // n0x16c1 c0x00f8 (n0x186c-n0x186d) + I mr - 0x002bb5c6, // n0x16c2 c0x0000 (---------------) + I muosat - 0x002bd646, // n0x16c3 c0x0000 (---------------) + I museum - 0x002f054e, // n0x16c4 c0x0000 (---------------) + I naamesjevuemie - 0x002ec30a, // n0x16c5 c0x0000 (---------------) + I namdalseid - 0x0021c1c6, // n0x16c6 c0x0000 (---------------) + I namsos - 0x00232b4a, // n0x16c7 c0x0000 (---------------) + I namsskogan - 0x002b2489, // n0x16c8 c0x0000 (---------------) + I nannestad - 0x002ff685, // n0x16c9 c0x0000 (---------------) + I naroy - 0x0037c388, // n0x16ca c0x0000 (---------------) + I narviika - 0x00393206, // n0x16cb c0x0000 (---------------) + I narvik - 0x0031e108, // n0x16cc c0x0000 (---------------) + I naustdal - 0x00354f08, // n0x16cd c0x0000 (---------------) + I navuotna - 0x00395acb, // n0x16ce c0x0000 (---------------) + I nedre-eiker - 0x0021b405, // n0x16cf c0x0000 (---------------) + I nesna - 0x003115c8, // n0x16d0 c0x0000 (---------------) + I nesodden - 0x0020108c, // n0x16d1 c0x0000 (---------------) + I nesoddtangen - 0x0025f107, // n0x16d2 c0x0000 (---------------) + I nesseby - 0x00239146, // n0x16d3 c0x0000 (---------------) + I nesset - 0x002e6588, // n0x16d4 c0x0000 (---------------) + I nissedal - 0x002677c8, // n0x16d5 c0x0000 (---------------) + I nittedal - 0x3e636482, // n0x16d6 c0x00f9 (n0x186d-n0x186e) + I nl - 0x002ab18b, // n0x16d7 c0x0000 (---------------) + I nord-aurdal - 0x00200c09, // n0x16d8 c0x0000 (---------------) + I nord-fron - 0x003473c9, // n0x16d9 c0x0000 (---------------) + I nord-odal - 0x0031da87, // n0x16da c0x0000 (---------------) + I norddal - 0x002befc8, // n0x16db c0x0000 (---------------) + I nordkapp - 0x3ea3dfc8, // n0x16dc c0x00fa (n0x186e-n0x1872) o I nordland - 0x002c5f0b, // n0x16dd c0x0000 (---------------) + I nordre-land - 0x003914c9, // n0x16de c0x0000 (---------------) + I nordreisa - 0x002113cd, // n0x16df c0x0000 (---------------) + I nore-og-uvdal - 0x0023fdc8, // n0x16e0 c0x0000 (---------------) + I notodden - 0x00288b08, // n0x16e1 c0x0000 (---------------) + I notteroy - 0x3ee00e02, // n0x16e2 c0x00fb (n0x1872-n0x1873) + I nt - 0x00396f44, // n0x16e3 c0x0000 (---------------) + I odda - 0x3f209982, // n0x16e4 c0x00fc (n0x1873-n0x1874) + I of - 0x002d89c6, // n0x16e5 c0x0000 (---------------) + I oksnes - 0x3f600a02, // n0x16e6 c0x00fd (n0x1874-n0x1875) + I ol - 0x0021d00a, // n0x16e7 c0x0000 (---------------) + I omasvuotna - 0x0029b206, // n0x16e8 c0x0000 (---------------) + I oppdal - 0x00220b88, // n0x16e9 c0x0000 (---------------) + I oppegard - 0x00241b48, // n0x16ea c0x0000 (---------------) + I orkanger - 0x00321986, // n0x16eb c0x0000 (---------------) + I orkdal - 0x0032e206, // n0x16ec c0x0000 (---------------) + I orland - 0x002ce006, // n0x16ed c0x0000 (---------------) + I orskog - 0x0029fac5, // n0x16ee c0x0000 (---------------) + I orsta - 0x0022be04, // n0x16ef c0x0000 (---------------) + I osen - 0x3fab8a04, // n0x16f0 c0x00fe (n0x1875-n0x1876) + I oslo - 0x00207f86, // n0x16f1 c0x0000 (---------------) + I osoyro - 0x002586c7, // n0x16f2 c0x0000 (---------------) + I osteroy - 0x3fed6987, // n0x16f3 c0x00ff (n0x1876-n0x1877) o I ostfold - 0x0020300b, // n0x16f4 c0x0000 (---------------) + I ostre-toten - 0x0036dac9, // n0x16f5 c0x0000 (---------------) + I overhalla - 0x0023970a, // n0x16f6 c0x0000 (---------------) + I ovre-eiker - 0x002f3544, // n0x16f7 c0x0000 (---------------) + I oyer - 0x00300d08, // n0x16f8 c0x0000 (---------------) + I oygarden - 0x00247b4d, // n0x16f9 c0x0000 (---------------) + I oystre-slidre - 0x002c9e89, // n0x16fa c0x0000 (---------------) + I porsanger - 0x002ca0c8, // n0x16fb c0x0000 (---------------) + I porsangu - 0x002ca349, // n0x16fc c0x0000 (---------------) + I porsgrunn - 0x002cba44, // n0x16fd c0x0000 (---------------) + I priv - 0x00212ec4, // n0x16fe c0x0000 (---------------) + I rade - 0x00254d85, // n0x16ff c0x0000 (---------------) + I radoy - 0x0035f14b, // n0x1700 c0x0000 (---------------) + I rahkkeravju - 0x00271d46, // n0x1701 c0x0000 (---------------) + I raholt - 0x002a2305, // n0x1702 c0x0000 (---------------) + I raisa - 0x0032a2c9, // n0x1703 c0x0000 (---------------) + I rakkestad - 0x0021b608, // n0x1704 c0x0000 (---------------) + I ralingen - 0x0025abc4, // n0x1705 c0x0000 (---------------) + I rana - 0x0023db49, // n0x1706 c0x0000 (---------------) + I randaberg - 0x0026a685, // n0x1707 c0x0000 (---------------) + I rauma - 0x00275c88, // n0x1708 c0x0000 (---------------) + I rendalen - 0x0033c507, // n0x1709 c0x0000 (---------------) + I rennebu - 0x002f5448, // n0x170a c0x0000 (---------------) + I rennesoy - 0x002af746, // n0x170b c0x0000 (---------------) + I rindal - 0x003247c7, // n0x170c c0x0000 (---------------) + I ringebu - 0x002a8c49, // n0x170d c0x0000 (---------------) + I ringerike - 0x00324cc9, // n0x170e c0x0000 (---------------) + I ringsaker - 0x0025b4c5, // n0x170f c0x0000 (---------------) + I risor - 0x002346c5, // n0x1710 c0x0000 (---------------) + I rissa - 0x4021d702, // n0x1711 c0x0100 (n0x1877-n0x1878) + I rl - 0x002dfe44, // n0x1712 c0x0000 (---------------) + I roan - 0x0036a305, // n0x1713 c0x0000 (---------------) + I rodoy - 0x0033c1c6, // n0x1714 c0x0000 (---------------) + I rollag - 0x00302a85, // n0x1715 c0x0000 (---------------) + I romsa - 0x0023d587, // n0x1716 c0x0000 (---------------) + I romskog - 0x002e3245, // n0x1717 c0x0000 (---------------) + I roros - 0x00263e44, // n0x1718 c0x0000 (---------------) + I rost - 0x0030dd46, // n0x1719 c0x0000 (---------------) + I royken - 0x002c7587, // n0x171a c0x0000 (---------------) + I royrvik - 0x002dcb86, // n0x171b c0x0000 (---------------) + I ruovat - 0x00268ac5, // n0x171c c0x0000 (---------------) + I rygge - 0x0031ce08, // n0x171d c0x0000 (---------------) + I salangen - 0x0031de05, // n0x171e c0x0000 (---------------) + I salat - 0x00341347, // n0x171f c0x0000 (---------------) + I saltdal - 0x0035b289, // n0x1720 c0x0000 (---------------) + I samnanger - 0x0029dd0a, // n0x1721 c0x0000 (---------------) + I sandefjord - 0x0023bac7, // n0x1722 c0x0000 (---------------) + I sandnes - 0x0023bacc, // n0x1723 c0x0000 (---------------) + I sandnessjoen - 0x0034bf86, // n0x1724 c0x0000 (---------------) + I sandoy - 0x0021db49, // n0x1725 c0x0000 (---------------) + I sarpsborg - 0x0022d7c5, // n0x1726 c0x0000 (---------------) + I sauda - 0x0022da88, // n0x1727 c0x0000 (---------------) + I sauherad - 0x0020a4c3, // n0x1728 c0x0000 (---------------) + I sel - 0x0020a4c5, // n0x1729 c0x0000 (---------------) + I selbu - 0x002fad85, // n0x172a c0x0000 (---------------) + I selje - 0x00245cc7, // n0x172b c0x0000 (---------------) + I seljord - 0x4060f182, // n0x172c c0x0101 (n0x1878-n0x1879) + I sf - 0x0023b647, // n0x172d c0x0000 (---------------) + I siellak - 0x002b79c6, // n0x172e c0x0000 (---------------) + I sigdal - 0x00214b46, // n0x172f c0x0000 (---------------) + I siljan - 0x002c1186, // n0x1730 c0x0000 (---------------) + I sirdal - 0x00267706, // n0x1731 c0x0000 (---------------) + I skanit - 0x00310108, // n0x1732 c0x0000 (---------------) + I skanland - 0x00262585, // n0x1733 c0x0000 (---------------) + I skaun - 0x002c3207, // n0x1734 c0x0000 (---------------) + I skedsmo - 0x002c320d, // n0x1735 c0x0000 (---------------) + I skedsmokorset - 0x00207b43, // n0x1736 c0x0000 (---------------) + I ski - 0x00207b45, // n0x1737 c0x0000 (---------------) + I skien - 0x002f2d47, // n0x1738 c0x0000 (---------------) + I skierva - 0x0036b048, // n0x1739 c0x0000 (---------------) + I skiptvet - 0x0036ac05, // n0x173a c0x0000 (---------------) + I skjak - 0x0030c348, // n0x173b c0x0000 (---------------) + I skjervoy - 0x002206c6, // n0x173c c0x0000 (---------------) + I skodje - 0x0022a247, // n0x173d c0x0000 (---------------) + I slattum - 0x00285605, // n0x173e c0x0000 (---------------) + I smola - 0x0021b486, // n0x173f c0x0000 (---------------) + I snaase - 0x00340405, // n0x1740 c0x0000 (---------------) + I snasa - 0x002aa34a, // n0x1741 c0x0000 (---------------) + I snillfjord - 0x002c4f86, // n0x1742 c0x0000 (---------------) + I snoasa - 0x002141c7, // n0x1743 c0x0000 (---------------) + I sogndal - 0x00308285, // n0x1744 c0x0000 (---------------) + I sogne - 0x002d9347, // n0x1745 c0x0000 (---------------) + I sokndal - 0x002d0204, // n0x1746 c0x0000 (---------------) + I sola - 0x002d8b06, // n0x1747 c0x0000 (---------------) + I solund - 0x002da005, // n0x1748 c0x0000 (---------------) + I somna - 0x002ee70b, // n0x1749 c0x0000 (---------------) + I sondre-land - 0x00364509, // n0x174a c0x0000 (---------------) + I songdalen - 0x0037184a, // n0x174b c0x0000 (---------------) + I sor-aurdal - 0x0025b548, // n0x174c c0x0000 (---------------) + I sor-fron - 0x002e0f48, // n0x174d c0x0000 (---------------) + I sor-odal - 0x002e888c, // n0x174e c0x0000 (---------------) + I sor-varanger - 0x002ec987, // n0x174f c0x0000 (---------------) + I sorfold - 0x00315608, // n0x1750 c0x0000 (---------------) + I sorreisa - 0x0031a288, // n0x1751 c0x0000 (---------------) + I sortland - 0x0031ee45, // n0x1752 c0x0000 (---------------) + I sorum - 0x002ac70a, // n0x1753 c0x0000 (---------------) + I spjelkavik - 0x00349a49, // n0x1754 c0x0000 (---------------) + I spydeberg - 0x40a023c2, // n0x1755 c0x0102 (n0x1879-n0x187a) + I st - 0x00309986, // n0x1756 c0x0000 (---------------) + I stange - 0x0029ca04, // n0x1757 c0x0000 (---------------) + I stat - 0x0029e909, // n0x1758 c0x0000 (---------------) + I stathelle - 0x002c92c9, // n0x1759 c0x0000 (---------------) + I stavanger - 0x002d97c7, // n0x175a c0x0000 (---------------) + I stavern - 0x0025c087, // n0x175b c0x0000 (---------------) + I steigen - 0x003374c9, // n0x175c c0x0000 (---------------) + I steinkjer - 0x00202b88, // n0x175d c0x0000 (---------------) + I stjordal - 0x00202b8f, // n0x175e c0x0000 (---------------) + I stjordalshalsen - 0x00228bc6, // n0x175f c0x0000 (---------------) + I stokke - 0x0023f24b, // n0x1760 c0x0000 (---------------) + I stor-elvdal - 0x002cf305, // n0x1761 c0x0000 (---------------) + I stord - 0x002cf307, // n0x1762 c0x0000 (---------------) + I stordal - 0x002cf749, // n0x1763 c0x0000 (---------------) + I storfjord - 0x0023dac6, // n0x1764 c0x0000 (---------------) + I strand - 0x0023dac7, // n0x1765 c0x0000 (---------------) + I stranda - 0x0037fd45, // n0x1766 c0x0000 (---------------) + I stryn - 0x00224fc4, // n0x1767 c0x0000 (---------------) + I sula - 0x00226b46, // n0x1768 c0x0000 (---------------) + I suldal - 0x00218c84, // n0x1769 c0x0000 (---------------) + I sund - 0x002a9c87, // n0x176a c0x0000 (---------------) + I sunndal - 0x002d1a88, // n0x176b c0x0000 (---------------) + I surnadal - 0x40ed36c8, // n0x176c c0x0103 (n0x187a-n0x187b) + I svalbard - 0x002d4485, // n0x176d c0x0000 (---------------) + I sveio - 0x002d45c7, // n0x176e c0x0000 (---------------) + I svelvik - 0x00354549, // n0x176f c0x0000 (---------------) + I sykkylven - 0x00204e04, // n0x1770 c0x0000 (---------------) + I tana - 0x00204e08, // n0x1771 c0x0000 (---------------) + I tananger - 0x4122ba88, // n0x1772 c0x0104 (n0x187b-n0x187d) o I telemark - 0x0036ef44, // n0x1773 c0x0000 (---------------) + I time - 0x00225c08, // n0x1774 c0x0000 (---------------) + I tingvoll - 0x0030cf04, // n0x1775 c0x0000 (---------------) + I tinn - 0x0021fb09, // n0x1776 c0x0000 (---------------) + I tjeldsund - 0x00259c45, // n0x1777 c0x0000 (---------------) + I tjome - 0x41608902, // n0x1778 c0x0105 (n0x187d-n0x187e) + I tm - 0x00228c05, // n0x1779 c0x0000 (---------------) + I tokke - 0x00215ac5, // n0x177a c0x0000 (---------------) + I tolga - 0x00204608, // n0x177b c0x0000 (---------------) + I tonsberg - 0x00226fc7, // n0x177c c0x0000 (---------------) + I torsken - 0x41a02402, // n0x177d c0x0106 (n0x187e-n0x187f) + I tr - 0x0025ab85, // n0x177e c0x0000 (---------------) + I trana - 0x00263106, // n0x177f c0x0000 (---------------) + I tranby - 0x00278cc6, // n0x1780 c0x0000 (---------------) + I tranoy - 0x002dfe08, // n0x1781 c0x0000 (---------------) + I troandin - 0x002e4348, // n0x1782 c0x0000 (---------------) + I trogstad - 0x00302a46, // n0x1783 c0x0000 (---------------) + I tromsa - 0x0030ac06, // n0x1784 c0x0000 (---------------) + I tromso - 0x00214709, // n0x1785 c0x0000 (---------------) + I trondheim - 0x0036b846, // n0x1786 c0x0000 (---------------) + I trysil - 0x00394d4b, // n0x1787 c0x0000 (---------------) + I tvedestrand - 0x00222c85, // n0x1788 c0x0000 (---------------) + I tydal - 0x0020fac6, // n0x1789 c0x0000 (---------------) + I tynset - 0x00224108, // n0x178a c0x0000 (---------------) + I tysfjord - 0x00234886, // n0x178b c0x0000 (---------------) + I tysnes - 0x002f8986, // n0x178c c0x0000 (---------------) + I tysvar - 0x00210dca, // n0x178d c0x0000 (---------------) + I ullensaker - 0x002bab8a, // n0x178e c0x0000 (---------------) + I ullensvang - 0x0025bd05, // n0x178f c0x0000 (---------------) + I ulvik - 0x00215307, // n0x1790 c0x0000 (---------------) + I unjarga - 0x002d0d06, // n0x1791 c0x0000 (---------------) + I utsira - 0x41e013c2, // n0x1792 c0x0107 (n0x187f-n0x1880) + I va - 0x002f2e87, // n0x1793 c0x0000 (---------------) + I vaapste - 0x00262a85, // n0x1794 c0x0000 (---------------) + I vadso - 0x00343f44, // n0x1795 c0x0000 (---------------) + I vaga - 0x00343f45, // n0x1796 c0x0000 (---------------) + I vagan - 0x00300c06, // n0x1797 c0x0000 (---------------) + I vagsoy - 0x0033f147, // n0x1798 c0x0000 (---------------) + I vaksdal - 0x00213d85, // n0x1799 c0x0000 (---------------) + I valle - 0x002bad04, // n0x179a c0x0000 (---------------) + I vang - 0x0025c3c8, // n0x179b c0x0000 (---------------) + I vanylven - 0x002f8a45, // n0x179c c0x0000 (---------------) + I vardo - 0x00280307, // n0x179d c0x0000 (---------------) + I varggat - 0x002cf005, // n0x179e c0x0000 (---------------) + I varoy - 0x00310385, // n0x179f c0x0000 (---------------) + I vefsn - 0x00212004, // n0x17a0 c0x0000 (---------------) + I vega - 0x00299e89, // n0x17a1 c0x0000 (---------------) + I vegarshei - 0x00212448, // n0x17a2 c0x0000 (---------------) + I vennesla - 0x00212286, // n0x17a3 c0x0000 (---------------) + I verdal - 0x00386a06, // n0x17a4 c0x0000 (---------------) + I verran - 0x002b9c46, // n0x17a5 c0x0000 (---------------) + I vestby - 0x422d9c88, // n0x17a6 c0x0108 (n0x1880-n0x1881) o I vestfold - 0x002d9e87, // n0x17a7 c0x0000 (---------------) + I vestnes - 0x002da30d, // n0x17a8 c0x0000 (---------------) + I vestre-slidre - 0x002da90c, // n0x17a9 c0x0000 (---------------) + I vestre-toten - 0x002daf09, // n0x17aa c0x0000 (---------------) + I vestvagoy - 0x002db149, // n0x17ab c0x0000 (---------------) + I vevelstad - 0x4273b4c2, // n0x17ac c0x0109 (n0x1881-n0x1882) + I vf - 0x0038c903, // n0x17ad c0x0000 (---------------) + I vgs - 0x00244c83, // n0x17ae c0x0000 (---------------) + I vik - 0x00364745, // n0x17af c0x0000 (---------------) + I vikna - 0x0037620a, // n0x17b0 c0x0000 (---------------) + I vindafjord - 0x00302906, // n0x17b1 c0x0000 (---------------) + I voagat - 0x002df605, // n0x17b2 c0x0000 (---------------) + I volda - 0x002e21c4, // n0x17b3 c0x0000 (---------------) + I voss - 0x002e21cb, // n0x17b4 c0x0000 (---------------) + I vossevangen - 0x002f6e0c, // n0x17b5 c0x0000 (---------------) + I xn--andy-ira - 0x002f764c, // n0x17b6 c0x0000 (---------------) + I xn--asky-ira - 0x002f7955, // n0x17b7 c0x0000 (---------------) + I xn--aurskog-hland-jnb - 0x002f984d, // n0x17b8 c0x0000 (---------------) + I xn--avery-yua - 0x002fbb0f, // n0x17b9 c0x0000 (---------------) + I xn--bdddj-mrabd - 0x002fbed2, // n0x17ba c0x0000 (---------------) + I xn--bearalvhki-y4a - 0x002fc34f, // n0x17bb c0x0000 (---------------) + I xn--berlevg-jxa - 0x002fc712, // n0x17bc c0x0000 (---------------) + I xn--bhcavuotna-s4a - 0x002fcb93, // n0x17bd c0x0000 (---------------) + I xn--bhccavuotna-k7a - 0x002fd04d, // n0x17be c0x0000 (---------------) + I xn--bidr-5nac - 0x002fd60d, // n0x17bf c0x0000 (---------------) + I xn--bievt-0qa - 0x002fd94e, // n0x17c0 c0x0000 (---------------) + I xn--bjarky-fya - 0x002fde0e, // n0x17c1 c0x0000 (---------------) + I xn--bjddar-pta - 0x002fec8c, // n0x17c2 c0x0000 (---------------) + I xn--blt-elab - 0x002ff00c, // n0x17c3 c0x0000 (---------------) + I xn--bmlo-gra - 0x002ff44b, // n0x17c4 c0x0000 (---------------) + I xn--bod-2na - 0x002ff7ce, // n0x17c5 c0x0000 (---------------) + I xn--brnny-wuac - 0x00301b92, // n0x17c6 c0x0000 (---------------) + I xn--brnnysund-m8ac - 0x003026cc, // n0x17c7 c0x0000 (---------------) + I xn--brum-voa - 0x00302e90, // n0x17c8 c0x0000 (---------------) + I xn--btsfjord-9za - 0x003138d2, // n0x17c9 c0x0000 (---------------) + I xn--davvenjrga-y4a - 0x0031458c, // n0x17ca c0x0000 (---------------) + I xn--dnna-gra - 0x00314a4d, // n0x17cb c0x0000 (---------------) + I xn--drbak-wua - 0x00314d8c, // n0x17cc c0x0000 (---------------) + I xn--dyry-ira - 0x00317b91, // n0x17cd c0x0000 (---------------) + I xn--eveni-0qa01ga - 0x00319c0d, // n0x17ce c0x0000 (---------------) + I xn--finny-yua - 0x0031f74d, // n0x17cf c0x0000 (---------------) + I xn--fjord-lra - 0x0031fd4a, // n0x17d0 c0x0000 (---------------) + I xn--fl-zia - 0x0031ffcc, // n0x17d1 c0x0000 (---------------) + I xn--flor-jra - 0x003208cc, // n0x17d2 c0x0000 (---------------) + I xn--frde-gra - 0x0032110c, // n0x17d3 c0x0000 (---------------) + I xn--frna-woa - 0x00321b0c, // n0x17d4 c0x0000 (---------------) + I xn--frya-hra - 0x00324f13, // n0x17d5 c0x0000 (---------------) + I xn--ggaviika-8ya47h - 0x00326650, // n0x17d6 c0x0000 (---------------) + I xn--gildeskl-g0a - 0x00326a50, // n0x17d7 c0x0000 (---------------) + I xn--givuotna-8ya - 0x0032714d, // n0x17d8 c0x0000 (---------------) + I xn--gjvik-wua - 0x0032748c, // n0x17d9 c0x0000 (---------------) + I xn--gls-elac - 0x00328189, // n0x17da c0x0000 (---------------) + I xn--h-2fa - 0x0032900d, // n0x17db c0x0000 (---------------) + I xn--hbmer-xqa - 0x00329353, // n0x17dc c0x0000 (---------------) + I xn--hcesuolo-7ya35b - 0x0032c151, // n0x17dd c0x0000 (---------------) + I xn--hgebostad-g3a - 0x0032c593, // n0x17de c0x0000 (---------------) + I xn--hmmrfeasta-s4ac - 0x0032e38f, // n0x17df c0x0000 (---------------) + I xn--hnefoss-q1a - 0x0032e74c, // n0x17e0 c0x0000 (---------------) + I xn--hobl-ira - 0x0032ea4f, // n0x17e1 c0x0000 (---------------) + I xn--holtlen-hxa - 0x0032ee0d, // n0x17e2 c0x0000 (---------------) + I xn--hpmir-xqa - 0x0032f40f, // n0x17e3 c0x0000 (---------------) + I xn--hyanger-q1a - 0x0032f7d0, // n0x17e4 c0x0000 (---------------) + I xn--hylandet-54a - 0x0033024e, // n0x17e5 c0x0000 (---------------) + I xn--indery-fya - 0x00332a0e, // n0x17e6 c0x0000 (---------------) + I xn--jlster-bya - 0x00333150, // n0x17e7 c0x0000 (---------------) + I xn--jrpeland-54a - 0x00333e8d, // n0x17e8 c0x0000 (---------------) + I xn--karmy-yua - 0x0033480e, // n0x17e9 c0x0000 (---------------) + I xn--kfjord-iua - 0x00334b8c, // n0x17ea c0x0000 (---------------) + I xn--klbu-woa - 0x00336b53, // n0x17eb c0x0000 (---------------) + I xn--koluokta-7ya57h - 0x0033934e, // n0x17ec c0x0000 (---------------) + I xn--krager-gya - 0x00339b10, // n0x17ed c0x0000 (---------------) + I xn--kranghke-b0a - 0x00339f11, // n0x17ee c0x0000 (---------------) + I xn--krdsherad-m8a - 0x0033a34f, // n0x17ef c0x0000 (---------------) + I xn--krehamn-dxa - 0x0033a713, // n0x17f0 c0x0000 (---------------) + I xn--krjohka-hwab49j - 0x0033b04d, // n0x17f1 c0x0000 (---------------) + I xn--ksnes-uua - 0x0033b38f, // n0x17f2 c0x0000 (---------------) + I xn--kvfjord-nxa - 0x0033b74e, // n0x17f3 c0x0000 (---------------) + I xn--kvitsy-fya - 0x0033d050, // n0x17f4 c0x0000 (---------------) + I xn--kvnangen-k0a - 0x0033d449, // n0x17f5 c0x0000 (---------------) + I xn--l-1fa - 0x0033e4d0, // n0x17f6 c0x0000 (---------------) + I xn--laheadju-7ya - 0x0033f30f, // n0x17f7 c0x0000 (---------------) + I xn--langevg-jxa - 0x0033f98f, // n0x17f8 c0x0000 (---------------) + I xn--ldingen-q1a - 0x0033fd52, // n0x17f9 c0x0000 (---------------) + I xn--leagaviika-52b - 0x00344a4e, // n0x17fa c0x0000 (---------------) + I xn--lesund-hua - 0x0034534d, // n0x17fb c0x0000 (---------------) + I xn--lgrd-poac - 0x00345bcd, // n0x17fc c0x0000 (---------------) + I xn--lhppi-xqa - 0x00345f0d, // n0x17fd c0x0000 (---------------) + I xn--linds-pra - 0x00347a8d, // n0x17fe c0x0000 (---------------) + I xn--loabt-0qa - 0x00347dcd, // n0x17ff c0x0000 (---------------) + I xn--lrdal-sra - 0x00348110, // n0x1800 c0x0000 (---------------) + I xn--lrenskog-54a - 0x0034850b, // n0x1801 c0x0000 (---------------) + I xn--lt-liac - 0x00348a8c, // n0x1802 c0x0000 (---------------) + I xn--lten-gra - 0x00348e0c, // n0x1803 c0x0000 (---------------) + I xn--lury-ira - 0x0034910c, // n0x1804 c0x0000 (---------------) + I xn--mely-ira - 0x0034940e, // n0x1805 c0x0000 (---------------) + I xn--merker-kua - 0x00356890, // n0x1806 c0x0000 (---------------) + I xn--mjndalen-64a - 0x003581d2, // n0x1807 c0x0000 (---------------) + I xn--mlatvuopmi-s4a - 0x0035864b, // n0x1808 c0x0000 (---------------) + I xn--mli-tla - 0x00358a8e, // n0x1809 c0x0000 (---------------) + I xn--mlselv-iua - 0x00358e0e, // n0x180a c0x0000 (---------------) + I xn--moreke-jua - 0x0035960e, // n0x180b c0x0000 (---------------) + I xn--mosjen-eya - 0x0035a4cb, // n0x180c c0x0000 (---------------) + I xn--mot-tla - 0x42b5a856, // n0x180d c0x010a (n0x1882-n0x1884) o I xn--mre-og-romsdal-qqb - 0x0035b4cd, // n0x180e c0x0000 (---------------) + I xn--msy-ula0h - 0x0035b954, // n0x180f c0x0000 (---------------) + I xn--mtta-vrjjat-k7af - 0x0035c38d, // n0x1810 c0x0000 (---------------) + I xn--muost-0qa - 0x0035d715, // n0x1811 c0x0000 (---------------) + I xn--nmesjevuemie-tcba - 0x0036060d, // n0x1812 c0x0000 (---------------) + I xn--nry-yla5g - 0x00360f8f, // n0x1813 c0x0000 (---------------) + I xn--nttery-byae - 0x00361bcf, // n0x1814 c0x0000 (---------------) + I xn--nvuotna-hwa - 0x003652cf, // n0x1815 c0x0000 (---------------) + I xn--oppegrd-ixa - 0x0036568e, // n0x1816 c0x0000 (---------------) + I xn--ostery-fya - 0x00365d4d, // n0x1817 c0x0000 (---------------) + I xn--osyro-wua - 0x00368211, // n0x1818 c0x0000 (---------------) + I xn--porsgu-sta26f - 0x0036f34c, // n0x1819 c0x0000 (---------------) + I xn--rady-ira - 0x0036f64c, // n0x181a c0x0000 (---------------) + I xn--rdal-poa - 0x0036f94b, // n0x181b c0x0000 (---------------) + I xn--rde-ula - 0x0036fc0c, // n0x181c c0x0000 (---------------) + I xn--rdy-0nab - 0x0036ffcf, // n0x181d c0x0000 (---------------) + I xn--rennesy-v1a - 0x00370392, // n0x181e c0x0000 (---------------) + I xn--rhkkervju-01af - 0x00371acd, // n0x181f c0x0000 (---------------) + I xn--rholt-mra - 0x00372d0c, // n0x1820 c0x0000 (---------------) + I xn--risa-5na - 0x0037318c, // n0x1821 c0x0000 (---------------) + I xn--risr-ira - 0x0037348d, // n0x1822 c0x0000 (---------------) + I xn--rland-uua - 0x003737cf, // n0x1823 c0x0000 (---------------) + I xn--rlingen-mxa - 0x00373b8e, // n0x1824 c0x0000 (---------------) + I xn--rmskog-bya - 0x00375ecc, // n0x1825 c0x0000 (---------------) + I xn--rros-gra - 0x0037648d, // n0x1826 c0x0000 (---------------) + I xn--rskog-uua - 0x003767cb, // n0x1827 c0x0000 (---------------) + I xn--rst-0na - 0x00376fcc, // n0x1828 c0x0000 (---------------) + I xn--rsta-fra - 0x0037754d, // n0x1829 c0x0000 (---------------) + I xn--ryken-vua - 0x0037788e, // n0x182a c0x0000 (---------------) + I xn--ryrvik-bya - 0x00377d09, // n0x182b c0x0000 (---------------) + I xn--s-1fa - 0x00378b53, // n0x182c c0x0000 (---------------) + I xn--sandnessjen-ogb - 0x0037940d, // n0x182d c0x0000 (---------------) + I xn--sandy-yua - 0x0037974d, // n0x182e c0x0000 (---------------) + I xn--seral-lra - 0x00379d4c, // n0x182f c0x0000 (---------------) + I xn--sgne-gra - 0x0037a1ce, // n0x1830 c0x0000 (---------------) + I xn--skierv-uta - 0x0037b34f, // n0x1831 c0x0000 (---------------) + I xn--skjervy-v1a - 0x0037b70c, // n0x1832 c0x0000 (---------------) + I xn--skjk-soa - 0x0037ba0d, // n0x1833 c0x0000 (---------------) + I xn--sknit-yqa - 0x0037bd4f, // n0x1834 c0x0000 (---------------) + I xn--sknland-fxa - 0x0037c10c, // n0x1835 c0x0000 (---------------) + I xn--slat-5na - 0x0037c74c, // n0x1836 c0x0000 (---------------) + I xn--slt-elab - 0x0037cb0c, // n0x1837 c0x0000 (---------------) + I xn--smla-hra - 0x0037ce0c, // n0x1838 c0x0000 (---------------) + I xn--smna-gra - 0x0037d4cd, // n0x1839 c0x0000 (---------------) + I xn--snase-nra - 0x0037d812, // n0x183a c0x0000 (---------------) + I xn--sndre-land-0cb - 0x0037de8c, // n0x183b c0x0000 (---------------) + I xn--snes-poa - 0x0037e18c, // n0x183c c0x0000 (---------------) + I xn--snsa-roa - 0x0037e491, // n0x183d c0x0000 (---------------) + I xn--sr-aurdal-l8a - 0x0037e8cf, // n0x183e c0x0000 (---------------) + I xn--sr-fron-q1a - 0x0037ec8f, // n0x183f c0x0000 (---------------) + I xn--sr-odal-q1a - 0x0037f053, // n0x1840 c0x0000 (---------------) + I xn--sr-varanger-ggb - 0x003801ce, // n0x1841 c0x0000 (---------------) + I xn--srfold-bya - 0x0038074f, // n0x1842 c0x0000 (---------------) + I xn--srreisa-q1a - 0x00380b0c, // n0x1843 c0x0000 (---------------) + I xn--srum-gra - 0x42f80e4e, // n0x1844 c0x010b (n0x1884-n0x1885) o I xn--stfold-9xa - 0x003811cf, // n0x1845 c0x0000 (---------------) + I xn--stjrdal-s1a - 0x00381596, // n0x1846 c0x0000 (---------------) + I xn--stjrdalshalsen-sqb - 0x00382652, // n0x1847 c0x0000 (---------------) + I xn--stre-toten-zcb - 0x0038448c, // n0x1848 c0x0000 (---------------) + I xn--tjme-hra - 0x003850cf, // n0x1849 c0x0000 (---------------) + I xn--tnsberg-q1a - 0x0038574d, // n0x184a c0x0000 (---------------) + I xn--trany-yua - 0x00385a8f, // n0x184b c0x0000 (---------------) + I xn--trgstad-r1a - 0x00385e4c, // n0x184c c0x0000 (---------------) + I xn--trna-woa - 0x0038614d, // n0x184d c0x0000 (---------------) + I xn--troms-zua - 0x0038648d, // n0x184e c0x0000 (---------------) + I xn--tysvr-vra - 0x003876ce, // n0x184f c0x0000 (---------------) + I xn--unjrga-rta - 0x0038850c, // n0x1850 c0x0000 (---------------) + I xn--vads-jra - 0x0038880c, // n0x1851 c0x0000 (---------------) + I xn--vard-jra - 0x00388b10, // n0x1852 c0x0000 (---------------) + I xn--vegrshei-c0a - 0x0038b251, // n0x1853 c0x0000 (---------------) + I xn--vestvgy-ixa6o - 0x0038b68b, // n0x1854 c0x0000 (---------------) + I xn--vg-yiab - 0x0038c50c, // n0x1855 c0x0000 (---------------) + I xn--vgan-qoa - 0x0038c80e, // n0x1856 c0x0000 (---------------) + I xn--vgsy-qoa0j - 0x0038e511, // n0x1857 c0x0000 (---------------) + I xn--vre-eiker-k8a - 0x0038e94e, // n0x1858 c0x0000 (---------------) + I xn--vrggt-xqad - 0x0038eccd, // n0x1859 c0x0000 (---------------) + I xn--vry-yla5g - 0x00392fcb, // n0x185a c0x0000 (---------------) + I xn--yer-zna - 0x00393c0f, // n0x185b c0x0000 (---------------) + I xn--ygarden-p1a - 0x00394594, // n0x185c c0x0000 (---------------) + I xn--ystre-slidre-ujb - 0x0026cd02, // n0x185d c0x0000 (---------------) + I gs - 0x0026cd02, // n0x185e c0x0000 (---------------) + I gs - 0x00201083, // n0x185f c0x0000 (---------------) + I nes - 0x0026cd02, // n0x1860 c0x0000 (---------------) + I gs - 0x00201083, // n0x1861 c0x0000 (---------------) + I nes - 0x0026cd02, // n0x1862 c0x0000 (---------------) + I gs - 0x00202382, // n0x1863 c0x0000 (---------------) + I os - 0x00351305, // n0x1864 c0x0000 (---------------) + I valer - 0x0038e20c, // n0x1865 c0x0000 (---------------) + I xn--vler-qoa - 0x0026cd02, // n0x1866 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1867 c0x0000 (---------------) + I gs - 0x00202382, // n0x1868 c0x0000 (---------------) + I os - 0x0026cd02, // n0x1869 c0x0000 (---------------) + I gs - 0x00280105, // n0x186a c0x0000 (---------------) + I heroy - 0x0029dd05, // n0x186b c0x0000 (---------------) + I sande - 0x0026cd02, // n0x186c c0x0000 (---------------) + I gs - 0x0026cd02, // n0x186d c0x0000 (---------------) + I gs - 0x0020a702, // n0x186e c0x0000 (---------------) + I bo - 0x00280105, // n0x186f c0x0000 (---------------) + I heroy - 0x002fa209, // n0x1870 c0x0000 (---------------) + I xn--b-5ga - 0x0032be4c, // n0x1871 c0x0000 (---------------) + I xn--hery-ira - 0x0026cd02, // n0x1872 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1873 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1874 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1875 c0x0000 (---------------) + I gs - 0x00351305, // n0x1876 c0x0000 (---------------) + I valer - 0x0026cd02, // n0x1877 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1878 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1879 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x187a c0x0000 (---------------) + I gs - 0x0020a702, // n0x187b c0x0000 (---------------) + I bo - 0x002fa209, // n0x187c c0x0000 (---------------) + I xn--b-5ga - 0x0026cd02, // n0x187d c0x0000 (---------------) + I gs - 0x0026cd02, // n0x187e c0x0000 (---------------) + I gs - 0x0026cd02, // n0x187f c0x0000 (---------------) + I gs - 0x0029dd05, // n0x1880 c0x0000 (---------------) + I sande - 0x0026cd02, // n0x1881 c0x0000 (---------------) + I gs - 0x0029dd05, // n0x1882 c0x0000 (---------------) + I sande - 0x0032be4c, // n0x1883 c0x0000 (---------------) + I xn--hery-ira - 0x0038e20c, // n0x1884 c0x0000 (---------------) + I xn--vler-qoa - 0x00310603, // n0x1885 c0x0000 (---------------) + I biz - 0x00222ac3, // n0x1886 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1887 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1888 c0x0000 (---------------) + I gov - 0x00200304, // n0x1889 c0x0000 (---------------) + I info - 0x002170c3, // n0x188a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x188b c0x0000 (---------------) + I org - 0x00166bc8, // n0x188c c0x0000 (---------------) + merseine - 0x0007c1c4, // n0x188d c0x0000 (---------------) + mine - 0x000cb2c8, // n0x188e c0x0000 (---------------) + shacknet - 0x00201e82, // n0x188f c0x0000 (---------------) + I ac - 0x43e00742, // n0x1890 c0x010f (n0x189f-n0x18a0) + I co - 0x002319c3, // n0x1891 c0x0000 (---------------) + I cri - 0x00252f84, // n0x1892 c0x0000 (---------------) + I geek - 0x002012c3, // n0x1893 c0x0000 (---------------) + I gen - 0x0021e284, // n0x1894 c0x0000 (---------------) + I govt - 0x00205e06, // n0x1895 c0x0000 (---------------) + I health - 0x002d2e03, // n0x1896 c0x0000 (---------------) + I iwi - 0x002d2dc4, // n0x1897 c0x0000 (---------------) + I kiwi - 0x002701c5, // n0x1898 c0x0000 (---------------) + I maori - 0x0023fa03, // n0x1899 c0x0000 (---------------) + I mil - 0x002170c3, // n0x189a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x189b c0x0000 (---------------) + I org - 0x002647ca, // n0x189c c0x0000 (---------------) + I parliament - 0x00235406, // n0x189d c0x0000 (---------------) + I school - 0x0035918c, // n0x189e c0x0000 (---------------) + I xn--mori-qsa - 0x000e4188, // n0x189f c0x0000 (---------------) + blogspot - 0x00200742, // n0x18a0 c0x0000 (---------------) + I co - 0x00222ac3, // n0x18a1 c0x0000 (---------------) + I com - 0x002d75c3, // n0x18a2 c0x0000 (---------------) + I edu - 0x0021e283, // n0x18a3 c0x0000 (---------------) + I gov - 0x0020b403, // n0x18a4 c0x0000 (---------------) + I med - 0x002bd646, // n0x18a5 c0x0000 (---------------) + I museum - 0x002170c3, // n0x18a6 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x18a7 c0x0000 (---------------) + I org - 0x00218243, // n0x18a8 c0x0000 (---------------) + I pro - 0x00004342, // n0x18a9 c0x0000 (---------------) + ae - 0x000d0087, // n0x18aa c0x0000 (---------------) + blogdns - 0x001619c8, // n0x18ab c0x0000 (---------------) + blogsite - 0x00076592, // n0x18ac c0x0000 (---------------) + boldlygoingnowhere - 0x44a2a085, // n0x18ad c0x0112 (n0x18e3-n0x18e5) o I cdn77 - 0x44f0720c, // n0x18ae c0x0113 (n0x18e5-n0x18e6) o I cdn77-secure - 0x00146fc8, // n0x18af c0x0000 (---------------) + dnsalias - 0x0006a247, // n0x18b0 c0x0000 (---------------) + dnsdojo - 0x00010a4b, // n0x18b1 c0x0000 (---------------) + doesntexist - 0x0015fdc9, // n0x18b2 c0x0000 (---------------) + dontexist - 0x00146ec7, // n0x18b3 c0x0000 (---------------) + doomdns - 0x0006a147, // n0x18b4 c0x0000 (---------------) + duckdns - 0x00194fc6, // n0x18b5 c0x0000 (---------------) + dvrdns - 0x000007c8, // n0x18b6 c0x0000 (---------------) + dynalias - 0x45409ac6, // n0x18b7 c0x0115 (n0x18e7-n0x18e9) + dyndns - 0x0009428d, // n0x18b8 c0x0000 (---------------) + endofinternet - 0x000f3e50, // n0x18b9 c0x0000 (---------------) + endoftheinternet - 0x4581d5c2, // n0x18ba c0x0116 (n0x18e9-n0x1920) + eu - 0x00057807, // n0x18bb c0x0000 (---------------) + from-me - 0x00083589, // n0x18bc c0x0000 (---------------) + game-host - 0x00043a86, // n0x18bd c0x0000 (---------------) + gotdns - 0x0002ea02, // n0x18be c0x0000 (---------------) + hk - 0x0013eeca, // n0x18bf c0x0000 (---------------) + hobby-site - 0x0000b387, // n0x18c0 c0x0000 (---------------) + homedns - 0x00085007, // n0x18c1 c0x0000 (---------------) + homeftp - 0x00090ec9, // n0x18c2 c0x0000 (---------------) + homelinux - 0x00091b88, // n0x18c3 c0x0000 (---------------) + homeunix - 0x000c528e, // n0x18c4 c0x0000 (---------------) + is-a-bruinsfan - 0x00008d8e, // n0x18c5 c0x0000 (---------------) + is-a-candidate - 0x0000eecf, // n0x18c6 c0x0000 (---------------) + is-a-celticsfan - 0x00166909, // n0x18c7 c0x0000 (---------------) + is-a-chef - 0x00052e49, // n0x18c8 c0x0000 (---------------) + is-a-geek - 0x0006b8cb, // n0x18c9 c0x0000 (---------------) + is-a-knight - 0x001259cf, // n0x18ca c0x0000 (---------------) + is-a-linux-user - 0x0008480c, // n0x18cb c0x0000 (---------------) + is-a-patsfan - 0x000d23cb, // n0x18cc c0x0000 (---------------) + is-a-soxfan - 0x00103ac8, // n0x18cd c0x0000 (---------------) + is-found - 0x000d6887, // n0x18ce c0x0000 (---------------) + is-lost - 0x000e2908, // n0x18cf c0x0000 (---------------) + is-saved - 0x0012148b, // n0x18d0 c0x0000 (---------------) + is-very-bad - 0x00127b0c, // n0x18d1 c0x0000 (---------------) + is-very-evil - 0x00130a4c, // n0x18d2 c0x0000 (---------------) + is-very-good - 0x0013904c, // n0x18d3 c0x0000 (---------------) + is-very-nice - 0x0013bb8d, // n0x18d4 c0x0000 (---------------) + is-very-sweet - 0x00191648, // n0x18d5 c0x0000 (---------------) + isa-geek - 0x00183609, // n0x18d6 c0x0000 (---------------) + kicks-ass - 0x0016a6cb, // n0x18d7 c0x0000 (---------------) + misconfused - 0x000c7e07, // n0x18d8 c0x0000 (---------------) + podzone - 0x0016184a, // n0x18d9 c0x0000 (---------------) + readmyblog - 0x00130f46, // n0x18da c0x0000 (---------------) + selfip - 0x00084dcd, // n0x18db c0x0000 (---------------) + sellsyourhome - 0x00079088, // n0x18dc c0x0000 (---------------) + servebbs - 0x00161348, // n0x18dd c0x0000 (---------------) + serveftp - 0x00011f49, // n0x18de c0x0000 (---------------) + servegame - 0x000d044c, // n0x18df c0x0000 (---------------) + stuff-4-sale - 0x00009f42, // n0x18e0 c0x0000 (---------------) + us - 0x00110e86, // n0x18e1 c0x0000 (---------------) + webhop - 0x000043c2, // n0x18e2 c0x0000 (---------------) + za - 0x00000741, // n0x18e3 c0x0000 (---------------) + c - 0x000060c3, // n0x18e4 c0x0000 (---------------) + rsc - 0x45374606, // n0x18e5 c0x0114 (n0x18e6-n0x18e7) o I origin - 0x0002a203, // n0x18e6 c0x0000 (---------------) + ssl - 0x00002342, // n0x18e7 c0x0000 (---------------) + go - 0x0000b384, // n0x18e8 c0x0000 (---------------) + home - 0x00000882, // n0x18e9 c0x0000 (---------------) + al - 0x000729c4, // n0x18ea c0x0000 (---------------) + asso - 0x00001642, // n0x18eb c0x0000 (---------------) + at - 0x00005ac2, // n0x18ec c0x0000 (---------------) + au - 0x00004702, // n0x18ed c0x0000 (---------------) + be - 0x00155e02, // n0x18ee c0x0000 (---------------) + bg - 0x000055c2, // n0x18ef c0x0000 (---------------) + ca - 0x0002a082, // n0x18f0 c0x0000 (---------------) + cd - 0x00004a02, // n0x18f1 c0x0000 (---------------) + ch - 0x000211c2, // n0x18f2 c0x0000 (---------------) + cn - 0x00029e42, // n0x18f3 c0x0000 (---------------) + cy - 0x00014442, // n0x18f4 c0x0000 (---------------) + cz - 0x000006c2, // n0x18f5 c0x0000 (---------------) + de - 0x00071742, // n0x18f6 c0x0000 (---------------) + dk - 0x000d75c3, // n0x18f7 c0x0000 (---------------) + edu - 0x00006042, // n0x18f8 c0x0000 (---------------) + ee - 0x000010c2, // n0x18f9 c0x0000 (---------------) + es - 0x000099c2, // n0x18fa c0x0000 (---------------) + fi - 0x00000d42, // n0x18fb c0x0000 (---------------) + fr - 0x0000dc82, // n0x18fc c0x0000 (---------------) + gr - 0x00025842, // n0x18fd c0x0000 (---------------) + hr - 0x00017d42, // n0x18fe c0x0000 (---------------) + hu - 0x00000e82, // n0x18ff c0x0000 (---------------) + ie - 0x000036c2, // n0x1900 c0x0000 (---------------) + il - 0x00000242, // n0x1901 c0x0000 (---------------) + in - 0x00038c03, // n0x1902 c0x0000 (---------------) + int - 0x00002b42, // n0x1903 c0x0000 (---------------) + is - 0x00006e82, // n0x1904 c0x0000 (---------------) + it - 0x000990c2, // n0x1905 c0x0000 (---------------) + jp - 0x000034c2, // n0x1906 c0x0000 (---------------) + kr - 0x00005ec2, // n0x1907 c0x0000 (---------------) + lt - 0x000071c2, // n0x1908 c0x0000 (---------------) + lu - 0x00027f02, // n0x1909 c0x0000 (---------------) + lv - 0x0003a6c2, // n0x190a c0x0000 (---------------) + mc - 0x00008942, // n0x190b c0x0000 (---------------) + me - 0x00156d82, // n0x190c c0x0000 (---------------) + mk - 0x00059642, // n0x190d c0x0000 (---------------) + mt - 0x00020282, // n0x190e c0x0000 (---------------) + my - 0x000170c3, // n0x190f c0x0000 (---------------) + net - 0x00001282, // n0x1910 c0x0000 (---------------) + ng - 0x00036482, // n0x1911 c0x0000 (---------------) + nl - 0x00000c02, // n0x1912 c0x0000 (---------------) + no - 0x000078c2, // n0x1913 c0x0000 (---------------) + nz - 0x0005b445, // n0x1914 c0x0000 (---------------) + paris - 0x00001e02, // n0x1915 c0x0000 (---------------) + pl - 0x00095982, // n0x1916 c0x0000 (---------------) + pt - 0x00123e03, // n0x1917 c0x0000 (---------------) + q-a - 0x00000d82, // n0x1918 c0x0000 (---------------) + ro - 0x000044c2, // n0x1919 c0x0000 (---------------) + ru - 0x00002e82, // n0x191a c0x0000 (---------------) + se - 0x00009182, // n0x191b c0x0000 (---------------) + si - 0x00007b42, // n0x191c c0x0000 (---------------) + sk - 0x00002402, // n0x191d c0x0000 (---------------) + tr - 0x0000cf02, // n0x191e c0x0000 (---------------) + uk - 0x00009f42, // n0x191f c0x0000 (---------------) + us - 0x0020c283, // n0x1920 c0x0000 (---------------) + I abo - 0x00201e82, // n0x1921 c0x0000 (---------------) + I ac - 0x00222ac3, // n0x1922 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1923 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x1924 c0x0000 (---------------) + I gob - 0x0020dc03, // n0x1925 c0x0000 (---------------) + I ing - 0x0020b403, // n0x1926 c0x0000 (---------------) + I med - 0x002170c3, // n0x1927 c0x0000 (---------------) + I net - 0x00207cc3, // n0x1928 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x1929 c0x0000 (---------------) + I org - 0x00280043, // n0x192a c0x0000 (---------------) + I sld - 0x000e4188, // n0x192b c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x192c c0x0000 (---------------) + I com - 0x002d75c3, // n0x192d c0x0000 (---------------) + I edu - 0x0034eb03, // n0x192e c0x0000 (---------------) + I gob - 0x0023fa03, // n0x192f c0x0000 (---------------) + I mil - 0x002170c3, // n0x1930 c0x0000 (---------------) + I net - 0x00207cc3, // n0x1931 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x1932 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1933 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1934 c0x0000 (---------------) + I edu - 0x0021dcc3, // n0x1935 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1936 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1937 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1938 c0x0000 (---------------) + I gov - 0x00200041, // n0x1939 c0x0000 (---------------) + I i - 0x0023fa03, // n0x193a c0x0000 (---------------) + I mil - 0x002170c3, // n0x193b c0x0000 (---------------) + I net - 0x00202303, // n0x193c c0x0000 (---------------) + I ngo - 0x0021dcc3, // n0x193d c0x0000 (---------------) + I org - 0x00310603, // n0x193e c0x0000 (---------------) + I biz - 0x00222ac3, // n0x193f c0x0000 (---------------) + I com - 0x002d75c3, // n0x1940 c0x0000 (---------------) + I edu - 0x002a1b43, // n0x1941 c0x0000 (---------------) + I fam - 0x0034eb03, // n0x1942 c0x0000 (---------------) + I gob - 0x00375943, // n0x1943 c0x0000 (---------------) + I gok - 0x0026f583, // n0x1944 c0x0000 (---------------) + I gon - 0x0028e783, // n0x1945 c0x0000 (---------------) + I gop - 0x00202343, // n0x1946 c0x0000 (---------------) + I gos - 0x0021e283, // n0x1947 c0x0000 (---------------) + I gov - 0x00200304, // n0x1948 c0x0000 (---------------) + I info - 0x002170c3, // n0x1949 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x194a c0x0000 (---------------) + I org - 0x00219fc3, // n0x194b c0x0000 (---------------) + I web - 0x002f8f84, // n0x194c c0x0000 (---------------) + I agro - 0x002375c3, // n0x194d c0x0000 (---------------) + I aid - 0x00000603, // n0x194e c0x0000 (---------------) + art - 0x0026a983, // n0x194f c0x0000 (---------------) + I atm - 0x0023e708, // n0x1950 c0x0000 (---------------) + I augustow - 0x002eaac4, // n0x1951 c0x0000 (---------------) + I auto - 0x0032d4ca, // n0x1952 c0x0000 (---------------) + I babia-gora - 0x0034d4c6, // n0x1953 c0x0000 (---------------) + I bedzin - 0x0035ad87, // n0x1954 c0x0000 (---------------) + I beskidy - 0x0021604a, // n0x1955 c0x0000 (---------------) + I bialowieza - 0x00228a89, // n0x1956 c0x0000 (---------------) + I bialystok - 0x0037f4c7, // n0x1957 c0x0000 (---------------) + I bielawa - 0x00382a8a, // n0x1958 c0x0000 (---------------) + I bieszczady - 0x00310603, // n0x1959 c0x0000 (---------------) + I biz - 0x0025374b, // n0x195a c0x0000 (---------------) + I boleslawiec - 0x00343289, // n0x195b c0x0000 (---------------) + I bydgoszcz - 0x002b9d45, // n0x195c c0x0000 (---------------) + I bytom - 0x002bb407, // n0x195d c0x0000 (---------------) + I cieszyn - 0x00000742, // n0x195e c0x0000 (---------------) + co - 0x00222ac3, // n0x195f c0x0000 (---------------) + I com - 0x002c8a87, // n0x1960 c0x0000 (---------------) + I czeladz - 0x00214445, // n0x1961 c0x0000 (---------------) + I czest - 0x002aae49, // n0x1962 c0x0000 (---------------) + I dlugoleka - 0x002d75c3, // n0x1963 c0x0000 (---------------) + I edu - 0x0021b206, // n0x1964 c0x0000 (---------------) + I elblag - 0x002aa003, // n0x1965 c0x0000 (---------------) + I elk - 0x000b7a43, // n0x1966 c0x0000 (---------------) + gda - 0x000e1246, // n0x1967 c0x0000 (---------------) + gdansk - 0x0016e4c6, // n0x1968 c0x0000 (---------------) + gdynia - 0x0014ee47, // n0x1969 c0x0000 (---------------) + gliwice - 0x00391046, // n0x196a c0x0000 (---------------) + I glogow - 0x002047c5, // n0x196b c0x0000 (---------------) + I gmina - 0x0031b347, // n0x196c c0x0000 (---------------) + I gniezno - 0x002b1487, // n0x196d c0x0000 (---------------) + I gorlice - 0x4761e283, // n0x196e c0x011d (n0x19f1-n0x1a20) + I gov - 0x003147c7, // n0x196f c0x0000 (---------------) + I grajewo - 0x0034b2c3, // n0x1970 c0x0000 (---------------) + I gsm - 0x0036cb05, // n0x1971 c0x0000 (---------------) + I ilawa - 0x00200304, // n0x1972 c0x0000 (---------------) + I info - 0x0020a8c8, // n0x1973 c0x0000 (---------------) + I jaworzno - 0x0020c80c, // n0x1974 c0x0000 (---------------) + I jelenia-gora - 0x00297b45, // n0x1975 c0x0000 (---------------) + I jgora - 0x002bed46, // n0x1976 c0x0000 (---------------) + I kalisz - 0x002c8947, // n0x1977 c0x0000 (---------------) + I karpacz - 0x002017c7, // n0x1978 c0x0000 (---------------) + I kartuzy - 0x00216a07, // n0x1979 c0x0000 (---------------) + I kaszuby - 0x00217888, // n0x197a c0x0000 (---------------) + I katowice - 0x0036730f, // n0x197b c0x0000 (---------------) + I kazimierz-dolny - 0x0023df05, // n0x197c c0x0000 (---------------) + I kepno - 0x00231ac7, // n0x197d c0x0000 (---------------) + I ketrzyn - 0x002a3547, // n0x197e c0x0000 (---------------) + I klodzko - 0x0029058a, // n0x197f c0x0000 (---------------) + I kobierzyce - 0x00295709, // n0x1980 c0x0000 (---------------) + I kolobrzeg - 0x002bbf45, // n0x1981 c0x0000 (---------------) + I konin - 0x002bdf8a, // n0x1982 c0x0000 (---------------) + I konskowola - 0x0011bec6, // n0x1983 c0x0000 (---------------) + krakow - 0x002aa085, // n0x1984 c0x0000 (---------------) + I kutno - 0x002be184, // n0x1985 c0x0000 (---------------) + I lapy - 0x002c8806, // n0x1986 c0x0000 (---------------) + I lebork - 0x00322207, // n0x1987 c0x0000 (---------------) + I legnica - 0x002bde07, // n0x1988 c0x0000 (---------------) + I lezajsk - 0x0036d448, // n0x1989 c0x0000 (---------------) + I limanowa - 0x002c6b85, // n0x198a c0x0000 (---------------) + I lomza - 0x00214346, // n0x198b c0x0000 (---------------) + I lowicz - 0x00218fc5, // n0x198c c0x0000 (---------------) + I lubin - 0x0029b345, // n0x198d c0x0000 (---------------) + I lukow - 0x00218f04, // n0x198e c0x0000 (---------------) + I mail - 0x00321887, // n0x198f c0x0000 (---------------) + I malbork - 0x0030ff4a, // n0x1990 c0x0000 (---------------) + I malopolska - 0x0020b988, // n0x1991 c0x0000 (---------------) + I mazowsze - 0x002d2a06, // n0x1992 c0x0000 (---------------) + I mazury - 0x0000b403, // n0x1993 c0x0000 (---------------) + med - 0x002dc385, // n0x1994 c0x0000 (---------------) + I media - 0x00232386, // n0x1995 c0x0000 (---------------) + I miasta - 0x00381e06, // n0x1996 c0x0000 (---------------) + I mielec - 0x002f0806, // n0x1997 c0x0000 (---------------) + I mielno - 0x0023fa03, // n0x1998 c0x0000 (---------------) + I mil - 0x00371d47, // n0x1999 c0x0000 (---------------) + I mragowo - 0x002a34c5, // n0x199a c0x0000 (---------------) + I naklo - 0x002170c3, // n0x199b c0x0000 (---------------) + I net - 0x0037f74d, // n0x199c c0x0000 (---------------) + I nieruchomosci - 0x00207cc3, // n0x199d c0x0000 (---------------) + I nom - 0x0036d548, // n0x199e c0x0000 (---------------) + I nowaruda - 0x00210944, // n0x199f c0x0000 (---------------) + I nysa - 0x00264105, // n0x19a0 c0x0000 (---------------) + I olawa - 0x00290486, // n0x19a1 c0x0000 (---------------) + I olecko - 0x002c1f06, // n0x19a2 c0x0000 (---------------) + I olkusz - 0x0020f9c7, // n0x19a3 c0x0000 (---------------) + I olsztyn - 0x00228dc7, // n0x19a4 c0x0000 (---------------) + I opoczno - 0x00246a05, // n0x19a5 c0x0000 (---------------) + I opole - 0x0021dcc3, // n0x19a6 c0x0000 (---------------) + I org - 0x00202387, // n0x19a7 c0x0000 (---------------) + I ostroda - 0x00203b09, // n0x19a8 c0x0000 (---------------) + I ostroleka - 0x002053c9, // n0x19a9 c0x0000 (---------------) + I ostrowiec - 0x0020818a, // n0x19aa c0x0000 (---------------) + I ostrowwlkp - 0x00203e02, // n0x19ab c0x0000 (---------------) + I pc - 0x0036cac4, // n0x19ac c0x0000 (---------------) + I pila - 0x002c2d84, // n0x19ad c0x0000 (---------------) + I pisz - 0x00210607, // n0x19ae c0x0000 (---------------) + I podhale - 0x0023b508, // n0x19af c0x0000 (---------------) + I podlasie - 0x002c8cc9, // n0x19b0 c0x0000 (---------------) + I polkowice - 0x00207a09, // n0x19b1 c0x0000 (---------------) + I pomorskie - 0x002c9507, // n0x19b2 c0x0000 (---------------) + I pomorze - 0x0026a886, // n0x19b3 c0x0000 (---------------) + I powiat - 0x000ca606, // n0x19b4 c0x0000 (---------------) + poznan - 0x002cba44, // n0x19b5 c0x0000 (---------------) + I priv - 0x002cbbca, // n0x19b6 c0x0000 (---------------) + I prochowice - 0x002cd2c8, // n0x19b7 c0x0000 (---------------) + I pruszkow - 0x002cdec9, // n0x19b8 c0x0000 (---------------) + I przeworsk - 0x00281bc6, // n0x19b9 c0x0000 (---------------) + I pulawy - 0x002e8285, // n0x19ba c0x0000 (---------------) + I radom - 0x0020b848, // n0x19bb c0x0000 (---------------) + I rawa-maz - 0x002b174a, // n0x19bc c0x0000 (---------------) + I realestate - 0x00241283, // n0x19bd c0x0000 (---------------) + I rel - 0x00226746, // n0x19be c0x0000 (---------------) + I rybnik - 0x002c9607, // n0x19bf c0x0000 (---------------) + I rzeszow - 0x0020b505, // n0x19c0 c0x0000 (---------------) + I sanok - 0x00375a45, // n0x19c1 c0x0000 (---------------) + I sejny - 0x0029acc3, // n0x19c2 c0x0000 (---------------) + I sex - 0x0029b184, // n0x19c3 c0x0000 (---------------) + I shop - 0x0021cd45, // n0x19c4 c0x0000 (---------------) + I sklep - 0x00270687, // n0x19c5 c0x0000 (---------------) + I skoczow - 0x00212585, // n0x19c6 c0x0000 (---------------) + I slask - 0x002c1646, // n0x19c7 c0x0000 (---------------) + I slupsk - 0x000ddd85, // n0x19c8 c0x0000 (---------------) + sopot - 0x0021c283, // n0x19c9 c0x0000 (---------------) + I sos - 0x0021c289, // n0x19ca c0x0000 (---------------) + I sosnowiec - 0x00263ecc, // n0x19cb c0x0000 (---------------) + I stalowa-wola - 0x0029720c, // n0x19cc c0x0000 (---------------) + I starachowice - 0x002b8648, // n0x19cd c0x0000 (---------------) + I stargard - 0x00325847, // n0x19ce c0x0000 (---------------) + I suwalki - 0x002d4d08, // n0x19cf c0x0000 (---------------) + I swidnica - 0x002d590a, // n0x19d0 c0x0000 (---------------) + I swiebodzin - 0x002d608b, // n0x19d1 c0x0000 (---------------) + I swinoujscie - 0x003433c8, // n0x19d2 c0x0000 (---------------) + I szczecin - 0x002bee48, // n0x19d3 c0x0000 (---------------) + I szczytno - 0x00207586, // n0x19d4 c0x0000 (---------------) + I szkola - 0x0030a185, // n0x19d5 c0x0000 (---------------) + I targi - 0x0030ebca, // n0x19d6 c0x0000 (---------------) + I tarnobrzeg - 0x0021e345, // n0x19d7 c0x0000 (---------------) + I tgory - 0x00208902, // n0x19d8 c0x0000 (---------------) + I tm - 0x002ae287, // n0x19d9 c0x0000 (---------------) + I tourism - 0x0027f186, // n0x19da c0x0000 (---------------) + I travel - 0x0033de05, // n0x19db c0x0000 (---------------) + I turek - 0x002d8689, // n0x19dc c0x0000 (---------------) + I turystyka - 0x0036b4c5, // n0x19dd c0x0000 (---------------) + I tychy - 0x0027af05, // n0x19de c0x0000 (---------------) + I ustka - 0x0036c6c9, // n0x19df c0x0000 (---------------) + I walbrzych - 0x00232206, // n0x19e0 c0x0000 (---------------) + I warmia - 0x00250f08, // n0x19e1 c0x0000 (---------------) + I warszawa - 0x002c7183, // n0x19e2 c0x0000 (---------------) + I waw - 0x00391186, // n0x19e3 c0x0000 (---------------) + I wegrow - 0x00263586, // n0x19e4 c0x0000 (---------------) + I wielun - 0x002e2d45, // n0x19e5 c0x0000 (---------------) + I wlocl - 0x002e2d49, // n0x19e6 c0x0000 (---------------) + I wloclawek - 0x0030b189, // n0x19e7 c0x0000 (---------------) + I wodzislaw - 0x002609c7, // n0x19e8 c0x0000 (---------------) + I wolomin - 0x000e2bc4, // n0x19e9 c0x0000 (---------------) + wroc - 0x002e2bc7, // n0x19ea c0x0000 (---------------) + I wroclaw - 0x00207909, // n0x19eb c0x0000 (---------------) + I zachpomor - 0x00216245, // n0x19ec c0x0000 (---------------) + I zagan - 0x0002bf08, // n0x19ed c0x0000 (---------------) + zakopane - 0x00310d85, // n0x19ee c0x0000 (---------------) + I zarow - 0x00217185, // n0x19ef c0x0000 (---------------) + I zgora - 0x0021e549, // n0x19f0 c0x0000 (---------------) + I zgorzelec - 0x002105c2, // n0x19f1 c0x0000 (---------------) + I ap - 0x00253e04, // n0x19f2 c0x0000 (---------------) + I griw - 0x00200b42, // n0x19f3 c0x0000 (---------------) + I ic - 0x00202b42, // n0x19f4 c0x0000 (---------------) + I is - 0x00268d85, // n0x19f5 c0x0000 (---------------) + I kmpsp - 0x002c1788, // n0x19f6 c0x0000 (---------------) + I konsulat - 0x00379185, // n0x19f7 c0x0000 (---------------) + I kppsp - 0x002ac643, // n0x19f8 c0x0000 (---------------) + I kwp - 0x002ac645, // n0x19f9 c0x0000 (---------------) + I kwpsp - 0x002bb7c3, // n0x19fa c0x0000 (---------------) + I mup - 0x0020a142, // n0x19fb c0x0000 (---------------) + I mw - 0x002d3fc4, // n0x19fc c0x0000 (---------------) + I oirm - 0x002f3c43, // n0x19fd c0x0000 (---------------) + I oum - 0x002052c2, // n0x19fe c0x0000 (---------------) + I pa - 0x0036be84, // n0x19ff c0x0000 (---------------) + I pinb - 0x002c3b43, // n0x1a00 c0x0000 (---------------) + I piw - 0x00203f02, // n0x1a01 c0x0000 (---------------) + I po - 0x002369c3, // n0x1a02 c0x0000 (---------------) + I psp - 0x0027ac04, // n0x1a03 c0x0000 (---------------) + I psse - 0x002a32c3, // n0x1a04 c0x0000 (---------------) + I pup - 0x00370ac4, // n0x1a05 c0x0000 (---------------) + I rzgw - 0x00201a02, // n0x1a06 c0x0000 (---------------) + I sa - 0x0025ebc3, // n0x1a07 c0x0000 (---------------) + I sdn - 0x002206c3, // n0x1a08 c0x0000 (---------------) + I sko - 0x00201102, // n0x1a09 c0x0000 (---------------) + I so - 0x002ceec2, // n0x1a0a c0x0000 (---------------) + I sr - 0x0030afc9, // n0x1a0b c0x0000 (---------------) + I starostwo - 0x00205082, // n0x1a0c c0x0000 (---------------) + I ug - 0x0031c4c4, // n0x1a0d c0x0000 (---------------) + I ugim - 0x00209802, // n0x1a0e c0x0000 (---------------) + I um - 0x0020b6c4, // n0x1a0f c0x0000 (---------------) + I umig - 0x0026a844, // n0x1a10 c0x0000 (---------------) + I upow - 0x00243ec4, // n0x1a11 c0x0000 (---------------) + I uppo - 0x00209f42, // n0x1a12 c0x0000 (---------------) + I us - 0x0022f3c2, // n0x1a13 c0x0000 (---------------) + I uw - 0x0020c583, // n0x1a14 c0x0000 (---------------) + I uzs - 0x00345983, // n0x1a15 c0x0000 (---------------) + I wif - 0x002310c4, // n0x1a16 c0x0000 (---------------) + I wiih - 0x00270804, // n0x1a17 c0x0000 (---------------) + I winb - 0x002b8984, // n0x1a18 c0x0000 (---------------) + I wios - 0x002c9784, // n0x1a19 c0x0000 (---------------) + I witd - 0x0030b383, // n0x1a1a c0x0000 (---------------) + I wiw - 0x002725c3, // n0x1a1b c0x0000 (---------------) + I wsa - 0x0031be44, // n0x1a1c c0x0000 (---------------) + I wskr - 0x002e3d44, // n0x1a1d c0x0000 (---------------) + I wuoz - 0x002e4546, // n0x1a1e c0x0000 (---------------) + I wzmiuw - 0x002c2042, // n0x1a1f c0x0000 (---------------) + I zp - 0x00200742, // n0x1a20 c0x0000 (---------------) + I co - 0x002d75c3, // n0x1a21 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a22 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1a23 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a24 c0x0000 (---------------) + I org - 0x00201e82, // n0x1a25 c0x0000 (---------------) + I ac - 0x00310603, // n0x1a26 c0x0000 (---------------) + I biz - 0x00222ac3, // n0x1a27 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1a28 c0x0000 (---------------) + I edu - 0x00208883, // n0x1a29 c0x0000 (---------------) + I est - 0x0021e283, // n0x1a2a c0x0000 (---------------) + I gov - 0x00200304, // n0x1a2b c0x0000 (---------------) + I info - 0x0030b284, // n0x1a2c c0x0000 (---------------) + I isla - 0x00298944, // n0x1a2d c0x0000 (---------------) + I name - 0x002170c3, // n0x1a2e c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a2f c0x0000 (---------------) + I org - 0x00218243, // n0x1a30 c0x0000 (---------------) + I pro - 0x002cc284, // n0x1a31 c0x0000 (---------------) + I prof - 0x002f2783, // n0x1a32 c0x0000 (---------------) + I aca - 0x0020c103, // n0x1a33 c0x0000 (---------------) + I bar - 0x0025b403, // n0x1a34 c0x0000 (---------------) + I cpa - 0x002674c3, // n0x1a35 c0x0000 (---------------) + I eng - 0x0029d803, // n0x1a36 c0x0000 (---------------) + I jur - 0x00253883, // n0x1a37 c0x0000 (---------------) + I law - 0x0020b403, // n0x1a38 c0x0000 (---------------) + I med - 0x00222ac3, // n0x1a39 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1a3a c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a3b c0x0000 (---------------) + I gov - 0x002170c3, // n0x1a3c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a3d c0x0000 (---------------) + I org - 0x002c6b43, // n0x1a3e c0x0000 (---------------) + I plo - 0x00223f83, // n0x1a3f c0x0000 (---------------) + I sec - 0x000e4188, // n0x1a40 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1a41 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1a42 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a43 c0x0000 (---------------) + I gov - 0x00238c03, // n0x1a44 c0x0000 (---------------) + I int - 0x002170c3, // n0x1a45 c0x0000 (---------------) + I net - 0x0022cb84, // n0x1a46 c0x0000 (---------------) + I nome - 0x0021dcc3, // n0x1a47 c0x0000 (---------------) + I org - 0x00296544, // n0x1a48 c0x0000 (---------------) + I publ - 0x00251645, // n0x1a49 c0x0000 (---------------) + I belau - 0x00200742, // n0x1a4a c0x0000 (---------------) + I co - 0x00203fc2, // n0x1a4b c0x0000 (---------------) + I ed - 0x00202342, // n0x1a4c c0x0000 (---------------) + I go - 0x00201082, // n0x1a4d c0x0000 (---------------) + I ne - 0x00200c42, // n0x1a4e c0x0000 (---------------) + I or - 0x00222ac3, // n0x1a4f c0x0000 (---------------) + I com - 0x00228d44, // n0x1a50 c0x0000 (---------------) + I coop - 0x002d75c3, // n0x1a51 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a52 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1a53 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1a54 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a55 c0x0000 (---------------) + I org - 0x000e4188, // n0x1a56 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1a57 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1a58 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a59 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1a5a c0x0000 (---------------) + I mil - 0x00298944, // n0x1a5b c0x0000 (---------------) + I name - 0x002170c3, // n0x1a5c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a5d c0x0000 (---------------) + I org - 0x00206103, // n0x1a5e c0x0000 (---------------) + I sch - 0x002729c4, // n0x1a5f c0x0000 (---------------) + I asso - 0x000e4188, // n0x1a60 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1a61 c0x0000 (---------------) + I com - 0x00207cc3, // n0x1a62 c0x0000 (---------------) + I nom - 0x00246584, // n0x1a63 c0x0000 (---------------) + I arts - 0x000e4188, // n0x1a64 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1a65 c0x0000 (---------------) + I com - 0x00238544, // n0x1a66 c0x0000 (---------------) + I firm - 0x00200304, // n0x1a67 c0x0000 (---------------) + I info - 0x00207cc3, // n0x1a68 c0x0000 (---------------) + I nom - 0x00200e02, // n0x1a69 c0x0000 (---------------) + I nt - 0x0021dcc3, // n0x1a6a c0x0000 (---------------) + I org - 0x002e6343, // n0x1a6b c0x0000 (---------------) + I rec - 0x002cf4c5, // n0x1a6c c0x0000 (---------------) + I store - 0x00208902, // n0x1a6d c0x0000 (---------------) + I tm - 0x002e3e83, // n0x1a6e c0x0000 (---------------) + I www - 0x00201e82, // n0x1a6f c0x0000 (---------------) + I ac - 0x000e4188, // n0x1a70 c0x0000 (---------------) + blogspot - 0x00200742, // n0x1a71 c0x0000 (---------------) + I co - 0x002d75c3, // n0x1a72 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a73 c0x0000 (---------------) + I gov - 0x00200242, // n0x1a74 c0x0000 (---------------) + I in - 0x0021dcc3, // n0x1a75 c0x0000 (---------------) + I org - 0x00201e82, // n0x1a76 c0x0000 (---------------) + I ac - 0x00382c47, // n0x1a77 c0x0000 (---------------) + I adygeya - 0x0028ee05, // n0x1a78 c0x0000 (---------------) + I altai - 0x00248504, // n0x1a79 c0x0000 (---------------) + I amur - 0x0036ab06, // n0x1a7a c0x0000 (---------------) + I amursk - 0x002f314b, // n0x1a7b c0x0000 (---------------) + I arkhangelsk - 0x002e9b49, // n0x1a7c c0x0000 (---------------) + I astrakhan - 0x002bec86, // n0x1a7d c0x0000 (---------------) + I baikal - 0x00309449, // n0x1a7e c0x0000 (---------------) + I bashkiria - 0x002c1a08, // n0x1a7f c0x0000 (---------------) + I belgorod - 0x00200503, // n0x1a80 c0x0000 (---------------) + I bir - 0x000e4188, // n0x1a81 c0x0000 (---------------) + blogspot - 0x0021cc07, // n0x1a82 c0x0000 (---------------) + I bryansk - 0x0021bc88, // n0x1a83 c0x0000 (---------------) + I buryatia - 0x00355dc3, // n0x1a84 c0x0000 (---------------) + I cbg - 0x002503c4, // n0x1a85 c0x0000 (---------------) + I chel - 0x002539cb, // n0x1a86 c0x0000 (---------------) + I chelyabinsk - 0x002932c5, // n0x1a87 c0x0000 (---------------) + I chita - 0x002ab708, // n0x1a88 c0x0000 (---------------) + I chukotka - 0x00313689, // n0x1a89 c0x0000 (---------------) + I chuvashia - 0x00249083, // n0x1a8a c0x0000 (---------------) + I cmw - 0x00222ac3, // n0x1a8b c0x0000 (---------------) + I com - 0x00309888, // n0x1a8c c0x0000 (---------------) + I dagestan - 0x002d3887, // n0x1a8d c0x0000 (---------------) + I dudinka - 0x00311a46, // n0x1a8e c0x0000 (---------------) + I e-burg - 0x002d75c3, // n0x1a8f c0x0000 (---------------) + I edu - 0x0032aa47, // n0x1a90 c0x0000 (---------------) + I fareast - 0x0021e283, // n0x1a91 c0x0000 (---------------) + I gov - 0x003789c6, // n0x1a92 c0x0000 (---------------) + I grozny - 0x00238c03, // n0x1a93 c0x0000 (---------------) + I int - 0x00220587, // n0x1a94 c0x0000 (---------------) + I irkutsk - 0x002f2a47, // n0x1a95 c0x0000 (---------------) + I ivanovo - 0x00379007, // n0x1a96 c0x0000 (---------------) + I izhevsk - 0x00321805, // n0x1a97 c0x0000 (---------------) + I jamal - 0x00202683, // n0x1a98 c0x0000 (---------------) + I jar - 0x002a248b, // n0x1a99 c0x0000 (---------------) + I joshkar-ola - 0x00312348, // n0x1a9a c0x0000 (---------------) + I k-uralsk - 0x002201c8, // n0x1a9b c0x0000 (---------------) + I kalmykia - 0x00305446, // n0x1a9c c0x0000 (---------------) + I kaluga - 0x0023a649, // n0x1a9d c0x0000 (---------------) + I kamchatka - 0x00365ac7, // n0x1a9e c0x0000 (---------------) + I karelia - 0x002dec85, // n0x1a9f c0x0000 (---------------) + I kazan - 0x0022d2c4, // n0x1aa0 c0x0000 (---------------) + I kchr - 0x00271548, // n0x1aa1 c0x0000 (---------------) + I kemerovo - 0x00235f8a, // n0x1aa2 c0x0000 (---------------) + I khabarovsk - 0x002361c9, // n0x1aa3 c0x0000 (---------------) + I khakassia - 0x0025be03, // n0x1aa4 c0x0000 (---------------) + I khv - 0x00254bc5, // n0x1aa5 c0x0000 (---------------) + I kirov - 0x00325683, // n0x1aa6 c0x0000 (---------------) + I kms - 0x002b9586, // n0x1aa7 c0x0000 (---------------) + I koenig - 0x003935c4, // n0x1aa8 c0x0000 (---------------) + I komi - 0x002e2f48, // n0x1aa9 c0x0000 (---------------) + I kostroma - 0x0039334b, // n0x1aaa c0x0000 (---------------) + I krasnoyarsk - 0x00331845, // n0x1aab c0x0000 (---------------) + I kuban - 0x002a4ac6, // n0x1aac c0x0000 (---------------) + I kurgan - 0x002a8e85, // n0x1aad c0x0000 (---------------) + I kursk - 0x002a9608, // n0x1aae c0x0000 (---------------) + I kustanai - 0x002aa1c7, // n0x1aaf c0x0000 (---------------) + I kuzbass - 0x003414c7, // n0x1ab0 c0x0000 (---------------) + I lipetsk - 0x0032ddc7, // n0x1ab1 c0x0000 (---------------) + I magadan - 0x00271948, // n0x1ab2 c0x0000 (---------------) + I magnitka - 0x00216504, // n0x1ab3 c0x0000 (---------------) + I mari - 0x00216507, // n0x1ab4 c0x0000 (---------------) + I mari-el - 0x003529c6, // n0x1ab5 c0x0000 (---------------) + I marine - 0x0023fa03, // n0x1ab6 c0x0000 (---------------) + I mil - 0x002b4208, // n0x1ab7 c0x0000 (---------------) + I mordovia - 0x00233f43, // n0x1ab8 c0x0000 (---------------) + I msk - 0x002bbd88, // n0x1ab9 c0x0000 (---------------) + I murmansk - 0x002bf205, // n0x1aba c0x0000 (---------------) + I mytis - 0x00332688, // n0x1abb c0x0000 (---------------) + I nakhodka - 0x00375747, // n0x1abc c0x0000 (---------------) + I nalchik - 0x002170c3, // n0x1abd c0x0000 (---------------) + I net - 0x002effc3, // n0x1abe c0x0000 (---------------) + I nkz - 0x00278ec4, // n0x1abf c0x0000 (---------------) + I nnov - 0x00228f07, // n0x1ac0 c0x0000 (---------------) + I norilsk - 0x00201343, // n0x1ac1 c0x0000 (---------------) + I nov - 0x002f2b0b, // n0x1ac2 c0x0000 (---------------) + I novosibirsk - 0x00217803, // n0x1ac3 c0x0000 (---------------) + I nsk - 0x00233f04, // n0x1ac4 c0x0000 (---------------) + I omsk - 0x002cf548, // n0x1ac5 c0x0000 (---------------) + I orenburg - 0x0021dcc3, // n0x1ac6 c0x0000 (---------------) + I org - 0x002c98c5, // n0x1ac7 c0x0000 (---------------) + I oryol - 0x002e3305, // n0x1ac8 c0x0000 (---------------) + I oskol - 0x00332586, // n0x1ac9 c0x0000 (---------------) + I palana - 0x00395385, // n0x1aca c0x0000 (---------------) + I penza - 0x002bf5c4, // n0x1acb c0x0000 (---------------) + I perm - 0x00207742, // n0x1acc c0x0000 (---------------) + I pp - 0x002ce183, // n0x1acd c0x0000 (---------------) + I ptz - 0x002be20a, // n0x1ace c0x0000 (---------------) + I pyatigorsk - 0x002ef043, // n0x1acf c0x0000 (---------------) + I rnd - 0x0030c189, // n0x1ad0 c0x0000 (---------------) + I rubtsovsk - 0x003227c6, // n0x1ad1 c0x0000 (---------------) + I ryazan - 0x00217648, // n0x1ad2 c0x0000 (---------------) + I sakhalin - 0x0027a746, // n0x1ad3 c0x0000 (---------------) + I samara - 0x00218487, // n0x1ad4 c0x0000 (---------------) + I saratov - 0x002b7c08, // n0x1ad5 c0x0000 (---------------) + I simbirsk - 0x002ae3c8, // n0x1ad6 c0x0000 (---------------) + I smolensk - 0x002c5603, // n0x1ad7 c0x0000 (---------------) + I snz - 0x00268e43, // n0x1ad8 c0x0000 (---------------) + I spb - 0x002187c9, // n0x1ad9 c0x0000 (---------------) + I stavropol - 0x002daf83, // n0x1ada c0x0000 (---------------) + I stv - 0x002d0c06, // n0x1adb c0x0000 (---------------) + I surgut - 0x0028ea86, // n0x1adc c0x0000 (---------------) + I syzran - 0x002fe106, // n0x1add c0x0000 (---------------) + I tambov - 0x0031df09, // n0x1ade c0x0000 (---------------) + I tatarstan - 0x002e3fc4, // n0x1adf c0x0000 (---------------) + I test - 0x0020fe03, // n0x1ae0 c0x0000 (---------------) + I tom - 0x00233ec5, // n0x1ae1 c0x0000 (---------------) + I tomsk - 0x0038c2c9, // n0x1ae2 c0x0000 (---------------) + I tsaritsyn - 0x00220683, // n0x1ae3 c0x0000 (---------------) + I tsk - 0x002d78c4, // n0x1ae4 c0x0000 (---------------) + I tula - 0x002d9504, // n0x1ae5 c0x0000 (---------------) + I tuva - 0x00248304, // n0x1ae6 c0x0000 (---------------) + I tver - 0x002a7d06, // n0x1ae7 c0x0000 (---------------) + I tyumen - 0x00309dc3, // n0x1ae8 c0x0000 (---------------) + I udm - 0x00309dc8, // n0x1ae9 c0x0000 (---------------) + I udmurtia - 0x00245a08, // n0x1aea c0x0000 (---------------) + I ulan-ude - 0x002fe246, // n0x1aeb c0x0000 (---------------) + I vdonsk - 0x002dea8b, // n0x1aec c0x0000 (---------------) + I vladikavkaz - 0x002dedc8, // n0x1aed c0x0000 (---------------) + I vladimir - 0x002defcb, // n0x1aee c0x0000 (---------------) + I vladivostok - 0x002df749, // n0x1aef c0x0000 (---------------) + I volgograd - 0x002e1147, // n0x1af0 c0x0000 (---------------) + I vologda - 0x002e1e48, // n0x1af1 c0x0000 (---------------) + I voronezh - 0x002e2b03, // n0x1af2 c0x0000 (---------------) + I vrn - 0x0037fec6, // n0x1af3 c0x0000 (---------------) + I vyatka - 0x0020d4c7, // n0x1af4 c0x0000 (---------------) + I yakutia - 0x00284405, // n0x1af5 c0x0000 (---------------) + I yamal - 0x00332d09, // n0x1af6 c0x0000 (---------------) + I yaroslavl - 0x0036e1cd, // n0x1af7 c0x0000 (---------------) + I yekaterinburg - 0x00217491, // n0x1af8 c0x0000 (---------------) + I yuzhno-sakhalinsk - 0x0029adc5, // n0x1af9 c0x0000 (---------------) + I zgrad - 0x00201e82, // n0x1afa c0x0000 (---------------) + I ac - 0x00200742, // n0x1afb c0x0000 (---------------) + I co - 0x00222ac3, // n0x1afc c0x0000 (---------------) + I com - 0x002d75c3, // n0x1afd c0x0000 (---------------) + I edu - 0x003579c4, // n0x1afe c0x0000 (---------------) + I gouv - 0x0021e283, // n0x1aff c0x0000 (---------------) + I gov - 0x00238c03, // n0x1b00 c0x0000 (---------------) + I int - 0x0023fa03, // n0x1b01 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1b02 c0x0000 (---------------) + I net - 0x00222ac3, // n0x1b03 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b04 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b05 c0x0000 (---------------) + I gov - 0x0020b403, // n0x1b06 c0x0000 (---------------) + I med - 0x002170c3, // n0x1b07 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b08 c0x0000 (---------------) + I org - 0x00296543, // n0x1b09 c0x0000 (---------------) + I pub - 0x00206103, // n0x1b0a c0x0000 (---------------) + I sch - 0x00222ac3, // n0x1b0b c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b0c c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b0d c0x0000 (---------------) + I gov - 0x002170c3, // n0x1b0e c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b0f c0x0000 (---------------) + I org - 0x00222ac3, // n0x1b10 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b11 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b12 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1b13 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b14 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1b15 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b16 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b17 c0x0000 (---------------) + I gov - 0x00200304, // n0x1b18 c0x0000 (---------------) + I info - 0x0020b403, // n0x1b19 c0x0000 (---------------) + I med - 0x002170c3, // n0x1b1a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b1b c0x0000 (---------------) + I org - 0x0020bf42, // n0x1b1c c0x0000 (---------------) + I tv - 0x00200181, // n0x1b1d c0x0000 (---------------) + I a - 0x00201e82, // n0x1b1e c0x0000 (---------------) + I ac - 0x00200001, // n0x1b1f c0x0000 (---------------) + I b - 0x002fbc02, // n0x1b20 c0x0000 (---------------) + I bd - 0x000e4188, // n0x1b21 c0x0000 (---------------) + blogspot - 0x00213b05, // n0x1b22 c0x0000 (---------------) + I brand - 0x00200741, // n0x1b23 c0x0000 (---------------) + I c - 0x00022ac3, // n0x1b24 c0x0000 (---------------) + com - 0x002005c1, // n0x1b25 c0x0000 (---------------) + I d - 0x00200701, // n0x1b26 c0x0000 (---------------) + I e - 0x00200381, // n0x1b27 c0x0000 (---------------) + I f - 0x00235ec2, // n0x1b28 c0x0000 (---------------) + I fh - 0x00235ec4, // n0x1b29 c0x0000 (---------------) + I fhsk - 0x00351283, // n0x1b2a c0x0000 (---------------) + I fhv - 0x00200401, // n0x1b2b c0x0000 (---------------) + I g - 0x00200201, // n0x1b2c c0x0000 (---------------) + I h - 0x00200041, // n0x1b2d c0x0000 (---------------) + I i - 0x00201001, // n0x1b2e c0x0000 (---------------) + I k - 0x002c8587, // n0x1b2f c0x0000 (---------------) + I komforb - 0x002a8f8f, // n0x1b30 c0x0000 (---------------) + I kommunalforbund - 0x002b1a86, // n0x1b31 c0x0000 (---------------) + I komvux - 0x002008c1, // n0x1b32 c0x0000 (---------------) + I l - 0x00323b46, // n0x1b33 c0x0000 (---------------) + I lanbib - 0x002000c1, // n0x1b34 c0x0000 (---------------) + I m - 0x00200281, // n0x1b35 c0x0000 (---------------) + I n - 0x002f460e, // n0x1b36 c0x0000 (---------------) + I naturbruksgymn - 0x00200081, // n0x1b37 c0x0000 (---------------) + I o - 0x0021dcc3, // n0x1b38 c0x0000 (---------------) + I org - 0x00200b01, // n0x1b39 c0x0000 (---------------) + I p - 0x00290b05, // n0x1b3a c0x0000 (---------------) + I parti - 0x00207742, // n0x1b3b c0x0000 (---------------) + I pp - 0x0029abc5, // n0x1b3c c0x0000 (---------------) + I press - 0x00200581, // n0x1b3d c0x0000 (---------------) + I r - 0x002001c1, // n0x1b3e c0x0000 (---------------) + I s - 0x00200141, // n0x1b3f c0x0000 (---------------) + I t - 0x00208902, // n0x1b40 c0x0000 (---------------) + I tm - 0x00200101, // n0x1b41 c0x0000 (---------------) + I u - 0x00202541, // n0x1b42 c0x0000 (---------------) + I w - 0x00203ec1, // n0x1b43 c0x0000 (---------------) + I x - 0x00200801, // n0x1b44 c0x0000 (---------------) + I y - 0x00201901, // n0x1b45 c0x0000 (---------------) + I z - 0x000e4188, // n0x1b46 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1b47 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b48 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b49 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1b4a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b4b c0x0000 (---------------) + I org - 0x00214943, // n0x1b4c c0x0000 (---------------) + I per - 0x00222ac3, // n0x1b4d c0x0000 (---------------) + I com - 0x0021e283, // n0x1b4e c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1b4f c0x0000 (---------------) + I mil - 0x002170c3, // n0x1b50 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b51 c0x0000 (---------------) + I org - 0x014c56c8, // n0x1b52 c0x0005 (---------------)* o platform - 0x000e4188, // n0x1b53 c0x0000 (---------------) + blogspot - 0x000e4188, // n0x1b54 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1b55 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b56 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b57 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1b58 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b59 c0x0000 (---------------) + I org - 0x00200603, // n0x1b5a c0x0000 (---------------) + I art - 0x000e4188, // n0x1b5b c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1b5c c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b5d c0x0000 (---------------) + I edu - 0x003579c4, // n0x1b5e c0x0000 (---------------) + I gouv - 0x0021dcc3, // n0x1b5f c0x0000 (---------------) + I org - 0x0028acc5, // n0x1b60 c0x0000 (---------------) + I perso - 0x0029f044, // n0x1b61 c0x0000 (---------------) + I univ - 0x00222ac3, // n0x1b62 c0x0000 (---------------) + I com - 0x002170c3, // n0x1b63 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b64 c0x0000 (---------------) + I org - 0x00200742, // n0x1b65 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1b66 c0x0000 (---------------) + I com - 0x00224f09, // n0x1b67 c0x0000 (---------------) + I consulado - 0x002d75c3, // n0x1b68 c0x0000 (---------------) + I edu - 0x00271109, // n0x1b69 c0x0000 (---------------) + I embaixada - 0x0021e283, // n0x1b6a c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1b6b c0x0000 (---------------) + I mil - 0x002170c3, // n0x1b6c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b6d c0x0000 (---------------) + I org - 0x002cb848, // n0x1b6e c0x0000 (---------------) + I principe - 0x0020fd47, // n0x1b6f c0x0000 (---------------) + I saotome - 0x002cf4c5, // n0x1b70 c0x0000 (---------------) + I store - 0x00382c47, // n0x1b71 c0x0000 (---------------) + I adygeya - 0x002f314b, // n0x1b72 c0x0000 (---------------) + I arkhangelsk - 0x00389cc8, // n0x1b73 c0x0000 (---------------) + I balashov - 0x00309449, // n0x1b74 c0x0000 (---------------) + I bashkiria - 0x0021cc07, // n0x1b75 c0x0000 (---------------) + I bryansk - 0x00309888, // n0x1b76 c0x0000 (---------------) + I dagestan - 0x003789c6, // n0x1b77 c0x0000 (---------------) + I grozny - 0x002f2a47, // n0x1b78 c0x0000 (---------------) + I ivanovo - 0x002201c8, // n0x1b79 c0x0000 (---------------) + I kalmykia - 0x00305446, // n0x1b7a c0x0000 (---------------) + I kaluga - 0x00365ac7, // n0x1b7b c0x0000 (---------------) + I karelia - 0x002361c9, // n0x1b7c c0x0000 (---------------) + I khakassia - 0x00384e89, // n0x1b7d c0x0000 (---------------) + I krasnodar - 0x002a4ac6, // n0x1b7e c0x0000 (---------------) + I kurgan - 0x00275dc5, // n0x1b7f c0x0000 (---------------) + I lenug - 0x002b4208, // n0x1b80 c0x0000 (---------------) + I mordovia - 0x00233f43, // n0x1b81 c0x0000 (---------------) + I msk - 0x002bbd88, // n0x1b82 c0x0000 (---------------) + I murmansk - 0x00375747, // n0x1b83 c0x0000 (---------------) + I nalchik - 0x00201343, // n0x1b84 c0x0000 (---------------) + I nov - 0x0032a707, // n0x1b85 c0x0000 (---------------) + I obninsk - 0x00395385, // n0x1b86 c0x0000 (---------------) + I penza - 0x002c8208, // n0x1b87 c0x0000 (---------------) + I pokrovsk - 0x00262b45, // n0x1b88 c0x0000 (---------------) + I sochi - 0x00268e43, // n0x1b89 c0x0000 (---------------) + I spb - 0x003547c9, // n0x1b8a c0x0000 (---------------) + I togliatti - 0x00295587, // n0x1b8b c0x0000 (---------------) + I troitsk - 0x002d78c4, // n0x1b8c c0x0000 (---------------) + I tula - 0x002d9504, // n0x1b8d c0x0000 (---------------) + I tuva - 0x002dea8b, // n0x1b8e c0x0000 (---------------) + I vladikavkaz - 0x002dedc8, // n0x1b8f c0x0000 (---------------) + I vladimir - 0x002e1147, // n0x1b90 c0x0000 (---------------) + I vologda - 0x00222ac3, // n0x1b91 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b92 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x1b93 c0x0000 (---------------) + I gob - 0x0021dcc3, // n0x1b94 c0x0000 (---------------) + I org - 0x00230683, // n0x1b95 c0x0000 (---------------) + I red - 0x0021e283, // n0x1b96 c0x0000 (---------------) + I gov - 0x00222ac3, // n0x1b97 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b98 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b99 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1b9a c0x0000 (---------------) + I mil - 0x002170c3, // n0x1b9b c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b9c c0x0000 (---------------) + I org - 0x00201e82, // n0x1b9d c0x0000 (---------------) + I ac - 0x00200742, // n0x1b9e c0x0000 (---------------) + I co - 0x0021dcc3, // n0x1b9f c0x0000 (---------------) + I org - 0x000e4188, // n0x1ba0 c0x0000 (---------------) + blogspot - 0x00201e82, // n0x1ba1 c0x0000 (---------------) + I ac - 0x00200742, // n0x1ba2 c0x0000 (---------------) + I co - 0x00202342, // n0x1ba3 c0x0000 (---------------) + I go - 0x00200242, // n0x1ba4 c0x0000 (---------------) + I in - 0x00204802, // n0x1ba5 c0x0000 (---------------) + I mi - 0x002170c3, // n0x1ba6 c0x0000 (---------------) + I net - 0x00200c42, // n0x1ba7 c0x0000 (---------------) + I or - 0x00201e82, // n0x1ba8 c0x0000 (---------------) + I ac - 0x00310603, // n0x1ba9 c0x0000 (---------------) + I biz - 0x00200742, // n0x1baa c0x0000 (---------------) + I co - 0x00222ac3, // n0x1bab c0x0000 (---------------) + I com - 0x002d75c3, // n0x1bac c0x0000 (---------------) + I edu - 0x00202342, // n0x1bad c0x0000 (---------------) + I go - 0x0021e283, // n0x1bae c0x0000 (---------------) + I gov - 0x00238c03, // n0x1baf c0x0000 (---------------) + I int - 0x0023fa03, // n0x1bb0 c0x0000 (---------------) + I mil - 0x00298944, // n0x1bb1 c0x0000 (---------------) + I name - 0x002170c3, // n0x1bb2 c0x0000 (---------------) + I net - 0x0020e3c3, // n0x1bb3 c0x0000 (---------------) + I nic - 0x0021dcc3, // n0x1bb4 c0x0000 (---------------) + I org - 0x002e3fc4, // n0x1bb5 c0x0000 (---------------) + I test - 0x00219fc3, // n0x1bb6 c0x0000 (---------------) + I web - 0x0021e283, // n0x1bb7 c0x0000 (---------------) + I gov - 0x00200742, // n0x1bb8 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1bb9 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1bba c0x0000 (---------------) + I edu - 0x0021e283, // n0x1bbb c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1bbc c0x0000 (---------------) + I mil - 0x002170c3, // n0x1bbd c0x0000 (---------------) + I net - 0x00207cc3, // n0x1bbe c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x1bbf c0x0000 (---------------) + I org - 0x002efd87, // n0x1bc0 c0x0000 (---------------) + I agrinet - 0x00222ac3, // n0x1bc1 c0x0000 (---------------) + I com - 0x00245b87, // n0x1bc2 c0x0000 (---------------) + I defense - 0x002d75c6, // n0x1bc3 c0x0000 (---------------) + I edunet - 0x00210e83, // n0x1bc4 c0x0000 (---------------) + I ens - 0x00236403, // n0x1bc5 c0x0000 (---------------) + I fin - 0x0021e283, // n0x1bc6 c0x0000 (---------------) + I gov - 0x00215703, // n0x1bc7 c0x0000 (---------------) + I ind - 0x00200304, // n0x1bc8 c0x0000 (---------------) + I info - 0x002c5104, // n0x1bc9 c0x0000 (---------------) + I intl - 0x002d4086, // n0x1bca c0x0000 (---------------) + I mincom - 0x0023ac03, // n0x1bcb c0x0000 (---------------) + I nat - 0x002170c3, // n0x1bcc c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1bcd c0x0000 (---------------) + I org - 0x0028acc5, // n0x1bce c0x0000 (---------------) + I perso - 0x003538c4, // n0x1bcf c0x0000 (---------------) + I rnrt - 0x002e6c03, // n0x1bd0 c0x0000 (---------------) + I rns - 0x00205b83, // n0x1bd1 c0x0000 (---------------) + I rnu - 0x002ae287, // n0x1bd2 c0x0000 (---------------) + I tourism - 0x0033c485, // n0x1bd3 c0x0000 (---------------) + I turen - 0x00222ac3, // n0x1bd4 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1bd5 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1bd6 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1bd7 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1bd8 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1bd9 c0x0000 (---------------) + I org - 0x00201482, // n0x1bda c0x0000 (---------------) + I av - 0x002791c3, // n0x1bdb c0x0000 (---------------) + I bbs - 0x00251643, // n0x1bdc c0x0000 (---------------) + I bel - 0x00310603, // n0x1bdd c0x0000 (---------------) + I biz - 0x51622ac3, // n0x1bde c0x0145 (n0x1bef-n0x1bf0) + I com - 0x0022fb02, // n0x1bdf c0x0000 (---------------) + I dr - 0x002d75c3, // n0x1be0 c0x0000 (---------------) + I edu - 0x002012c3, // n0x1be1 c0x0000 (---------------) + I gen - 0x0021e283, // n0x1be2 c0x0000 (---------------) + I gov - 0x00200304, // n0x1be3 c0x0000 (---------------) + I info - 0x00312503, // n0x1be4 c0x0000 (---------------) + I k12 - 0x0023df03, // n0x1be5 c0x0000 (---------------) + I kep - 0x0023fa03, // n0x1be6 c0x0000 (---------------) + I mil - 0x00298944, // n0x1be7 c0x0000 (---------------) + I name - 0x51a1c742, // n0x1be8 c0x0146 (n0x1bf0-n0x1bf1) + I nc - 0x002170c3, // n0x1be9 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1bea c0x0000 (---------------) + I org - 0x00218943, // n0x1beb c0x0000 (---------------) + I pol - 0x0022ba83, // n0x1bec c0x0000 (---------------) + I tel - 0x0020bf42, // n0x1bed c0x0000 (---------------) + I tv - 0x00219fc3, // n0x1bee c0x0000 (---------------) + I web - 0x000e4188, // n0x1bef c0x0000 (---------------) + blogspot - 0x0021e283, // n0x1bf0 c0x0000 (---------------) + I gov - 0x002751c4, // n0x1bf1 c0x0000 (---------------) + I aero - 0x00310603, // n0x1bf2 c0x0000 (---------------) + I biz - 0x00200742, // n0x1bf3 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1bf4 c0x0000 (---------------) + I com - 0x00228d44, // n0x1bf5 c0x0000 (---------------) + I coop - 0x002d75c3, // n0x1bf6 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1bf7 c0x0000 (---------------) + I gov - 0x00200304, // n0x1bf8 c0x0000 (---------------) + I info - 0x00238c03, // n0x1bf9 c0x0000 (---------------) + I int - 0x002a5d04, // n0x1bfa c0x0000 (---------------) + I jobs - 0x00203604, // n0x1bfb c0x0000 (---------------) + I mobi - 0x002bd646, // n0x1bfc c0x0000 (---------------) + I museum - 0x00298944, // n0x1bfd c0x0000 (---------------) + I name - 0x002170c3, // n0x1bfe c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1bff c0x0000 (---------------) + I org - 0x00218243, // n0x1c00 c0x0000 (---------------) + I pro - 0x0027f186, // n0x1c01 c0x0000 (---------------) + I travel - 0x00041e4b, // n0x1c02 c0x0000 (---------------) + better-than - 0x00009ac6, // n0x1c03 c0x0000 (---------------) + dyndns - 0x00019e0a, // n0x1c04 c0x0000 (---------------) + on-the-web - 0x00171e8a, // n0x1c05 c0x0000 (---------------) + worse-than - 0x000e4188, // n0x1c06 c0x0000 (---------------) + blogspot - 0x002752c4, // n0x1c07 c0x0000 (---------------) + I club - 0x00222ac3, // n0x1c08 c0x0000 (---------------) + I com - 0x003105c4, // n0x1c09 c0x0000 (---------------) + I ebiz - 0x002d75c3, // n0x1c0a c0x0000 (---------------) + I edu - 0x00212084, // n0x1c0b c0x0000 (---------------) + I game - 0x0021e283, // n0x1c0c c0x0000 (---------------) + I gov - 0x00300b83, // n0x1c0d c0x0000 (---------------) + I idv - 0x0023fa03, // n0x1c0e c0x0000 (---------------) + I mil - 0x002170c3, // n0x1c0f c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1c10 c0x0000 (---------------) + I org - 0x0030d70b, // n0x1c11 c0x0000 (---------------) + I xn--czrw28b - 0x003867ca, // n0x1c12 c0x0000 (---------------) + I xn--uc0atv - 0x0039604c, // n0x1c13 c0x0000 (---------------) + I xn--zf0ao64a - 0x00201e82, // n0x1c14 c0x0000 (---------------) + I ac - 0x00200742, // n0x1c15 c0x0000 (---------------) + I co - 0x00202342, // n0x1c16 c0x0000 (---------------) + I go - 0x00294945, // n0x1c17 c0x0000 (---------------) + I hotel - 0x00200304, // n0x1c18 c0x0000 (---------------) + I info - 0x00208942, // n0x1c19 c0x0000 (---------------) + I me - 0x0023fa03, // n0x1c1a c0x0000 (---------------) + I mil - 0x00203604, // n0x1c1b c0x0000 (---------------) + I mobi - 0x00201082, // n0x1c1c c0x0000 (---------------) + I ne - 0x00200c42, // n0x1c1d c0x0000 (---------------) + I or - 0x00200982, // n0x1c1e c0x0000 (---------------) + I sc - 0x0020bf42, // n0x1c1f c0x0000 (---------------) + I tv - 0x0029d289, // n0x1c20 c0x0000 (---------------) + I cherkassy - 0x0028e908, // n0x1c21 c0x0000 (---------------) + I cherkasy - 0x00259889, // n0x1c22 c0x0000 (---------------) + I chernigov - 0x0025f489, // n0x1c23 c0x0000 (---------------) + I chernihiv - 0x0026b44a, // n0x1c24 c0x0000 (---------------) + I chernivtsi - 0x00367e8a, // n0x1c25 c0x0000 (---------------) + I chernovtsy - 0x00201782, // n0x1c26 c0x0000 (---------------) + I ck - 0x002211c2, // n0x1c27 c0x0000 (---------------) + I cn - 0x00200742, // n0x1c28 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1c29 c0x0000 (---------------) + I com - 0x0020c502, // n0x1c2a c0x0000 (---------------) + I cr - 0x00231c86, // n0x1c2b c0x0000 (---------------) + I crimea - 0x0033f802, // n0x1c2c c0x0000 (---------------) + I cv - 0x00209b82, // n0x1c2d c0x0000 (---------------) + I dn - 0x0036ad4e, // n0x1c2e c0x0000 (---------------) + I dnepropetrovsk - 0x0025ec0e, // n0x1c2f c0x0000 (---------------) + I dnipropetrovsk - 0x0026b2c7, // n0x1c30 c0x0000 (---------------) + I dominic - 0x003409c7, // n0x1c31 c0x0000 (---------------) + I donetsk - 0x00238b42, // n0x1c32 c0x0000 (---------------) + I dp - 0x002d75c3, // n0x1c33 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1c34 c0x0000 (---------------) + I gov - 0x00239ec2, // n0x1c35 c0x0000 (---------------) + I if - 0x00200242, // n0x1c36 c0x0000 (---------------) + I in - 0x0022cf4f, // n0x1c37 c0x0000 (---------------) + I ivano-frankivsk - 0x002176c2, // n0x1c38 c0x0000 (---------------) + I kh - 0x00244d07, // n0x1c39 c0x0000 (---------------) + I kharkiv - 0x0024cb07, // n0x1c3a c0x0000 (---------------) + I kharkov - 0x00250087, // n0x1c3b c0x0000 (---------------) + I kherson - 0x0025304c, // n0x1c3c c0x0000 (---------------) + I khmelnitskiy - 0x002581cc, // n0x1c3d c0x0000 (---------------) + I khmelnytskyi - 0x0037aac4, // n0x1c3e c0x0000 (---------------) + I kiev - 0x00254bca, // n0x1c3f c0x0000 (---------------) + I kirovograd - 0x00268d82, // n0x1c40 c0x0000 (---------------) + I km - 0x002034c2, // n0x1c41 c0x0000 (---------------) + I kr - 0x0029ed84, // n0x1c42 c0x0000 (---------------) + I krym - 0x00238082, // n0x1c43 c0x0000 (---------------) + I ks - 0x002aa8c2, // n0x1c44 c0x0000 (---------------) + I kv - 0x00258404, // n0x1c45 c0x0000 (---------------) + I kyiv - 0x0020e4c2, // n0x1c46 c0x0000 (---------------) + I lg - 0x00205ec2, // n0x1c47 c0x0000 (---------------) + I lt - 0x003054c7, // n0x1c48 c0x0000 (---------------) + I lugansk - 0x002e6745, // n0x1c49 c0x0000 (---------------) + I lutsk - 0x00227f02, // n0x1c4a c0x0000 (---------------) + I lv - 0x0022cec4, // n0x1c4b c0x0000 (---------------) + I lviv - 0x00356d82, // n0x1c4c c0x0000 (---------------) + I mk - 0x002f28c8, // n0x1c4d c0x0000 (---------------) + I mykolaiv - 0x002170c3, // n0x1c4e c0x0000 (---------------) + I net - 0x00342248, // n0x1c4f c0x0000 (---------------) + I nikolaev - 0x00200782, // n0x1c50 c0x0000 (---------------) + I od - 0x00227505, // n0x1c51 c0x0000 (---------------) + I odesa - 0x0035fa46, // n0x1c52 c0x0000 (---------------) + I odessa - 0x0021dcc3, // n0x1c53 c0x0000 (---------------) + I org - 0x00201e02, // n0x1c54 c0x0000 (---------------) + I pl - 0x002c8f07, // n0x1c55 c0x0000 (---------------) + I poltava - 0x00207742, // n0x1c56 c0x0000 (---------------) + I pp - 0x002cba85, // n0x1c57 c0x0000 (---------------) + I rivne - 0x00208085, // n0x1c58 c0x0000 (---------------) + I rovno - 0x00211fc2, // n0x1c59 c0x0000 (---------------) + I rv - 0x002046c2, // n0x1c5a c0x0000 (---------------) + I sb - 0x0035e2ca, // n0x1c5b c0x0000 (---------------) + I sebastopol - 0x0024688a, // n0x1c5c c0x0000 (---------------) + I sevastopol - 0x0023f582, // n0x1c5d c0x0000 (---------------) + I sm - 0x00308004, // n0x1c5e c0x0000 (---------------) + I sumy - 0x00203202, // n0x1c5f c0x0000 (---------------) + I te - 0x0036c988, // n0x1c60 c0x0000 (---------------) + I ternopil - 0x002018c2, // n0x1c61 c0x0000 (---------------) + I uz - 0x0036a1c8, // n0x1c62 c0x0000 (---------------) + I uzhgorod - 0x002dc087, // n0x1c63 c0x0000 (---------------) + I vinnica - 0x002dc4c9, // n0x1c64 c0x0000 (---------------) + I vinnytsia - 0x00208102, // n0x1c65 c0x0000 (---------------) + I vn - 0x002e1c05, // n0x1c66 c0x0000 (---------------) + I volyn - 0x0028edc5, // n0x1c67 c0x0000 (---------------) + I yalta - 0x002b214b, // n0x1c68 c0x0000 (---------------) + I zaporizhzhe - 0x002b2b8c, // n0x1c69 c0x0000 (---------------) + I zaporizhzhia - 0x00220408, // n0x1c6a c0x0000 (---------------) + I zhitomir - 0x002e1fc8, // n0x1c6b c0x0000 (---------------) + I zhytomyr - 0x002c2042, // n0x1c6c c0x0000 (---------------) + I zp - 0x0020fa82, // n0x1c6d c0x0000 (---------------) + I zt - 0x00201e82, // n0x1c6e c0x0000 (---------------) + I ac - 0x000e4188, // n0x1c6f c0x0000 (---------------) + blogspot - 0x00200742, // n0x1c70 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1c71 c0x0000 (---------------) + I com - 0x00202342, // n0x1c72 c0x0000 (---------------) + I go - 0x00201082, // n0x1c73 c0x0000 (---------------) + I ne - 0x00200c42, // n0x1c74 c0x0000 (---------------) + I or - 0x0021dcc3, // n0x1c75 c0x0000 (---------------) + I org - 0x00200982, // n0x1c76 c0x0000 (---------------) + I sc - 0x00201e82, // n0x1c77 c0x0000 (---------------) + I ac - 0x53a00742, // n0x1c78 c0x014e (n0x1c82-n0x1c83) + I co - 0x53e1e283, // n0x1c79 c0x014f (n0x1c83-n0x1c84) + I gov - 0x003413c3, // n0x1c7a c0x0000 (---------------) + I ltd - 0x00208942, // n0x1c7b c0x0000 (---------------) + I me - 0x002170c3, // n0x1c7c c0x0000 (---------------) + I net - 0x002037c3, // n0x1c7d c0x0000 (---------------) + I nhs - 0x0021dcc3, // n0x1c7e c0x0000 (---------------) + I org - 0x002c65c3, // n0x1c7f c0x0000 (---------------) + I plc - 0x00218946, // n0x1c80 c0x0000 (---------------) + I police - 0x01606103, // n0x1c81 c0x0005 (---------------)* o I sch - 0x000e4188, // n0x1c82 c0x0000 (---------------) + blogspot - 0x00043bc7, // n0x1c83 c0x0000 (---------------) + service - 0x54601a42, // n0x1c84 c0x0151 (n0x1cc3-n0x1cc6) + I ak - 0x54a00882, // n0x1c85 c0x0152 (n0x1cc6-n0x1cc9) + I al - 0x54e00602, // n0x1c86 c0x0153 (n0x1cc9-n0x1ccc) + I ar - 0x55200182, // n0x1c87 c0x0154 (n0x1ccc-n0x1ccf) + I as - 0x55608cc2, // n0x1c88 c0x0155 (n0x1ccf-n0x1cd2) + I az - 0x55a055c2, // n0x1c89 c0x0156 (n0x1cd2-n0x1cd5) + I ca - 0x55e00742, // n0x1c8a c0x0157 (n0x1cd5-n0x1cd8) + I co - 0x56223d82, // n0x1c8b c0x0158 (n0x1cd8-n0x1cdb) + I ct - 0x56616e02, // n0x1c8c c0x0159 (n0x1cdb-n0x1cde) + I dc - 0x56a006c2, // n0x1c8d c0x015a (n0x1cde-n0x1ce1) + I de - 0x0025ec03, // n0x1c8e c0x0000 (---------------) + I dni - 0x0020c743, // n0x1c8f c0x0000 (---------------) + I fed - 0x56e39b02, // n0x1c90 c0x015b (n0x1ce1-n0x1ce4) + I fl - 0x57201602, // n0x1c91 c0x015c (n0x1ce4-n0x1ce7) + I ga - 0x57629702, // n0x1c92 c0x015d (n0x1ce7-n0x1cea) + I gu - 0x57a00202, // n0x1c93 c0x015e (n0x1cea-n0x1cec) + I hi - 0x57e00482, // n0x1c94 c0x015f (n0x1cec-n0x1cef) + I ia - 0x58206202, // n0x1c95 c0x0160 (n0x1cef-n0x1cf2) + I id - 0x586036c2, // n0x1c96 c0x0161 (n0x1cf2-n0x1cf5) + I il - 0x58a00242, // n0x1c97 c0x0162 (n0x1cf5-n0x1cf8) + I in - 0x000aa785, // n0x1c98 c0x0000 (---------------) + is-by - 0x00209883, // n0x1c99 c0x0000 (---------------) + I isa - 0x00394c44, // n0x1c9a c0x0000 (---------------) + I kids - 0x58e38082, // n0x1c9b c0x0163 (n0x1cf8-n0x1cfb) + I ks - 0x59229082, // n0x1c9c c0x0164 (n0x1cfb-n0x1cfe) + I ky - 0x59601e42, // n0x1c9d c0x0165 (n0x1cfe-n0x1d01) + I la - 0x0006700b, // n0x1c9e c0x0000 (---------------) + land-4-sale - 0x59a04302, // n0x1c9f c0x0166 (n0x1d01-n0x1d04) + I ma - 0x5a238602, // n0x1ca0 c0x0168 (n0x1d07-n0x1d0a) + I md - 0x5a608942, // n0x1ca1 c0x0169 (n0x1d0a-n0x1d0d) + I me - 0x5aa04802, // n0x1ca2 c0x016a (n0x1d0d-n0x1d10) + I mi - 0x5ae17082, // n0x1ca3 c0x016b (n0x1d10-n0x1d13) + I mn - 0x5b203602, // n0x1ca4 c0x016c (n0x1d13-n0x1d16) + I mo - 0x5b609282, // n0x1ca5 c0x016d (n0x1d16-n0x1d19) + I ms - 0x5ba59642, // n0x1ca6 c0x016e (n0x1d19-n0x1d1c) + I mt - 0x5be1c742, // n0x1ca7 c0x016f (n0x1d1c-n0x1d1f) + I nc - 0x5c208f42, // n0x1ca8 c0x0170 (n0x1d1f-n0x1d21) + I nd - 0x5c601082, // n0x1ca9 c0x0171 (n0x1d21-n0x1d24) + I ne - 0x5ca037c2, // n0x1caa c0x0172 (n0x1d24-n0x1d27) + I nh - 0x5ce02942, // n0x1cab c0x0173 (n0x1d27-n0x1d2a) + I nj - 0x5d233c42, // n0x1cac c0x0174 (n0x1d2a-n0x1d2d) + I nm - 0x002c55c3, // n0x1cad c0x0000 (---------------) + I nsn - 0x5d608802, // n0x1cae c0x0175 (n0x1d2d-n0x1d30) + I nv - 0x5da108c2, // n0x1caf c0x0176 (n0x1d30-n0x1d33) + I ny - 0x5de051c2, // n0x1cb0 c0x0177 (n0x1d33-n0x1d36) + I oh - 0x5e201bc2, // n0x1cb1 c0x0178 (n0x1d36-n0x1d39) + I ok - 0x5e600c42, // n0x1cb2 c0x0179 (n0x1d39-n0x1d3c) + I or - 0x5ea052c2, // n0x1cb3 c0x017a (n0x1d3c-n0x1d3f) + I pa - 0x5ee18242, // n0x1cb4 c0x017b (n0x1d3f-n0x1d42) + I pr - 0x5f202842, // n0x1cb5 c0x017c (n0x1d42-n0x1d45) + I ri - 0x5f600982, // n0x1cb6 c0x017d (n0x1d45-n0x1d48) + I sc - 0x5fa4f842, // n0x1cb7 c0x017e (n0x1d48-n0x1d4a) + I sd - 0x000d044c, // n0x1cb8 c0x0000 (---------------) + stuff-4-sale - 0x5fe1d1c2, // n0x1cb9 c0x017f (n0x1d4a-n0x1d4d) + I tn - 0x60225242, // n0x1cba c0x0180 (n0x1d4d-n0x1d50) + I tx - 0x60600102, // n0x1cbb c0x0181 (n0x1d50-n0x1d53) + I ut - 0x60a013c2, // n0x1cbc c0x0182 (n0x1d53-n0x1d56) + I va - 0x60e13602, // n0x1cbd c0x0183 (n0x1d56-n0x1d59) + I vi - 0x6121e302, // n0x1cbe c0x0184 (n0x1d59-n0x1d5c) + I vt - 0x61602542, // n0x1cbf c0x0185 (n0x1d5c-n0x1d5f) + I wa - 0x61a05502, // n0x1cc0 c0x0186 (n0x1d5f-n0x1d62) + I wi - 0x61e63902, // n0x1cc1 c0x0187 (n0x1d62-n0x1d63) + I wv - 0x62237f82, // n0x1cc2 c0x0188 (n0x1d63-n0x1d66) + I wy - 0x0021aa82, // n0x1cc3 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cc4 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cc5 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cc6 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cc7 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cc8 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cc9 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cca c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ccb c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ccc c0x0000 (---------------) + I cc - 0x00312503, // n0x1ccd c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cce c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ccf c0x0000 (---------------) + I cc - 0x00312503, // n0x1cd0 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cd1 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cd2 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cd3 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cd4 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cd5 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cd6 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cd7 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cd8 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cd9 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cda c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cdb c0x0000 (---------------) + I cc - 0x00312503, // n0x1cdc c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cdd c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cde c0x0000 (---------------) + I cc - 0x00312503, // n0x1cdf c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ce0 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ce1 c0x0000 (---------------) + I cc - 0x00312503, // n0x1ce2 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ce3 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ce4 c0x0000 (---------------) + I cc - 0x00312503, // n0x1ce5 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ce6 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ce7 c0x0000 (---------------) + I cc - 0x00312503, // n0x1ce8 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ce9 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cea c0x0000 (---------------) + I cc - 0x00273c43, // n0x1ceb c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cec c0x0000 (---------------) + I cc - 0x00312503, // n0x1ced c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cee c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cef c0x0000 (---------------) + I cc - 0x00312503, // n0x1cf0 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cf1 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cf2 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cf3 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cf4 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cf5 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cf6 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cf7 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cf8 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cf9 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cfa c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cfb c0x0000 (---------------) + I cc - 0x00312503, // n0x1cfc c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cfd c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cfe c0x0000 (---------------) + I cc - 0x00312503, // n0x1cff c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d00 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d01 c0x0000 (---------------) + I cc - 0x59f12503, // n0x1d02 c0x0167 (n0x1d04-n0x1d07) + I k12 - 0x00273c43, // n0x1d03 c0x0000 (---------------) + I lib - 0x002e8ec4, // n0x1d04 c0x0000 (---------------) + I chtr - 0x0028e806, // n0x1d05 c0x0000 (---------------) + I paroch - 0x002ce243, // n0x1d06 c0x0000 (---------------) + I pvt - 0x0021aa82, // n0x1d07 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d08 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d09 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d0a c0x0000 (---------------) + I cc - 0x00312503, // n0x1d0b c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d0c c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d0d c0x0000 (---------------) + I cc - 0x00312503, // n0x1d0e c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d0f c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d10 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d11 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d12 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d13 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d14 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d15 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d16 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d17 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d18 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d19 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d1a c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d1b c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d1c c0x0000 (---------------) + I cc - 0x00312503, // n0x1d1d c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d1e c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d1f c0x0000 (---------------) + I cc - 0x00273c43, // n0x1d20 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d21 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d22 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d23 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d24 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d25 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d26 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d27 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d28 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d29 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d2a c0x0000 (---------------) + I cc - 0x00312503, // n0x1d2b c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d2c c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d2d c0x0000 (---------------) + I cc - 0x00312503, // n0x1d2e c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d2f c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d30 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d31 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d32 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d33 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d34 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d35 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d36 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d37 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d38 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d39 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d3a c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d3b c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d3c c0x0000 (---------------) + I cc - 0x00312503, // n0x1d3d c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d3e c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d3f c0x0000 (---------------) + I cc - 0x00312503, // n0x1d40 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d41 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d42 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d43 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d44 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d45 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d46 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d47 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d48 c0x0000 (---------------) + I cc - 0x00273c43, // n0x1d49 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d4a c0x0000 (---------------) + I cc - 0x00312503, // n0x1d4b c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d4c c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d4d c0x0000 (---------------) + I cc - 0x00312503, // n0x1d4e c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d4f c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d50 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d51 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d52 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d53 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d54 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d55 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d56 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d57 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d58 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d59 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d5a c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d5b c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d5c c0x0000 (---------------) + I cc - 0x00312503, // n0x1d5d c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d5e c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d5f c0x0000 (---------------) + I cc - 0x00312503, // n0x1d60 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d61 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d62 c0x0000 (---------------) + I cc - 0x0021aa82, // n0x1d63 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d64 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d65 c0x0000 (---------------) + I lib - 0x62a22ac3, // n0x1d66 c0x018a (n0x1d6c-n0x1d6d) + I com - 0x002d75c3, // n0x1d67 c0x0000 (---------------) + I edu - 0x0032b9c3, // n0x1d68 c0x0000 (---------------) + I gub - 0x0023fa03, // n0x1d69 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1d6a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d6b c0x0000 (---------------) + I org - 0x000e4188, // n0x1d6c c0x0000 (---------------) + blogspot - 0x00200742, // n0x1d6d c0x0000 (---------------) + I co - 0x00222ac3, // n0x1d6e c0x0000 (---------------) + I com - 0x002170c3, // n0x1d6f c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d70 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1d71 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1d72 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1d73 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1d74 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1d75 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d76 c0x0000 (---------------) + I org - 0x00246584, // n0x1d77 c0x0000 (---------------) + I arts - 0x00200742, // n0x1d78 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1d79 c0x0000 (---------------) + I com - 0x0023ee43, // n0x1d7a c0x0000 (---------------) + I e12 - 0x002d75c3, // n0x1d7b c0x0000 (---------------) + I edu - 0x00238544, // n0x1d7c c0x0000 (---------------) + I firm - 0x0034eb03, // n0x1d7d c0x0000 (---------------) + I gob - 0x0021e283, // n0x1d7e c0x0000 (---------------) + I gov - 0x00200304, // n0x1d7f c0x0000 (---------------) + I info - 0x00238c03, // n0x1d80 c0x0000 (---------------) + I int - 0x0023fa03, // n0x1d81 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1d82 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d83 c0x0000 (---------------) + I org - 0x002e6343, // n0x1d84 c0x0000 (---------------) + I rec - 0x002cf4c5, // n0x1d85 c0x0000 (---------------) + I store - 0x0029d583, // n0x1d86 c0x0000 (---------------) + I tec - 0x00219fc3, // n0x1d87 c0x0000 (---------------) + I web - 0x00200742, // n0x1d88 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1d89 c0x0000 (---------------) + I com - 0x00312503, // n0x1d8a c0x0000 (---------------) + I k12 - 0x002170c3, // n0x1d8b c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d8c c0x0000 (---------------) + I org - 0x00201e82, // n0x1d8d c0x0000 (---------------) + I ac - 0x00310603, // n0x1d8e c0x0000 (---------------) + I biz - 0x000e4188, // n0x1d8f c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1d90 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1d91 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1d92 c0x0000 (---------------) + I gov - 0x00205e06, // n0x1d93 c0x0000 (---------------) + I health - 0x00200304, // n0x1d94 c0x0000 (---------------) + I info - 0x00238c03, // n0x1d95 c0x0000 (---------------) + I int - 0x00298944, // n0x1d96 c0x0000 (---------------) + I name - 0x002170c3, // n0x1d97 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d98 c0x0000 (---------------) + I org - 0x00218243, // n0x1d99 c0x0000 (---------------) + I pro - 0x00222ac3, // n0x1d9a c0x0000 (---------------) + I com - 0x002d75c3, // n0x1d9b c0x0000 (---------------) + I edu - 0x002170c3, // n0x1d9c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d9d c0x0000 (---------------) + I org - 0x00222ac3, // n0x1d9e c0x0000 (---------------) + I com - 0x00009ac6, // n0x1d9f c0x0000 (---------------) + dyndns - 0x002d75c3, // n0x1da0 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1da1 c0x0000 (---------------) + I gov - 0x00108086, // n0x1da2 c0x0000 (---------------) + mypets - 0x002170c3, // n0x1da3 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1da4 c0x0000 (---------------) + I org - 0x002f1308, // n0x1da5 c0x0000 (---------------) + I xn--80au - 0x002f5c09, // n0x1da6 c0x0000 (---------------) + I xn--90azh - 0x00303289, // n0x1da7 c0x0000 (---------------) + I xn--c1avg - 0x00312fc8, // n0x1da8 c0x0000 (---------------) + I xn--d1at - 0x00362248, // n0x1da9 c0x0000 (---------------) + I xn--o1ac - 0x00362249, // n0x1daa c0x0000 (---------------) + I xn--o1ach - 0x00201e82, // n0x1dab c0x0000 (---------------) + I ac - 0x00301306, // n0x1dac c0x0000 (---------------) + I agrica - 0x00205e83, // n0x1dad c0x0000 (---------------) + I alt - 0x65200742, // n0x1dae c0x0194 (n0x1dbc-n0x1dbd) + I co - 0x002d75c3, // n0x1daf c0x0000 (---------------) + I edu - 0x0021e283, // n0x1db0 c0x0000 (---------------) + I gov - 0x002c6987, // n0x1db1 c0x0000 (---------------) + I grondar - 0x00253883, // n0x1db2 c0x0000 (---------------) + I law - 0x0023fa03, // n0x1db3 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1db4 c0x0000 (---------------) + I net - 0x00202303, // n0x1db5 c0x0000 (---------------) + I ngo - 0x00208b83, // n0x1db6 c0x0000 (---------------) + I nis - 0x00207cc3, // n0x1db7 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x1db8 c0x0000 (---------------) + I org - 0x00235406, // n0x1db9 c0x0000 (---------------) + I school - 0x00208902, // n0x1dba c0x0000 (---------------) + I tm - 0x00219fc3, // n0x1dbb c0x0000 (---------------) + I web - 0x000e4188, // n0x1dbc c0x0000 (---------------) + blogspot + 0x00379643, // n0x0000 c0x0000 (---------------) + I aaa + 0x002ff504, // n0x0001 c0x0000 (---------------) + I aarp + 0x00243386, // n0x0002 c0x0000 (---------------) + I abarth + 0x0030f843, // n0x0003 c0x0000 (---------------) + I abb + 0x0030f846, // n0x0004 c0x0000 (---------------) + I abbott + 0x00364206, // n0x0005 c0x0000 (---------------) + I abbvie + 0x003973c3, // n0x0006 c0x0000 (---------------) + I abc + 0x002a8884, // n0x0007 c0x0000 (---------------) + I able + 0x00226607, // n0x0008 c0x0000 (---------------) + I abogado + 0x00242fc8, // n0x0009 c0x0000 (---------------) + I abudhabi + 0x01a05882, // n0x000a c0x0006 (n0x05f6-n0x05fc) + I ac + 0x00305387, // n0x000b c0x0000 (---------------) + I academy + 0x0034d409, // n0x000c c0x0000 (---------------) + I accenture + 0x002eda0a, // n0x000d c0x0000 (---------------) + I accountant + 0x002eda0b, // n0x000e c0x0000 (---------------) + I accountants + 0x0022f6c3, // n0x000f c0x0000 (---------------) + I aco + 0x002820c6, // n0x0010 c0x0000 (---------------) + I active + 0x00235dc5, // n0x0011 c0x0000 (---------------) + I actor + 0x01e03d82, // n0x0012 c0x0007 (n0x05fc-n0x05fd) + I ad + 0x00209d04, // n0x0013 c0x0000 (---------------) + I adac + 0x00253903, // n0x0014 c0x0000 (---------------) + I ads + 0x00299105, // n0x0015 c0x0000 (---------------) + I adult + 0x0220ac02, // n0x0016 c0x0008 (n0x05fd-n0x0605) + I ae + 0x0024d5c3, // n0x0017 c0x0000 (---------------) + I aeg + 0x026bcb84, // n0x0018 c0x0009 (n0x0605-n0x065e) + I aero + 0x003023c5, // n0x0019 c0x0000 (---------------) + I aetna + 0x02a00342, // n0x001a c0x000a (n0x065e-n0x0663) + I af + 0x0036c30e, // n0x001b c0x0000 (---------------) + I afamilycompany + 0x00249ec3, // n0x001c c0x0000 (---------------) + I afl + 0x0036af06, // n0x001d c0x0000 (---------------) + I africa + 0x0036af0b, // n0x001e c0x0000 (---------------) + I africamagic + 0x02e01002, // n0x001f c0x000b (n0x0663-n0x0668) + I ag + 0x00279c47, // n0x0020 c0x0000 (---------------) + I agakhan + 0x002393c6, // n0x0021 c0x0000 (---------------) + I agency + 0x03202142, // n0x0022 c0x000c (n0x0668-n0x066c) + I ai + 0x0025cc83, // n0x0023 c0x0000 (---------------) + I aig + 0x0025cc84, // n0x0024 c0x0000 (---------------) + I aigo + 0x00204686, // n0x0025 c0x0000 (---------------) + I airbus + 0x0023ba48, // n0x0026 c0x0000 (---------------) + I airforce + 0x0027e646, // n0x0027 c0x0000 (---------------) + I airtel + 0x00377d04, // n0x0028 c0x0000 (---------------) + I akdn + 0x036001c2, // n0x0029 c0x000d (n0x066c-n0x0673) + I al + 0x00324e49, // n0x002a c0x0000 (---------------) + I alfaromeo + 0x003934c7, // n0x002b c0x0000 (---------------) + I alibaba + 0x002b7146, // n0x002c c0x0000 (---------------) + I alipay + 0x0033a7c9, // n0x002d c0x0000 (---------------) + I allfinanz + 0x0028e708, // n0x002e c0x0000 (---------------) + I allstate + 0x00391984, // n0x002f c0x0000 (---------------) + I ally + 0x0021c6c6, // n0x0030 c0x0000 (---------------) + I alsace + 0x003353c6, // n0x0031 c0x0000 (---------------) + I alstom + 0x03a01382, // n0x0032 c0x000e (n0x0673-n0x0674) + I am + 0x00240a8f, // n0x0033 c0x0000 (---------------) + I americanexpress + 0x00378c8e, // n0x0034 c0x0000 (---------------) + I americanfamily + 0x003a3884, // n0x0035 c0x0000 (---------------) + I amex + 0x00365985, // n0x0036 c0x0000 (---------------) + I amfam + 0x00229685, // n0x0037 c0x0000 (---------------) + I amica + 0x002b0d09, // n0x0038 c0x0000 (---------------) + I amsterdam + 0x03e00b42, // n0x0039 c0x000f (n0x0674-n0x0678) + I an + 0x0023dc09, // n0x003a c0x0000 (---------------) + I analytics + 0x0031e587, // n0x003b c0x0000 (---------------) + I android + 0x0034c406, // n0x003c c0x0000 (---------------) + I anquan + 0x0024fa83, // n0x003d c0x0000 (---------------) + I anz + 0x04203042, // n0x003e c0x0010 (n0x0678-n0x067e) + I ao + 0x00267903, // n0x003f c0x0000 (---------------) + I aol + 0x002136ca, // n0x0040 c0x0000 (---------------) + I apartments + 0x00220503, // n0x0041 c0x0000 (---------------) + I app + 0x002bda45, // n0x0042 c0x0000 (---------------) + I apple + 0x00229802, // n0x0043 c0x0000 (---------------) + I aq + 0x0027d0c9, // n0x0044 c0x0000 (---------------) + I aquarelle + 0x046011c2, // n0x0045 c0x0011 (n0x067e-n0x0687) + I ar + 0x0030f386, // n0x0046 c0x0000 (---------------) + I aramco + 0x002c3405, // n0x0047 c0x0000 (---------------) + I archi + 0x00344984, // n0x0048 c0x0000 (---------------) + I army + 0x04e51f04, // n0x0049 c0x0013 (n0x0688-n0x068e) + I arpa + 0x00234904, // n0x004a c0x0000 (---------------) + I arte + 0x05202002, // n0x004b c0x0014 (n0x068e-n0x068f) + I as + 0x002ff244, // n0x004c c0x0000 (---------------) + I asda + 0x0036a844, // n0x004d c0x0000 (---------------) + I asia + 0x0033014a, // n0x004e c0x0000 (---------------) + I associates + 0x05600102, // n0x004f c0x0015 (n0x068f-n0x0696) + I at + 0x00308207, // n0x0050 c0x0000 (---------------) + I athleta + 0x00378648, // n0x0051 c0x0000 (---------------) + I attorney + 0x05e09602, // n0x0052 c0x0017 (n0x0697-n0x06a9) + I au + 0x00319547, // n0x0053 c0x0000 (---------------) + I auction + 0x0022e9c4, // n0x0054 c0x0000 (---------------) + I audi + 0x002cae47, // n0x0055 c0x0000 (---------------) + I audible + 0x0022e9c5, // n0x0056 c0x0000 (---------------) + I audio + 0x0035d247, // n0x0057 c0x0000 (---------------) + I auspost + 0x0031e346, // n0x0058 c0x0000 (---------------) + I author + 0x00216404, // n0x0059 c0x0000 (---------------) + I auto + 0x00321605, // n0x005a c0x0000 (---------------) + I autos + 0x002ca387, // n0x005b c0x0000 (---------------) + I avianca + 0x06e01082, // n0x005c c0x001b (n0x06b7-n0x06b8) + I aw + 0x002eb603, // n0x005d c0x0000 (---------------) + I aws + 0x0020d002, // n0x005e c0x0000 (---------------) + I ax + 0x00362dc3, // n0x005f c0x0000 (---------------) + I axa + 0x07212502, // n0x0060 c0x001c (n0x06b8-n0x06c4) + I az + 0x00277585, // n0x0061 c0x0000 (---------------) + I azure + 0x07603002, // n0x0062 c0x001d (n0x06c4-n0x06cf) + I ba + 0x00301844, // n0x0063 c0x0000 (---------------) + I baby + 0x00274445, // n0x0064 c0x0000 (---------------) + I baidu + 0x003a37c7, // n0x0065 c0x0000 (---------------) + I banamex + 0x002dcc8e, // n0x0066 c0x0000 (---------------) + I bananarepublic + 0x00300944, // n0x0067 c0x0000 (---------------) + I band + 0x0020ad44, // n0x0068 c0x0000 (---------------) + I bank + 0x00211783, // n0x0069 c0x0000 (---------------) + I bar + 0x002bb549, // n0x006a c0x0000 (---------------) + I barcelona + 0x002d690b, // n0x006b c0x0000 (---------------) + I barclaycard + 0x002fe188, // n0x006c c0x0000 (---------------) + I barclays + 0x00307708, // n0x006d c0x0000 (---------------) + I barefoot + 0x0030dc48, // n0x006e c0x0000 (---------------) + I bargains + 0x0033a60a, // n0x006f c0x0000 (---------------) + I basketball + 0x0035d147, // n0x0070 c0x0000 (---------------) + I bauhaus + 0x0030b746, // n0x0071 c0x0000 (---------------) + I bayern + 0x07ac9742, // n0x0072 c0x001e (n0x06cf-n0x06d9) + I bb + 0x00362043, // n0x0073 c0x0000 (---------------) + I bbc + 0x0036a303, // n0x0074 c0x0000 (---------------) + I bbt + 0x00373384, // n0x0075 c0x0000 (---------------) + I bbva + 0x00397403, // n0x0076 c0x0000 (---------------) + I bcg + 0x0035bb43, // n0x0077 c0x0000 (---------------) + I bcn + 0x01712842, // n0x0078 c0x0005 (---------------)* o I bd + 0x07e094c2, // n0x0079 c0x001f (n0x06d9-n0x06db) + I be + 0x00215745, // n0x007a c0x0000 (---------------) + I beats + 0x0020b084, // n0x007b c0x0000 (---------------) + I beer + 0x002de9c7, // n0x007c c0x0000 (---------------) + I bentley + 0x00351e06, // n0x007d c0x0000 (---------------) + I berlin + 0x003633c4, // n0x007e c0x0000 (---------------) + I best + 0x00392f47, // n0x007f c0x0000 (---------------) + I bestbuy + 0x00210503, // n0x0080 c0x0000 (---------------) + I bet + 0x08357082, // n0x0081 c0x0020 (n0x06db-n0x06dc) + I bf + 0x08626882, // n0x0082 c0x0021 (n0x06dc-n0x0701) + I bg + 0x08b0c002, // n0x0083 c0x0022 (n0x0701-n0x0706) + I bh + 0x0039a906, // n0x0084 c0x0000 (---------------) + I bharti + 0x08e00002, // n0x0085 c0x0023 (n0x0706-n0x070b) + I bi + 0x00351845, // n0x0086 c0x0000 (---------------) + I bible + 0x00313d83, // n0x0087 c0x0000 (---------------) + I bid + 0x00202b44, // n0x0088 c0x0000 (---------------) + I bike + 0x002d6744, // n0x0089 c0x0000 (---------------) + I bing + 0x002d6745, // n0x008a c0x0000 (---------------) + I bingo + 0x00203a43, // n0x008b c0x0000 (---------------) + I bio + 0x0930a143, // n0x008c c0x0024 (n0x070b-n0x0712) + I biz + 0x096066c2, // n0x008d c0x0025 (n0x0712-n0x0716) + I bj + 0x002828c5, // n0x008e c0x0000 (---------------) + I black + 0x002828cb, // n0x008f c0x0000 (---------------) + I blackfriday + 0x00251446, // n0x0090 c0x0000 (---------------) + I blanco + 0x00208dcb, // n0x0091 c0x0000 (---------------) + I blockbuster + 0x00229004, // n0x0092 c0x0000 (---------------) + I blog + 0x00209389, // n0x0093 c0x0000 (---------------) + I bloomberg + 0x0020b184, // n0x0094 c0x0000 (---------------) + I blue + 0x09a0c542, // n0x0095 c0x0026 (n0x0716-n0x071b) + I bm + 0x0020d543, // n0x0096 c0x0000 (---------------) + I bms + 0x0020f283, // n0x0097 c0x0000 (---------------) + I bmw + 0x0160f402, // n0x0098 c0x0005 (---------------)* o I bn + 0x0023e043, // n0x0099 c0x0000 (---------------) + I bnl + 0x0020f40a, // n0x009a c0x0000 (---------------) + I bnpparibas + 0x09e06dc2, // n0x009b c0x0027 (n0x071b-n0x0724) + I bo + 0x00209f85, // n0x009c c0x0000 (---------------) + I boats + 0x0028888a, // n0x009d c0x0000 (---------------) + I boehringer + 0x002d5184, // n0x009e c0x0000 (---------------) + I bofa + 0x00211483, // n0x009f c0x0000 (---------------) + I bom + 0x00211944, // n0x00a0 c0x0000 (---------------) + I bond + 0x002149c3, // n0x00a1 c0x0000 (---------------) + I boo + 0x002149c4, // n0x00a2 c0x0000 (---------------) + I book + 0x002149c7, // n0x00a3 c0x0000 (---------------) + I booking + 0x00214f85, // n0x00a4 c0x0000 (---------------) + I boots + 0x00215cc5, // n0x00a5 c0x0000 (---------------) + I bosch + 0x00216286, // n0x00a6 c0x0000 (---------------) + I bostik + 0x00217083, // n0x00a7 c0x0000 (---------------) + I bot + 0x00219ec8, // n0x00a8 c0x0000 (---------------) + I boutique + 0x0a20bb42, // n0x00a9 c0x0028 (n0x0724-n0x076a) + I br + 0x0021ab08, // n0x00aa c0x0000 (---------------) + I bradesco + 0x0021fc0b, // n0x00ab c0x0000 (---------------) + I bridgestone + 0x0021ef88, // n0x00ac c0x0000 (---------------) + I broadway + 0x00220086, // n0x00ad c0x0000 (---------------) + I broker + 0x00221247, // n0x00ae c0x0000 (---------------) + I brother + 0x002230c8, // n0x00af c0x0000 (---------------) + I brussels + 0x0aa311c2, // n0x00b0 c0x002a (n0x076b-n0x0770) + I bs + 0x0ae1d7c2, // n0x00b1 c0x002b (n0x0770-n0x0775) + I bt + 0x002ce848, // n0x00b2 c0x0000 (---------------) + I budapest + 0x002338c7, // n0x00b3 c0x0000 (---------------) + I bugatti + 0x002dfcc5, // n0x00b4 c0x0000 (---------------) + I build + 0x002dfcc8, // n0x00b5 c0x0000 (---------------) + I builders + 0x002ac908, // n0x00b6 c0x0000 (---------------) + I business + 0x00393043, // n0x00b7 c0x0000 (---------------) + I buy + 0x00229f84, // n0x00b8 c0x0000 (---------------) + I buzz + 0x00364282, // n0x00b9 c0x0000 (---------------) + I bv + 0x0b22a802, // n0x00ba c0x002c (n0x0775-n0x0777) + I bw + 0x0b602902, // n0x00bb c0x002d (n0x0777-n0x077b) + I by + 0x0be2b202, // n0x00bc c0x002f (n0x077c-n0x0782) + I bz + 0x0022b203, // n0x00bd c0x0000 (---------------) + I bzh + 0x0c200302, // n0x00be c0x0030 (n0x0782-n0x0793) + I ca + 0x0030f803, // n0x00bf c0x0000 (---------------) + I cab + 0x00200304, // n0x00c0 c0x0000 (---------------) + I cafe + 0x00217203, // n0x00c1 c0x0000 (---------------) + I cal + 0x00391944, // n0x00c2 c0x0000 (---------------) + I call + 0x00225dcb, // n0x00c3 c0x0000 (---------------) + I calvinklein + 0x0031b3c6, // n0x00c4 c0x0000 (---------------) + I camera + 0x0023bf44, // n0x00c5 c0x0000 (---------------) + I camp + 0x0029008e, // n0x00c6 c0x0000 (---------------) + I cancerresearch + 0x00333445, // n0x00c7 c0x0000 (---------------) + I canon + 0x002a9308, // n0x00c8 c0x0000 (---------------) + I capetown + 0x002ca4c7, // n0x00c9 c0x0000 (---------------) + I capital + 0x002ca4ca, // n0x00ca c0x0000 (---------------) + I capitalone + 0x0023e283, // n0x00cb c0x0000 (---------------) + I car + 0x00265e07, // n0x00cc c0x0000 (---------------) + I caravan + 0x002d6ac5, // n0x00cd c0x0000 (---------------) + I cards + 0x002a5344, // n0x00ce c0x0000 (---------------) + I care + 0x002a5346, // n0x00cf c0x0000 (---------------) + I career + 0x002a5347, // n0x00d0 c0x0000 (---------------) + I careers + 0x002b6284, // n0x00d1 c0x0000 (---------------) + I cars + 0x00350687, // n0x00d2 c0x0000 (---------------) + I cartier + 0x00203cc4, // n0x00d3 c0x0000 (---------------) + I casa + 0x002108c4, // n0x00d4 c0x0000 (---------------) + I case + 0x002108c6, // n0x00d5 c0x0000 (---------------) + I caseih + 0x002c7944, // n0x00d6 c0x0000 (---------------) + I cash + 0x00351546, // n0x00d7 c0x0000 (---------------) + I casino + 0x0020c383, // n0x00d8 c0x0000 (---------------) + I cat + 0x00233688, // n0x00d9 c0x0000 (---------------) + I catering + 0x00242e43, // n0x00da c0x0000 (---------------) + I cba + 0x0023e003, // n0x00db c0x0000 (---------------) + I cbn + 0x00388044, // n0x00dc c0x0000 (---------------) + I cbre + 0x0038c903, // n0x00dd c0x0000 (---------------) + I cbs + 0x0c61db82, // n0x00de c0x0031 (n0x0793-n0x0797) + I cc + 0x0ca39702, // n0x00df c0x0032 (n0x0797-n0x0798) + I cd + 0x00202ec3, // n0x00e0 c0x0000 (---------------) + I ceb + 0x00204206, // n0x00e1 c0x0000 (---------------) + I center + 0x0023bbc3, // n0x00e2 c0x0000 (---------------) + I ceo + 0x00312604, // n0x00e3 c0x0000 (---------------) + I cern + 0x0ce12ac2, // n0x00e4 c0x0033 (n0x0798-n0x0799) + I cf + 0x00212ac3, // n0x00e5 c0x0000 (---------------) + I cfa + 0x00374e83, // n0x00e6 c0x0000 (---------------) + I cfd + 0x00219182, // n0x00e7 c0x0000 (---------------) + I cg + 0x0d2058c2, // n0x00e8 c0x0034 (n0x0799-n0x079a) + I ch + 0x002b5806, // n0x00e9 c0x0000 (---------------) + I chanel + 0x00236cc7, // n0x00ea c0x0000 (---------------) + I channel + 0x00332285, // n0x00eb c0x0000 (---------------) + I chase + 0x00322a84, // n0x00ec c0x0000 (---------------) + I chat + 0x0027f485, // n0x00ed c0x0000 (---------------) + I cheap + 0x00389d87, // n0x00ee c0x0000 (---------------) + I chintai + 0x002a9945, // n0x00ef c0x0000 (---------------) + I chloe + 0x002f9e89, // n0x00f0 c0x0000 (---------------) + I christmas + 0x002fb446, // n0x00f1 c0x0000 (---------------) + I chrome + 0x002fcf88, // n0x00f2 c0x0000 (---------------) + I chrysler + 0x00332186, // n0x00f3 c0x0000 (---------------) + I church + 0x0d6080c2, // n0x00f4 c0x0035 (n0x079a-n0x07a9) + I ci + 0x0036b488, // n0x00f5 c0x0000 (---------------) + I cipriani + 0x00337906, // n0x00f6 c0x0000 (---------------) + I circle + 0x002080c5, // n0x00f7 c0x0000 (---------------) + I cisco + 0x0034e707, // n0x00f8 c0x0000 (---------------) + I citadel + 0x00351444, // n0x00f9 c0x0000 (---------------) + I citi + 0x00351445, // n0x00fa c0x0000 (---------------) + I citic + 0x0027e804, // n0x00fb c0x0000 (---------------) + I city + 0x0027e808, // n0x00fc c0x0000 (---------------) + I cityeats + 0x0da08e82, // n0x00fd c0x0036 (n0x07a9-n0x07aa)* o I ck + 0x0de02502, // n0x00fe c0x0037 (n0x07aa-n0x07af) + I cl + 0x003753c6, // n0x00ff c0x0000 (---------------) + I claims + 0x0033d548, // n0x0100 c0x0000 (---------------) + I cleaning + 0x00376805, // n0x0101 c0x0000 (---------------) + I click + 0x00382e06, // n0x0102 c0x0000 (---------------) + I clinic + 0x00385448, // n0x0103 c0x0000 (---------------) + I clinique + 0x0039bf48, // n0x0104 c0x0000 (---------------) + I clothing + 0x0022b985, // n0x0105 c0x0000 (---------------) + I cloud + 0x00202504, // n0x0106 c0x0000 (---------------) + I club + 0x0035aac7, // n0x0107 c0x0000 (---------------) + I clubmed + 0x0e255882, // n0x0108 c0x0038 (n0x07af-n0x07b3) + I cm + 0x0e61a142, // n0x0109 c0x0039 (n0x07b3-n0x07e0) + I cn + 0x0fe08182, // n0x010a c0x003f (n0x07e5-n0x07f2) + I co + 0x0033c805, // n0x010b c0x0000 (---------------) + I coach + 0x002932c5, // n0x010c c0x0000 (---------------) + I codes + 0x003623c6, // n0x010d c0x0000 (---------------) + I coffee + 0x0025d8c7, // n0x010e c0x0000 (---------------) + I college + 0x0021dbc7, // n0x010f c0x0000 (---------------) + I cologne + 0x1062edc3, // n0x0110 c0x0041 (n0x07f3-n0x08bf) + I com + 0x002d2dc7, // n0x0111 c0x0000 (---------------) + I comcast + 0x0022edc8, // n0x0112 c0x0000 (---------------) + I commbank + 0x0022f149, // n0x0113 c0x0000 (---------------) + I community + 0x0036c4c7, // n0x0114 c0x0000 (---------------) + I company + 0x0022f707, // n0x0115 c0x0000 (---------------) + I compare + 0x00230608, // n0x0116 c0x0000 (---------------) + I computer + 0x00230e06, // n0x0117 c0x0000 (---------------) + I comsec + 0x002314c6, // n0x0118 c0x0000 (---------------) + I condos + 0x0023224c, // n0x0119 c0x0000 (---------------) + I construction + 0x00232dca, // n0x011a c0x0000 (---------------) + I consulting + 0x00233287, // n0x011b c0x0000 (---------------) + I contact + 0x00235c8b, // n0x011c c0x0000 (---------------) + I contractors + 0x00236b07, // n0x011d c0x0000 (---------------) + I cooking + 0x00236b0e, // n0x011e c0x0000 (---------------) + I cookingchannel + 0x00237604, // n0x011f c0x0000 (---------------) + I cool + 0x00238284, // n0x0120 c0x0000 (---------------) + I coop + 0x00239e47, // n0x0121 c0x0000 (---------------) + I corsica + 0x00337c87, // n0x0122 c0x0000 (---------------) + I country + 0x0023c846, // n0x0123 c0x0000 (---------------) + I coupon + 0x0023c847, // n0x0124 c0x0000 (---------------) + I coupons + 0x0023cf87, // n0x0125 c0x0000 (---------------) + I courses + 0x11a11e82, // n0x0126 c0x0046 (n0x08dd-n0x08e4) + I cr + 0x0023e106, // n0x0127 c0x0000 (---------------) + I credit + 0x0023e10a, // n0x0128 c0x0000 (---------------) + I creditcard + 0x0023e38b, // n0x0129 c0x0000 (---------------) + I creditunion + 0x0023eec7, // n0x012a c0x0000 (---------------) + I cricket + 0x0023f885, // n0x012b c0x0000 (---------------) + I crown + 0x0023f9c3, // n0x012c c0x0000 (---------------) + I crs + 0x00240107, // n0x012d c0x0000 (---------------) + I cruises + 0x002267c3, // n0x012e c0x0000 (---------------) + I csc + 0x11e17882, // n0x012f c0x0047 (n0x08e4-n0x08ea) + I cu + 0x0024070a, // n0x0130 c0x0000 (---------------) + I cuisinella + 0x1234f802, // n0x0131 c0x0048 (n0x08ea-n0x08eb) + I cv + 0x126c7542, // n0x0132 c0x0049 (n0x08eb-n0x08ef) + I cw + 0x12a41b02, // n0x0133 c0x004a (n0x08ef-n0x08f1) + I cx + 0x12e394c2, // n0x0134 c0x004b (n0x08f1-n0x08fe) o I cy + 0x00242545, // n0x0135 c0x0000 (---------------) + I cymru + 0x00242c44, // n0x0136 c0x0000 (---------------) + I cyou + 0x13633fc2, // n0x0137 c0x004d (n0x08ff-n0x0900) + I cz + 0x002ff2c5, // n0x0138 c0x0000 (---------------) + I dabur + 0x0025cd83, // n0x0139 c0x0000 (---------------) + I dad + 0x0033dcc5, // n0x013a c0x0000 (---------------) + I dance + 0x00205dc4, // n0x013b c0x0000 (---------------) + I date + 0x00202c46, // n0x013c c0x0000 (---------------) + I dating + 0x0020b286, // n0x013d c0x0000 (---------------) + I datsun + 0x00282ac3, // n0x013e c0x0000 (---------------) + I day + 0x00227e04, // n0x013f c0x0000 (---------------) + I dclk + 0x002bd543, // n0x0140 c0x0000 (---------------) + I dds + 0x13a00402, // n0x0141 c0x004e (n0x0900-n0x0908) + I de + 0x00235884, // n0x0142 c0x0000 (---------------) + I deal + 0x0035b046, // n0x0143 c0x0000 (---------------) + I dealer + 0x00235885, // n0x0144 c0x0000 (---------------) + I deals + 0x00396686, // n0x0145 c0x0000 (---------------) + I degree + 0x0034e808, // n0x0146 c0x0000 (---------------) + I delivery + 0x00253184, // n0x0147 c0x0000 (---------------) + I dell + 0x00319dc8, // n0x0148 c0x0000 (---------------) + I deloitte + 0x00331185, // n0x0149 c0x0000 (---------------) + I delta + 0x00218588, // n0x014a c0x0000 (---------------) + I democrat + 0x002a3206, // n0x014b c0x0000 (---------------) + I dental + 0x002ae147, // n0x014c c0x0000 (---------------) + I dentist + 0x00222ec4, // n0x014d c0x0000 (---------------) + I desi + 0x00222ec6, // n0x014e c0x0000 (---------------) + I design + 0x0036d143, // n0x014f c0x0000 (---------------) + I dev + 0x00375943, // n0x0150 c0x0000 (---------------) + I dhl + 0x002c13c8, // n0x0151 c0x0000 (---------------) + I diamonds + 0x0030c184, // n0x0152 c0x0000 (---------------) + I diet + 0x00363507, // n0x0153 c0x0000 (---------------) + I digital + 0x002477c6, // n0x0154 c0x0000 (---------------) + I direct + 0x002477c9, // n0x0155 c0x0000 (---------------) + I directory + 0x0031e708, // n0x0156 c0x0000 (---------------) + I discount + 0x0033b448, // n0x0157 c0x0000 (---------------) + I discover + 0x00224b44, // n0x0158 c0x0000 (---------------) + I dish + 0x0022b5c2, // n0x0159 c0x0000 (---------------) + I dj + 0x13e00ac2, // n0x015a c0x004f (n0x0908-n0x0909) + I dk + 0x14214142, // n0x015b c0x0050 (n0x0909-n0x090e) + I dm + 0x002a1143, // n0x015c c0x0000 (---------------) + I dnp + 0x14606e42, // n0x015d c0x0051 (n0x090e-n0x0918) + I do + 0x00226744, // n0x015e c0x0000 (---------------) + I docs + 0x0035db05, // n0x015f c0x0000 (---------------) + I dodge + 0x0022c703, // n0x0160 c0x0000 (---------------) + I dog + 0x00232704, // n0x0161 c0x0000 (---------------) + I doha + 0x002f90c7, // n0x0162 c0x0000 (---------------) + I domains + 0x00237d86, // n0x0163 c0x0000 (---------------) + I doosan + 0x003227c3, // n0x0164 c0x0000 (---------------) + I dot + 0x0035f648, // n0x0165 c0x0000 (---------------) + I download + 0x0030e985, // n0x0166 c0x0000 (---------------) + I drive + 0x002839c4, // n0x0167 c0x0000 (---------------) + I dstv + 0x00361303, // n0x0168 c0x0000 (---------------) + I dtv + 0x002743c5, // n0x0169 c0x0000 (---------------) + I dubai + 0x00274504, // n0x016a c0x0000 (---------------) + I duck + 0x00350386, // n0x016b c0x0000 (---------------) + I dunlop + 0x00362ac4, // n0x016c c0x0000 (---------------) + I duns + 0x00393b06, // n0x016d c0x0000 (---------------) + I dupont + 0x003a3706, // n0x016e c0x0000 (---------------) + I durban + 0x00306f44, // n0x016f c0x0000 (---------------) + I dvag + 0x00210183, // n0x0170 c0x0000 (---------------) + I dwg + 0x14aa1402, // n0x0171 c0x0052 (n0x0918-n0x0920) + I dz + 0x00279b05, // n0x0172 c0x0000 (---------------) + I earth + 0x00215783, // n0x0173 c0x0000 (---------------) + I eat + 0x14e03c82, // n0x0174 c0x0053 (n0x0920-n0x092c) + I ec + 0x0022bcc5, // n0x0175 c0x0000 (---------------) + I edeka + 0x002349c3, // n0x0176 c0x0000 (---------------) + I edu + 0x002349c9, // n0x0177 c0x0000 (---------------) + I education + 0x1520b0c2, // n0x0178 c0x0054 (n0x092c-n0x0936) + I ee + 0x15a05a42, // n0x0179 c0x0056 (n0x0937-n0x0940) + I eg + 0x00301c05, // n0x017a c0x0000 (---------------) + I email + 0x002ae506, // n0x017b c0x0000 (---------------) + I emerck + 0x0031fc47, // n0x017c c0x0000 (---------------) + I emerson + 0x002c9306, // n0x017d c0x0000 (---------------) + I energy + 0x0032a108, // n0x017e c0x0000 (---------------) + I engineer + 0x0032a10b, // n0x017f c0x0000 (---------------) + I engineering + 0x0020424b, // n0x0180 c0x0000 (---------------) + I enterprises + 0x003940c5, // n0x0181 c0x0000 (---------------) + I epost + 0x003963c5, // n0x0182 c0x0000 (---------------) + I epson + 0x002bf809, // n0x0183 c0x0000 (---------------) + I equipment + 0x01600442, // n0x0184 c0x0005 (---------------)* o I er + 0x003061c8, // n0x0185 c0x0000 (---------------) + I ericsson + 0x00218044, // n0x0186 c0x0000 (---------------) + I erni + 0x16202242, // n0x0187 c0x0058 (n0x0941-n0x0946) + I es + 0x0027c5c3, // n0x0188 c0x0000 (---------------) + I esq + 0x002bf586, // n0x0189 c0x0000 (---------------) + I estate + 0x002032c8, // n0x018a c0x0000 (---------------) + I esurance + 0x16a0a502, // n0x018b c0x005a (n0x0947-n0x094f) + I et + 0x00222708, // n0x018c c0x0000 (---------------) + I etisalat + 0x00224542, // n0x018d c0x0000 (---------------) + I eu + 0x0027df0a, // n0x018e c0x0000 (---------------) + I eurovision + 0x00224543, // n0x018f c0x0000 (---------------) + I eus + 0x0036d186, // n0x0190 c0x0000 (---------------) + I events + 0x0020ac48, // n0x0191 c0x0000 (---------------) + I everbank + 0x0035b488, // n0x0192 c0x0000 (---------------) + I exchange + 0x002a8546, // n0x0193 c0x0000 (---------------) + I expert + 0x0037ffc7, // n0x0194 c0x0000 (---------------) + I exposed + 0x00240c87, // n0x0195 c0x0000 (---------------) + I express + 0x00334f4a, // n0x0196 c0x0000 (---------------) + I extraspace + 0x002d5204, // n0x0197 c0x0000 (---------------) + I fage + 0x00212b04, // n0x0198 c0x0000 (---------------) + I fail + 0x00336b89, // n0x0199 c0x0000 (---------------) + I fairwinds + 0x0034c105, // n0x019a c0x0000 (---------------) + I faith + 0x0036c346, // n0x019b c0x0000 (---------------) + I family + 0x0020dd43, // n0x019c c0x0000 (---------------) + I fan + 0x002da484, // n0x019d c0x0000 (---------------) + I fans + 0x002a0f44, // n0x019e c0x0000 (---------------) + I farm + 0x00302a87, // n0x019f c0x0000 (---------------) + I farmers + 0x0022a887, // n0x01a0 c0x0000 (---------------) + I fashion + 0x002e01c4, // n0x01a1 c0x0000 (---------------) + I fast + 0x002120c5, // n0x01a2 c0x0000 (---------------) + I fedex + 0x00362488, // n0x01a3 c0x0000 (---------------) + I feedback + 0x002f6847, // n0x01a4 c0x0000 (---------------) + I ferrari + 0x00333207, // n0x01a5 c0x0000 (---------------) + I ferrero + 0x16e0e002, // n0x01a6 c0x005b (n0x094f-n0x0952) + I fi + 0x0028b4c4, // n0x01a7 c0x0000 (---------------) + I fiat + 0x003570c8, // n0x01a8 c0x0000 (---------------) + I fidelity + 0x00359c84, // n0x01a9 c0x0000 (---------------) + I fido + 0x00243ec4, // n0x01aa c0x0000 (---------------) + I film + 0x00244285, // n0x01ab c0x0000 (---------------) + I final + 0x002443c7, // n0x01ac c0x0000 (---------------) + I finance + 0x0020e009, // n0x01ad c0x0000 (---------------) + I financial + 0x00245884, // n0x01ae c0x0000 (---------------) + I fire + 0x00247509, // n0x01af c0x0000 (---------------) + I firestone + 0x00247a08, // n0x01b0 c0x0000 (---------------) + I firmdale + 0x00248504, // n0x01b1 c0x0000 (---------------) + I fish + 0x00248507, // n0x01b2 c0x0000 (---------------) + I fishing + 0x00248b03, // n0x01b3 c0x0000 (---------------) + I fit + 0x00249187, // n0x01b4 c0x0000 (---------------) + I fitness + 0x0162f3c2, // n0x01b5 c0x0005 (---------------)* o I fj + 0x016a4482, // n0x01b6 c0x0005 (---------------)* o I fk + 0x00249846, // n0x01b7 c0x0000 (---------------) + I flickr + 0x00249f07, // n0x01b8 c0x0000 (---------------) + I flights + 0x0024a344, // n0x01b9 c0x0000 (---------------) + I flir + 0x0024b087, // n0x01ba c0x0000 (---------------) + I florist + 0x0024bbc7, // n0x01bb c0x0000 (---------------) + I flowers + 0x0024c108, // n0x01bc c0x0000 (---------------) + I flsmidth + 0x0024c783, // n0x01bd c0x0000 (---------------) + I fly + 0x0023d4c2, // n0x01be c0x0000 (---------------) + I fm + 0x0023bb02, // n0x01bf c0x0000 (---------------) + I fo + 0x0024dc83, // n0x01c0 c0x0000 (---------------) + I foo + 0x0024dc8b, // n0x01c1 c0x0000 (---------------) + I foodnetwork + 0x00307808, // n0x01c2 c0x0000 (---------------) + I football + 0x00395184, // n0x01c3 c0x0000 (---------------) + I ford + 0x0024f2c5, // n0x01c4 c0x0000 (---------------) + I forex + 0x00252587, // n0x01c5 c0x0000 (---------------) + I forsale + 0x00253c85, // n0x01c6 c0x0000 (---------------) + I forum + 0x002b370a, // n0x01c7 c0x0000 (---------------) + I foundation + 0x00255183, // n0x01c8 c0x0000 (---------------) + I fox + 0x17207fc2, // n0x01c9 c0x005c (n0x0952-n0x096a) + I fr + 0x00256cc9, // n0x01ca c0x0000 (---------------) + I fresenius + 0x0025a843, // n0x01cb c0x0000 (---------------) + I frl + 0x0025a907, // n0x01cc c0x0000 (---------------) + I frogans + 0x0022c9c9, // n0x01cd c0x0000 (---------------) + I frontdoor + 0x0038c308, // n0x01ce c0x0000 (---------------) + I frontier + 0x00235583, // n0x01cf c0x0000 (---------------) + I ftr + 0x00273507, // n0x01d0 c0x0000 (---------------) + I fujitsu + 0x00273a09, // n0x01d1 c0x0000 (---------------) + I fujixerox + 0x00279fc4, // n0x01d2 c0x0000 (---------------) + I fund + 0x0027ae09, // n0x01d3 c0x0000 (---------------) + I furniture + 0x00280b06, // n0x01d4 c0x0000 (---------------) + I futbol + 0x00281d43, // n0x01d5 c0x0000 (---------------) + I fyi + 0x002006c2, // n0x01d6 c0x0000 (---------------) + I ga + 0x0021c683, // n0x01d7 c0x0000 (---------------) + I gal + 0x00397d47, // n0x01d8 c0x0000 (---------------) + I gallery + 0x00337a85, // n0x01d9 c0x0000 (---------------) + I gallo + 0x002dca86, // n0x01da c0x0000 (---------------) + I gallup + 0x0029f084, // n0x01db c0x0000 (---------------) + I game + 0x00318cc5, // n0x01dc c0x0000 (---------------) + I games + 0x00213683, // n0x01dd c0x0000 (---------------) + I gap + 0x002172c6, // n0x01de c0x0000 (---------------) + I garden + 0x00209582, // n0x01df c0x0000 (---------------) + I gb + 0x00383ac4, // n0x01e0 c0x0000 (---------------) + I gbiz + 0x00221f82, // n0x01e1 c0x0000 (---------------) + I gd + 0x002290c3, // n0x01e2 c0x0000 (---------------) + I gdn + 0x17603982, // n0x01e3 c0x005d (n0x096a-n0x0971) + I ge + 0x00244ac3, // n0x01e4 c0x0000 (---------------) + I gea + 0x00216ac4, // n0x01e5 c0x0000 (---------------) + I gent + 0x00216ac7, // n0x01e6 c0x0000 (---------------) + I genting + 0x0031e0c6, // n0x01e7 c0x0000 (---------------) + I george + 0x00255682, // n0x01e8 c0x0000 (---------------) + I gf + 0x17a4c482, // n0x01e9 c0x005e (n0x0971-n0x0974) + I gg + 0x0033b684, // n0x01ea c0x0000 (---------------) + I ggee + 0x17e45f82, // n0x01eb c0x005f (n0x0974-n0x0979) + I gh + 0x18212e42, // n0x01ec c0x0060 (n0x0979-n0x097f) + I gi + 0x00342584, // n0x01ed c0x0000 (---------------) + I gift + 0x00342585, // n0x01ee c0x0000 (---------------) + I gifts + 0x00219605, // n0x01ef c0x0000 (---------------) + I gives + 0x00261a06, // n0x01f0 c0x0000 (---------------) + I giving + 0x18602d82, // n0x01f1 c0x0061 (n0x097f-n0x0984) + I gl + 0x00319d05, // n0x01f2 c0x0000 (---------------) + I glade + 0x003959c5, // n0x01f3 c0x0000 (---------------) + I glass + 0x0027d403, // n0x01f4 c0x0000 (---------------) + I gle + 0x00205586, // n0x01f5 c0x0000 (---------------) + I global + 0x00206d05, // n0x01f6 c0x0000 (---------------) + I globo + 0x0020f7c2, // n0x01f7 c0x0000 (---------------) + I gm + 0x00331dc5, // n0x01f8 c0x0000 (---------------) + I gmail + 0x00210203, // n0x01f9 c0x0000 (---------------) + I gmo + 0x00214b43, // n0x01fa c0x0000 (---------------) + I gmx + 0x18a07e42, // n0x01fb c0x0062 (n0x0984-n0x098a) + I gn + 0x0025cd07, // n0x01fc c0x0000 (---------------) + I godaddy + 0x002f6ac4, // n0x01fd c0x0000 (---------------) + I gold + 0x002f6ac9, // n0x01fe c0x0000 (---------------) + I goldpoint + 0x00247c04, // n0x01ff c0x0000 (---------------) + I golf + 0x002799c3, // n0x0200 c0x0000 (---------------) + I goo + 0x0031bd09, // n0x0201 c0x0000 (---------------) + I goodhands + 0x002799c8, // n0x0202 c0x0000 (---------------) + I goodyear + 0x00293144, // n0x0203 c0x0000 (---------------) + I goog + 0x00293146, // n0x0204 c0x0000 (---------------) + I google + 0x0029ae43, // n0x0205 c0x0000 (---------------) + I gop + 0x00214503, // n0x0206 c0x0000 (---------------) + I got + 0x002d6804, // n0x0207 c0x0000 (---------------) + I gotv + 0x00275003, // n0x0208 c0x0000 (---------------) + I gov + 0x18edee02, // n0x0209 c0x0063 (n0x098a-n0x0990) + I gp + 0x002f83c2, // n0x020a c0x0000 (---------------) + I gq + 0x192089c2, // n0x020b c0x0064 (n0x0990-n0x0996) + I gr + 0x00315bc8, // n0x020c c0x0000 (---------------) + I grainger + 0x002ff848, // n0x020d c0x0000 (---------------) + I graphics + 0x00387486, // n0x020e c0x0000 (---------------) + I gratis + 0x0036bb45, // n0x020f c0x0000 (---------------) + I green + 0x00219c05, // n0x0210 c0x0000 (---------------) + I gripe + 0x0020eb45, // n0x0211 c0x0000 (---------------) + I group + 0x002242c2, // n0x0212 c0x0000 (---------------) + I gs + 0x19627d02, // n0x0213 c0x0065 (n0x0996-n0x099d) + I gt + 0x01605a82, // n0x0214 c0x0005 (---------------)* o I gu + 0x0034c288, // n0x0215 c0x0000 (---------------) + I guardian + 0x0036b3c5, // n0x0216 c0x0000 (---------------) + I gucci + 0x002d9b84, // n0x0217 c0x0000 (---------------) + I guge + 0x0036d085, // n0x0218 c0x0000 (---------------) + I guide + 0x0039c107, // n0x0219 c0x0000 (---------------) + I guitars + 0x00330644, // n0x021a c0x0000 (---------------) + I guru + 0x0020fb82, // n0x021b c0x0000 (---------------) + I gw + 0x19a01642, // n0x021c c0x0066 (n0x099d-n0x09a0) + I gy + 0x00205407, // n0x021d c0x0000 (---------------) + I hamburg + 0x0037e0c7, // n0x021e c0x0000 (---------------) + I hangout + 0x0035d204, // n0x021f c0x0000 (---------------) + I haus + 0x00288843, // n0x0220 c0x0000 (---------------) + I hbo + 0x00242d84, // n0x0221 c0x0000 (---------------) + I hdfc + 0x00242d88, // n0x0222 c0x0000 (---------------) + I hdfcbank + 0x002a51c6, // n0x0223 c0x0000 (---------------) + I health + 0x002a51ca, // n0x0224 c0x0000 (---------------) + I healthcare + 0x0020dec4, // n0x0225 c0x0000 (---------------) + I help + 0x0020c9c8, // n0x0226 c0x0000 (---------------) + I helsinki + 0x0024c384, // n0x0227 c0x0000 (---------------) + I here + 0x00221346, // n0x0228 c0x0000 (---------------) + I hermes + 0x00289a84, // n0x0229 c0x0000 (---------------) + I hgtv + 0x0033cb06, // n0x022a c0x0000 (---------------) + I hiphop + 0x00229cc9, // n0x022b c0x0000 (---------------) + I hisamitsu + 0x00299f47, // n0x022c c0x0000 (---------------) + I hitachi + 0x0036b303, // n0x022d c0x0000 (---------------) + I hiv + 0x19e0e882, // n0x022e c0x0067 (n0x09a0-n0x09b8) + I hk + 0x002667c3, // n0x022f c0x0000 (---------------) + I hkt + 0x0020c742, // n0x0230 c0x0000 (---------------) + I hm + 0x1a218902, // n0x0231 c0x0068 (n0x09b8-n0x09be) + I hn + 0x002d8e06, // n0x0232 c0x0000 (---------------) + I hockey + 0x00358bc8, // n0x0233 c0x0000 (---------------) + I holdings + 0x0029c0c7, // n0x0234 c0x0000 (---------------) + I holiday + 0x0026c749, // n0x0235 c0x0000 (---------------) + I homedepot + 0x00290d49, // n0x0236 c0x0000 (---------------) + I homegoods + 0x0029cc05, // n0x0237 c0x0000 (---------------) + I homes + 0x0029cc09, // n0x0238 c0x0000 (---------------) + I homesense + 0x0029e045, // n0x0239 c0x0000 (---------------) + I honda + 0x0029e7c9, // n0x023a c0x0000 (---------------) + I honeywell + 0x0029f5c5, // n0x023b c0x0000 (---------------) + I horse + 0x00207a84, // n0x023c c0x0000 (---------------) + I host + 0x0029f1c7, // n0x023d c0x0000 (---------------) + I hosting + 0x0022fac3, // n0x023e c0x0000 (---------------) + I hot + 0x0029fcc7, // n0x023f c0x0000 (---------------) + I hoteles + 0x002a0287, // n0x0240 c0x0000 (---------------) + I hotmail + 0x00299885, // n0x0241 c0x0000 (---------------) + I house + 0x00296183, // n0x0242 c0x0000 (---------------) + I how + 0x1a632882, // n0x0243 c0x0069 (n0x09be-n0x09c3) + I hr + 0x00385384, // n0x0244 c0x0000 (---------------) + I hsbc + 0x1aa45fc2, // n0x0245 c0x006a (n0x09c3-n0x09d4) + I ht + 0x00255803, // n0x0246 c0x0000 (---------------) + I htc + 0x1ae0d0c2, // n0x0247 c0x006b (n0x09d4-n0x09f4) + I hu + 0x002ef4c6, // n0x0248 c0x0000 (---------------) + I hughes + 0x003785c5, // n0x0249 c0x0000 (---------------) + I hyatt + 0x002a4107, // n0x024a c0x0000 (---------------) + I hyundai + 0x00264103, // n0x024b c0x0000 (---------------) + I ibm + 0x0035bac4, // n0x024c c0x0000 (---------------) + I icbc + 0x00202e83, // n0x024d c0x0000 (---------------) + I ice + 0x002ce583, // n0x024e c0x0000 (---------------) + I icu + 0x1b205d82, // n0x024f c0x006c (n0x09f4-n0x09ff) + I id + 0x1ba00042, // n0x0250 c0x006e (n0x0a00-n0x0a02) + I ie + 0x00364304, // n0x0251 c0x0000 (---------------) + I ieee + 0x0023d483, // n0x0252 c0x0000 (---------------) + I ifm + 0x002bc045, // n0x0253 c0x0000 (---------------) + I iinet + 0x002bbe85, // n0x0254 c0x0000 (---------------) + I ikano + 0x1be02f82, // n0x0255 c0x006f (n0x0a02-n0x0a0a) + I il + 0x1c607242, // n0x0256 c0x0071 (n0x0a0b-n0x0a12) + I im + 0x0024fd06, // n0x0257 c0x0000 (---------------) + I imamat + 0x00307644, // n0x0258 c0x0000 (---------------) + I imdb + 0x00207784, // n0x0259 c0x0000 (---------------) + I immo + 0x0020778a, // n0x025a c0x0000 (---------------) + I immobilien + 0x1ce020c2, // n0x025b c0x0073 (n0x0a14-n0x0a21) + I in + 0x0036568a, // n0x025c c0x0000 (---------------) + I industries + 0x00389f88, // n0x025d c0x0000 (---------------) + I infiniti + 0x1d38a144, // n0x025e c0x0074 (n0x0a21-n0x0a2b) + I info + 0x00202d03, // n0x025f c0x0000 (---------------) + I ing + 0x00202743, // n0x0260 c0x0000 (---------------) + I ink + 0x0030dd89, // n0x0261 c0x0000 (---------------) + I institute + 0x00239c09, // n0x0262 c0x0000 (---------------) + I insurance + 0x002f91c6, // n0x0263 c0x0000 (---------------) + I insure + 0x1d66f683, // n0x0264 c0x0075 (n0x0a2b-n0x0a2c) + I int + 0x002f6c45, // n0x0265 c0x0000 (---------------) + I intel + 0x002fd58d, // n0x0266 c0x0000 (---------------) + I international + 0x002efac6, // n0x0267 c0x0000 (---------------) + I intuit + 0x0020218b, // n0x0268 c0x0000 (---------------) + I investments + 0x1da00542, // n0x0269 c0x0076 (n0x0a2c-n0x0a31) + I io + 0x00253a88, // n0x026a c0x0000 (---------------) + I ipiranga + 0x1de048c2, // n0x026b c0x0077 (n0x0a31-n0x0a37) + I iq + 0x1e204082, // n0x026c c0x0078 (n0x0a37-n0x0a40) + I ir + 0x00291085, // n0x026d c0x0000 (---------------) + I irish + 0x1e601a02, // n0x026e c0x0079 (n0x0a40-n0x0a48) + I is + 0x00253f07, // n0x026f c0x0000 (---------------) + I iselect + 0x0027d787, // n0x0270 c0x0000 (---------------) + I ismaili + 0x00201a03, // n0x0271 c0x0000 (---------------) + I ist + 0x002ec0c8, // n0x0272 c0x0000 (---------------) + I istanbul + 0x1ea06f82, // n0x0273 c0x007a (n0x0a48-n0x0bb9) + I it + 0x0026a984, // n0x0274 c0x0000 (---------------) + I itau + 0x00206f83, // n0x0275 c0x0000 (---------------) + I itv + 0x00320745, // n0x0276 c0x0000 (---------------) + I iveco + 0x00366503, // n0x0277 c0x0000 (---------------) + I iwc + 0x002c3306, // n0x0278 c0x0000 (---------------) + I jaguar + 0x00317a04, // n0x0279 c0x0000 (---------------) + I java + 0x0023dfc3, // n0x027a c0x0000 (---------------) + I jcb + 0x00266b43, // n0x027b c0x0000 (---------------) + I jcp + 0x1ee07602, // n0x027c c0x007b (n0x0bb9-n0x0bbc) + I je + 0x0022b604, // n0x027d c0x0000 (---------------) + I jeep + 0x0034a685, // n0x027e c0x0000 (---------------) + I jetzt + 0x0035e0c7, // n0x027f c0x0000 (---------------) + I jewelry + 0x002716c3, // n0x0280 c0x0000 (---------------) + I jio + 0x002a49c3, // n0x0281 c0x0000 (---------------) + I jlc + 0x002a6003, // n0x0282 c0x0000 (---------------) + I jll + 0x01675282, // n0x0283 c0x0005 (---------------)* o I jm + 0x002a60c3, // n0x0284 c0x0000 (---------------) + I jmp + 0x002a7143, // n0x0285 c0x0000 (---------------) + I jnj + 0x1f201842, // n0x0286 c0x007c (n0x0bbc-n0x0bc4) + I jo + 0x002cd804, // n0x0287 c0x0000 (---------------) + I jobs + 0x00274746, // n0x0288 c0x0000 (---------------) + I joburg + 0x0020a143, // n0x0289 c0x0000 (---------------) + I jot + 0x002a74c3, // n0x028a c0x0000 (---------------) + I joy + 0x1f6a8bc2, // n0x028b c0x007d (n0x0bc4-n0x0c33) + I jp + 0x002a8bc8, // n0x028c c0x0000 (---------------) + I jpmorgan + 0x002a9a84, // n0x028d c0x0000 (---------------) + I jprs + 0x00247e06, // n0x028e c0x0000 (---------------) + I juegos + 0x002a9fc7, // n0x028f c0x0000 (---------------) + I juniper + 0x0020e386, // n0x0290 c0x0000 (---------------) + I kaufen + 0x002ad104, // n0x0291 c0x0000 (---------------) + I kddi + 0x2d202bc2, // n0x0292 c0x00b4 (n0x12c7-n0x12c8)* o I ke + 0x0022f98b, // n0x0293 c0x0000 (---------------) + I kerryhotels + 0x002dc18e, // n0x0294 c0x0000 (---------------) + I kerrylogistics + 0x0022014f, // n0x0295 c0x0000 (---------------) + I kerryproperties + 0x00325a03, // n0x0296 c0x0000 (---------------) + I kfh + 0x2dab1882, // n0x0297 c0x00b6 (n0x12c9-n0x12cf) + I kg + 0x01600a02, // n0x0298 c0x0005 (---------------)* o I kh + 0x2de03142, // n0x0299 c0x00b7 (n0x12cf-n0x12d6) + I ki + 0x0022a743, // n0x029a c0x0000 (---------------) + I kia + 0x00229403, // n0x029b c0x0000 (---------------) + I kim + 0x00305fc6, // n0x029c c0x0000 (---------------) + I kinder + 0x0032fd86, // n0x029d c0x0000 (---------------) + I kindle + 0x00318fc7, // n0x029e c0x0000 (---------------) + I kitchen + 0x002e2c84, // n0x029f c0x0000 (---------------) + I kiwi + 0x2e22ccc2, // n0x02a0 c0x00b8 (n0x12d6-n0x12e7) + I km + 0x2e651942, // n0x02a1 c0x00b9 (n0x12e7-n0x12eb) + I kn + 0x002a5b85, // n0x02a2 c0x0000 (---------------) + I koeln + 0x0028e9c7, // n0x02a3 c0x0000 (---------------) + I komatsu + 0x002e4886, // n0x02a4 c0x0000 (---------------) + I kosher + 0x2ea08742, // n0x02a5 c0x00ba (n0x12eb-n0x12f1) + I kp + 0x00208744, // n0x02a6 c0x0000 (---------------) + I kpmg + 0x0036e383, // n0x02a7 c0x0000 (---------------) + I kpn + 0x2ee076c2, // n0x02a8 c0x00bb (n0x12f1-n0x130f) + I kr + 0x00349b03, // n0x02a9 c0x0000 (---------------) + I krd + 0x003a0504, // n0x02aa c0x0000 (---------------) + I kred + 0x002b17c9, // n0x02ab c0x0000 (---------------) + I kuokgroup + 0x016b82c2, // n0x02ac c0x0005 (---------------)* o I kw + 0x2f23ae42, // n0x02ad c0x00bc (n0x130f-n0x1314) + I ky + 0x00261cc6, // n0x02ae c0x0000 (---------------) + I kyknet + 0x002b8805, // n0x02af c0x0000 (---------------) + I kyoto + 0x2f70a942, // n0x02b0 c0x00bd (n0x1314-n0x131a) + I kz + 0x2fa03842, // n0x02b1 c0x00be (n0x131a-n0x1323) + I la + 0x00336007, // n0x02b2 c0x0000 (---------------) + I lacaixa + 0x0020ba89, // n0x02b3 c0x0000 (---------------) + I ladbrokes + 0x0034d68b, // n0x02b4 c0x0000 (---------------) + I lamborghini + 0x00240a45, // n0x02b5 c0x0000 (---------------) + I lamer + 0x00369b89, // n0x02b6 c0x0000 (---------------) + I lancaster + 0x002ba286, // n0x02b7 c0x0000 (---------------) + I lancia + 0x00251487, // n0x02b8 c0x0000 (---------------) + I lancome + 0x00204e44, // n0x02b9 c0x0000 (---------------) + I land + 0x002bc689, // n0x02ba c0x0000 (---------------) + I landrover + 0x00353a07, // n0x02bb c0x0000 (---------------) + I lanxess + 0x0027c207, // n0x02bc c0x0000 (---------------) + I lasalle + 0x00203843, // n0x02bd c0x0000 (---------------) + I lat + 0x002247c6, // n0x02be c0x0000 (---------------) + I latino + 0x002cac47, // n0x02bf c0x0000 (---------------) + I latrobe + 0x00209183, // n0x02c0 c0x0000 (---------------) + I law + 0x0025d606, // n0x02c1 c0x0000 (---------------) + I lawyer + 0x2fe02fc2, // n0x02c2 c0x00bf (n0x1323-n0x1328) + I lb + 0x30234c42, // n0x02c3 c0x00c0 (n0x1328-n0x132e) + I lc + 0x0021f403, // n0x02c4 c0x0000 (---------------) + I lds + 0x0027c345, // n0x02c5 c0x0000 (---------------) + I lease + 0x002acc07, // n0x02c6 c0x0000 (---------------) + I leclerc + 0x00351906, // n0x02c7 c0x0000 (---------------) + I lefrak + 0x00337a05, // n0x02c8 c0x0000 (---------------) + I legal + 0x00247b84, // n0x02c9 c0x0000 (---------------) + I lego + 0x002d8305, // n0x02ca c0x0000 (---------------) + I lexus + 0x002df5c4, // n0x02cb c0x0000 (---------------) + I lgbt + 0x306019c2, // n0x02cc c0x00c1 (n0x132e-n0x132f) + I li + 0x00310b07, // n0x02cd c0x0000 (---------------) + I liaison + 0x002b6a44, // n0x02ce c0x0000 (---------------) + I lidl + 0x00239b04, // n0x02cf c0x0000 (---------------) + I life + 0x00239b0d, // n0x02d0 c0x0000 (---------------) + I lifeinsurance + 0x0023ec89, // n0x02d1 c0x0000 (---------------) + I lifestyle + 0x00245f08, // n0x02d2 c0x0000 (---------------) + I lighting + 0x002510c4, // n0x02d3 c0x0000 (---------------) + I like + 0x00263dc5, // n0x02d4 c0x0000 (---------------) + I lilly + 0x0030e807, // n0x02d5 c0x0000 (---------------) + I limited + 0x00342804, // n0x02d6 c0x0000 (---------------) + I limo + 0x00351ec7, // n0x02d7 c0x0000 (---------------) + I lincoln + 0x0039ae45, // n0x02d8 c0x0000 (---------------) + I linde + 0x00202704, // n0x02d9 c0x0000 (---------------) + I link + 0x002cfd05, // n0x02da c0x0000 (---------------) + I lipsy + 0x00259504, // n0x02db c0x0000 (---------------) + I live + 0x002d8446, // n0x02dc c0x0000 (---------------) + I living + 0x003581c5, // n0x02dd c0x0000 (---------------) + I lixil + 0x30a08702, // n0x02de c0x00c2 (n0x132f-n0x133e) + I lk + 0x00211544, // n0x02df c0x0000 (---------------) + I loan + 0x00211545, // n0x02e0 c0x0000 (---------------) + I loans + 0x00373906, // n0x02e1 c0x0000 (---------------) + I locker + 0x00337b45, // n0x02e2 c0x0000 (---------------) + I locus + 0x002cdfc4, // n0x02e3 c0x0000 (---------------) + I loft + 0x002bf2c3, // n0x02e4 c0x0000 (---------------) + I lol + 0x00310546, // n0x02e5 c0x0000 (---------------) + I london + 0x0021a6c5, // n0x02e6 c0x0000 (---------------) + I lotte + 0x00221a85, // n0x02e7 c0x0000 (---------------) + I lotto + 0x00229244, // n0x02e8 c0x0000 (---------------) + I love + 0x0020df43, // n0x02e9 c0x0000 (---------------) + I lpl + 0x0020df4c, // n0x02ea c0x0000 (---------------) + I lplfinancial + 0x30e81442, // n0x02eb c0x00c3 (n0x133e-n0x1343) + I lr + 0x31201c02, // n0x02ec c0x00c4 (n0x1343-n0x1345) + I ls + 0x31608bc2, // n0x02ed c0x00c5 (n0x1345-n0x1347) + I lt + 0x00342703, // n0x02ee c0x0000 (---------------) + I ltd + 0x00342704, // n0x02ef c0x0000 (---------------) + I ltda + 0x31a02542, // n0x02f0 c0x00c6 (n0x1347-n0x1348) + I lu + 0x002dc548, // n0x02f1 c0x0000 (---------------) + I lundbeck + 0x002dcb45, // n0x02f2 c0x0000 (---------------) + I lupin + 0x00339384, // n0x02f3 c0x0000 (---------------) + I luxe + 0x00231e46, // n0x02f4 c0x0000 (---------------) + I luxury + 0x31e07302, // n0x02f5 c0x00c7 (n0x1348-n0x1351) + I lv + 0x3223dcc2, // n0x02f6 c0x00c8 (n0x1351-n0x135a) + I ly + 0x32600182, // n0x02f7 c0x00c9 (n0x135a-n0x1360) + I ma + 0x002eca45, // n0x02f8 c0x0000 (---------------) + I macys + 0x00306e06, // n0x02f9 c0x0000 (---------------) + I madrid + 0x002a0e84, // n0x02fa c0x0000 (---------------) + I maif + 0x00204bc6, // n0x02fb c0x0000 (---------------) + I maison + 0x00307fc6, // n0x02fc c0x0000 (---------------) + I makeup + 0x00237243, // n0x02fd c0x0000 (---------------) + I man + 0x0036c88a, // n0x02fe c0x0000 (---------------) + I management + 0x00237245, // n0x02ff c0x0000 (---------------) + I mango + 0x0022dc46, // n0x0300 c0x0000 (---------------) + I market + 0x002e5f89, // n0x0301 c0x0000 (---------------) + I marketing + 0x002318c7, // n0x0302 c0x0000 (---------------) + I markets + 0x0020ce08, // n0x0303 c0x0000 (---------------) + I marriott + 0x0028e5c9, // n0x0304 c0x0000 (---------------) + I marshalls + 0x0020d888, // n0x0305 c0x0000 (---------------) + I maserati + 0x00339746, // n0x0306 c0x0000 (---------------) + I mattel + 0x0022ee83, // n0x0307 c0x0000 (---------------) + I mba + 0x32ad2e42, // n0x0308 c0x00ca (n0x1360-n0x1362) + I mc + 0x003770c3, // n0x0309 c0x0000 (---------------) + I mcd + 0x003770c9, // n0x030a c0x0000 (---------------) + I mcdonalds + 0x00309e08, // n0x030b c0x0000 (---------------) + I mckinsey + 0x32e47ac2, // n0x030c c0x00cb (n0x1362-n0x1363) + I md + 0x33202302, // n0x030d c0x00cc (n0x1363-n0x136b) + I me + 0x00211c43, // n0x030e c0x0000 (---------------) + I med + 0x002fb545, // n0x030f c0x0000 (---------------) + I media + 0x00262d84, // n0x0310 c0x0000 (---------------) + I meet + 0x002dae09, // n0x0311 c0x0000 (---------------) + I melbourne + 0x002ae4c4, // n0x0312 c0x0000 (---------------) + I meme + 0x00338b08, // n0x0313 c0x0000 (---------------) + I memorial + 0x00202303, // n0x0314 c0x0000 (---------------) + I men + 0x00226244, // n0x0315 c0x0000 (---------------) + I menu + 0x00322c03, // n0x0316 c0x0000 (---------------) + I meo + 0x00239a47, // n0x0317 c0x0000 (---------------) + I metlife + 0x336087c2, // n0x0318 c0x00cd (n0x136b-n0x1374) + I mg + 0x0024ee82, // n0x0319 c0x0000 (---------------) + I mh + 0x00383105, // n0x031a c0x0000 (---------------) + I miami + 0x002634c9, // n0x031b c0x0000 (---------------) + I microsoft + 0x00215b43, // n0x031c c0x0000 (---------------) + I mil + 0x00274d84, // n0x031d c0x0000 (---------------) + I mini + 0x002fd544, // n0x031e c0x0000 (---------------) + I mint + 0x00229483, // n0x031f c0x0000 (---------------) + I mit + 0x00275e4a, // n0x0320 c0x0000 (---------------) + I mitsubishi + 0x33b65542, // n0x0321 c0x00ce (n0x1374-n0x137c) + I mk + 0x33e11502, // n0x0322 c0x00cf (n0x137c-n0x1383) + I ml + 0x002bb4c3, // n0x0323 c0x0000 (---------------) + I mlb + 0x00367c83, // n0x0324 c0x0000 (---------------) + I mls + 0x016077c2, // n0x0325 c0x0005 (---------------)* o I mm + 0x0036acc3, // n0x0326 c0x0000 (---------------) + I mma + 0x3421d882, // n0x0327 c0x00d0 (n0x1383-n0x1387) + I mn + 0x0021d884, // n0x0328 c0x0000 (---------------) + I mnet + 0x34603ec2, // n0x0329 c0x00d1 (n0x1387-n0x138c) + I mo + 0x00207804, // n0x032a c0x0000 (---------------) + I mobi + 0x002d2346, // n0x032b c0x0000 (---------------) + I mobily + 0x00264dc4, // n0x032c c0x0000 (---------------) + I moda + 0x00248203, // n0x032d c0x0000 (---------------) + I moe + 0x00278c03, // n0x032e c0x0000 (---------------) + I moi + 0x0020ed83, // n0x032f c0x0000 (---------------) + I mom + 0x0023e706, // n0x0330 c0x0000 (---------------) + I monash + 0x002c5005, // n0x0331 c0x0000 (---------------) + I money + 0x002bef07, // n0x0332 c0x0000 (---------------) + I monster + 0x00251349, // n0x0333 c0x0000 (---------------) + I montblanc + 0x002c2245, // n0x0334 c0x0000 (---------------) + I mopar + 0x002c4f46, // n0x0335 c0x0000 (---------------) + I mormon + 0x002c58c8, // n0x0336 c0x0000 (---------------) + I mortgage + 0x002c5ac6, // n0x0337 c0x0000 (---------------) + I moscow + 0x00270fc4, // n0x0338 c0x0000 (---------------) + I moto + 0x0029214b, // n0x0339 c0x0000 (---------------) + I motorcycles + 0x002c7003, // n0x033a c0x0000 (---------------) + I mov + 0x002c7005, // n0x033b c0x0000 (---------------) + I movie + 0x002c7148, // n0x033c c0x0000 (---------------) + I movistar + 0x00226dc2, // n0x033d c0x0000 (---------------) + I mp + 0x00336302, // n0x033e c0x0000 (---------------) + I mq + 0x34a425c2, // n0x033f c0x00d2 (n0x138c-n0x138e) + I mr + 0x34e02482, // n0x0340 c0x00d3 (n0x138e-n0x1393) + I ms + 0x00263cc3, // n0x0341 c0x0000 (---------------) + I msd + 0x35235702, // n0x0342 c0x00d4 (n0x1393-n0x1397) + I mt + 0x00265803, // n0x0343 c0x0000 (---------------) + I mtn + 0x002c7444, // n0x0344 c0x0000 (---------------) + I mtpc + 0x002c7c03, // n0x0345 c0x0000 (---------------) + I mtr + 0x35a01f42, // n0x0346 c0x00d6 (n0x1398-n0x139f) + I mu + 0x002c990b, // n0x0347 c0x0000 (---------------) + I multichoice + 0x35ecc746, // n0x0348 c0x00d7 (n0x139f-n0x15c3) + I museum + 0x00238746, // n0x0349 c0x0000 (---------------) + I mutual + 0x002ccd88, // n0x034a c0x0000 (---------------) + I mutuelle + 0x362878c2, // n0x034b c0x00d8 (n0x15c3-n0x15d1) + I mv + 0x3660f2c2, // n0x034c c0x00d9 (n0x15d1-n0x15dc) + I mw + 0x36a14b82, // n0x034d c0x00da (n0x15dc-n0x15e2) + I mx + 0x36e2a6c2, // n0x034e c0x00db (n0x15e2-n0x15ea) + I my + 0x37212c42, // n0x034f c0x00dc (n0x15ea-n0x15eb)* o I mz + 0x00212c4b, // n0x0350 c0x0000 (---------------) + I mzansimagic + 0x376005c2, // n0x0351 c0x00dd (n0x15eb-n0x15fc) + I na + 0x002156c3, // n0x0352 c0x0000 (---------------) + I nab + 0x0035b3c5, // n0x0353 c0x0000 (---------------) + I nadex + 0x0022d886, // n0x0354 c0x0000 (---------------) + I nagoya + 0x37a7ca84, // n0x0355 c0x00de (n0x15fc-n0x15fe) + I name + 0x003036c7, // n0x0356 c0x0000 (---------------) + I naspers + 0x0035ae4a, // n0x0357 c0x0000 (---------------) + I nationwide + 0x00308d86, // n0x0358 c0x0000 (---------------) + I natura + 0x00394304, // n0x0359 c0x0000 (---------------) + I navy + 0x00255983, // n0x035a c0x0000 (---------------) + I nba + 0x38603402, // n0x035b c0x00e1 (n0x1600-n0x1601) + I nc + 0x00203282, // n0x035c c0x0000 (---------------) + I ne + 0x00322303, // n0x035d c0x0000 (---------------) + I nec + 0x38a1d8c3, // n0x035e c0x00e2 (n0x1601-n0x1632) + I net + 0x0030a7c7, // n0x035f c0x0000 (---------------) + I netbank + 0x003580c7, // n0x0360 c0x0000 (---------------) + I netflix + 0x0024dd87, // n0x0361 c0x0000 (---------------) + I network + 0x00224507, // n0x0362 c0x0000 (---------------) + I neustar + 0x0021dd03, // n0x0363 c0x0000 (---------------) + I new + 0x002ca6ca, // n0x0364 c0x0000 (---------------) + I newholland + 0x0021fe44, // n0x0365 c0x0000 (---------------) + I news + 0x002476c4, // n0x0366 c0x0000 (---------------) + I next + 0x002476ca, // n0x0367 c0x0000 (---------------) + I nextdirect + 0x00266385, // n0x0368 c0x0000 (---------------) + I nexus + 0x39e037c2, // n0x0369 c0x00e7 (n0x163a-n0x1644) + I nf + 0x002037c3, // n0x036a c0x0000 (---------------) + I nfl + 0x3a202d42, // n0x036b c0x00e8 (n0x1644-n0x164d) + I ng + 0x002084c3, // n0x036c c0x0000 (---------------) + I ngo + 0x00266783, // n0x036d c0x0000 (---------------) + I nhk + 0x0160a7c2, // n0x036e c0x0005 (---------------)* o I ni + 0x00382ec4, // n0x036f c0x0000 (---------------) + I nico + 0x0021c3c4, // n0x0370 c0x0000 (---------------) + I nike + 0x0020d185, // n0x0371 c0x0000 (---------------) + I nikon + 0x002c6d85, // n0x0372 c0x0000 (---------------) + I ninja + 0x0036bc46, // n0x0373 c0x0000 (---------------) + I nissan + 0x3aa3e082, // n0x0374 c0x00ea (n0x164e-n0x1651) + I nl + 0x3ae00d82, // n0x0375 c0x00eb (n0x1651-n0x1927) + I no + 0x002f5685, // n0x0376 c0x0000 (---------------) + I nokia + 0x00238452, // n0x0377 c0x0000 (---------------) + I northwesternmutual + 0x003099c6, // n0x0378 c0x0000 (---------------) + I norton + 0x00217c83, // n0x0379 c0x0000 (---------------) + I now + 0x00294486, // n0x037a c0x0000 (---------------) + I nowruz + 0x00217c85, // n0x037b c0x0000 (---------------) + I nowtv + 0x01600c02, // n0x037c c0x0005 (---------------)* o I np + 0x4329d602, // n0x037d c0x010c (n0x194f-n0x1956) + I nr + 0x002f3043, // n0x037e c0x0000 (---------------) + I nra + 0x00332603, // n0x037f c0x0000 (---------------) + I nrw + 0x003702c3, // n0x0380 c0x0000 (---------------) + I ntt + 0x43609702, // n0x0381 c0x010d (n0x1956-n0x1959) + I nu + 0x0036c603, // n0x0382 c0x0000 (---------------) + I nyc + 0x43a09a82, // n0x0383 c0x010e (n0x1959-n0x1969) + I nz + 0x00207843, // n0x0384 c0x0000 (---------------) + I obi + 0x002cd848, // n0x0385 c0x0000 (---------------) + I observer + 0x0021f703, // n0x0386 c0x0000 (---------------) + I off + 0x0021f706, // n0x0387 c0x0000 (---------------) + I office + 0x00390f07, // n0x0388 c0x0000 (---------------) + I okinawa + 0x0020e9c6, // n0x0389 c0x0000 (---------------) + I olayan + 0x0020e9cb, // n0x038a c0x0000 (---------------) + I olayangroup + 0x00394247, // n0x038b c0x0000 (---------------) + I oldnavy + 0x00385184, // n0x038c c0x0000 (---------------) + I ollo + 0x44201f02, // n0x038d c0x0110 (n0x196a-n0x1973) + I om + 0x002dc9c5, // n0x038e c0x0000 (---------------) + I omega + 0x00203f03, // n0x038f c0x0000 (---------------) + I one + 0x0027c9c3, // n0x0390 c0x0000 (---------------) + I ong + 0x00316943, // n0x0391 c0x0000 (---------------) + I onl + 0x00316946, // n0x0392 c0x0000 (---------------) + I online + 0x0039648a, // n0x0393 c0x0000 (---------------) + I onyourside + 0x00285703, // n0x0394 c0x0000 (---------------) + I ooo + 0x00239284, // n0x0395 c0x0000 (---------------) + I open + 0x0033d486, // n0x0396 c0x0000 (---------------) + I oracle + 0x00391646, // n0x0397 c0x0000 (---------------) + I orange + 0x44629a83, // n0x0398 c0x0111 (n0x1973-n0x19ae) + I org + 0x002a8c87, // n0x0399 c0x0000 (---------------) + I organic + 0x002d4d8d, // n0x039a c0x0000 (---------------) + I orientexpress + 0x00371dc7, // n0x039b c0x0000 (---------------) + I origins + 0x00291e85, // n0x039c c0x0000 (---------------) + I osaka + 0x0025de06, // n0x039d c0x0000 (---------------) + I otsuka + 0x0020cf43, // n0x039e c0x0000 (---------------) + I ott + 0x002057c3, // n0x039f c0x0000 (---------------) + I ovh + 0x45e0ec42, // n0x03a0 c0x0117 (n0x19eb-n0x19f6) + I pa + 0x00323c44, // n0x03a1 c0x0000 (---------------) + I page + 0x002dff0c, // n0x03a2 c0x0000 (---------------) + I pamperedchef + 0x00233489, // n0x03a3 c0x0000 (---------------) + I panasonic + 0x0023b907, // n0x03a4 c0x0000 (---------------) + I panerai + 0x00252285, // n0x03a5 c0x0000 (---------------) + I paris + 0x0027f584, // n0x03a6 c0x0000 (---------------) + I pars + 0x0037ec88, // n0x03a7 c0x0000 (---------------) + I partners + 0x0029aec5, // n0x03a8 c0x0000 (---------------) + I parts + 0x0029c3c5, // n0x03a9 c0x0000 (---------------) + I party + 0x002b09c9, // n0x03aa c0x0000 (---------------) + I passagens + 0x002b7203, // n0x03ab c0x0000 (---------------) + I pay + 0x002b7204, // n0x03ac c0x0000 (---------------) + I payu + 0x002c74c4, // n0x03ad c0x0000 (---------------) + I pccw + 0x46209a02, // n0x03ae c0x0118 (n0x19f6-n0x19fe) + I pe + 0x0020e283, // n0x03af c0x0000 (---------------) + I pet + 0x466d0882, // n0x03b0 c0x0119 (n0x19fe-n0x1a01) + I pf + 0x002d0886, // n0x03b1 c0x0000 (---------------) + I pfizer + 0x01708882, // n0x03b2 c0x0005 (---------------)* o I pg + 0x46acd182, // n0x03b3 c0x011a (n0x1a01-n0x1a09) + I ph + 0x002ec948, // n0x03b4 c0x0000 (---------------) + I pharmacy + 0x002cfc47, // n0x03b5 c0x0000 (---------------) + I philips + 0x002cd185, // n0x03b6 c0x0000 (---------------) + I photo + 0x002d02cb, // n0x03b7 c0x0000 (---------------) + I photography + 0x002cd186, // n0x03b8 c0x0000 (---------------) + I photos + 0x002d04c6, // n0x03b9 c0x0000 (---------------) + I physio + 0x002d0646, // n0x03ba c0x0000 (---------------) + I piaget + 0x00220ac4, // n0x03bb c0x0000 (---------------) + I pics + 0x002d0a06, // n0x03bc c0x0000 (---------------) + I pictet + 0x002d0ec8, // n0x03bd c0x0000 (---------------) + I pictures + 0x0023c003, // n0x03be c0x0000 (---------------) + I pid + 0x00219b43, // n0x03bf c0x0000 (---------------) + I pin + 0x00219b44, // n0x03c0 c0x0000 (---------------) + I ping + 0x002d1784, // n0x03c1 c0x0000 (---------------) + I pink + 0x002d1bc7, // n0x03c2 c0x0000 (---------------) + I pioneer + 0x002d2645, // n0x03c3 c0x0000 (---------------) + I pizza + 0x46ed2782, // n0x03c4 c0x011b (n0x1a09-n0x1a17) + I pk + 0x47206582, // n0x03c5 c0x011c (n0x1a17-n0x1abc) + I pl + 0x00206585, // n0x03c6 c0x0000 (---------------) + I place + 0x0028bd84, // n0x03c7 c0x0000 (---------------) + I play + 0x002d470b, // n0x03c8 c0x0000 (---------------) + I playstation + 0x002d6648, // n0x03c9 c0x0000 (---------------) + I plumbing + 0x002d6ec4, // n0x03ca c0x0000 (---------------) + I plus + 0x00208782, // n0x03cb c0x0000 (---------------) + I pm + 0x47aa98c2, // n0x03cc c0x011e (n0x1aeb-n0x1af0) + I pn + 0x002a98c3, // n0x03cd c0x0000 (---------------) + I pnc + 0x002d7304, // n0x03ce c0x0000 (---------------) + I pohl + 0x002d7405, // n0x03cf c0x0000 (---------------) + I poker + 0x002d7947, // n0x03d0 c0x0000 (---------------) + I politie + 0x002d96c4, // n0x03d1 c0x0000 (---------------) + I porn + 0x0035d304, // n0x03d2 c0x0000 (---------------) + I post + 0x47e04382, // n0x03d3 c0x011f (n0x1af0-n0x1afd) + I pr + 0x00352e09, // n0x03d4 c0x0000 (---------------) + I pramerica + 0x002da0c5, // n0x03d5 c0x0000 (---------------) + I praxi + 0x00240d05, // n0x03d6 c0x0000 (---------------) + I press + 0x002dad45, // n0x03d7 c0x0000 (---------------) + I prime + 0x48220283, // n0x03d8 c0x0120 (n0x1afd-n0x1b04) + I pro + 0x002db644, // n0x03d9 c0x0000 (---------------) + I prod + 0x002db64b, // n0x03da c0x0000 (---------------) + I productions + 0x002dba84, // n0x03db c0x0000 (---------------) + I prof + 0x002dbd0b, // n0x03dc c0x0000 (---------------) + I progressive + 0x002dd745, // n0x03dd c0x0000 (---------------) + I promo + 0x0022028a, // n0x03de c0x0000 (---------------) + I properties + 0x002ddec8, // n0x03df c0x0000 (---------------) + I property + 0x002de0ca, // n0x03e0 c0x0000 (---------------) + I protection + 0x002de343, // n0x03e1 c0x0000 (---------------) + I pru + 0x002de34a, // n0x03e2 c0x0000 (---------------) + I prudential + 0x48626e02, // n0x03e3 c0x0121 (n0x1b04-n0x1b0b) + I ps + 0x48a835c2, // n0x03e4 c0x0122 (n0x1b0b-n0x1b14) + I pt + 0x00287e83, // n0x03e5 c0x0000 (---------------) + I pub + 0x48f94e82, // n0x03e6 c0x0123 (n0x1b14-n0x1b1a) + I pw + 0x4932e602, // n0x03e7 c0x0124 (n0x1b1a-n0x1b21) + I py + 0x49714502, // n0x03e8 c0x0125 (n0x1b21-n0x1b2a) + I qa + 0x002df444, // n0x03e9 c0x0000 (---------------) + I qpon + 0x0021a006, // n0x03ea c0x0000 (---------------) + I quebec + 0x00204905, // n0x03eb c0x0000 (---------------) + I quest + 0x002dfac3, // n0x03ec c0x0000 (---------------) + I qvc + 0x00379c06, // n0x03ed c0x0000 (---------------) + I racing + 0x0021a384, // n0x03ee c0x0000 (---------------) + I raid + 0x49a04d82, // n0x03ef c0x0126 (n0x1b2a-n0x1b2e) + I re + 0x002cf684, // n0x03f0 c0x0000 (---------------) + I read + 0x002bf48a, // n0x03f1 c0x0000 (---------------) + I realestate + 0x0033dec7, // n0x03f2 c0x0000 (---------------) + I realtor + 0x00378406, // n0x03f3 c0x0000 (---------------) + I realty + 0x00226f07, // n0x03f4 c0x0000 (---------------) + I recipes + 0x0023e143, // n0x03f5 c0x0000 (---------------) + I red + 0x003a0548, // n0x03f6 c0x0000 (---------------) + I redstone + 0x003381cb, // n0x03f7 c0x0000 (---------------) + I redumbrella + 0x0035c805, // n0x03f8 c0x0000 (---------------) + I rehab + 0x002c7a85, // n0x03f9 c0x0000 (---------------) + I reise + 0x002c7a86, // n0x03fa c0x0000 (---------------) + I reisen + 0x002f92c4, // n0x03fb c0x0000 (---------------) + I reit + 0x00374788, // n0x03fc c0x0000 (---------------) + I reliance + 0x00215383, // n0x03fd c0x0000 (---------------) + I ren + 0x002b5304, // n0x03fe c0x0000 (---------------) + I rent + 0x003352c7, // n0x03ff c0x0000 (---------------) + I rentals + 0x002b1f86, // n0x0400 c0x0000 (---------------) + I repair + 0x002eff06, // n0x0401 c0x0000 (---------------) + I report + 0x0028feca, // n0x0402 c0x0000 (---------------) + I republican + 0x00247584, // n0x0403 c0x0000 (---------------) + I rest + 0x00364b8a, // n0x0404 c0x0000 (---------------) + I restaurant + 0x00323806, // n0x0405 c0x0000 (---------------) + I review + 0x00323807, // n0x0406 c0x0000 (---------------) + I reviews + 0x0024f347, // n0x0407 c0x0000 (---------------) + I rexroth + 0x0026c104, // n0x0408 c0x0000 (---------------) + I rich + 0x0026c109, // n0x0409 c0x0000 (---------------) + I richardli + 0x0025c745, // n0x040a c0x0000 (---------------) + I ricoh + 0x002ad44b, // n0x040b c0x0000 (---------------) + I rightathome + 0x00250403, // n0x040c c0x0000 (---------------) + I ril + 0x0020cec3, // n0x040d c0x0000 (---------------) + I rio + 0x00219c43, // n0x040e c0x0000 (---------------) + I rip + 0x49e00cc2, // n0x040f c0x0127 (n0x1b2e-n0x1b3a) + I ro + 0x0026fb46, // n0x0410 c0x0000 (---------------) + I rocher + 0x00295f05, // n0x0411 c0x0000 (---------------) + I rocks + 0x002b2985, // n0x0412 c0x0000 (---------------) + I rodeo + 0x00395406, // n0x0413 c0x0000 (---------------) + I rogers + 0x0024a684, // n0x0414 c0x0000 (---------------) + I room + 0x4a20a642, // n0x0415 c0x0128 (n0x1b3a-n0x1b41) + I rs + 0x002dfe44, // n0x0416 c0x0000 (---------------) + I rsvp + 0x4a611ec2, // n0x0417 c0x0129 (n0x1b41-n0x1bc5) + I ru + 0x00232804, // n0x0418 c0x0000 (---------------) + I ruhr + 0x00221d83, // n0x0419 c0x0000 (---------------) + I run + 0x4ab19802, // n0x041a c0x012a (n0x1bc5-n0x1bce) + I rw + 0x00319803, // n0x041b c0x0000 (---------------) + I rwe + 0x002a4b06, // n0x041c c0x0000 (---------------) + I ryukyu + 0x4ae02402, // n0x041d c0x012b (n0x1bce-n0x1bd6) + I sa + 0x002bd388, // n0x041e c0x0000 (---------------) + I saarland + 0x0039ac44, // n0x041f c0x0000 (---------------) + I safe + 0x0039ac46, // n0x0420 c0x0000 (---------------) + I safety + 0x002fe346, // n0x0421 c0x0000 (---------------) + I sakura + 0x00252644, // n0x0422 c0x0000 (---------------) + I sale + 0x003104c5, // n0x0423 c0x0000 (---------------) + I salon + 0x00202408, // n0x0424 c0x0000 (---------------) + I samsclub + 0x00206b87, // n0x0425 c0x0000 (---------------) + I samsung + 0x00244cc7, // n0x0426 c0x0000 (---------------) + I sandvik + 0x00244ccf, // n0x0427 c0x0000 (---------------) + I sandvikcoromant + 0x0028b3c6, // n0x0428 c0x0000 (---------------) + I sanofi + 0x00215843, // n0x0429 c0x0000 (---------------) + I sap + 0x00215844, // n0x042a c0x0000 (---------------) + I sapo + 0x00229184, // n0x042b c0x0000 (---------------) + I sarl + 0x00236443, // n0x042c c0x0000 (---------------) + I sas + 0x00221484, // n0x042d c0x0000 (---------------) + I save + 0x0039c4c4, // n0x042e c0x0000 (---------------) + I saxo + 0x4b229a02, // n0x042f c0x012c (n0x1bd6-n0x1bdb) + I sb + 0x00282803, // n0x0430 c0x0000 (---------------) + I sbi + 0x00231183, // n0x0431 c0x0000 (---------------) + I sbs + 0x4b6024c2, // n0x0432 c0x012d (n0x1bdb-n0x1be0) + I sc + 0x00254f03, // n0x0433 c0x0000 (---------------) + I sca + 0x00226803, // n0x0434 c0x0000 (---------------) + I scb + 0x00215d4a, // n0x0435 c0x0000 (---------------) + I schaeffler + 0x00233ac7, // n0x0436 c0x0000 (---------------) + I schmidt + 0x00231a4c, // n0x0437 c0x0000 (---------------) + I scholarships + 0x00231d06, // n0x0438 c0x0000 (---------------) + I school + 0x0023c9c6, // n0x0439 c0x0000 (---------------) + I schule + 0x0023d107, // n0x043a c0x0000 (---------------) + I schwarz + 0x00230a47, // n0x043b c0x0000 (---------------) + I science + 0x00243c89, // n0x043c c0x0000 (---------------) + I scjohnson + 0x0021ac44, // n0x043d c0x0000 (---------------) + I scor + 0x00208144, // n0x043e c0x0000 (---------------) + I scot + 0x4ba56ec2, // n0x043f c0x012e (n0x1be0-n0x1be8) + I sd + 0x4be01d42, // n0x0440 c0x012f (n0x1be8-n0x1c11) + I se + 0x00306844, // n0x0441 c0x0000 (---------------) + I seat + 0x0031c886, // n0x0442 c0x0000 (---------------) + I secure + 0x00230ec8, // n0x0443 c0x0000 (---------------) + I security + 0x0027c404, // n0x0444 c0x0000 (---------------) + I seek + 0x00253f46, // n0x0445 c0x0000 (---------------) + I select + 0x002c92c5, // n0x0446 c0x0000 (---------------) + I sener + 0x002069c8, // n0x0447 c0x0000 (---------------) + I services + 0x00204443, // n0x0448 c0x0000 (---------------) + I ses + 0x0024bd45, // n0x0449 c0x0000 (---------------) + I seven + 0x0024ec83, // n0x044a c0x0000 (---------------) + I sew + 0x00240e03, // n0x044b c0x0000 (---------------) + I sex + 0x00240e04, // n0x044c c0x0000 (---------------) + I sexy + 0x0024f9c3, // n0x044d c0x0000 (---------------) + I sfr + 0x4c266482, // n0x044e c0x0130 (n0x1c11-n0x1c18) + I sg + 0x4c601c42, // n0x044f c0x0131 (n0x1c18-n0x1c1e) + I sh + 0x002502c9, // n0x0450 c0x0000 (---------------) + I shangrila + 0x00251e85, // n0x0451 c0x0000 (---------------) + I sharp + 0x00254484, // n0x0452 c0x0000 (---------------) + I shaw + 0x00257245, // n0x0453 c0x0000 (---------------) + I shell + 0x00212444, // n0x0454 c0x0000 (---------------) + I shia + 0x002af887, // n0x0455 c0x0000 (---------------) + I shiksha + 0x00398385, // n0x0456 c0x0000 (---------------) + I shoes + 0x002aa606, // n0x0457 c0x0000 (---------------) + I shouji + 0x002ab744, // n0x0458 c0x0000 (---------------) + I show + 0x002ae348, // n0x0459 c0x0000 (---------------) + I showtime + 0x002b0bc7, // n0x045a c0x0000 (---------------) + I shriram + 0x4ca0ca82, // n0x045b c0x0132 (n0x1c1e-n0x1c1f) + I si + 0x003531c4, // n0x045c c0x0000 (---------------) + I silk + 0x002ec7c4, // n0x045d c0x0000 (---------------) + I sina + 0x0027d347, // n0x045e c0x0000 (---------------) + I singles + 0x00247244, // n0x045f c0x0000 (---------------) + I site + 0x00251cc2, // n0x0460 c0x0000 (---------------) + I sj + 0x4ce0e342, // n0x0461 c0x0133 (n0x1c1f-n0x1c20) + I sk + 0x0021cf83, // n0x0462 c0x0000 (---------------) + I ski + 0x00305f84, // n0x0463 c0x0000 (---------------) + I skin + 0x0023ae03, // n0x0464 c0x0000 (---------------) + I sky + 0x00265c85, // n0x0465 c0x0000 (---------------) + I skype + 0x4d217a82, // n0x0466 c0x0134 (n0x1c20-n0x1c25) + I sl + 0x002c97c5, // n0x0467 c0x0000 (---------------) + I sling + 0x00215b02, // n0x0468 c0x0000 (---------------) + I sm + 0x0034b7c5, // n0x0469 c0x0000 (---------------) + I smart + 0x00358d85, // n0x046a c0x0000 (---------------) + I smile + 0x4d612a42, // n0x046b c0x0135 (n0x1c25-n0x1c2d) + I sn + 0x00212a44, // n0x046c c0x0000 (---------------) + I sncf + 0x4da04c82, // n0x046d c0x0136 (n0x1c2d-n0x1c30) + I so + 0x002a1a46, // n0x046e c0x0000 (---------------) + I soccer + 0x00298406, // n0x046f c0x0000 (---------------) + I social + 0x00263608, // n0x0470 c0x0000 (---------------) + I softbank + 0x002b2f88, // n0x0471 c0x0000 (---------------) + I software + 0x002ef444, // n0x0472 c0x0000 (---------------) + I sohu + 0x002da545, // n0x0473 c0x0000 (---------------) + I solar + 0x002ef609, // n0x0474 c0x0000 (---------------) + I solutions + 0x0031fd44, // n0x0475 c0x0000 (---------------) + I song + 0x00396444, // n0x0476 c0x0000 (---------------) + I sony + 0x002566c3, // n0x0477 c0x0000 (---------------) + I soy + 0x00335085, // n0x0478 c0x0000 (---------------) + I space + 0x0037a7c7, // n0x0479 c0x0000 (---------------) + I spiegel + 0x00245b44, // n0x047a c0x0000 (---------------) + I spot + 0x0032cc4d, // n0x047b c0x0000 (---------------) + I spreadbetting + 0x00336d82, // n0x047c c0x0000 (---------------) + I sr + 0x00336d83, // n0x047d c0x0000 (---------------) + I srl + 0x00353b83, // n0x047e c0x0000 (---------------) + I srt + 0x4de01a42, // n0x047f c0x0137 (n0x1c30-n0x1c3c) + I st + 0x0037b645, // n0x0480 c0x0000 (---------------) + I stada + 0x00383287, // n0x0481 c0x0000 (---------------) + I staples + 0x002245c4, // n0x0482 c0x0000 (---------------) + I star + 0x002245c7, // n0x0483 c0x0000 (---------------) + I starhub + 0x0028e7c9, // n0x0484 c0x0000 (---------------) + I statebank + 0x002bf5c9, // n0x0485 c0x0000 (---------------) + I statefarm + 0x002e88c7, // n0x0486 c0x0000 (---------------) + I statoil + 0x0026f903, // n0x0487 c0x0000 (---------------) + I stc + 0x0026f908, // n0x0488 c0x0000 (---------------) + I stcgroup + 0x00292749, // n0x0489 c0x0000 (---------------) + I stockholm + 0x003613c7, // n0x048a c0x0000 (---------------) + I storage + 0x0038c985, // n0x048b c0x0000 (---------------) + I store + 0x002e0886, // n0x048c c0x0000 (---------------) + I studio + 0x002e0a05, // n0x048d c0x0000 (---------------) + I study + 0x0023ed85, // n0x048e c0x0000 (---------------) + I style + 0x4e2029c2, // n0x048f c0x0138 (n0x1c3c-n0x1c5c) + I su + 0x002be445, // n0x0490 c0x0000 (---------------) + I sucks + 0x002b508a, // n0x0491 c0x0000 (---------------) + I supersport + 0x002b8a08, // n0x0492 c0x0000 (---------------) + I supplies + 0x0029d806, // n0x0493 c0x0000 (---------------) + I supply + 0x002dd987, // n0x0494 c0x0000 (---------------) + I support + 0x002466c4, // n0x0495 c0x0000 (---------------) + I surf + 0x00299d87, // n0x0496 c0x0000 (---------------) + I surgery + 0x002e3846, // n0x0497 c0x0000 (---------------) + I suzuki + 0x4e60ee82, // n0x0498 c0x0139 (n0x1c5c-n0x1c61) + I sv + 0x00373606, // n0x0499 c0x0000 (---------------) + I swatch + 0x002e61ca, // n0x049a c0x0000 (---------------) + I swiftcover + 0x002e6b85, // n0x049b c0x0000 (---------------) + I swiss + 0x4eae7402, // n0x049c c0x013a (n0x1c61-n0x1c62) + I sx + 0x4ee2b802, // n0x049d c0x013b (n0x1c62-n0x1c68) + I sy + 0x0022b806, // n0x049e c0x0000 (---------------) + I sydney + 0x002a3b08, // n0x049f c0x0000 (---------------) + I symantec + 0x0037e287, // n0x04a0 c0x0000 (---------------) + I systems + 0x4f202842, // n0x04a1 c0x013c (n0x1c68-n0x1c6b) + I sz + 0x00211703, // n0x04a2 c0x0000 (---------------) + I tab + 0x003a3406, // n0x04a3 c0x0000 (---------------) + I taipei + 0x0023ab44, // n0x04a4 c0x0000 (---------------) + I talk + 0x00390dc6, // n0x04a5 c0x0000 (---------------) + I taobao + 0x00363046, // n0x04a6 c0x0000 (---------------) + I target + 0x0030f98a, // n0x04a7 c0x0000 (---------------) + I tatamotors + 0x0036a385, // n0x04a8 c0x0000 (---------------) + I tatar + 0x0020a1c6, // n0x04a9 c0x0000 (---------------) + I tattoo + 0x0020cfc3, // n0x04aa c0x0000 (---------------) + I tax + 0x0020cfc4, // n0x04ab c0x0000 (---------------) + I taxi + 0x002041c2, // n0x04ac c0x0000 (---------------) + I tc + 0x003075c3, // n0x04ad c0x0000 (---------------) + I tci + 0x4f62cac2, // n0x04ae c0x013d (n0x1c6b-n0x1c6c) + I td + 0x002c7603, // n0x04af c0x0000 (---------------) + I tdk + 0x00365904, // n0x04b0 c0x0000 (---------------) + I team + 0x002a3c44, // n0x04b1 c0x0000 (---------------) + I tech + 0x002a3c4a, // n0x04b2 c0x0000 (---------------) + I technology + 0x0022fb43, // n0x04b3 c0x0000 (---------------) + I tel + 0x0027e708, // n0x04b4 c0x0000 (---------------) + I telecity + 0x0030df4a, // n0x04b5 c0x0000 (---------------) + I telefonica + 0x00319f47, // n0x04b6 c0x0000 (---------------) + I temasek + 0x002e9886, // n0x04b7 c0x0000 (---------------) + I tennis + 0x00328784, // n0x04b8 c0x0000 (---------------) + I teva + 0x00286e42, // n0x04b9 c0x0000 (---------------) + I tf + 0x00218742, // n0x04ba c0x0000 (---------------) + I tg + 0x4fa06502, // n0x04bb c0x013e (n0x1c6c-n0x1c73) + I th + 0x00242d43, // n0x04bc c0x0000 (---------------) + I thd + 0x0031b107, // n0x04bd c0x0000 (---------------) + I theater + 0x0024f0c7, // n0x04be c0x0000 (---------------) + I theatre + 0x0034c1cb, // n0x04bf c0x0000 (---------------) + I theguardian + 0x002ff484, // n0x04c0 c0x0000 (---------------) + I tiaa + 0x002eb8c7, // n0x04c1 c0x0000 (---------------) + I tickets + 0x002d7a46, // n0x04c2 c0x0000 (---------------) + I tienda + 0x0039aa07, // n0x04c3 c0x0000 (---------------) + I tiffany + 0x00233a04, // n0x04c4 c0x0000 (---------------) + I tips + 0x0034ee05, // n0x04c5 c0x0000 (---------------) + I tires + 0x002b5605, // n0x04c6 c0x0000 (---------------) + I tirol + 0x4fe01a82, // n0x04c7 c0x013f (n0x1c73-n0x1c82) + I tj + 0x00275246, // n0x04c8 c0x0000 (---------------) + I tjmaxx + 0x0036cac3, // n0x04c9 c0x0000 (---------------) + I tjx + 0x0022cc82, // n0x04ca c0x0000 (---------------) + I tk + 0x0022cc86, // n0x04cb c0x0000 (---------------) + I tkmaxx + 0x50208202, // n0x04cc c0x0140 (n0x1c82-n0x1c83) + I tl + 0x50600142, // n0x04cd c0x0141 (n0x1c83-n0x1c8b) + I tm + 0x00200145, // n0x04ce c0x0000 (---------------) + I tmall + 0x50a00942, // n0x04cf c0x0142 (n0x1c8b-n0x1c9f) + I tn + 0x50e07442, // n0x04d0 c0x0143 (n0x1c9f-n0x1ca5) + I to + 0x003338c5, // n0x04d1 c0x0000 (---------------) + I today + 0x002ef045, // n0x04d2 c0x0000 (---------------) + I tokyo + 0x0020a285, // n0x04d3 c0x0000 (---------------) + I tools + 0x0024a1c3, // n0x04d4 c0x0000 (---------------) + I top + 0x002238c5, // n0x04d5 c0x0000 (---------------) + I toray + 0x002cd247, // n0x04d6 c0x0000 (---------------) + I toshiba + 0x00254205, // n0x04d7 c0x0000 (---------------) + I total + 0x002f3c85, // n0x04d8 c0x0000 (---------------) + I tours + 0x002a9404, // n0x04d9 c0x0000 (---------------) + I town + 0x00254b06, // n0x04da c0x0000 (---------------) + I toyota + 0x00262e44, // n0x04db c0x0000 (---------------) + I toys + 0x00214582, // n0x04dc c0x0000 (---------------) + I tp + 0x51203642, // n0x04dd c0x0144 (n0x1ca5-n0x1cba) + I tr + 0x0025f785, // n0x04de c0x0000 (---------------) + I trade + 0x0029b6c7, // n0x04df c0x0000 (---------------) + I trading + 0x00312148, // n0x04e0 c0x0000 (---------------) + I training + 0x00293486, // n0x04e1 c0x0000 (---------------) + I travel + 0x0029348d, // n0x04e2 c0x0000 (---------------) + I travelchannel + 0x00299209, // n0x04e3 c0x0000 (---------------) + I travelers + 0x00299212, // n0x04e4 c0x0000 (---------------) + I travelersinsurance + 0x0031f0c5, // n0x04e5 c0x0000 (---------------) + I trust + 0x00325243, // n0x04e6 c0x0000 (---------------) + I trv + 0x51e0a242, // n0x04e7 c0x0147 (n0x1cbc-n0x1ccd) + I tt + 0x002de944, // n0x04e8 c0x0000 (---------------) + I tube + 0x002efb43, // n0x04e9 c0x0000 (---------------) + I tui + 0x002e7885, // n0x04ea c0x0000 (---------------) + I tunes + 0x002e8105, // n0x04eb c0x0000 (---------------) + I tushu + 0x52206fc2, // n0x04ec c0x0148 (n0x1ccd-n0x1cd1) + I tv + 0x00361343, // n0x04ed c0x0000 (---------------) + I tvs + 0x52641cc2, // n0x04ee c0x0149 (n0x1cd1-n0x1cdf) + I tw + 0x52a1d942, // n0x04ef c0x014a (n0x1cdf-n0x1ceb) + I tz + 0x52e0d102, // n0x04f0 c0x014b (n0x1ceb-n0x1d3a) + I ua + 0x00334405, // n0x04f1 c0x0000 (---------------) + I ubank + 0x0024d683, // n0x04f2 c0x0000 (---------------) + I ubs + 0x00322208, // n0x04f3 c0x0000 (---------------) + I uconnect + 0x53207e02, // n0x04f4 c0x014c (n0x1d3a-n0x1d43) + I ug + 0x53600f82, // n0x04f5 c0x014d (n0x1d43-n0x1d4e) + I uk + 0x00281a0a, // n0x04f6 c0x0000 (---------------) + I university + 0x00208d03, // n0x04f7 c0x0000 (---------------) + I uno + 0x0023a103, // n0x04f8 c0x0000 (---------------) + I uol + 0x002cdd83, // n0x04f9 c0x0000 (---------------) + I ups + 0x54202982, // n0x04fa c0x0150 (n0x1d50-n0x1d8f) + I us + 0x6260d7c2, // n0x04fb c0x0189 (n0x1e32-n0x1e38) + I uy + 0x62e11f02, // n0x04fc c0x018b (n0x1e39-n0x1e3d) + I uz + 0x002000c2, // n0x04fd c0x0000 (---------------) + I va + 0x00373409, // n0x04fe c0x0000 (---------------) + I vacations + 0x002b7704, // n0x04ff c0x0000 (---------------) + I vana + 0x00275b48, // n0x0500 c0x0000 (---------------) + I vanguard + 0x632dfb02, // n0x0501 c0x018c (n0x1e3d-n0x1e43) + I vc + 0x63602202, // n0x0502 c0x018d (n0x1e43-n0x1e54) + I ve + 0x002292c5, // n0x0503 c0x0000 (---------------) + I vegas + 0x002360c8, // n0x0504 c0x0000 (---------------) + I ventures + 0x002e6388, // n0x0505 c0x0000 (---------------) + I verisign + 0x0038fb4c, // n0x0506 c0x0000 (---------------) + I versicherung + 0x0023b383, // n0x0507 c0x0000 (---------------) + I vet + 0x00258ec2, // n0x0508 c0x0000 (---------------) + I vg + 0x63a00642, // n0x0509 c0x018e (n0x1e54-n0x1e59) + I vi + 0x002c26c6, // n0x050a c0x0000 (---------------) + I viajes + 0x002ea705, // n0x050b c0x0000 (---------------) + I video + 0x00200643, // n0x050c c0x0000 (---------------) + I vig + 0x0036cf46, // n0x050d c0x0000 (---------------) + I viking + 0x002ea846, // n0x050e c0x0000 (---------------) + I villas + 0x00225e83, // n0x050f c0x0000 (---------------) + I vin + 0x002ec703, // n0x0510 c0x0000 (---------------) + I vip + 0x002ee6c6, // n0x0511 c0x0000 (---------------) + I virgin + 0x002eec44, // n0x0512 c0x0000 (---------------) + I visa + 0x0023b546, // n0x0513 c0x0000 (---------------) + I vision + 0x002c71c5, // n0x0514 c0x0000 (---------------) + I vista + 0x002ef90a, // n0x0515 c0x0000 (---------------) + I vistaprint + 0x002388c4, // n0x0516 c0x0000 (---------------) + I viva + 0x002f0b04, // n0x0517 c0x0000 (---------------) + I vivo + 0x003434ca, // n0x0518 c0x0000 (---------------) + I vlaanderen + 0x63e00d42, // n0x0519 c0x018f (n0x1e59-n0x1e66) + I vn + 0x002c3d45, // n0x051a c0x0000 (---------------) + I vodka + 0x002f210a, // n0x051b c0x0000 (---------------) + I volkswagen + 0x002f3984, // n0x051c c0x0000 (---------------) + I vote + 0x002f3a86, // n0x051d c0x0000 (---------------) + I voting + 0x002f3c04, // n0x051e c0x0000 (---------------) + I voto + 0x002a8206, // n0x051f c0x0000 (---------------) + I voyage + 0x64200882, // n0x0520 c0x0190 (n0x1e66-n0x1e6a) + I vu + 0x002c2fc6, // n0x0521 c0x0000 (---------------) + I vuelos + 0x0030e445, // n0x0522 c0x0000 (---------------) + I wales + 0x002010c7, // n0x0523 c0x0000 (---------------) + I walmart + 0x00209206, // n0x0524 c0x0000 (---------------) + I walter + 0x0023d304, // n0x0525 c0x0000 (---------------) + I wang + 0x002fa647, // n0x0526 c0x0000 (---------------) + I wanggou + 0x0036c7c6, // n0x0527 c0x0000 (---------------) + I warman + 0x002a6905, // n0x0528 c0x0000 (---------------) + I watch + 0x002fa287, // n0x0529 c0x0000 (---------------) + I watches + 0x0038d087, // n0x052a c0x0000 (---------------) + I weather + 0x0038d08e, // n0x052b c0x0000 (---------------) + I weatherchannel + 0x0021fa86, // n0x052c c0x0000 (---------------) + I webcam + 0x00351d85, // n0x052d c0x0000 (---------------) + I weber + 0x002ba987, // n0x052e c0x0000 (---------------) + I website + 0x002e4ec3, // n0x052f c0x0000 (---------------) + I wed + 0x0033adc7, // n0x0530 c0x0000 (---------------) + I wedding + 0x00208a85, // n0x0531 c0x0000 (---------------) + I weibo + 0x0020f304, // n0x0532 c0x0000 (---------------) + I weir + 0x0022a842, // n0x0533 c0x0000 (---------------) + I wf + 0x00332687, // n0x0534 c0x0000 (---------------) + I whoswho + 0x002e2d04, // n0x0535 c0x0000 (---------------) + I wien + 0x0032fd04, // n0x0536 c0x0000 (---------------) + I wiki + 0x0024ed0b, // n0x0537 c0x0000 (---------------) + I williamhill + 0x0021b743, // n0x0538 c0x0000 (---------------) + I win + 0x0027a9c7, // n0x0539 c0x0000 (---------------) + I windows + 0x0021b744, // n0x053a c0x0000 (---------------) + I wine + 0x002ab5c7, // n0x053b c0x0000 (---------------) + I winners + 0x0021dd83, // n0x053c c0x0000 (---------------) + I wme + 0x0032704d, // n0x053d c0x0000 (---------------) + I wolterskluwer + 0x0037be88, // n0x053e c0x0000 (---------------) + I woodside + 0x002423c4, // n0x053f c0x0000 (---------------) + I work + 0x00332b45, // n0x0540 c0x0000 (---------------) + I works + 0x002f7105, // n0x0541 c0x0000 (---------------) + I world + 0x002f4c03, // n0x0542 c0x0000 (---------------) + I wow + 0x6461fec2, // n0x0543 c0x0191 (n0x1e6a-n0x1e71) + I ws + 0x002f60c3, // n0x0544 c0x0000 (---------------) + I wtc + 0x002f67c3, // n0x0545 c0x0000 (---------------) + I wtf + 0x00214bc4, // n0x0546 c0x0000 (---------------) + I xbox + 0x00273b05, // n0x0547 c0x0000 (---------------) + I xerox + 0x00214c87, // n0x0548 c0x0000 (---------------) + I xfinity + 0x0020d046, // n0x0549 c0x0000 (---------------) + I xihuan + 0x00365643, // n0x054a c0x0000 (---------------) + I xin + 0x0036cb4b, // n0x054b c0x0000 (---------------) + I xn--11b4c3d + 0x0022cdcb, // n0x054c c0x0000 (---------------) + I xn--1ck2e1b + 0x00269acb, // n0x054d c0x0000 (---------------) + I xn--1qqw23a + 0x00273c0a, // n0x054e c0x0000 (---------------) + I xn--30rr7y + 0x0029db4b, // n0x054f c0x0000 (---------------) + I xn--3bst00m + 0x002b414b, // n0x0550 c0x0000 (---------------) + I xn--3ds443g + 0x002cffcc, // n0x0551 c0x0000 (---------------) + I xn--3e0b707e + 0x002e7451, // n0x0552 c0x0000 (---------------) + I xn--3oq18vl8pn36a + 0x0034624a, // n0x0553 c0x0000 (---------------) + I xn--3pxu8k + 0x003a114b, // n0x0554 c0x0000 (---------------) + I xn--42c2d9a + 0x003a260b, // n0x0555 c0x0000 (---------------) + I xn--45brj9c + 0x002f750a, // n0x0556 c0x0000 (---------------) + I xn--45q11c + 0x002f7eca, // n0x0557 c0x0000 (---------------) + I xn--4gbrim + 0x002f828d, // n0x0558 c0x0000 (---------------) + I xn--4gq48lf9j + 0x002f9b4e, // n0x0559 c0x0000 (---------------) + I xn--54b7fta0cc + 0x002fa9cb, // n0x055a c0x0000 (---------------) + I xn--55qw42g + 0x002fac8a, // n0x055b c0x0000 (---------------) + I xn--55qx5d + 0x002fbad1, // n0x055c c0x0000 (---------------) + I xn--5su34j936bgsg + 0x002fbf0a, // n0x055d c0x0000 (---------------) + I xn--5tzm5g + 0x002fc40b, // n0x055e c0x0000 (---------------) + I xn--6frz82g + 0x002fc94e, // n0x055f c0x0000 (---------------) + I xn--6qq986b3xl + 0x002fd18c, // n0x0560 c0x0000 (---------------) + I xn--80adxhks + 0x002fdc0b, // n0x0561 c0x0000 (---------------) + I xn--80ao21a + 0x002fdecc, // n0x0562 c0x0000 (---------------) + I xn--80asehdb + 0x00303c8a, // n0x0563 c0x0000 (---------------) + I xn--80aswg + 0x00304e8c, // n0x0564 c0x0000 (---------------) + I xn--8y0a063a + 0x64b0518a, // n0x0565 c0x0192 (n0x1e71-n0x1e77) + I xn--90a3ac + 0x0030aa49, // n0x0566 c0x0000 (---------------) + I xn--90ais + 0x0030c44a, // n0x0567 c0x0000 (---------------) + I xn--9dbq2a + 0x0030c6ca, // n0x0568 c0x0000 (---------------) + I xn--9et52u + 0x0030c94b, // n0x0569 c0x0000 (---------------) + I xn--9krt00a + 0x0031194e, // n0x056a c0x0000 (---------------) + I xn--b4w605ferd + 0x00311cd1, // n0x056b c0x0000 (---------------) + I xn--bck1b9a5dre4c + 0x00318289, // n0x056c c0x0000 (---------------) + I xn--c1avg + 0x003184ca, // n0x056d c0x0000 (---------------) + I xn--c2br7g + 0x0031918b, // n0x056e c0x0000 (---------------) + I xn--cck2b3b + 0x0031b8ca, // n0x056f c0x0000 (---------------) + I xn--cg4bki + 0x0031c216, // n0x0570 c0x0000 (---------------) + I xn--clchc0ea0b2g2a9gcd + 0x0031da0b, // n0x0571 c0x0000 (---------------) + I xn--czr694b + 0x0031ee8a, // n0x0572 c0x0000 (---------------) + I xn--czrs0t + 0x0031f28a, // n0x0573 c0x0000 (---------------) + I xn--czru2d + 0x0032118b, // n0x0574 c0x0000 (---------------) + I xn--d1acj3b + 0x00324cc9, // n0x0575 c0x0000 (---------------) + I xn--d1alf + 0x003279cd, // n0x0576 c0x0000 (---------------) + I xn--eckvdtc9d + 0x0032838b, // n0x0577 c0x0000 (---------------) + I xn--efvy88h + 0x0032908b, // n0x0578 c0x0000 (---------------) + I xn--estv75g + 0x00329a4b, // n0x0579 c0x0000 (---------------) + I xn--fct429k + 0x0032a3c9, // n0x057a c0x0000 (---------------) + I xn--fhbei + 0x0032aa0e, // n0x057b c0x0000 (---------------) + I xn--fiq228c5hs + 0x0032b0ca, // n0x057c c0x0000 (---------------) + I xn--fiq64b + 0x0032c6ca, // n0x057d c0x0000 (---------------) + I xn--fiqs8s + 0x0032ca0a, // n0x057e c0x0000 (---------------) + I xn--fiqz9s + 0x0032d2cb, // n0x057f c0x0000 (---------------) + I xn--fjq720a + 0x0032db0b, // n0x0580 c0x0000 (---------------) + I xn--flw351e + 0x0032ddcd, // n0x0581 c0x0000 (---------------) + I xn--fpcrj9c3d + 0x0032f38d, // n0x0582 c0x0000 (---------------) + I xn--fzc2c9e2c + 0x00331a50, // n0x0583 c0x0000 (---------------) + I xn--fzys8d69uvgm + 0x00331f0b, // n0x0584 c0x0000 (---------------) + I xn--g2xx48c + 0x00332f4c, // n0x0585 c0x0000 (---------------) + I xn--gckr3f0f + 0x00333a0b, // n0x0586 c0x0000 (---------------) + I xn--gecrj9c + 0x00335b0b, // n0x0587 c0x0000 (---------------) + I xn--gk3at1e + 0x0033768b, // n0x0588 c0x0000 (---------------) + I xn--h2brj9c + 0x0033ef4b, // n0x0589 c0x0000 (---------------) + I xn--hxt814e + 0x0033f9cf, // n0x058a c0x0000 (---------------) + I xn--i1b6b1a6a2e + 0x0033fd8b, // n0x058b c0x0000 (---------------) + I xn--imr513n + 0x00340a0a, // n0x058c c0x0000 (---------------) + I xn--io0a7i + 0x00341409, // n0x058d c0x0000 (---------------) + I xn--j1aef + 0x003417c9, // n0x058e c0x0000 (---------------) + I xn--j1amh + 0x00341dcb, // n0x058f c0x0000 (---------------) + I xn--j6w193g + 0x0034208e, // n0x0590 c0x0000 (---------------) + I xn--jlq61u9w7b + 0x00343b4b, // n0x0591 c0x0000 (---------------) + I xn--jvr189m + 0x00344e0f, // n0x0592 c0x0000 (---------------) + I xn--kcrx77d1x4a + 0x00346c0b, // n0x0593 c0x0000 (---------------) + I xn--kprw13d + 0x00346ecb, // n0x0594 c0x0000 (---------------) + I xn--kpry57d + 0x0034718b, // n0x0595 c0x0000 (---------------) + I xn--kpu716f + 0x0034774a, // n0x0596 c0x0000 (---------------) + I xn--kput3i + 0x0034d289, // n0x0597 c0x0000 (---------------) + I xn--l1acc + 0x00350bcf, // n0x0598 c0x0000 (---------------) + I xn--lgbbat1ad8j + 0x00355dcc, // n0x0599 c0x0000 (---------------) + I xn--mgb2ddes + 0x00356e0c, // n0x059a c0x0000 (---------------) + I xn--mgb9awbf + 0x003573ce, // n0x059b c0x0000 (---------------) + I xn--mgba3a3ejt + 0x0035830f, // n0x059c c0x0000 (---------------) + I xn--mgba3a4f16a + 0x003586ce, // n0x059d c0x0000 (---------------) + I xn--mgba3a4fra + 0x00359510, // n0x059e c0x0000 (---------------) + I xn--mgba7c0bbn0a + 0x0035990f, // n0x059f c0x0000 (---------------) + I xn--mgbaakc7dvf + 0x0035be0e, // n0x05a0 c0x0000 (---------------) + I xn--mgbaam7a8h + 0x0035ca0c, // n0x05a1 c0x0000 (---------------) + I xn--mgbab2bd + 0x0035cd12, // n0x05a2 c0x0000 (---------------) + I xn--mgbai9a5eva00b + 0x0035dcd1, // n0x05a3 c0x0000 (---------------) + I xn--mgbai9azgqp6j + 0x0035e28e, // n0x05a4 c0x0000 (---------------) + I xn--mgbayh7gpa + 0x0035e6ce, // n0x05a5 c0x0000 (---------------) + I xn--mgbb9fbpob + 0x0035ec0e, // n0x05a6 c0x0000 (---------------) + I xn--mgbbh1a71e + 0x0035ef8f, // n0x05a7 c0x0000 (---------------) + I xn--mgbc0a9azcg + 0x0035f34e, // n0x05a8 c0x0000 (---------------) + I xn--mgbca7dzdo + 0x0035f853, // n0x05a9 c0x0000 (---------------) + I xn--mgberp4a5d4a87g + 0x0035fd11, // n0x05aa c0x0000 (---------------) + I xn--mgberp4a5d4ar + 0x0036014c, // n0x05ab c0x0000 (---------------) + I xn--mgbpl2fh + 0x00360593, // n0x05ac c0x0000 (---------------) + I xn--mgbqly7c0a67fbc + 0x00360d10, // n0x05ad c0x0000 (---------------) + I xn--mgbqly7cvafr + 0x0036158c, // n0x05ae c0x0000 (---------------) + I xn--mgbt3dhd + 0x0036188c, // n0x05af c0x0000 (---------------) + I xn--mgbtf8fl + 0x00361dcb, // n0x05b0 c0x0000 (---------------) + I xn--mgbtx2b + 0x00363f0e, // n0x05b1 c0x0000 (---------------) + I xn--mgbx4cd0ab + 0x0036440b, // n0x05b2 c0x0000 (---------------) + I xn--mix082f + 0x003647cb, // n0x05b3 c0x0000 (---------------) + I xn--mix891f + 0x00365ccc, // n0x05b4 c0x0000 (---------------) + I xn--mk1bu44c + 0x0036d74a, // n0x05b5 c0x0000 (---------------) + I xn--mxtq1m + 0x0036db0c, // n0x05b6 c0x0000 (---------------) + I xn--ngbc5azd + 0x0036de0c, // n0x05b7 c0x0000 (---------------) + I xn--ngbe9e0a + 0x0036ed0b, // n0x05b8 c0x0000 (---------------) + I xn--nnx388a + 0x0036efc8, // n0x05b9 c0x0000 (---------------) + I xn--node + 0x0036f489, // n0x05ba c0x0000 (---------------) + I xn--nqv7f + 0x0036f48f, // n0x05bb c0x0000 (---------------) + I xn--nqv7fs00ema + 0x00370e0b, // n0x05bc c0x0000 (---------------) + I xn--nyqy26a + 0x003718ca, // n0x05bd c0x0000 (---------------) + I xn--o3cw4h + 0x00373a8c, // n0x05be c0x0000 (---------------) + I xn--ogbpf8fl + 0x00374cc9, // n0x05bf c0x0000 (---------------) + I xn--p1acf + 0x00374f48, // n0x05c0 c0x0000 (---------------) + I xn--p1ai + 0x0037514b, // n0x05c1 c0x0000 (---------------) + I xn--pbt977c + 0x0037570b, // n0x05c2 c0x0000 (---------------) + I xn--pgbs0dh + 0x0037630a, // n0x05c3 c0x0000 (---------------) + I xn--pssy2u + 0x0037658b, // n0x05c4 c0x0000 (---------------) + I xn--q9jyb4c + 0x00376e4c, // n0x05c5 c0x0000 (---------------) + I xn--qcka1pmc + 0x003779c8, // n0x05c6 c0x0000 (---------------) + I xn--qxam + 0x0037c08b, // n0x05c7 c0x0000 (---------------) + I xn--rhqv96g + 0x0037f08b, // n0x05c8 c0x0000 (---------------) + I xn--rovu88b + 0x00382b8b, // n0x05c9 c0x0000 (---------------) + I xn--s9brj9c + 0x0038458b, // n0x05ca c0x0000 (---------------) + I xn--ses554g + 0x0038cc0b, // n0x05cb c0x0000 (---------------) + I xn--t60b56a + 0x0038cec9, // n0x05cc c0x0000 (---------------) + I xn--tckwe + 0x00391a8a, // n0x05cd c0x0000 (---------------) + I xn--unup4y + 0x003929d7, // n0x05ce c0x0000 (---------------) + I xn--vermgensberater-ctb + 0x00394958, // n0x05cf c0x0000 (---------------) + I xn--vermgensberatung-pwb + 0x00399489, // n0x05d0 c0x0000 (---------------) + I xn--vhquv + 0x0039a68b, // n0x05d1 c0x0000 (---------------) + I xn--vuq861b + 0x0039b294, // n0x05d2 c0x0000 (---------------) + I xn--w4r85el8fhu5dnra + 0x0039b78b, // n0x05d3 c0x0000 (---------------) + I xn--w4rs40l + 0x0039bd0a, // n0x05d4 c0x0000 (---------------) + I xn--wgbh1c + 0x0039c5ca, // n0x05d5 c0x0000 (---------------) + I xn--wgbl6a + 0x0039c84b, // n0x05d6 c0x0000 (---------------) + I xn--xhq521b + 0x0039e590, // n0x05d7 c0x0000 (---------------) + I xn--xkc2al3hye2a + 0x0039e991, // n0x05d8 c0x0000 (---------------) + I xn--xkc2dl3a5ee0h + 0x0039f7ca, // n0x05d9 c0x0000 (---------------) + I xn--y9a3aq + 0x003a074d, // n0x05da c0x0000 (---------------) + I xn--yfro4i67o + 0x003a0e4d, // n0x05db c0x0000 (---------------) + I xn--ygbi2ammx + 0x003a2ccb, // n0x05dc c0x0000 (---------------) + I xn--zfr164b + 0x003a3a86, // n0x05dd c0x0000 (---------------) + I xperia + 0x00275343, // n0x05de c0x0000 (---------------) + I xxx + 0x00240e83, // n0x05df c0x0000 (---------------) + I xyz + 0x00264686, // n0x05e0 c0x0000 (---------------) + I yachts + 0x00285645, // n0x05e1 c0x0000 (---------------) + I yahoo + 0x0021b2c7, // n0x05e2 c0x0000 (---------------) + I yamaxun + 0x00334e46, // n0x05e3 c0x0000 (---------------) + I yandex + 0x0161bcc2, // n0x05e4 c0x0005 (---------------)* o I ye + 0x002f7809, // n0x05e5 c0x0000 (---------------) + I yodobashi + 0x00379a04, // n0x05e6 c0x0000 (---------------) + I yoga + 0x0024d248, // n0x05e7 c0x0000 (---------------) + I yokohama + 0x00242c83, // n0x05e8 c0x0000 (---------------) + I you + 0x002de887, // n0x05e9 c0x0000 (---------------) + I youtube + 0x002197c2, // n0x05ea c0x0000 (---------------) + I yt + 0x002a4143, // n0x05eb c0x0000 (---------------) + I yun + 0x64e09ac2, // n0x05ec c0x0193 (n0x1e77-n0x1e88) o I za + 0x002c10c6, // n0x05ed c0x0000 (---------------) + I zappos + 0x002c1cc4, // n0x05ee c0x0000 (---------------) + I zara + 0x00324004, // n0x05ef c0x0000 (---------------) + I zero + 0x002377c3, // n0x05f0 c0x0000 (---------------) + I zip + 0x002377c5, // n0x05f1 c0x0000 (---------------) + I zippo + 0x016f7282, // n0x05f2 c0x0005 (---------------)* o I zm + 0x002d7204, // n0x05f3 c0x0000 (---------------) + I zone + 0x0026c047, // n0x05f4 c0x0000 (---------------) + I zuerich + 0x0165b802, // n0x05f5 c0x0005 (---------------)* o I zw + 0x0022edc3, // n0x05f6 c0x0000 (---------------) + I com + 0x002349c3, // n0x05f7 c0x0000 (---------------) + I edu + 0x00275003, // n0x05f8 c0x0000 (---------------) + I gov + 0x00215b43, // n0x05f9 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x05fa c0x0000 (---------------) + I net + 0x00229a83, // n0x05fb c0x0000 (---------------) + I org + 0x0020e543, // n0x05fc c0x0000 (---------------) + I nom + 0x00205882, // n0x05fd c0x0000 (---------------) + I ac + 0x000f5248, // n0x05fe c0x0000 (---------------) + blogspot + 0x00208182, // n0x05ff c0x0000 (---------------) + I co + 0x00275003, // n0x0600 c0x0000 (---------------) + I gov + 0x00215b43, // n0x0601 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x0602 c0x0000 (---------------) + I net + 0x00229a83, // n0x0603 c0x0000 (---------------) + I org + 0x00215d43, // n0x0604 c0x0000 (---------------) + I sch + 0x00316456, // n0x0605 c0x0000 (---------------) + I accident-investigation + 0x00317053, // n0x0606 c0x0000 (---------------) + I accident-prevention + 0x002eb749, // n0x0607 c0x0000 (---------------) + I aerobatic + 0x0035a9c8, // n0x0608 c0x0000 (---------------) + I aeroclub + 0x002dc849, // n0x0609 c0x0000 (---------------) + I aerodrome + 0x002f2286, // n0x060a c0x0000 (---------------) + I agents + 0x0033cd10, // n0x060b c0x0000 (---------------) + I air-surveillance + 0x002b2053, // n0x060c c0x0000 (---------------) + I air-traffic-control + 0x00235408, // n0x060d c0x0000 (---------------) + I aircraft + 0x00272007, // n0x060e c0x0000 (---------------) + I airline + 0x0027b687, // n0x060f c0x0000 (---------------) + I airport + 0x00296d8a, // n0x0610 c0x0000 (---------------) + I airtraffic + 0x002b0ec9, // n0x0611 c0x0000 (---------------) + I ambulance + 0x00362e49, // n0x0612 c0x0000 (---------------) + I amusement + 0x002b1c4b, // n0x0613 c0x0000 (---------------) + I association + 0x0031e346, // n0x0614 c0x0000 (---------------) + I author + 0x00339b0a, // n0x0615 c0x0000 (---------------) + I ballooning + 0x00220086, // n0x0616 c0x0000 (---------------) + I broker + 0x00379603, // n0x0617 c0x0000 (---------------) + I caa + 0x002ebd85, // n0x0618 c0x0000 (---------------) + I cargo + 0x00233688, // n0x0619 c0x0000 (---------------) + I catering + 0x002a1b0d, // n0x061a c0x0000 (---------------) + I certification + 0x0033c8cc, // n0x061b c0x0000 (---------------) + I championship + 0x00268847, // n0x061c c0x0000 (---------------) + I charter + 0x00354d8d, // n0x061d c0x0000 (---------------) + I civilaviation + 0x00202504, // n0x061e c0x0000 (---------------) + I club + 0x00231fca, // n0x061f c0x0000 (---------------) + I conference + 0x0023290a, // n0x0620 c0x0000 (---------------) + I consultant + 0x00232dca, // n0x0621 c0x0000 (---------------) + I consulting + 0x0022bac7, // n0x0622 c0x0000 (---------------) + I control + 0x0023c687, // n0x0623 c0x0000 (---------------) + I council + 0x0023eac4, // n0x0624 c0x0000 (---------------) + I crew + 0x00222ec6, // n0x0625 c0x0000 (---------------) + I design + 0x0031b344, // n0x0626 c0x0000 (---------------) + I dgca + 0x002aefc8, // n0x0627 c0x0000 (---------------) + I educator + 0x002bb8c9, // n0x0628 c0x0000 (---------------) + I emergency + 0x0032a106, // n0x0629 c0x0000 (---------------) + I engine + 0x0032a108, // n0x062a c0x0000 (---------------) + I engineer + 0x0024130d, // n0x062b c0x0000 (---------------) + I entertainment + 0x002bf809, // n0x062c c0x0000 (---------------) + I equipment + 0x0035b488, // n0x062d c0x0000 (---------------) + I exchange + 0x00240c87, // n0x062e c0x0000 (---------------) + I express + 0x0020038a, // n0x062f c0x0000 (---------------) + I federation + 0x00249f06, // n0x0630 c0x0000 (---------------) + I flight + 0x002556c7, // n0x0631 c0x0000 (---------------) + I freight + 0x003392c4, // n0x0632 c0x0000 (---------------) + I fuel + 0x00252087, // n0x0633 c0x0000 (---------------) + I gliding + 0x0027500a, // n0x0634 c0x0000 (---------------) + I government + 0x0033158e, // n0x0635 c0x0000 (---------------) + I groundhandling + 0x0020eb45, // n0x0636 c0x0000 (---------------) + I group + 0x002f494b, // n0x0637 c0x0000 (---------------) + I hanggliding + 0x0025cf89, // n0x0638 c0x0000 (---------------) + I homebuilt + 0x00239c09, // n0x0639 c0x0000 (---------------) + I insurance + 0x00201847, // n0x063a c0x0000 (---------------) + I journal + 0x0020184a, // n0x063b c0x0000 (---------------) + I journalist + 0x0027d287, // n0x063c c0x0000 (---------------) + I leasing + 0x002dc2c9, // n0x063d c0x0000 (---------------) + I logistics + 0x00391388, // n0x063e c0x0000 (---------------) + I magazine + 0x0026f60b, // n0x063f c0x0000 (---------------) + I maintenance + 0x0022dc4b, // n0x0640 c0x0000 (---------------) + I marketplace + 0x002fb545, // n0x0641 c0x0000 (---------------) + I media + 0x00245dca, // n0x0642 c0x0000 (---------------) + I microlight + 0x0029a989, // n0x0643 c0x0000 (---------------) + I modelling + 0x002005ca, // n0x0644 c0x0000 (---------------) + I navigation + 0x002c22cb, // n0x0645 c0x0000 (---------------) + I parachuting + 0x00251f8b, // n0x0646 c0x0000 (---------------) + I paragliding + 0x002b19d5, // n0x0647 c0x0000 (---------------) + I passenger-association + 0x002d1345, // n0x0648 c0x0000 (---------------) + I pilot + 0x00240d05, // n0x0649 c0x0000 (---------------) + I press + 0x002db64a, // n0x064a c0x0000 (---------------) + I production + 0x0031c98a, // n0x064b c0x0000 (---------------) + I recreation + 0x00228d07, // n0x064c c0x0000 (---------------) + I repbody + 0x0021bfc3, // n0x064d c0x0000 (---------------) + I res + 0x00290208, // n0x064e c0x0000 (---------------) + I research + 0x002cb30a, // n0x064f c0x0000 (---------------) + I rotorcraft + 0x0039ac46, // n0x0650 c0x0000 (---------------) + I safety + 0x00240289, // n0x0651 c0x0000 (---------------) + I scientist + 0x002069c8, // n0x0652 c0x0000 (---------------) + I services + 0x002ab744, // n0x0653 c0x0000 (---------------) + I show + 0x00371689, // n0x0654 c0x0000 (---------------) + I skydiving + 0x002b2f88, // n0x0655 c0x0000 (---------------) + I software + 0x002a3147, // n0x0656 c0x0000 (---------------) + I student + 0x0020cfc4, // n0x0657 c0x0000 (---------------) + I taxi + 0x0025f786, // n0x0658 c0x0000 (---------------) + I trader + 0x0029b6c7, // n0x0659 c0x0000 (---------------) + I trading + 0x003374c7, // n0x065a c0x0000 (---------------) + I trainer + 0x0023e505, // n0x065b c0x0000 (---------------) + I union + 0x002d574c, // n0x065c c0x0000 (---------------) + I workinggroup + 0x00332b45, // n0x065d c0x0000 (---------------) + I works + 0x0022edc3, // n0x065e c0x0000 (---------------) + I com + 0x002349c3, // n0x065f c0x0000 (---------------) + I edu + 0x00275003, // n0x0660 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x0661 c0x0000 (---------------) + I net + 0x00229a83, // n0x0662 c0x0000 (---------------) + I org + 0x00208182, // n0x0663 c0x0000 (---------------) + I co + 0x0022edc3, // n0x0664 c0x0000 (---------------) + I com + 0x0021d8c3, // n0x0665 c0x0000 (---------------) + I net + 0x0020e543, // n0x0666 c0x0000 (---------------) + I nom + 0x00229a83, // n0x0667 c0x0000 (---------------) + I org + 0x0022edc3, // n0x0668 c0x0000 (---------------) + I com + 0x0021d8c3, // n0x0669 c0x0000 (---------------) + I net + 0x0021f703, // n0x066a c0x0000 (---------------) + I off + 0x00229a83, // n0x066b c0x0000 (---------------) + I org + 0x000f5248, // n0x066c c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x066d c0x0000 (---------------) + I com + 0x002349c3, // n0x066e c0x0000 (---------------) + I edu + 0x00275003, // n0x066f c0x0000 (---------------) + I gov + 0x00215b43, // n0x0670 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x0671 c0x0000 (---------------) + I net + 0x00229a83, // n0x0672 c0x0000 (---------------) + I org + 0x000f5248, // n0x0673 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x0674 c0x0000 (---------------) + I com + 0x002349c3, // n0x0675 c0x0000 (---------------) + I edu + 0x0021d8c3, // n0x0676 c0x0000 (---------------) + I net + 0x00229a83, // n0x0677 c0x0000 (---------------) + I org + 0x00208182, // n0x0678 c0x0000 (---------------) + I co + 0x002003c2, // n0x0679 c0x0000 (---------------) + I ed + 0x00233002, // n0x067a c0x0000 (---------------) + I gv + 0x00206f82, // n0x067b c0x0000 (---------------) + I it + 0x00201602, // n0x067c c0x0000 (---------------) + I og + 0x00228d82, // n0x067d c0x0000 (---------------) + I pb + 0x04a2edc3, // n0x067e c0x0012 (n0x0687-n0x0688) + I com + 0x002349c3, // n0x067f c0x0000 (---------------) + I edu + 0x00209f03, // n0x0680 c0x0000 (---------------) + I gob + 0x00275003, // n0x0681 c0x0000 (---------------) + I gov + 0x0026f683, // n0x0682 c0x0000 (---------------) + I int + 0x00215b43, // n0x0683 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x0684 c0x0000 (---------------) + I net + 0x00229a83, // n0x0685 c0x0000 (---------------) + I org + 0x00236183, // n0x0686 c0x0000 (---------------) + I tur + 0x000f5248, // n0x0687 c0x0000 (---------------) + blogspot + 0x00256bc4, // n0x0688 c0x0000 (---------------) + I e164 + 0x00226007, // n0x0689 c0x0000 (---------------) + I in-addr + 0x00216fc3, // n0x068a c0x0000 (---------------) + I ip6 + 0x00291084, // n0x068b c0x0000 (---------------) + I iris + 0x002016c3, // n0x068c c0x0000 (---------------) + I uri + 0x002018c3, // n0x068d c0x0000 (---------------) + I urn + 0x00275003, // n0x068e c0x0000 (---------------) + I gov + 0x00205882, // n0x068f c0x0000 (---------------) + I ac + 0x0010a143, // n0x0690 c0x0000 (---------------) + biz + 0x05a08182, // n0x0691 c0x0016 (n0x0696-n0x0697) + I co + 0x00233002, // n0x0692 c0x0000 (---------------) + I gv + 0x0018a144, // n0x0693 c0x0000 (---------------) + info + 0x00200282, // n0x0694 c0x0000 (---------------) + I or + 0x000db244, // n0x0695 c0x0000 (---------------) + priv + 0x000f5248, // n0x0696 c0x0000 (---------------) + blogspot + 0x00233383, // n0x0697 c0x0000 (---------------) + I act + 0x0022d9c3, // n0x0698 c0x0000 (---------------) + I asn + 0x0622edc3, // n0x0699 c0x0018 (n0x06a9-n0x06aa) + I com + 0x00231fc4, // n0x069a c0x0000 (---------------) + I conf + 0x066349c3, // n0x069b c0x0019 (n0x06aa-n0x06b2) + I edu + 0x06a75003, // n0x069c c0x001a (n0x06b2-n0x06b7) + I gov + 0x00205d82, // n0x069d c0x0000 (---------------) + I id + 0x0038a144, // n0x069e c0x0000 (---------------) + I info + 0x0021d8c3, // n0x069f c0x0000 (---------------) + I net + 0x002e4fc3, // n0x06a0 c0x0000 (---------------) + I nsw + 0x00202382, // n0x06a1 c0x0000 (---------------) + I nt + 0x00229a83, // n0x06a2 c0x0000 (---------------) + I org + 0x0021a842, // n0x06a3 c0x0000 (---------------) + I oz + 0x002df383, // n0x06a4 c0x0000 (---------------) + I qld + 0x00202402, // n0x06a5 c0x0000 (---------------) + I sa + 0x00201fc3, // n0x06a6 c0x0000 (---------------) + I tas + 0x00206a83, // n0x06a7 c0x0000 (---------------) + I vic + 0x002010c2, // n0x06a8 c0x0000 (---------------) + I wa + 0x000f5248, // n0x06a9 c0x0000 (---------------) + blogspot + 0x00233383, // n0x06aa c0x0000 (---------------) + I act + 0x002e4fc3, // n0x06ab c0x0000 (---------------) + I nsw + 0x00202382, // n0x06ac c0x0000 (---------------) + I nt + 0x002df383, // n0x06ad c0x0000 (---------------) + I qld + 0x00202402, // n0x06ae c0x0000 (---------------) + I sa + 0x00201fc3, // n0x06af c0x0000 (---------------) + I tas + 0x00206a83, // n0x06b0 c0x0000 (---------------) + I vic + 0x002010c2, // n0x06b1 c0x0000 (---------------) + I wa + 0x002df383, // n0x06b2 c0x0000 (---------------) + I qld + 0x00202402, // n0x06b3 c0x0000 (---------------) + I sa + 0x00201fc3, // n0x06b4 c0x0000 (---------------) + I tas + 0x00206a83, // n0x06b5 c0x0000 (---------------) + I vic + 0x002010c2, // n0x06b6 c0x0000 (---------------) + I wa + 0x0022edc3, // n0x06b7 c0x0000 (---------------) + I com + 0x0030a143, // n0x06b8 c0x0000 (---------------) + I biz + 0x0022edc3, // n0x06b9 c0x0000 (---------------) + I com + 0x002349c3, // n0x06ba c0x0000 (---------------) + I edu + 0x00275003, // n0x06bb c0x0000 (---------------) + I gov + 0x0038a144, // n0x06bc c0x0000 (---------------) + I info + 0x0026f683, // n0x06bd c0x0000 (---------------) + I int + 0x00215b43, // n0x06be c0x0000 (---------------) + I mil + 0x0027ca84, // n0x06bf c0x0000 (---------------) + I name + 0x0021d8c3, // n0x06c0 c0x0000 (---------------) + I net + 0x00229a83, // n0x06c1 c0x0000 (---------------) + I org + 0x002099c2, // n0x06c2 c0x0000 (---------------) + I pp + 0x00220283, // n0x06c3 c0x0000 (---------------) + I pro + 0x000f5248, // n0x06c4 c0x0000 (---------------) + blogspot + 0x00208182, // n0x06c5 c0x0000 (---------------) + I co + 0x0022edc3, // n0x06c6 c0x0000 (---------------) + I com + 0x002349c3, // n0x06c7 c0x0000 (---------------) + I edu + 0x00275003, // n0x06c8 c0x0000 (---------------) + I gov + 0x00215b43, // n0x06c9 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x06ca c0x0000 (---------------) + I net + 0x00229a83, // n0x06cb c0x0000 (---------------) + I org + 0x0020a642, // n0x06cc c0x0000 (---------------) + I rs + 0x00272344, // n0x06cd c0x0000 (---------------) + I unbi + 0x00362b04, // n0x06ce c0x0000 (---------------) + I unsa + 0x0030a143, // n0x06cf c0x0000 (---------------) + I biz + 0x00208182, // n0x06d0 c0x0000 (---------------) + I co + 0x0022edc3, // n0x06d1 c0x0000 (---------------) + I com + 0x002349c3, // n0x06d2 c0x0000 (---------------) + I edu + 0x00275003, // n0x06d3 c0x0000 (---------------) + I gov + 0x0038a144, // n0x06d4 c0x0000 (---------------) + I info + 0x0021d8c3, // n0x06d5 c0x0000 (---------------) + I net + 0x00229a83, // n0x06d6 c0x0000 (---------------) + I org + 0x0038c985, // n0x06d7 c0x0000 (---------------) + I store + 0x00206fc2, // n0x06d8 c0x0000 (---------------) + I tv + 0x00205882, // n0x06d9 c0x0000 (---------------) + I ac + 0x000f5248, // n0x06da c0x0000 (---------------) + blogspot + 0x00275003, // n0x06db c0x0000 (---------------) + I gov + 0x00226981, // n0x06dc c0x0000 (---------------) + I 0 + 0x00226901, // n0x06dd c0x0000 (---------------) + I 1 + 0x00226941, // n0x06de c0x0000 (---------------) + I 2 + 0x0024bb41, // n0x06df c0x0000 (---------------) + I 3 + 0x00256c81, // n0x06e0 c0x0000 (---------------) + I 4 + 0x0026bdc1, // n0x06e1 c0x0000 (---------------) + I 5 + 0x00217041, // n0x06e2 c0x0000 (---------------) + I 6 + 0x002397c1, // n0x06e3 c0x0000 (---------------) + I 7 + 0x002e7641, // n0x06e4 c0x0000 (---------------) + I 8 + 0x002f8541, // n0x06e5 c0x0000 (---------------) + I 9 + 0x00200101, // n0x06e6 c0x0000 (---------------) + I a + 0x00200001, // n0x06e7 c0x0000 (---------------) + I b + 0x000f5248, // n0x06e8 c0x0000 (---------------) + blogspot + 0x00200301, // n0x06e9 c0x0000 (---------------) + I c + 0x00200401, // n0x06ea c0x0000 (---------------) + I d + 0x00200081, // n0x06eb c0x0000 (---------------) + I e + 0x00200381, // n0x06ec c0x0000 (---------------) + I f + 0x002006c1, // n0x06ed c0x0000 (---------------) + I g + 0x00200a41, // n0x06ee c0x0000 (---------------) + I h + 0x00200041, // n0x06ef c0x0000 (---------------) + I i + 0x00201841, // n0x06f0 c0x0000 (---------------) + I j + 0x00200a01, // n0x06f1 c0x0000 (---------------) + I k + 0x00200201, // n0x06f2 c0x0000 (---------------) + I l + 0x00200181, // n0x06f3 c0x0000 (---------------) + I m + 0x002005c1, // n0x06f4 c0x0000 (---------------) + I n + 0x00200281, // n0x06f5 c0x0000 (---------------) + I o + 0x00200c41, // n0x06f6 c0x0000 (---------------) + I p + 0x00204901, // n0x06f7 c0x0000 (---------------) + I q + 0x002002c1, // n0x06f8 c0x0000 (---------------) + I r + 0x00201a41, // n0x06f9 c0x0000 (---------------) + I s + 0x00200141, // n0x06fa c0x0000 (---------------) + I t + 0x002008c1, // n0x06fb c0x0000 (---------------) + I u + 0x002000c1, // n0x06fc c0x0000 (---------------) + I v + 0x002010c1, // n0x06fd c0x0000 (---------------) + I w + 0x0020d041, // n0x06fe c0x0000 (---------------) + I x + 0x00201341, // n0x06ff c0x0000 (---------------) + I y + 0x00202881, // n0x0700 c0x0000 (---------------) + I z + 0x0022edc3, // n0x0701 c0x0000 (---------------) + I com + 0x002349c3, // n0x0702 c0x0000 (---------------) + I edu + 0x00275003, // n0x0703 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x0704 c0x0000 (---------------) + I net + 0x00229a83, // n0x0705 c0x0000 (---------------) + I org + 0x00208182, // n0x0706 c0x0000 (---------------) + I co + 0x0022edc3, // n0x0707 c0x0000 (---------------) + I com + 0x002349c3, // n0x0708 c0x0000 (---------------) + I edu + 0x00200282, // n0x0709 c0x0000 (---------------) + I or + 0x00229a83, // n0x070a c0x0000 (---------------) + I org + 0x00011a06, // n0x070b c0x0000 (---------------) + dyndns + 0x0004e08a, // n0x070c c0x0000 (---------------) + for-better + 0x00081088, // n0x070d c0x0000 (---------------) + for-more + 0x0004e688, // n0x070e c0x0000 (---------------) + for-some + 0x0004efc7, // n0x070f c0x0000 (---------------) + for-the + 0x00053986, // n0x0710 c0x0000 (---------------) + selfip + 0x00123b06, // n0x0711 c0x0000 (---------------) + webhop + 0x002b1c44, // n0x0712 c0x0000 (---------------) + I asso + 0x00319407, // n0x0713 c0x0000 (---------------) + I barreau + 0x000f5248, // n0x0714 c0x0000 (---------------) + blogspot + 0x002fa744, // n0x0715 c0x0000 (---------------) + I gouv + 0x0022edc3, // n0x0716 c0x0000 (---------------) + I com + 0x002349c3, // n0x0717 c0x0000 (---------------) + I edu + 0x00275003, // n0x0718 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x0719 c0x0000 (---------------) + I net + 0x00229a83, // n0x071a c0x0000 (---------------) + I org + 0x0022edc3, // n0x071b c0x0000 (---------------) + I com + 0x002349c3, // n0x071c c0x0000 (---------------) + I edu + 0x00209f03, // n0x071d c0x0000 (---------------) + I gob + 0x00275003, // n0x071e c0x0000 (---------------) + I gov + 0x0026f683, // n0x071f c0x0000 (---------------) + I int + 0x00215b43, // n0x0720 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x0721 c0x0000 (---------------) + I net + 0x00229a83, // n0x0722 c0x0000 (---------------) + I org + 0x00206fc2, // n0x0723 c0x0000 (---------------) + I tv + 0x002c0603, // n0x0724 c0x0000 (---------------) + I adm + 0x002288c3, // n0x0725 c0x0000 (---------------) + I adv + 0x00250603, // n0x0726 c0x0000 (---------------) + I agr + 0x00201382, // n0x0727 c0x0000 (---------------) + I am + 0x00248c03, // n0x0728 c0x0000 (---------------) + I arq + 0x002011c3, // n0x0729 c0x0000 (---------------) + I art + 0x00207403, // n0x072a c0x0000 (---------------) + I ato + 0x00200001, // n0x072b c0x0000 (---------------) + I b + 0x00203a43, // n0x072c c0x0000 (---------------) + I bio + 0x00229004, // n0x072d c0x0000 (---------------) + I blog + 0x00264143, // n0x072e c0x0000 (---------------) + I bmd + 0x00307603, // n0x072f c0x0000 (---------------) + I cim + 0x0021a143, // n0x0730 c0x0000 (---------------) + I cng + 0x0022cc03, // n0x0731 c0x0000 (---------------) + I cnt + 0x0a62edc3, // n0x0732 c0x0029 (n0x076a-n0x076b) + I com + 0x00238284, // n0x0733 c0x0000 (---------------) + I coop + 0x0021a103, // n0x0734 c0x0000 (---------------) + I ecn + 0x00230383, // n0x0735 c0x0000 (---------------) + I eco + 0x002349c3, // n0x0736 c0x0000 (---------------) + I edu + 0x00234703, // n0x0737 c0x0000 (---------------) + I emp + 0x0027bd03, // n0x0738 c0x0000 (---------------) + I eng + 0x00293383, // n0x0739 c0x0000 (---------------) + I esp + 0x00307583, // n0x073a c0x0000 (---------------) + I etc + 0x00222703, // n0x073b c0x0000 (---------------) + I eti + 0x00210003, // n0x073c c0x0000 (---------------) + I far + 0x0024a844, // n0x073d c0x0000 (---------------) + I flog + 0x0023d4c2, // n0x073e c0x0000 (---------------) + I fm + 0x0024da03, // n0x073f c0x0000 (---------------) + I fnd + 0x00254a83, // n0x0740 c0x0000 (---------------) + I fot + 0x0026f8c3, // n0x0741 c0x0000 (---------------) + I fst + 0x002268c3, // n0x0742 c0x0000 (---------------) + I g12 + 0x00302a03, // n0x0743 c0x0000 (---------------) + I ggf + 0x00275003, // n0x0744 c0x0000 (---------------) + I gov + 0x002c15c3, // n0x0745 c0x0000 (---------------) + I imb + 0x00202603, // n0x0746 c0x0000 (---------------) + I ind + 0x00389f83, // n0x0747 c0x0000 (---------------) + I inf + 0x00201ac3, // n0x0748 c0x0000 (---------------) + I jor + 0x002e8403, // n0x0749 c0x0000 (---------------) + I jus + 0x00247b83, // n0x074a c0x0000 (---------------) + I leg + 0x002b9403, // n0x074b c0x0000 (---------------) + I lel + 0x0021ed03, // n0x074c c0x0000 (---------------) + I mat + 0x00211c43, // n0x074d c0x0000 (---------------) + I med + 0x00215b43, // n0x074e c0x0000 (---------------) + I mil + 0x00226dc2, // n0x074f c0x0000 (---------------) + I mp + 0x00270383, // n0x0750 c0x0000 (---------------) + I mus + 0x0021d8c3, // n0x0751 c0x0000 (---------------) + I net + 0x0160e543, // n0x0752 c0x0005 (---------------)* o I nom + 0x00246403, // n0x0753 c0x0000 (---------------) + I not + 0x0022bb43, // n0x0754 c0x0000 (---------------) + I ntr + 0x00206e03, // n0x0755 c0x0000 (---------------) + I odo + 0x00229a83, // n0x0756 c0x0000 (---------------) + I org + 0x00308843, // n0x0757 c0x0000 (---------------) + I ppg + 0x00220283, // n0x0758 c0x0000 (---------------) + I pro + 0x00231cc3, // n0x0759 c0x0000 (---------------) + I psc + 0x002ec783, // n0x075a c0x0000 (---------------) + I psi + 0x002df543, // n0x075b c0x0000 (---------------) + I qsl + 0x0025e6c5, // n0x075c c0x0000 (---------------) + I radio + 0x00226f03, // n0x075d c0x0000 (---------------) + I rec + 0x002df583, // n0x075e c0x0000 (---------------) + I slg + 0x00356083, // n0x075f c0x0000 (---------------) + I srv + 0x0020cfc4, // n0x0760 c0x0000 (---------------) + I taxi + 0x00337f43, // n0x0761 c0x0000 (---------------) + I teo + 0x00233403, // n0x0762 c0x0000 (---------------) + I tmp + 0x0029fc03, // n0x0763 c0x0000 (---------------) + I trd + 0x00236183, // n0x0764 c0x0000 (---------------) + I tur + 0x00206fc2, // n0x0765 c0x0000 (---------------) + I tv + 0x0023b383, // n0x0766 c0x0000 (---------------) + I vet + 0x002f1744, // n0x0767 c0x0000 (---------------) + I vlog + 0x0032fd04, // n0x0768 c0x0000 (---------------) + I wiki + 0x00240f03, // n0x0769 c0x0000 (---------------) + I zlg + 0x000f5248, // n0x076a c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x076b c0x0000 (---------------) + I com + 0x002349c3, // n0x076c c0x0000 (---------------) + I edu + 0x00275003, // n0x076d c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x076e c0x0000 (---------------) + I net + 0x00229a83, // n0x076f c0x0000 (---------------) + I org + 0x0022edc3, // n0x0770 c0x0000 (---------------) + I com + 0x002349c3, // n0x0771 c0x0000 (---------------) + I edu + 0x00275003, // n0x0772 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x0773 c0x0000 (---------------) + I net + 0x00229a83, // n0x0774 c0x0000 (---------------) + I org + 0x00208182, // n0x0775 c0x0000 (---------------) + I co + 0x00229a83, // n0x0776 c0x0000 (---------------) + I org + 0x0ba2edc3, // n0x0777 c0x002e (n0x077b-n0x077c) + I com + 0x00275003, // n0x0778 c0x0000 (---------------) + I gov + 0x00215b43, // n0x0779 c0x0000 (---------------) + I mil + 0x0021f702, // n0x077a c0x0000 (---------------) + I of + 0x000f5248, // n0x077b c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x077c c0x0000 (---------------) + I com + 0x002349c3, // n0x077d c0x0000 (---------------) + I edu + 0x00275003, // n0x077e c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x077f c0x0000 (---------------) + I net + 0x00229a83, // n0x0780 c0x0000 (---------------) + I org + 0x00009ac2, // n0x0781 c0x0000 (---------------) + za + 0x00200e82, // n0x0782 c0x0000 (---------------) + I ab + 0x0021fb02, // n0x0783 c0x0000 (---------------) + I bc + 0x000f5248, // n0x0784 c0x0000 (---------------) + blogspot + 0x00008182, // n0x0785 c0x0000 (---------------) + co + 0x00236c82, // n0x0786 c0x0000 (---------------) + I gc + 0x00205482, // n0x0787 c0x0000 (---------------) + I mb + 0x002263c2, // n0x0788 c0x0000 (---------------) + I nb + 0x002037c2, // n0x0789 c0x0000 (---------------) + I nf + 0x0023e082, // n0x078a c0x0000 (---------------) + I nl + 0x00208402, // n0x078b c0x0000 (---------------) + I ns + 0x00202382, // n0x078c c0x0000 (---------------) + I nt + 0x00209702, // n0x078d c0x0000 (---------------) + I nu + 0x00200582, // n0x078e c0x0000 (---------------) + I on + 0x00209a02, // n0x078f c0x0000 (---------------) + I pe + 0x00376f42, // n0x0790 c0x0000 (---------------) + I qc + 0x0020e342, // n0x0791 c0x0000 (---------------) + I sk + 0x0022a702, // n0x0792 c0x0000 (---------------) + I yk + 0x000ad709, // n0x0793 c0x0000 (---------------) + ftpaccess + 0x001706cb, // n0x0794 c0x0000 (---------------) + game-server + 0x000cd108, // n0x0795 c0x0000 (---------------) + myphotos + 0x00044749, // n0x0796 c0x0000 (---------------) + scrapping + 0x00275003, // n0x0797 c0x0000 (---------------) + I gov + 0x000f5248, // n0x0798 c0x0000 (---------------) + blogspot + 0x000f5248, // n0x0799 c0x0000 (---------------) + blogspot + 0x00205882, // n0x079a c0x0000 (---------------) + I ac + 0x002b1c44, // n0x079b c0x0000 (---------------) + I asso + 0x00208182, // n0x079c c0x0000 (---------------) + I co + 0x0022edc3, // n0x079d c0x0000 (---------------) + I com + 0x002003c2, // n0x079e c0x0000 (---------------) + I ed + 0x002349c3, // n0x079f c0x0000 (---------------) + I edu + 0x00208502, // n0x07a0 c0x0000 (---------------) + I go + 0x002fa744, // n0x07a1 c0x0000 (---------------) + I gouv + 0x0026f683, // n0x07a2 c0x0000 (---------------) + I int + 0x00247ac2, // n0x07a3 c0x0000 (---------------) + I md + 0x0021d8c3, // n0x07a4 c0x0000 (---------------) + I net + 0x00200282, // n0x07a5 c0x0000 (---------------) + I or + 0x00229a83, // n0x07a6 c0x0000 (---------------) + I org + 0x00240d06, // n0x07a7 c0x0000 (---------------) + I presse + 0x0030cf0f, // n0x07a8 c0x0000 (---------------) + I xn--aroport-bya + 0x006f7083, // n0x07a9 c0x0001 (---------------) ! I www + 0x000f5248, // n0x07aa c0x0000 (---------------) + blogspot + 0x00208182, // n0x07ab c0x0000 (---------------) + I co + 0x00209f03, // n0x07ac c0x0000 (---------------) + I gob + 0x00275003, // n0x07ad c0x0000 (---------------) + I gov + 0x00215b43, // n0x07ae c0x0000 (---------------) + I mil + 0x00208182, // n0x07af c0x0000 (---------------) + I co + 0x0022edc3, // n0x07b0 c0x0000 (---------------) + I com + 0x00275003, // n0x07b1 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x07b2 c0x0000 (---------------) + I net + 0x00205882, // n0x07b3 c0x0000 (---------------) + I ac + 0x00207142, // n0x07b4 c0x0000 (---------------) + I ah + 0x0eaeb489, // n0x07b5 c0x003a (n0x07e0-n0x07e1) o I amazonaws + 0x002066c2, // n0x07b6 c0x0000 (---------------) + I bj + 0x0f22edc3, // n0x07b7 c0x003c (n0x07e2-n0x07e3) + I com + 0x0023d842, // n0x07b8 c0x0000 (---------------) + I cq + 0x002349c3, // n0x07b9 c0x0000 (---------------) + I edu + 0x0022f3c2, // n0x07ba c0x0000 (---------------) + I fj + 0x00221f82, // n0x07bb c0x0000 (---------------) + I gd + 0x00275003, // n0x07bc c0x0000 (---------------) + I gov + 0x002242c2, // n0x07bd c0x0000 (---------------) + I gs + 0x0024b8c2, // n0x07be c0x0000 (---------------) + I gx + 0x00252202, // n0x07bf c0x0000 (---------------) + I gz + 0x00201c82, // n0x07c0 c0x0000 (---------------) + I ha + 0x00288842, // n0x07c1 c0x0000 (---------------) + I hb + 0x00205a02, // n0x07c2 c0x0000 (---------------) + I he + 0x00202082, // n0x07c3 c0x0000 (---------------) + I hi + 0x0020e882, // n0x07c4 c0x0000 (---------------) + I hk + 0x002a9982, // n0x07c5 c0x0000 (---------------) + I hl + 0x00218902, // n0x07c6 c0x0000 (---------------) + I hn + 0x002a49c2, // n0x07c7 c0x0000 (---------------) + I jl + 0x0023cbc2, // n0x07c8 c0x0000 (---------------) + I js + 0x00313282, // n0x07c9 c0x0000 (---------------) + I jx + 0x00218f42, // n0x07ca c0x0000 (---------------) + I ln + 0x00215b43, // n0x07cb c0x0000 (---------------) + I mil + 0x00203ec2, // n0x07cc c0x0000 (---------------) + I mo + 0x0021d8c3, // n0x07cd c0x0000 (---------------) + I net + 0x0022dc02, // n0x07ce c0x0000 (---------------) + I nm + 0x00269a82, // n0x07cf c0x0000 (---------------) + I nx + 0x00229a83, // n0x07d0 c0x0000 (---------------) + I org + 0x00248c82, // n0x07d1 c0x0000 (---------------) + I qh + 0x002024c2, // n0x07d2 c0x0000 (---------------) + I sc + 0x00256ec2, // n0x07d3 c0x0000 (---------------) + I sd + 0x00201c42, // n0x07d4 c0x0000 (---------------) + I sh + 0x00212a42, // n0x07d5 c0x0000 (---------------) + I sn + 0x002e7402, // n0x07d6 c0x0000 (---------------) + I sx + 0x00201a82, // n0x07d7 c0x0000 (---------------) + I tj + 0x00241cc2, // n0x07d8 c0x0000 (---------------) + I tw + 0x002753c2, // n0x07d9 c0x0000 (---------------) + I xj + 0x002fac8a, // n0x07da c0x0000 (---------------) + I xn--55qx5d + 0x00340a0a, // n0x07db c0x0000 (---------------) + I xn--io0a7i + 0x00372e8a, // n0x07dc c0x0000 (---------------) + I xn--od0alg + 0x003a3c02, // n0x07dd c0x0000 (---------------) + I xz + 0x0020a442, // n0x07de c0x0000 (---------------) + I yn + 0x0023df82, // n0x07df c0x0000 (---------------) + I zj + 0x0ec303c7, // n0x07e0 c0x003b (n0x07e1-n0x07e2) + compute + 0x0015bb8a, // n0x07e1 c0x0000 (---------------) + cn-north-1 + 0x0f6eb489, // n0x07e2 c0x003d (n0x07e3-n0x07e4) o I amazonaws + 0x0fb5bb8a, // n0x07e3 c0x003e (n0x07e4-n0x07e5) o I cn-north-1 + 0x0004d702, // n0x07e4 c0x0000 (---------------) + s3 + 0x00243984, // n0x07e5 c0x0000 (---------------) + I arts + 0x1022edc3, // n0x07e6 c0x0040 (n0x07f2-n0x07f3) + I com + 0x002349c3, // n0x07e7 c0x0000 (---------------) + I edu + 0x00247a04, // n0x07e8 c0x0000 (---------------) + I firm + 0x00275003, // n0x07e9 c0x0000 (---------------) + I gov + 0x0038a144, // n0x07ea c0x0000 (---------------) + I info + 0x0026f683, // n0x07eb c0x0000 (---------------) + I int + 0x00215b43, // n0x07ec c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x07ed c0x0000 (---------------) + I net + 0x0020e543, // n0x07ee c0x0000 (---------------) + I nom + 0x00229a83, // n0x07ef c0x0000 (---------------) + I org + 0x00226f03, // n0x07f0 c0x0000 (---------------) + I rec + 0x0021fa83, // n0x07f1 c0x0000 (---------------) + I web + 0x000f5248, // n0x07f2 c0x0000 (---------------) + blogspot + 0x000bd9c5, // n0x07f3 c0x0000 (---------------) + 1kapp + 0x00104e02, // n0x07f4 c0x0000 (---------------) + 4u + 0x0016af06, // n0x07f5 c0x0000 (---------------) + africa + 0x10aeb489, // n0x07f6 c0x0042 (n0x08bf-n0x08d1) o I amazonaws + 0x00045a87, // n0x07f7 c0x0000 (---------------) + appspot + 0x000011c2, // n0x07f8 c0x0000 (---------------) + ar + 0x00194f0a, // n0x07f9 c0x0000 (---------------) + betainabox + 0x00029007, // n0x07fa c0x0000 (---------------) + blogdns + 0x000f5248, // n0x07fb c0x0000 (---------------) + blogspot + 0x0000bb42, // n0x07fc c0x0000 (---------------) + br + 0x0013dd87, // n0x07fd c0x0000 (---------------) + cechire + 0x0010944f, // n0x07fe c0x0000 (---------------) + cloudcontrolapp + 0x0002b98f, // n0x07ff c0x0000 (---------------) + cloudcontrolled + 0x0001a142, // n0x0800 c0x0000 (---------------) + cn + 0x00008182, // n0x0801 c0x0000 (---------------) + co + 0x000932c8, // n0x0802 c0x0000 (---------------) + codespot + 0x00000402, // n0x0803 c0x0000 (---------------) + de + 0x00147e08, // n0x0804 c0x0000 (---------------) + dnsalias + 0x00074607, // n0x0805 c0x0000 (---------------) + dnsdojo + 0x000ebecb, // n0x0806 c0x0000 (---------------) + doesntexist + 0x00168789, // n0x0807 c0x0000 (---------------) + dontexist + 0x00147d07, // n0x0808 c0x0000 (---------------) + doomdns + 0x000e908c, // n0x0809 c0x0000 (---------------) + dreamhosters + 0x0012088a, // n0x080a c0x0000 (---------------) + dyn-o-saur + 0x0018bd88, // n0x080b c0x0000 (---------------) + dynalias + 0x0006c4ce, // n0x080c c0x0000 (---------------) + dyndns-at-home + 0x000d54ce, // n0x080d c0x0000 (---------------) + dyndns-at-work + 0x00028e4b, // n0x080e c0x0000 (---------------) + dyndns-blog + 0x000e0acb, // n0x080f c0x0000 (---------------) + dyndns-free + 0x00011a0b, // n0x0810 c0x0000 (---------------) + dyndns-home + 0x00016e09, // n0x0811 c0x0000 (---------------) + dyndns-ip + 0x0001a44b, // n0x0812 c0x0000 (---------------) + dyndns-mail + 0x0001f54d, // n0x0813 c0x0000 (---------------) + dyndns-office + 0x0002090b, // n0x0814 c0x0000 (---------------) + dyndns-pics + 0x0002a14d, // n0x0815 c0x0000 (---------------) + dyndns-remote + 0x0002ad8d, // n0x0816 c0x0000 (---------------) + dyndns-server + 0x00151bca, // n0x0817 c0x0000 (---------------) + dyndns-web + 0x0012fb4b, // n0x0818 c0x0000 (---------------) + dyndns-wiki + 0x0013298b, // n0x0819 c0x0000 (---------------) + dyndns-work + 0x0003a850, // n0x081a c0x0000 (---------------) + elasticbeanstalk + 0x0000498f, // n0x081b c0x0000 (---------------) + est-a-la-maison + 0x000ce98f, // n0x081c c0x0000 (---------------) + est-a-la-masion + 0x0003404d, // n0x081d c0x0000 (---------------) + est-le-patron + 0x0007dbd0, // n0x081e c0x0000 (---------------) + est-mon-blogueur + 0x00024542, // n0x081f c0x0000 (---------------) + eu + 0x0004588b, // n0x0820 c0x0000 (---------------) + firebaseapp + 0x0004c788, // n0x0821 c0x0000 (---------------) + flynnhub + 0x0005afc7, // n0x0822 c0x0000 (---------------) + from-ak + 0x0005b307, // n0x0823 c0x0000 (---------------) + from-al + 0x0005b4c7, // n0x0824 c0x0000 (---------------) + from-ar + 0x0005ba47, // n0x0825 c0x0000 (---------------) + from-ca + 0x0005dbc7, // n0x0826 c0x0000 (---------------) + from-ct + 0x0005e287, // n0x0827 c0x0000 (---------------) + from-dc + 0x0005f3c7, // n0x0828 c0x0000 (---------------) + from-de + 0x0005f907, // n0x0829 c0x0000 (---------------) + from-fl + 0x0005ff47, // n0x082a c0x0000 (---------------) + from-ga + 0x000602c7, // n0x082b c0x0000 (---------------) + from-hi + 0x00060d07, // n0x082c c0x0000 (---------------) + from-ia + 0x00060ec7, // n0x082d c0x0000 (---------------) + from-id + 0x00061087, // n0x082e c0x0000 (---------------) + from-il + 0x00061247, // n0x082f c0x0000 (---------------) + from-in + 0x00061547, // n0x0830 c0x0000 (---------------) + from-ks + 0x00061b87, // n0x0831 c0x0000 (---------------) + from-ky + 0x000623c7, // n0x0832 c0x0000 (---------------) + from-ma + 0x00062a87, // n0x0833 c0x0000 (---------------) + from-md + 0x00063387, // n0x0834 c0x0000 (---------------) + from-mi + 0x00064ac7, // n0x0835 c0x0000 (---------------) + from-mn + 0x00064c87, // n0x0836 c0x0000 (---------------) + from-mo + 0x00064f87, // n0x0837 c0x0000 (---------------) + from-ms + 0x000656c7, // n0x0838 c0x0000 (---------------) + from-mt + 0x000658c7, // n0x0839 c0x0000 (---------------) + from-nc + 0x00066087, // n0x083a c0x0000 (---------------) + from-nd + 0x00066247, // n0x083b c0x0000 (---------------) + from-ne + 0x00066647, // n0x083c c0x0000 (---------------) + from-nh + 0x000669c7, // n0x083d c0x0000 (---------------) + from-nj + 0x00066f87, // n0x083e c0x0000 (---------------) + from-nm + 0x00067747, // n0x083f c0x0000 (---------------) + from-nv + 0x00068bc7, // n0x0840 c0x0000 (---------------) + from-oh + 0x00068e87, // n0x0841 c0x0000 (---------------) + from-ok + 0x00069207, // n0x0842 c0x0000 (---------------) + from-or + 0x000693c7, // n0x0843 c0x0000 (---------------) + from-pa + 0x00069747, // n0x0844 c0x0000 (---------------) + from-pr + 0x00069d87, // n0x0845 c0x0000 (---------------) + from-ri + 0x0006ac87, // n0x0846 c0x0000 (---------------) + from-sc + 0x0006b087, // n0x0847 c0x0000 (---------------) + from-sd + 0x0006b847, // n0x0848 c0x0000 (---------------) + from-tn + 0x0006ba07, // n0x0849 c0x0000 (---------------) + from-tx + 0x0006be47, // n0x084a c0x0000 (---------------) + from-ut + 0x0006ce47, // n0x084b c0x0000 (---------------) + from-va + 0x0006d487, // n0x084c c0x0000 (---------------) + from-vt + 0x0006de87, // n0x084d c0x0000 (---------------) + from-wa + 0x0006e047, // n0x084e c0x0000 (---------------) + from-wi + 0x0006e3c7, // n0x084f c0x0000 (---------------) + from-wv + 0x0006e947, // n0x0850 c0x0000 (---------------) + from-wy + 0x00009582, // n0x0851 c0x0000 (---------------) + gb + 0x000d0707, // n0x0852 c0x0000 (---------------) + getmyip + 0x000c8391, // n0x0853 c0x0000 (---------------) + githubusercontent + 0x000d8b0a, // n0x0854 c0x0000 (---------------) + googleapis + 0x0009314a, // n0x0855 c0x0000 (---------------) + googlecode + 0x0004f886, // n0x0856 c0x0000 (---------------) + gotdns + 0x0001450b, // n0x0857 c0x0000 (---------------) + gotpantheon + 0x000089c2, // n0x0858 c0x0000 (---------------) + gr + 0x0017ea89, // n0x0859 c0x0000 (---------------) + herokuapp + 0x000896c9, // n0x085a c0x0000 (---------------) + herokussl + 0x0000e882, // n0x085b c0x0000 (---------------) + hk + 0x000fef8a, // n0x085c c0x0000 (---------------) + hobby-site + 0x0009c509, // n0x085d c0x0000 (---------------) + homelinux + 0x0009d988, // n0x085e c0x0000 (---------------) + homeunix + 0x0000d0c2, // n0x085f c0x0000 (---------------) + hu + 0x00106c49, // n0x0860 c0x0000 (---------------) + iamallama + 0x0015c40e, // n0x0861 c0x0000 (---------------) + is-a-anarchist + 0x0009894c, // n0x0862 c0x0000 (---------------) + is-a-blogger + 0x000cee0f, // n0x0863 c0x0000 (---------------) + is-a-bookkeeper + 0x0018758e, // n0x0864 c0x0000 (---------------) + is-a-bulls-fan + 0x0000c24c, // n0x0865 c0x0000 (---------------) + is-a-caterer + 0x0000fe09, // n0x0866 c0x0000 (---------------) + is-a-chef + 0x000125d1, // n0x0867 c0x0000 (---------------) + is-a-conservative + 0x00013a48, // n0x0868 c0x0000 (---------------) + is-a-cpa + 0x00017752, // n0x0869 c0x0000 (---------------) + is-a-cubicle-slave + 0x0001844d, // n0x086a c0x0000 (---------------) + is-a-democrat + 0x00022d8d, // n0x086b c0x0000 (---------------) + is-a-designer + 0x000236cb, // n0x086c c0x0000 (---------------) + is-a-doctor + 0x00028555, // n0x086d c0x0000 (---------------) + is-a-financialadvisor + 0x0005f049, // n0x086e c0x0000 (---------------) + is-a-geek + 0x0016ba0a, // n0x086f c0x0000 (---------------) + is-a-green + 0x00130509, // n0x0870 c0x0000 (---------------) + is-a-guru + 0x00042150, // n0x0871 c0x0000 (---------------) + is-a-hard-worker + 0x0004884b, // n0x0872 c0x0000 (---------------) + is-a-hunter + 0x00054ccf, // n0x0873 c0x0000 (---------------) + is-a-landscaper + 0x0005d4cb, // n0x0874 c0x0000 (---------------) + is-a-lawyer + 0x000653cc, // n0x0875 c0x0000 (---------------) + is-a-liberal + 0x00067350, // n0x0876 c0x0000 (---------------) + is-a-libertarian + 0x0006ca4a, // n0x0877 c0x0000 (---------------) + is-a-llama + 0x0007024d, // n0x0878 c0x0000 (---------------) + is-a-musician + 0x0007198e, // n0x0879 c0x0000 (---------------) + is-a-nascarfan + 0x0007570a, // n0x087a c0x0000 (---------------) + is-a-nurse + 0x00081dcc, // n0x087b c0x0000 (---------------) + is-a-painter + 0x00137194, // n0x087c c0x0000 (---------------) + is-a-personaltrainer + 0x0017e711, // n0x087d c0x0000 (---------------) + is-a-photographer + 0x0008bc4b, // n0x087e c0x0000 (---------------) + is-a-player + 0x0008fd8f, // n0x087f c0x0000 (---------------) + is-a-republican + 0x00095dcd, // n0x0880 c0x0000 (---------------) + is-a-rockstar + 0x000982ce, // n0x0881 c0x0000 (---------------) + is-a-socialist + 0x000a300c, // n0x0882 c0x0000 (---------------) + is-a-student + 0x000a374c, // n0x0883 c0x0000 (---------------) + is-a-teacher + 0x000edf8b, // n0x0884 c0x0000 (---------------) + is-a-techie + 0x000ee28e, // n0x0885 c0x0000 (---------------) + is-a-therapist + 0x000ed890, // n0x0886 c0x0000 (---------------) + is-an-accountant + 0x00156b4b, // n0x0887 c0x0000 (---------------) + is-an-actor + 0x000ed38d, // n0x0888 c0x0000 (---------------) + is-an-actress + 0x000d5f4f, // n0x0889 c0x0000 (---------------) + is-an-anarchist + 0x0015634c, // n0x088a c0x0000 (---------------) + is-an-artist + 0x00129f8e, // n0x088b c0x0000 (---------------) + is-an-engineer + 0x00168c91, // n0x088c c0x0000 (---------------) + is-an-entertainer + 0x000aed4c, // n0x088d c0x0000 (---------------) + is-certified + 0x000b3d47, // n0x088e c0x0000 (---------------) + is-gone + 0x000b488d, // n0x088f c0x0000 (---------------) + is-into-anime + 0x000b608c, // n0x0890 c0x0000 (---------------) + is-into-cars + 0x000d3e10, // n0x0891 c0x0000 (---------------) + is-into-cartoons + 0x00118acd, // n0x0892 c0x0000 (---------------) + is-into-games + 0x00144007, // n0x0893 c0x0000 (---------------) + is-leet + 0x00157c90, // n0x0894 c0x0000 (---------------) + is-not-certified + 0x000e2408, // n0x0895 c0x0000 (---------------) + is-slick + 0x000e398b, // n0x0896 c0x0000 (---------------) + is-uberleet + 0x0014798f, // n0x0897 c0x0000 (---------------) + is-with-theband + 0x000fff08, // n0x0898 c0x0000 (---------------) + isa-geek + 0x000d8d0d, // n0x0899 c0x0000 (---------------) + isa-hockeynut + 0x0014b750, // n0x089a c0x0000 (---------------) + issmarterthanyou + 0x000a9883, // n0x089b c0x0000 (---------------) + jpn + 0x000076c2, // n0x089c c0x0000 (---------------) + kr + 0x000510c9, // n0x089d c0x0000 (---------------) + likes-pie + 0x0006c2ca, // n0x089e c0x0000 (---------------) + likescandy + 0x0001ddc3, // n0x089f c0x0000 (---------------) + mex + 0x00116a48, // n0x08a0 c0x0000 (---------------) + neat-url + 0x000079c7, // n0x08a1 c0x0000 (---------------) + nfshost + 0x00000d82, // n0x08a2 c0x0000 (---------------) + no + 0x0005e84a, // n0x08a3 c0x0000 (---------------) + operaunite + 0x0017e1cf, // n0x08a4 c0x0000 (---------------) + outsystemscloud + 0x00123c52, // n0x08a5 c0x0000 (---------------) + pagespeedmobilizer + 0x00114503, // n0x08a6 c0x0000 (---------------) + qa2 + 0x00176f42, // n0x08a7 c0x0000 (---------------) + qc + 0x001093c7, // n0x08a8 c0x0000 (---------------) + rhcloud + 0x00000cc2, // n0x08a9 c0x0000 (---------------) + ro + 0x00011ec2, // n0x08aa c0x0000 (---------------) + ru + 0x00002402, // n0x08ab c0x0000 (---------------) + sa + 0x00198490, // n0x08ac c0x0000 (---------------) + saves-the-whales + 0x00001d42, // n0x08ad c0x0000 (---------------) + se + 0x00053986, // n0x08ae c0x0000 (---------------) + selfip + 0x00046cce, // n0x08af c0x0000 (---------------) + sells-for-less + 0x00084c4b, // n0x08b0 c0x0000 (---------------) + sells-for-u + 0x000c9608, // n0x08b1 c0x0000 (---------------) + servebbs + 0x000c670a, // n0x08b2 c0x0000 (---------------) + simple-url + 0x000ec7c7, // n0x08b3 c0x0000 (---------------) + sinaapp + 0x0013508d, // n0x08b4 c0x0000 (---------------) + space-to-rent + 0x0017980c, // n0x08b5 c0x0000 (---------------) + teaches-yoga + 0x00000f82, // n0x08b6 c0x0000 (---------------) + uk + 0x00002982, // n0x08b7 c0x0000 (---------------) + us + 0x0000d7c2, // n0x08b8 c0x0000 (---------------) + uy + 0x000ec70a, // n0x08b9 c0x0000 (---------------) + vipsinaapp + 0x000d8a0a, // n0x08ba c0x0000 (---------------) + withgoogle + 0x000de78b, // n0x08bb c0x0000 (---------------) + withyoutube + 0x000f4fce, // n0x08bc c0x0000 (---------------) + writesthisblog + 0x000d2888, // n0x08bd c0x0000 (---------------) + yolasite + 0x00009ac2, // n0x08be c0x0000 (---------------) + za + 0x10c303c7, // n0x08bf c0x0043 (n0x08d1-n0x08da) + compute + 0x110303c9, // n0x08c0 c0x0044 (n0x08da-n0x08dc) + compute-1 + 0x0000f683, // n0x08c1 c0x0000 (---------------) + elb + 0x11763c0c, // n0x08c2 c0x0045 (n0x08dc-n0x08dd) o I eu-central-1 + 0x0004d702, // n0x08c3 c0x0000 (---------------) + s3 + 0x000be551, // n0x08c4 c0x0000 (---------------) + s3-ap-northeast-1 + 0x000bd5d1, // n0x08c5 c0x0000 (---------------) + s3-ap-southeast-1 + 0x00103851, // n0x08c6 c0x0000 (---------------) + s3-ap-southeast-2 + 0x00163b4f, // n0x08c7 c0x0000 (---------------) + s3-eu-central-1 + 0x0004d70c, // n0x08c8 c0x0000 (---------------) + s3-eu-west-1 + 0x000a234d, // n0x08c9 c0x0000 (---------------) + s3-external-1 + 0x0011eb4d, // n0x08ca c0x0000 (---------------) + s3-external-2 + 0x00120c55, // n0x08cb c0x0000 (---------------) + s3-fips-us-gov-west-1 + 0x0012c3cc, // n0x08cc c0x0000 (---------------) + s3-sa-east-1 + 0x00142c10, // n0x08cd c0x0000 (---------------) + s3-us-gov-west-1 + 0x000647cc, // n0x08ce c0x0000 (---------------) + s3-us-west-1 + 0x000d6bcc, // n0x08cf c0x0000 (---------------) + s3-us-west-2 + 0x0011b689, // n0x08d0 c0x0000 (---------------) + us-east-1 + 0x000be60e, // n0x08d1 c0x0000 (---------------) + ap-northeast-1 + 0x000bd68e, // n0x08d2 c0x0000 (---------------) + ap-southeast-1 + 0x0010390e, // n0x08d3 c0x0000 (---------------) + ap-southeast-2 + 0x00163c0c, // n0x08d4 c0x0000 (---------------) + eu-central-1 + 0x0004d7c9, // n0x08d5 c0x0000 (---------------) + eu-west-1 + 0x0012c489, // n0x08d6 c0x0000 (---------------) + sa-east-1 + 0x00120e4d, // n0x08d7 c0x0000 (---------------) + us-gov-west-1 + 0x00064889, // n0x08d8 c0x0000 (---------------) + us-west-1 + 0x000d6c89, // n0x08d9 c0x0000 (---------------) + us-west-2 + 0x0010a983, // n0x08da c0x0000 (---------------) + z-1 + 0x0013bb83, // n0x08db c0x0000 (---------------) + z-2 + 0x0004d702, // n0x08dc c0x0000 (---------------) + s3 + 0x00205882, // n0x08dd c0x0000 (---------------) + I ac + 0x00208182, // n0x08de c0x0000 (---------------) + I co + 0x002003c2, // n0x08df c0x0000 (---------------) + I ed + 0x0020e002, // n0x08e0 c0x0000 (---------------) + I fi + 0x00208502, // n0x08e1 c0x0000 (---------------) + I go + 0x00200282, // n0x08e2 c0x0000 (---------------) + I or + 0x00202402, // n0x08e3 c0x0000 (---------------) + I sa + 0x0022edc3, // n0x08e4 c0x0000 (---------------) + I com + 0x002349c3, // n0x08e5 c0x0000 (---------------) + I edu + 0x00275003, // n0x08e6 c0x0000 (---------------) + I gov + 0x00389f83, // n0x08e7 c0x0000 (---------------) + I inf + 0x0021d8c3, // n0x08e8 c0x0000 (---------------) + I net + 0x00229a83, // n0x08e9 c0x0000 (---------------) + I org + 0x000f5248, // n0x08ea c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x08eb c0x0000 (---------------) + I com + 0x002349c3, // n0x08ec c0x0000 (---------------) + I edu + 0x0021d8c3, // n0x08ed c0x0000 (---------------) + I net + 0x00229a83, // n0x08ee c0x0000 (---------------) + I org + 0x0005cf03, // n0x08ef c0x0000 (---------------) + ath + 0x00275003, // n0x08f0 c0x0000 (---------------) + I gov + 0x00205882, // n0x08f1 c0x0000 (---------------) + I ac + 0x0030a143, // n0x08f2 c0x0000 (---------------) + I biz + 0x1322edc3, // n0x08f3 c0x004c (n0x08fe-n0x08ff) + I com + 0x0027c487, // n0x08f4 c0x0000 (---------------) + I ekloges + 0x00275003, // n0x08f5 c0x0000 (---------------) + I gov + 0x00342703, // n0x08f6 c0x0000 (---------------) + I ltd + 0x0027ca84, // n0x08f7 c0x0000 (---------------) + I name + 0x0021d8c3, // n0x08f8 c0x0000 (---------------) + I net + 0x00229a83, // n0x08f9 c0x0000 (---------------) + I org + 0x00266bca, // n0x08fa c0x0000 (---------------) + I parliament + 0x00240d05, // n0x08fb c0x0000 (---------------) + I press + 0x00220283, // n0x08fc c0x0000 (---------------) + I pro + 0x00200142, // n0x08fd c0x0000 (---------------) + I tm + 0x000f5248, // n0x08fe c0x0000 (---------------) + blogspot + 0x000f5248, // n0x08ff c0x0000 (---------------) + blogspot + 0x000f5248, // n0x0900 c0x0000 (---------------) + blogspot + 0x0002edc3, // n0x0901 c0x0000 (---------------) + com + 0x000d434f, // n0x0902 c0x0000 (---------------) + fuettertdasnetz + 0x0016890a, // n0x0903 c0x0000 (---------------) + isteingeek + 0x00098587, // n0x0904 c0x0000 (---------------) + istmein + 0x0001d74a, // n0x0905 c0x0000 (---------------) + lebtimnetz + 0x0008df8a, // n0x0906 c0x0000 (---------------) + leitungsen + 0x000355cd, // n0x0907 c0x0000 (---------------) + traeumtgerade + 0x000f5248, // n0x0908 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x0909 c0x0000 (---------------) + I com + 0x002349c3, // n0x090a c0x0000 (---------------) + I edu + 0x00275003, // n0x090b c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x090c c0x0000 (---------------) + I net + 0x00229a83, // n0x090d c0x0000 (---------------) + I org + 0x002011c3, // n0x090e c0x0000 (---------------) + I art + 0x0022edc3, // n0x090f c0x0000 (---------------) + I com + 0x002349c3, // n0x0910 c0x0000 (---------------) + I edu + 0x00209f03, // n0x0911 c0x0000 (---------------) + I gob + 0x00275003, // n0x0912 c0x0000 (---------------) + I gov + 0x00215b43, // n0x0913 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x0914 c0x0000 (---------------) + I net + 0x00229a83, // n0x0915 c0x0000 (---------------) + I org + 0x00289883, // n0x0916 c0x0000 (---------------) + I sld + 0x0021fa83, // n0x0917 c0x0000 (---------------) + I web + 0x002011c3, // n0x0918 c0x0000 (---------------) + I art + 0x002b1c44, // n0x0919 c0x0000 (---------------) + I asso + 0x0022edc3, // n0x091a c0x0000 (---------------) + I com + 0x002349c3, // n0x091b c0x0000 (---------------) + I edu + 0x00275003, // n0x091c c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x091d c0x0000 (---------------) + I net + 0x00229a83, // n0x091e c0x0000 (---------------) + I org + 0x002210c3, // n0x091f c0x0000 (---------------) + I pol + 0x0022edc3, // n0x0920 c0x0000 (---------------) + I com + 0x002349c3, // n0x0921 c0x0000 (---------------) + I edu + 0x0020e003, // n0x0922 c0x0000 (---------------) + I fin + 0x00209f03, // n0x0923 c0x0000 (---------------) + I gob + 0x00275003, // n0x0924 c0x0000 (---------------) + I gov + 0x0038a144, // n0x0925 c0x0000 (---------------) + I info + 0x00324c03, // n0x0926 c0x0000 (---------------) + I k12 + 0x00211c43, // n0x0927 c0x0000 (---------------) + I med + 0x00215b43, // n0x0928 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x0929 c0x0000 (---------------) + I net + 0x00229a83, // n0x092a c0x0000 (---------------) + I org + 0x00220283, // n0x092b c0x0000 (---------------) + I pro + 0x003a3443, // n0x092c c0x0000 (---------------) + I aip + 0x1562edc3, // n0x092d c0x0055 (n0x0936-n0x0937) + I com + 0x002349c3, // n0x092e c0x0000 (---------------) + I edu + 0x002aef43, // n0x092f c0x0000 (---------------) + I fie + 0x00275003, // n0x0930 c0x0000 (---------------) + I gov + 0x00265503, // n0x0931 c0x0000 (---------------) + I lib + 0x00211c43, // n0x0932 c0x0000 (---------------) + I med + 0x00229a83, // n0x0933 c0x0000 (---------------) + I org + 0x00204383, // n0x0934 c0x0000 (---------------) + I pri + 0x0037f9c4, // n0x0935 c0x0000 (---------------) + I riik + 0x000f5248, // n0x0936 c0x0000 (---------------) + blogspot + 0x15e2edc3, // n0x0937 c0x0057 (n0x0940-n0x0941) + I com + 0x002349c3, // n0x0938 c0x0000 (---------------) + I edu + 0x0029da43, // n0x0939 c0x0000 (---------------) + I eun + 0x00275003, // n0x093a c0x0000 (---------------) + I gov + 0x00215b43, // n0x093b c0x0000 (---------------) + I mil + 0x0027ca84, // n0x093c c0x0000 (---------------) + I name + 0x0021d8c3, // n0x093d c0x0000 (---------------) + I net + 0x00229a83, // n0x093e c0x0000 (---------------) + I org + 0x0021c043, // n0x093f c0x0000 (---------------) + I sci + 0x000f5248, // n0x0940 c0x0000 (---------------) + blogspot + 0x1662edc3, // n0x0941 c0x0059 (n0x0946-n0x0947) + I com + 0x002349c3, // n0x0942 c0x0000 (---------------) + I edu + 0x00209f03, // n0x0943 c0x0000 (---------------) + I gob + 0x0020e543, // n0x0944 c0x0000 (---------------) + I nom + 0x00229a83, // n0x0945 c0x0000 (---------------) + I org + 0x000f5248, // n0x0946 c0x0000 (---------------) + blogspot + 0x0030a143, // n0x0947 c0x0000 (---------------) + I biz + 0x0022edc3, // n0x0948 c0x0000 (---------------) + I com + 0x002349c3, // n0x0949 c0x0000 (---------------) + I edu + 0x00275003, // n0x094a c0x0000 (---------------) + I gov + 0x0038a144, // n0x094b c0x0000 (---------------) + I info + 0x0027ca84, // n0x094c c0x0000 (---------------) + I name + 0x0021d8c3, // n0x094d c0x0000 (---------------) + I net + 0x00229a83, // n0x094e c0x0000 (---------------) + I org + 0x0031e505, // n0x094f c0x0000 (---------------) + I aland + 0x000f5248, // n0x0950 c0x0000 (---------------) + blogspot + 0x0001eb43, // n0x0951 c0x0000 (---------------) + iki + 0x002bcb88, // n0x0952 c0x0000 (---------------) + I aeroport + 0x0034ca87, // n0x0953 c0x0000 (---------------) + I assedic + 0x002b1c44, // n0x0954 c0x0000 (---------------) + I asso + 0x0033aac6, // n0x0955 c0x0000 (---------------) + I avocat + 0x00342ac6, // n0x0956 c0x0000 (---------------) + I avoues + 0x000f5248, // n0x0957 c0x0000 (---------------) + blogspot + 0x00316483, // n0x0958 c0x0000 (---------------) + I cci + 0x003793c9, // n0x0959 c0x0000 (---------------) + I chambagri + 0x002ade55, // n0x095a c0x0000 (---------------) + I chirurgiens-dentistes + 0x0022edc3, // n0x095b c0x0000 (---------------) + I com + 0x002a8552, // n0x095c c0x0000 (---------------) + I experts-comptables + 0x002a830f, // n0x095d c0x0000 (---------------) + I geometre-expert + 0x002fa744, // n0x095e c0x0000 (---------------) + I gouv + 0x00215505, // n0x095f c0x0000 (---------------) + I greta + 0x002e81d0, // n0x0960 c0x0000 (---------------) + I huissier-justice + 0x0035abc7, // n0x0961 c0x0000 (---------------) + I medecin + 0x0020e543, // n0x0962 c0x0000 (---------------) + I nom + 0x00246408, // n0x0963 c0x0000 (---------------) + I notaires + 0x002d5a0a, // n0x0964 c0x0000 (---------------) + I pharmacien + 0x0023f504, // n0x0965 c0x0000 (---------------) + I port + 0x002da783, // n0x0966 c0x0000 (---------------) + I prd + 0x00240d06, // n0x0967 c0x0000 (---------------) + I presse + 0x00200142, // n0x0968 c0x0000 (---------------) + I tm + 0x003781cb, // n0x0969 c0x0000 (---------------) + I veterinaire + 0x0022edc3, // n0x096a c0x0000 (---------------) + I com + 0x002349c3, // n0x096b c0x0000 (---------------) + I edu + 0x00275003, // n0x096c c0x0000 (---------------) + I gov + 0x00215b43, // n0x096d c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x096e c0x0000 (---------------) + I net + 0x00229a83, // n0x096f c0x0000 (---------------) + I org + 0x002def03, // n0x0970 c0x0000 (---------------) + I pvt + 0x00208182, // n0x0971 c0x0000 (---------------) + I co + 0x0021d8c3, // n0x0972 c0x0000 (---------------) + I net + 0x00229a83, // n0x0973 c0x0000 (---------------) + I org + 0x0022edc3, // n0x0974 c0x0000 (---------------) + I com + 0x002349c3, // n0x0975 c0x0000 (---------------) + I edu + 0x00275003, // n0x0976 c0x0000 (---------------) + I gov + 0x00215b43, // n0x0977 c0x0000 (---------------) + I mil + 0x00229a83, // n0x0978 c0x0000 (---------------) + I org + 0x0022edc3, // n0x0979 c0x0000 (---------------) + I com + 0x002349c3, // n0x097a c0x0000 (---------------) + I edu + 0x00275003, // n0x097b c0x0000 (---------------) + I gov + 0x00342703, // n0x097c c0x0000 (---------------) + I ltd + 0x00210243, // n0x097d c0x0000 (---------------) + I mod + 0x00229a83, // n0x097e c0x0000 (---------------) + I org + 0x00208182, // n0x097f c0x0000 (---------------) + I co + 0x0022edc3, // n0x0980 c0x0000 (---------------) + I com + 0x002349c3, // n0x0981 c0x0000 (---------------) + I edu + 0x0021d8c3, // n0x0982 c0x0000 (---------------) + I net + 0x00229a83, // n0x0983 c0x0000 (---------------) + I org + 0x00205882, // n0x0984 c0x0000 (---------------) + I ac + 0x0022edc3, // n0x0985 c0x0000 (---------------) + I com + 0x002349c3, // n0x0986 c0x0000 (---------------) + I edu + 0x00275003, // n0x0987 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x0988 c0x0000 (---------------) + I net + 0x00229a83, // n0x0989 c0x0000 (---------------) + I org + 0x002b1c44, // n0x098a c0x0000 (---------------) + I asso + 0x0022edc3, // n0x098b c0x0000 (---------------) + I com + 0x002349c3, // n0x098c c0x0000 (---------------) + I edu + 0x00207804, // n0x098d c0x0000 (---------------) + I mobi + 0x0021d8c3, // n0x098e c0x0000 (---------------) + I net + 0x00229a83, // n0x098f c0x0000 (---------------) + I org + 0x000f5248, // n0x0990 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x0991 c0x0000 (---------------) + I com + 0x002349c3, // n0x0992 c0x0000 (---------------) + I edu + 0x00275003, // n0x0993 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x0994 c0x0000 (---------------) + I net + 0x00229a83, // n0x0995 c0x0000 (---------------) + I org + 0x0022edc3, // n0x0996 c0x0000 (---------------) + I com + 0x002349c3, // n0x0997 c0x0000 (---------------) + I edu + 0x00209f03, // n0x0998 c0x0000 (---------------) + I gob + 0x00202603, // n0x0999 c0x0000 (---------------) + I ind + 0x00215b43, // n0x099a c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x099b c0x0000 (---------------) + I net + 0x00229a83, // n0x099c c0x0000 (---------------) + I org + 0x00208182, // n0x099d c0x0000 (---------------) + I co + 0x0022edc3, // n0x099e c0x0000 (---------------) + I com + 0x0021d8c3, // n0x099f c0x0000 (---------------) + I net + 0x000f5248, // n0x09a0 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x09a1 c0x0000 (---------------) + I com + 0x002349c3, // n0x09a2 c0x0000 (---------------) + I edu + 0x00275003, // n0x09a3 c0x0000 (---------------) + I gov + 0x00306f03, // n0x09a4 c0x0000 (---------------) + I idv + 0x00061383, // n0x09a5 c0x0000 (---------------) + inc + 0x00142703, // n0x09a6 c0x0000 (---------------) + ltd + 0x0021d8c3, // n0x09a7 c0x0000 (---------------) + I net + 0x00229a83, // n0x09a8 c0x0000 (---------------) + I org + 0x002fac8a, // n0x09a9 c0x0000 (---------------) + I xn--55qx5d + 0x0031bfc9, // n0x09aa c0x0000 (---------------) + I xn--ciqpn + 0x003361cb, // n0x09ab c0x0000 (---------------) + I xn--gmq050i + 0x0033674a, // n0x09ac c0x0000 (---------------) + I xn--gmqw5a + 0x00340a0a, // n0x09ad c0x0000 (---------------) + I xn--io0a7i + 0x0034f6cb, // n0x09ae c0x0000 (---------------) + I xn--lcvr32d + 0x0036544a, // n0x09af c0x0000 (---------------) + I xn--mk0axi + 0x0036d74a, // n0x09b0 c0x0000 (---------------) + I xn--mxtq1m + 0x00372e8a, // n0x09b1 c0x0000 (---------------) + I xn--od0alg + 0x0037310b, // n0x09b2 c0x0000 (---------------) + I xn--od0aq3b + 0x0038d709, // n0x09b3 c0x0000 (---------------) + I xn--tn0ag + 0x0038f90a, // n0x09b4 c0x0000 (---------------) + I xn--uc0atv + 0x0038fe4b, // n0x09b5 c0x0000 (---------------) + I xn--uc0ay4a + 0x0039ba4b, // n0x09b6 c0x0000 (---------------) + I xn--wcvs22d + 0x003a23ca, // n0x09b7 c0x0000 (---------------) + I xn--zf0avx + 0x0022edc3, // n0x09b8 c0x0000 (---------------) + I com + 0x002349c3, // n0x09b9 c0x0000 (---------------) + I edu + 0x00209f03, // n0x09ba c0x0000 (---------------) + I gob + 0x00215b43, // n0x09bb c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x09bc c0x0000 (---------------) + I net + 0x00229a83, // n0x09bd c0x0000 (---------------) + I org + 0x000f5248, // n0x09be c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x09bf c0x0000 (---------------) + I com + 0x0025afc4, // n0x09c0 c0x0000 (---------------) + I from + 0x00217542, // n0x09c1 c0x0000 (---------------) + I iz + 0x0027ca84, // n0x09c2 c0x0000 (---------------) + I name + 0x00299105, // n0x09c3 c0x0000 (---------------) + I adult + 0x002011c3, // n0x09c4 c0x0000 (---------------) + I art + 0x002b1c44, // n0x09c5 c0x0000 (---------------) + I asso + 0x0022edc3, // n0x09c6 c0x0000 (---------------) + I com + 0x00238284, // n0x09c7 c0x0000 (---------------) + I coop + 0x002349c3, // n0x09c8 c0x0000 (---------------) + I edu + 0x00247a04, // n0x09c9 c0x0000 (---------------) + I firm + 0x002fa744, // n0x09ca c0x0000 (---------------) + I gouv + 0x0038a144, // n0x09cb c0x0000 (---------------) + I info + 0x00211c43, // n0x09cc c0x0000 (---------------) + I med + 0x0021d8c3, // n0x09cd c0x0000 (---------------) + I net + 0x00229a83, // n0x09ce c0x0000 (---------------) + I org + 0x003372c5, // n0x09cf c0x0000 (---------------) + I perso + 0x002210c3, // n0x09d0 c0x0000 (---------------) + I pol + 0x00220283, // n0x09d1 c0x0000 (---------------) + I pro + 0x0020c043, // n0x09d2 c0x0000 (---------------) + I rel + 0x00332c44, // n0x09d3 c0x0000 (---------------) + I shop + 0x00226944, // n0x09d4 c0x0000 (---------------) + I 2000 + 0x00250605, // n0x09d5 c0x0000 (---------------) + I agrar + 0x000f5248, // n0x09d6 c0x0000 (---------------) + blogspot + 0x00208b44, // n0x09d7 c0x0000 (---------------) + I bolt + 0x00351546, // n0x09d8 c0x0000 (---------------) + I casino + 0x0027e804, // n0x09d9 c0x0000 (---------------) + I city + 0x00208182, // n0x09da c0x0000 (---------------) + I co + 0x00333307, // n0x09db c0x0000 (---------------) + I erotica + 0x00249a47, // n0x09dc c0x0000 (---------------) + I erotika + 0x00243ec4, // n0x09dd c0x0000 (---------------) + I film + 0x00253c85, // n0x09de c0x0000 (---------------) + I forum + 0x00318cc5, // n0x09df c0x0000 (---------------) + I games + 0x0022fac5, // n0x09e0 c0x0000 (---------------) + I hotel + 0x0038a144, // n0x09e1 c0x0000 (---------------) + I info + 0x0033d688, // n0x09e2 c0x0000 (---------------) + I ingatlan + 0x0020b886, // n0x09e3 c0x0000 (---------------) + I jogasz + 0x002cde48, // n0x09e4 c0x0000 (---------------) + I konyvelo + 0x00237ac5, // n0x09e5 c0x0000 (---------------) + I lakas + 0x002fb545, // n0x09e6 c0x0000 (---------------) + I media + 0x0021fe44, // n0x09e7 c0x0000 (---------------) + I news + 0x00229a83, // n0x09e8 c0x0000 (---------------) + I org + 0x002db244, // n0x09e9 c0x0000 (---------------) + I priv + 0x0034d5c6, // n0x09ea c0x0000 (---------------) + I reklam + 0x00240e03, // n0x09eb c0x0000 (---------------) + I sex + 0x00332c44, // n0x09ec c0x0000 (---------------) + I shop + 0x0028b685, // n0x09ed c0x0000 (---------------) + I sport + 0x002368c4, // n0x09ee c0x0000 (---------------) + I suli + 0x0037ff44, // n0x09ef c0x0000 (---------------) + I szex + 0x00200142, // n0x09f0 c0x0000 (---------------) + I tm + 0x00266846, // n0x09f1 c0x0000 (---------------) + I tozsde + 0x00384f86, // n0x09f2 c0x0000 (---------------) + I utazas + 0x002ea705, // n0x09f3 c0x0000 (---------------) + I video + 0x00205882, // n0x09f4 c0x0000 (---------------) + I ac + 0x0030a143, // n0x09f5 c0x0000 (---------------) + I biz + 0x1b608182, // n0x09f6 c0x006d (n0x09ff-n0x0a00) + I co + 0x002363c4, // n0x09f7 c0x0000 (---------------) + I desa + 0x00208502, // n0x09f8 c0x0000 (---------------) + I go + 0x00215b43, // n0x09f9 c0x0000 (---------------) + I mil + 0x0022a6c2, // n0x09fa c0x0000 (---------------) + I my + 0x0021d8c3, // n0x09fb c0x0000 (---------------) + I net + 0x00200282, // n0x09fc c0x0000 (---------------) + I or + 0x00215d43, // n0x09fd c0x0000 (---------------) + I sch + 0x0021fa83, // n0x09fe c0x0000 (---------------) + I web + 0x000f5248, // n0x09ff c0x0000 (---------------) + blogspot + 0x000f5248, // n0x0a00 c0x0000 (---------------) + blogspot + 0x00275003, // n0x0a01 c0x0000 (---------------) + I gov + 0x00205882, // n0x0a02 c0x0000 (---------------) + I ac + 0x1c208182, // n0x0a03 c0x0070 (n0x0a0a-n0x0a0b) + I co + 0x00275003, // n0x0a04 c0x0000 (---------------) + I gov + 0x00261003, // n0x0a05 c0x0000 (---------------) + I idf + 0x00324c03, // n0x0a06 c0x0000 (---------------) + I k12 + 0x0022f204, // n0x0a07 c0x0000 (---------------) + I muni + 0x0021d8c3, // n0x0a08 c0x0000 (---------------) + I net + 0x00229a83, // n0x0a09 c0x0000 (---------------) + I org + 0x000f5248, // n0x0a0a c0x0000 (---------------) + blogspot + 0x00205882, // n0x0a0b c0x0000 (---------------) + I ac + 0x1ca08182, // n0x0a0c c0x0072 (n0x0a12-n0x0a14) + I co + 0x0022edc3, // n0x0a0d c0x0000 (---------------) + I com + 0x0021d8c3, // n0x0a0e c0x0000 (---------------) + I net + 0x00229a83, // n0x0a0f c0x0000 (---------------) + I org + 0x0020a242, // n0x0a10 c0x0000 (---------------) + I tt + 0x00206fc2, // n0x0a11 c0x0000 (---------------) + I tv + 0x00342703, // n0x0a12 c0x0000 (---------------) + I ltd + 0x002d4b03, // n0x0a13 c0x0000 (---------------) + I plc + 0x00205882, // n0x0a14 c0x0000 (---------------) + I ac + 0x000f5248, // n0x0a15 c0x0000 (---------------) + blogspot + 0x00208182, // n0x0a16 c0x0000 (---------------) + I co + 0x002349c3, // n0x0a17 c0x0000 (---------------) + I edu + 0x00247a04, // n0x0a18 c0x0000 (---------------) + I firm + 0x00206243, // n0x0a19 c0x0000 (---------------) + I gen + 0x00275003, // n0x0a1a c0x0000 (---------------) + I gov + 0x00202603, // n0x0a1b c0x0000 (---------------) + I ind + 0x00215b43, // n0x0a1c c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x0a1d c0x0000 (---------------) + I net + 0x00217183, // n0x0a1e c0x0000 (---------------) + I nic + 0x00229a83, // n0x0a1f c0x0000 (---------------) + I org + 0x0021bfc3, // n0x0a20 c0x0000 (---------------) + I res + 0x0011dc93, // n0x0a21 c0x0000 (---------------) + barrel-of-knowledge + 0x0011f794, // n0x0a22 c0x0000 (---------------) + barrell-of-knowledge + 0x00011a06, // n0x0a23 c0x0000 (---------------) + dyndns + 0x0004e4c7, // n0x0a24 c0x0000 (---------------) + for-our + 0x0011af89, // n0x0a25 c0x0000 (---------------) + groks-the + 0x00029b0a, // n0x0a26 c0x0000 (---------------) + groks-this + 0x00080f4d, // n0x0a27 c0x0000 (---------------) + here-for-more + 0x000f088a, // n0x0a28 c0x0000 (---------------) + knowsitall + 0x00053986, // n0x0a29 c0x0000 (---------------) + selfip + 0x00123b06, // n0x0a2a c0x0000 (---------------) + webhop + 0x00224542, // n0x0a2b c0x0000 (---------------) + I eu + 0x0022edc3, // n0x0a2c c0x0000 (---------------) + I com + 0x000c8386, // n0x0a2d c0x0000 (---------------) + github + 0x0011b2c3, // n0x0a2e c0x0000 (---------------) + nid + 0x000145c8, // n0x0a2f c0x0000 (---------------) + pantheon + 0x000aa448, // n0x0a30 c0x0000 (---------------) + sandcats + 0x0022edc3, // n0x0a31 c0x0000 (---------------) + I com + 0x002349c3, // n0x0a32 c0x0000 (---------------) + I edu + 0x00275003, // n0x0a33 c0x0000 (---------------) + I gov + 0x00215b43, // n0x0a34 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x0a35 c0x0000 (---------------) + I net + 0x00229a83, // n0x0a36 c0x0000 (---------------) + I org + 0x00205882, // n0x0a37 c0x0000 (---------------) + I ac + 0x00208182, // n0x0a38 c0x0000 (---------------) + I co + 0x00275003, // n0x0a39 c0x0000 (---------------) + I gov + 0x00205d82, // n0x0a3a c0x0000 (---------------) + I id + 0x0021d8c3, // n0x0a3b c0x0000 (---------------) + I net + 0x00229a83, // n0x0a3c c0x0000 (---------------) + I org + 0x00215d43, // n0x0a3d c0x0000 (---------------) + I sch + 0x0035830f, // n0x0a3e c0x0000 (---------------) + I xn--mgba3a4f16a + 0x003586ce, // n0x0a3f c0x0000 (---------------) + I xn--mgba3a4fra + 0x000f5248, // n0x0a40 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x0a41 c0x0000 (---------------) + I com + 0x00041947, // n0x0a42 c0x0000 (---------------) + cupcake + 0x002349c3, // n0x0a43 c0x0000 (---------------) + I edu + 0x00275003, // n0x0a44 c0x0000 (---------------) + I gov + 0x0026f683, // n0x0a45 c0x0000 (---------------) + I int + 0x0021d8c3, // n0x0a46 c0x0000 (---------------) + I net + 0x00229a83, // n0x0a47 c0x0000 (---------------) + I org + 0x0021b583, // n0x0a48 c0x0000 (---------------) + I abr + 0x00225ac7, // n0x0a49 c0x0000 (---------------) + I abruzzo + 0x00201002, // n0x0a4a c0x0000 (---------------) + I ag + 0x0038d8c9, // n0x0a4b c0x0000 (---------------) + I agrigento + 0x002001c2, // n0x0a4c c0x0000 (---------------) + I al + 0x0039878b, // n0x0a4d c0x0000 (---------------) + I alessandria + 0x002d920a, // n0x0a4e c0x0000 (---------------) + I alto-adige + 0x002dd509, // n0x0a4f c0x0000 (---------------) + I altoadige + 0x00200b42, // n0x0a50 c0x0000 (---------------) + I an + 0x0034c506, // n0x0a51 c0x0000 (---------------) + I ancona + 0x0026d795, // n0x0a52 c0x0000 (---------------) + I andria-barletta-trani + 0x003988d5, // n0x0a53 c0x0000 (---------------) + I andria-trani-barletta + 0x0039f193, // n0x0a54 c0x0000 (---------------) + I andriabarlettatrani + 0x00398e53, // n0x0a55 c0x0000 (---------------) + I andriatranibarletta + 0x00203042, // n0x0a56 c0x0000 (---------------) + I ao + 0x00213e05, // n0x0a57 c0x0000 (---------------) + I aosta + 0x0039d64c, // n0x0a58 c0x0000 (---------------) + I aosta-valley + 0x00213e0b, // n0x0a59 c0x0000 (---------------) + I aostavalley + 0x0023b085, // n0x0a5a c0x0000 (---------------) + I aoste + 0x002136c2, // n0x0a5b c0x0000 (---------------) + I ap + 0x00229802, // n0x0a5c c0x0000 (---------------) + I aq + 0x00369a86, // n0x0a5d c0x0000 (---------------) + I aquila + 0x002011c2, // n0x0a5e c0x0000 (---------------) + I ar + 0x0027c6c6, // n0x0a5f c0x0000 (---------------) + I arezzo + 0x0038bf0d, // n0x0a60 c0x0000 (---------------) + I ascoli-piceno + 0x00347f8c, // n0x0a61 c0x0000 (---------------) + I ascolipiceno + 0x0023a8c4, // n0x0a62 c0x0000 (---------------) + I asti + 0x00200102, // n0x0a63 c0x0000 (---------------) + I at + 0x00200602, // n0x0a64 c0x0000 (---------------) + I av + 0x00217b08, // n0x0a65 c0x0000 (---------------) + I avellino + 0x00203002, // n0x0a66 c0x0000 (---------------) + I ba + 0x0024c946, // n0x0a67 c0x0000 (---------------) + I balsan + 0x003084c4, // n0x0a68 c0x0000 (---------------) + I bari + 0x0026d955, // n0x0a69 c0x0000 (---------------) + I barletta-trani-andria + 0x0039f313, // n0x0a6a c0x0000 (---------------) + I barlettatraniandria + 0x0020f5c3, // n0x0a6b c0x0000 (---------------) + I bas + 0x0032b30a, // n0x0a6c c0x0000 (---------------) + I basilicata + 0x002ffc47, // n0x0a6d c0x0000 (---------------) + I belluno + 0x0027fc89, // n0x0a6e c0x0000 (---------------) + I benevento + 0x0022d307, // n0x0a6f c0x0000 (---------------) + I bergamo + 0x00226882, // n0x0a70 c0x0000 (---------------) + I bg + 0x00200002, // n0x0a71 c0x0000 (---------------) + I bi + 0x003a18c6, // n0x0a72 c0x0000 (---------------) + I biella + 0x00208dc2, // n0x0a73 c0x0000 (---------------) + I bl + 0x000f5248, // n0x0a74 c0x0000 (---------------) + blogspot + 0x0020f402, // n0x0a75 c0x0000 (---------------) + I bn + 0x00206dc2, // n0x0a76 c0x0000 (---------------) + I bo + 0x0037f447, // n0x0a77 c0x0000 (---------------) + I bologna + 0x00210e87, // n0x0a78 c0x0000 (---------------) + I bolzano + 0x0021a805, // n0x0a79 c0x0000 (---------------) + I bozen + 0x0020bb42, // n0x0a7a c0x0000 (---------------) + I br + 0x0021bf87, // n0x0a7b c0x0000 (---------------) + I brescia + 0x0021c148, // n0x0a7c c0x0000 (---------------) + I brindisi + 0x002311c2, // n0x0a7d c0x0000 (---------------) + I bs + 0x0021d7c2, // n0x0a7e c0x0000 (---------------) + I bt + 0x0022b202, // n0x0a7f c0x0000 (---------------) + I bz + 0x00200302, // n0x0a80 c0x0000 (---------------) + I ca + 0x0030e148, // n0x0a81 c0x0000 (---------------) + I cagliari + 0x00217203, // n0x0a82 c0x0000 (---------------) + I cal + 0x0024c588, // n0x0a83 c0x0000 (---------------) + I calabria + 0x00234fcd, // n0x0a84 c0x0000 (---------------) + I caltanissetta + 0x0021fb43, // n0x0a85 c0x0000 (---------------) + I cam + 0x00306ac8, // n0x0a86 c0x0000 (---------------) + I campania + 0x0023bf4f, // n0x0a87 c0x0000 (---------------) + I campidano-medio + 0x0023c30e, // n0x0a88 c0x0000 (---------------) + I campidanomedio + 0x0032ffca, // n0x0a89 c0x0000 (---------------) + I campobasso + 0x002e5191, // n0x0a8a c0x0000 (---------------) + I carbonia-iglesias + 0x002e5610, // n0x0a8b c0x0000 (---------------) + I carboniaiglesias + 0x002ac2cd, // n0x0a8c c0x0000 (---------------) + I carrara-massa + 0x002ac60c, // n0x0a8d c0x0000 (---------------) + I carraramassa + 0x00212ec7, // n0x0a8e c0x0000 (---------------) + I caserta + 0x0032b487, // n0x0a8f c0x0000 (---------------) + I catania + 0x0033ab89, // n0x0a90 c0x0000 (---------------) + I catanzaro + 0x00226842, // n0x0a91 c0x0000 (---------------) + I cb + 0x00202ec2, // n0x0a92 c0x0000 (---------------) + I ce + 0x00250b8c, // n0x0a93 c0x0000 (---------------) + I cesena-forli + 0x00250e8b, // n0x0a94 c0x0000 (---------------) + I cesenaforli + 0x002058c2, // n0x0a95 c0x0000 (---------------) + I ch + 0x002ee146, // n0x0a96 c0x0000 (---------------) + I chieti + 0x002080c2, // n0x0a97 c0x0000 (---------------) + I ci + 0x00202502, // n0x0a98 c0x0000 (---------------) + I cl + 0x0021a142, // n0x0a99 c0x0000 (---------------) + I cn + 0x00208182, // n0x0a9a c0x0000 (---------------) + I co + 0x0022f504, // n0x0a9b c0x0000 (---------------) + I como + 0x0023b6c7, // n0x0a9c c0x0000 (---------------) + I cosenza + 0x00211e82, // n0x0a9d c0x0000 (---------------) + I cr + 0x0023e647, // n0x0a9e c0x0000 (---------------) + I cremona + 0x0023f307, // n0x0a9f c0x0000 (---------------) + I crotone + 0x0020dcc2, // n0x0aa0 c0x0000 (---------------) + I cs + 0x0021e002, // n0x0aa1 c0x0000 (---------------) + I ct + 0x00241805, // n0x0aa2 c0x0000 (---------------) + I cuneo + 0x00233fc2, // n0x0aa3 c0x0000 (---------------) + I cz + 0x0025318e, // n0x0aa4 c0x0000 (---------------) + I dell-ogliastra + 0x0025f50d, // n0x0aa5 c0x0000 (---------------) + I dellogliastra + 0x002349c3, // n0x0aa6 c0x0000 (---------------) + I edu + 0x0030310e, // n0x0aa7 c0x0000 (---------------) + I emilia-romagna + 0x0027b14d, // n0x0aa8 c0x0000 (---------------) + I emiliaromagna + 0x0035dc03, // n0x0aa9 c0x0000 (---------------) + I emr + 0x00201d82, // n0x0aaa c0x0000 (---------------) + I en + 0x00279884, // n0x0aab c0x0000 (---------------) + I enna + 0x00242e02, // n0x0aac c0x0000 (---------------) + I fc + 0x00200382, // n0x0aad c0x0000 (---------------) + I fe + 0x002d2285, // n0x0aae c0x0000 (---------------) + I fermo + 0x002dbb47, // n0x0aaf c0x0000 (---------------) + I ferrara + 0x00347402, // n0x0ab0 c0x0000 (---------------) + I fg + 0x0020e002, // n0x0ab1 c0x0000 (---------------) + I fi + 0x00247347, // n0x0ab2 c0x0000 (---------------) + I firenze + 0x0024acc8, // n0x0ab3 c0x0000 (---------------) + I florence + 0x0023d4c2, // n0x0ab4 c0x0000 (---------------) + I fm + 0x0038a1c6, // n0x0ab5 c0x0000 (---------------) + I foggia + 0x00250a0c, // n0x0ab6 c0x0000 (---------------) + I forli-cesena + 0x00250d4b, // n0x0ab7 c0x0000 (---------------) + I forlicesena + 0x00207fc2, // n0x0ab8 c0x0000 (---------------) + I fr + 0x0025774f, // n0x0ab9 c0x0000 (---------------) + I friuli-v-giulia + 0x00257b10, // n0x0aba c0x0000 (---------------) + I friuli-ve-giulia + 0x00257f0f, // n0x0abb c0x0000 (---------------) + I friuli-vegiulia + 0x002582d5, // n0x0abc c0x0000 (---------------) + I friuli-venezia-giulia + 0x00258814, // n0x0abd c0x0000 (---------------) + I friuli-veneziagiulia + 0x00258d0e, // n0x0abe c0x0000 (---------------) + I friuli-vgiulia + 0x0025908e, // n0x0abf c0x0000 (---------------) + I friuliv-giulia + 0x0025940f, // n0x0ac0 c0x0000 (---------------) + I friulive-giulia + 0x002597ce, // n0x0ac1 c0x0000 (---------------) + I friulivegiulia + 0x00259b54, // n0x0ac2 c0x0000 (---------------) + I friulivenezia-giulia + 0x0025a053, // n0x0ac3 c0x0000 (---------------) + I friuliveneziagiulia + 0x0025a50d, // n0x0ac4 c0x0000 (---------------) + I friulivgiulia + 0x0026eb09, // n0x0ac5 c0x0000 (---------------) + I frosinone + 0x00281c83, // n0x0ac6 c0x0000 (---------------) + I fvg + 0x00203982, // n0x0ac7 c0x0000 (---------------) + I ge + 0x00307a85, // n0x0ac8 c0x0000 (---------------) + I genoa + 0x00206246, // n0x0ac9 c0x0000 (---------------) + I genova + 0x00208502, // n0x0aca c0x0000 (---------------) + I go + 0x00372cc7, // n0x0acb c0x0000 (---------------) + I gorizia + 0x00275003, // n0x0acc c0x0000 (---------------) + I gov + 0x002089c2, // n0x0acd c0x0000 (---------------) + I gr + 0x00330d88, // n0x0ace c0x0000 (---------------) + I grosseto + 0x002e53d1, // n0x0acf c0x0000 (---------------) + I iglesias-carbonia + 0x002e5810, // n0x0ad0 c0x0000 (---------------) + I iglesiascarbonia + 0x00207242, // n0x0ad1 c0x0000 (---------------) + I im + 0x00234447, // n0x0ad2 c0x0000 (---------------) + I imperia + 0x00201a02, // n0x0ad3 c0x0000 (---------------) + I is + 0x00342947, // n0x0ad4 c0x0000 (---------------) + I isernia + 0x002076c2, // n0x0ad5 c0x0000 (---------------) + I kr + 0x002bc989, // n0x0ad6 c0x0000 (---------------) + I la-spezia + 0x00369a47, // n0x0ad7 c0x0000 (---------------) + I laquila + 0x00257348, // n0x0ad8 c0x0000 (---------------) + I laspezia + 0x00222846, // n0x0ad9 c0x0000 (---------------) + I latina + 0x002d4a03, // n0x0ada c0x0000 (---------------) + I laz + 0x003021c5, // n0x0adb c0x0000 (---------------) + I lazio + 0x00234c42, // n0x0adc c0x0000 (---------------) + I lc + 0x0020a5c2, // n0x0add c0x0000 (---------------) + I le + 0x003a1cc5, // n0x0ade c0x0000 (---------------) + I lecce + 0x0021db05, // n0x0adf c0x0000 (---------------) + I lecco + 0x002019c2, // n0x0ae0 c0x0000 (---------------) + I li + 0x00236943, // n0x0ae1 c0x0000 (---------------) + I lig + 0x00236947, // n0x0ae2 c0x0000 (---------------) + I liguria + 0x002112c7, // n0x0ae3 c0x0000 (---------------) + I livorno + 0x00200242, // n0x0ae4 c0x0000 (---------------) + I lo + 0x00252bc4, // n0x0ae5 c0x0000 (---------------) + I lodi + 0x00212bc3, // n0x0ae6 c0x0000 (---------------) + I lom + 0x002c1249, // n0x0ae7 c0x0000 (---------------) + I lombardia + 0x002d5348, // n0x0ae8 c0x0000 (---------------) + I lombardy + 0x00208bc2, // n0x0ae9 c0x0000 (---------------) + I lt + 0x00202542, // n0x0aea c0x0000 (---------------) + I lu + 0x002a5e47, // n0x0aeb c0x0000 (---------------) + I lucania + 0x002a9245, // n0x0aec c0x0000 (---------------) + I lucca + 0x003065c8, // n0x0aed c0x0000 (---------------) + I macerata + 0x00244f87, // n0x0aee c0x0000 (---------------) + I mantova + 0x00201183, // n0x0aef c0x0000 (---------------) + I mar + 0x0027f3c6, // n0x0af0 c0x0000 (---------------) + I marche + 0x002ac14d, // n0x0af1 c0x0000 (---------------) + I massa-carrara + 0x002ac4cc, // n0x0af2 c0x0000 (---------------) + I massacarrara + 0x0024fdc6, // n0x0af3 c0x0000 (---------------) + I matera + 0x00205482, // n0x0af4 c0x0000 (---------------) + I mb + 0x002d2e42, // n0x0af5 c0x0000 (---------------) + I mc + 0x00202302, // n0x0af6 c0x0000 (---------------) + I me + 0x0023bdcf, // n0x0af7 c0x0000 (---------------) + I medio-campidano + 0x0023c1ce, // n0x0af8 c0x0000 (---------------) + I mediocampidano + 0x00318d47, // n0x0af9 c0x0000 (---------------) + I messina + 0x0020e5c2, // n0x0afa c0x0000 (---------------) + I mi + 0x00304a85, // n0x0afb c0x0000 (---------------) + I milan + 0x00304a86, // n0x0afc c0x0000 (---------------) + I milano + 0x0021d882, // n0x0afd c0x0000 (---------------) + I mn + 0x00203ec2, // n0x0afe c0x0000 (---------------) + I mo + 0x00210246, // n0x0aff c0x0000 (---------------) + I modena + 0x00256ac3, // n0x0b00 c0x0000 (---------------) + I mol + 0x00342886, // n0x0b01 c0x0000 (---------------) + I molise + 0x002bfe45, // n0x0b02 c0x0000 (---------------) + I monza + 0x002bfe4d, // n0x0b03 c0x0000 (---------------) + I monza-brianza + 0x002c0695, // n0x0b04 c0x0000 (---------------) + I monza-e-della-brianza + 0x002c0e4c, // n0x0b05 c0x0000 (---------------) + I monzabrianza + 0x002c1a0d, // n0x0b06 c0x0000 (---------------) + I monzaebrianza + 0x002c1dd2, // n0x0b07 c0x0000 (---------------) + I monzaedellabrianza + 0x00202482, // n0x0b08 c0x0000 (---------------) + I ms + 0x00235702, // n0x0b09 c0x0000 (---------------) + I mt + 0x002005c2, // n0x0b0a c0x0000 (---------------) + I na + 0x0039c386, // n0x0b0b c0x0000 (---------------) + I naples + 0x00298806, // n0x0b0c c0x0000 (---------------) + I napoli + 0x00200d82, // n0x0b0d c0x0000 (---------------) + I no + 0x002062c6, // n0x0b0e c0x0000 (---------------) + I novara + 0x00209702, // n0x0b0f c0x0000 (---------------) + I nu + 0x00395345, // n0x0b10 c0x0000 (---------------) + I nuoro + 0x00201602, // n0x0b11 c0x0000 (---------------) + I og + 0x002532c9, // n0x0b12 c0x0000 (---------------) + I ogliastra + 0x0026794c, // n0x0b13 c0x0000 (---------------) + I olbia-tempio + 0x00267c8b, // n0x0b14 c0x0000 (---------------) + I olbiatempio + 0x00200282, // n0x0b15 c0x0000 (---------------) + I or + 0x0024b108, // n0x0b16 c0x0000 (---------------) + I oristano + 0x00200902, // n0x0b17 c0x0000 (---------------) + I ot + 0x0020ec42, // n0x0b18 c0x0000 (---------------) + I pa + 0x00213bc6, // n0x0b19 c0x0000 (---------------) + I padova + 0x0035e585, // n0x0b1a c0x0000 (---------------) + I padua + 0x0020ec47, // n0x0b1b c0x0000 (---------------) + I palermo + 0x0026e805, // n0x0b1c c0x0000 (---------------) + I parma + 0x002ca345, // n0x0b1d c0x0000 (---------------) + I pavia + 0x002419c2, // n0x0b1e c0x0000 (---------------) + I pc + 0x00332d42, // n0x0b1f c0x0000 (---------------) + I pd + 0x00209a02, // n0x0b20 c0x0000 (---------------) + I pe + 0x00254fc7, // n0x0b21 c0x0000 (---------------) + I perugia + 0x0022700d, // n0x0b22 c0x0000 (---------------) + I pesaro-urbino + 0x0022738c, // n0x0b23 c0x0000 (---------------) + I pesarourbino + 0x00265d47, // n0x0b24 c0x0000 (---------------) + I pescara + 0x00308882, // n0x0b25 c0x0000 (---------------) + I pg + 0x00209102, // n0x0b26 c0x0000 (---------------) + I pi + 0x00338508, // n0x0b27 c0x0000 (---------------) + I piacenza + 0x00251248, // n0x0b28 c0x0000 (---------------) + I piedmont + 0x002d1148, // n0x0b29 c0x0000 (---------------) + I piemonte + 0x002d8cc4, // n0x0b2a c0x0000 (---------------) + I pisa + 0x002ee507, // n0x0b2b c0x0000 (---------------) + I pistoia + 0x002d7083, // n0x0b2c c0x0000 (---------------) + I pmn + 0x002a98c2, // n0x0b2d c0x0000 (---------------) + I pn + 0x00200c42, // n0x0b2e c0x0000 (---------------) + I po + 0x002d9489, // n0x0b2f c0x0000 (---------------) + I pordenone + 0x00245b87, // n0x0b30 c0x0000 (---------------) + I potenza + 0x00204382, // n0x0b31 c0x0000 (---------------) + I pr + 0x00269885, // n0x0b32 c0x0000 (---------------) + I prato + 0x002835c2, // n0x0b33 c0x0000 (---------------) + I pt + 0x00230482, // n0x0b34 c0x0000 (---------------) + I pu + 0x002711c3, // n0x0b35 c0x0000 (---------------) + I pug + 0x002711c6, // n0x0b36 c0x0000 (---------------) + I puglia + 0x002def02, // n0x0b37 c0x0000 (---------------) + I pv + 0x002df302, // n0x0b38 c0x0000 (---------------) + I pz + 0x00200482, // n0x0b39 c0x0000 (---------------) + I ra + 0x002bd286, // n0x0b3a c0x0000 (---------------) + I ragusa + 0x002a7a87, // n0x0b3b c0x0000 (---------------) + I ravenna + 0x002002c2, // n0x0b3c c0x0000 (---------------) + I rc + 0x00204d82, // n0x0b3d c0x0000 (---------------) + I re + 0x0034cecf, // n0x0b3e c0x0000 (---------------) + I reggio-calabria + 0x00302f4d, // n0x0b3f c0x0000 (---------------) + I reggio-emilia + 0x0024c40e, // n0x0b40 c0x0000 (---------------) + I reggiocalabria + 0x0027afcc, // n0x0b41 c0x0000 (---------------) + I reggioemilia + 0x00205542, // n0x0b42 c0x0000 (---------------) + I rg + 0x00201702, // n0x0b43 c0x0000 (---------------) + I ri + 0x00222685, // n0x0b44 c0x0000 (---------------) + I rieti + 0x002f8086, // n0x0b45 c0x0000 (---------------) + I rimini + 0x0020ed42, // n0x0b46 c0x0000 (---------------) + I rm + 0x00201902, // n0x0b47 c0x0000 (---------------) + I rn + 0x00200cc2, // n0x0b48 c0x0000 (---------------) + I ro + 0x00227784, // n0x0b49 c0x0000 (---------------) + I roma + 0x002dc984, // n0x0b4a c0x0000 (---------------) + I rome + 0x0032edc6, // n0x0b4b c0x0000 (---------------) + I rovigo + 0x00202402, // n0x0b4c c0x0000 (---------------) + I sa + 0x0027ba07, // n0x0b4d c0x0000 (---------------) + I salerno + 0x00220b83, // n0x0b4e c0x0000 (---------------) + I sar + 0x00223288, // n0x0b4f c0x0000 (---------------) + I sardegna + 0x00223c08, // n0x0b50 c0x0000 (---------------) + I sardinia + 0x00330387, // n0x0b51 c0x0000 (---------------) + I sassari + 0x0039c286, // n0x0b52 c0x0000 (---------------) + I savona + 0x0020ca82, // n0x0b53 c0x0000 (---------------) + I si + 0x00239f03, // n0x0b54 c0x0000 (---------------) + I sic + 0x002971c7, // n0x0b55 c0x0000 (---------------) + I sicilia + 0x0024bf86, // n0x0b56 c0x0000 (---------------) + I sicily + 0x002b8bc5, // n0x0b57 c0x0000 (---------------) + I siena + 0x003405c8, // n0x0b58 c0x0000 (---------------) + I siracusa + 0x00204c82, // n0x0b59 c0x0000 (---------------) + I so + 0x00310c07, // n0x0b5a c0x0000 (---------------) + I sondrio + 0x0021ff02, // n0x0b5b c0x0000 (---------------) + I sp + 0x00336d82, // n0x0b5c c0x0000 (---------------) + I sr + 0x00206982, // n0x0b5d c0x0000 (---------------) + I ss + 0x002cb789, // n0x0b5e c0x0000 (---------------) + I suedtirol + 0x0020ee82, // n0x0b5f c0x0000 (---------------) + I sv + 0x00201242, // n0x0b60 c0x0000 (---------------) + I ta + 0x00265fc3, // n0x0b61 c0x0000 (---------------) + I taa + 0x00324807, // n0x0b62 c0x0000 (---------------) + I taranto + 0x002012c2, // n0x0b63 c0x0000 (---------------) + I te + 0x00267acc, // n0x0b64 c0x0000 (---------------) + I tempio-olbia + 0x00267dcb, // n0x0b65 c0x0000 (---------------) + I tempioolbia + 0x0024fe46, // n0x0b66 c0x0000 (---------------) + I teramo + 0x0031b205, // n0x0b67 c0x0000 (---------------) + I terni + 0x00200942, // n0x0b68 c0x0000 (---------------) + I tn + 0x00207442, // n0x0b69 c0x0000 (---------------) + I to + 0x002abe46, // n0x0b6a c0x0000 (---------------) + I torino + 0x00242a83, // n0x0b6b c0x0000 (---------------) + I tos + 0x00321687, // n0x0b6c c0x0000 (---------------) + I toscana + 0x00214582, // n0x0b6d c0x0000 (---------------) + I tp + 0x00203642, // n0x0b6e c0x0000 (---------------) + I tr + 0x0026d615, // n0x0b6f c0x0000 (---------------) + I trani-andria-barletta + 0x00398a95, // n0x0b70 c0x0000 (---------------) + I trani-barletta-andria + 0x0039f053, // n0x0b71 c0x0000 (---------------) + I traniandriabarletta + 0x00398fd3, // n0x0b72 c0x0000 (---------------) + I tranibarlettaandria + 0x0028b787, // n0x0b73 c0x0000 (---------------) + I trapani + 0x002b52c8, // n0x0b74 c0x0000 (---------------) + I trentino + 0x00344190, // n0x0b75 c0x0000 (---------------) + I trentino-a-adige + 0x002e3c0f, // n0x0b76 c0x0000 (---------------) + I trentino-aadige + 0x00340f53, // n0x0b77 c0x0000 (---------------) + I trentino-alto-adige + 0x0034a792, // n0x0b78 c0x0000 (---------------) + I trentino-altoadige + 0x002ce090, // n0x0b79 c0x0000 (---------------) + I trentino-s-tirol + 0x002f938f, // n0x0b7a c0x0000 (---------------) + I trentino-stirol + 0x002b52d2, // n0x0b7b c0x0000 (---------------) + I trentino-sud-tirol + 0x002bfa11, // n0x0b7c c0x0000 (---------------) + I trentino-sudtirol + 0x002c8793, // n0x0b7d c0x0000 (---------------) + I trentino-sued-tirol + 0x002cb552, // n0x0b7e c0x0000 (---------------) + I trentino-suedtirol + 0x002cc38f, // n0x0b7f c0x0000 (---------------) + I trentinoa-adige + 0x002d0b4e, // n0x0b80 c0x0000 (---------------) + I trentinoaadige + 0x002d9012, // n0x0b81 c0x0000 (---------------) + I trentinoalto-adige + 0x002dd311, // n0x0b82 c0x0000 (---------------) + I trentinoaltoadige + 0x002ddb0f, // n0x0b83 c0x0000 (---------------) + I trentinos-tirol + 0x002def8e, // n0x0b84 c0x0000 (---------------) + I trentinostirol + 0x002df691, // n0x0b85 c0x0000 (---------------) + I trentinosud-tirol + 0x00315210, // n0x0b86 c0x0000 (---------------) + I trentinosudtirol + 0x00353c12, // n0x0b87 c0x0000 (---------------) + I trentinosued-tirol + 0x002e1b11, // n0x0b88 c0x0000 (---------------) + I trentinosuedtirol + 0x002f0046, // n0x0b89 c0x0000 (---------------) + I trento + 0x002ef307, // n0x0b8a c0x0000 (---------------) + I treviso + 0x003657c7, // n0x0b8b c0x0000 (---------------) + I trieste + 0x002023c2, // n0x0b8c c0x0000 (---------------) + I ts + 0x002770c5, // n0x0b8d c0x0000 (---------------) + I turin + 0x002e7f47, // n0x0b8e c0x0000 (---------------) + I tuscany + 0x00206fc2, // n0x0b8f c0x0000 (---------------) + I tv + 0x00204fc2, // n0x0b90 c0x0000 (---------------) + I ud + 0x00226bc5, // n0x0b91 c0x0000 (---------------) + I udine + 0x0021cac3, // n0x0b92 c0x0000 (---------------) + I umb + 0x00250886, // n0x0b93 c0x0000 (---------------) + I umbria + 0x002271cd, // n0x0b94 c0x0000 (---------------) + I urbino-pesaro + 0x0022750c, // n0x0b95 c0x0000 (---------------) + I urbinopesaro + 0x002000c2, // n0x0b96 c0x0000 (---------------) + I va + 0x0039d4cb, // n0x0b97 c0x0000 (---------------) + I val-d-aosta + 0x00213cca, // n0x0b98 c0x0000 (---------------) + I val-daosta + 0x00317a8a, // n0x0b99 c0x0000 (---------------) + I vald-aosta + 0x002ab089, // n0x0b9a c0x0000 (---------------) + I valdaosta + 0x002d7f4b, // n0x0b9b c0x0000 (---------------) + I valle-aosta + 0x002e864d, // n0x0b9c c0x0000 (---------------) + I valle-d-aosta + 0x002450cc, // n0x0b9d c0x0000 (---------------) + I valle-daosta + 0x00217d8a, // n0x0b9e c0x0000 (---------------) + I valleaosta + 0x00220d0c, // n0x0b9f c0x0000 (---------------) + I valled-aosta + 0x00338f4b, // n0x0ba0 c0x0000 (---------------) + I valledaosta + 0x00376a8c, // n0x0ba1 c0x0000 (---------------) + I vallee-aoste + 0x0023af0b, // n0x0ba2 c0x0000 (---------------) + I valleeaoste + 0x002678c3, // n0x0ba3 c0x0000 (---------------) + I vao + 0x0026e546, // n0x0ba4 c0x0000 (---------------) + I varese + 0x002d68c2, // n0x0ba5 c0x0000 (---------------) + I vb + 0x002dfb02, // n0x0ba6 c0x0000 (---------------) + I vc + 0x00211203, // n0x0ba7 c0x0000 (---------------) + I vda + 0x00202202, // n0x0ba8 c0x0000 (---------------) + I ve + 0x00203203, // n0x0ba9 c0x0000 (---------------) + I ven + 0x00366906, // n0x0baa c0x0000 (---------------) + I veneto + 0x00258487, // n0x0bab c0x0000 (---------------) + I venezia + 0x0023ce06, // n0x0bac c0x0000 (---------------) + I venice + 0x0022b008, // n0x0bad c0x0000 (---------------) + I verbania + 0x002cd988, // n0x0bae c0x0000 (---------------) + I vercelli + 0x00207006, // n0x0baf c0x0000 (---------------) + I verona + 0x00200642, // n0x0bb0 c0x0000 (---------------) + I vi + 0x002ea0cd, // n0x0bb1 c0x0000 (---------------) + I vibo-valentia + 0x002ea40c, // n0x0bb2 c0x0000 (---------------) + I vibovalentia + 0x002fa807, // n0x0bb3 c0x0000 (---------------) + I vicenza + 0x002f06c7, // n0x0bb4 c0x0000 (---------------) + I viterbo + 0x00208342, // n0x0bb5 c0x0000 (---------------) + I vr + 0x00238c02, // n0x0bb6 c0x0000 (---------------) + I vs + 0x00255c42, // n0x0bb7 c0x0000 (---------------) + I vt + 0x0025c902, // n0x0bb8 c0x0000 (---------------) + I vv + 0x00208182, // n0x0bb9 c0x0000 (---------------) + I co + 0x0021d8c3, // n0x0bba c0x0000 (---------------) + I net + 0x00229a83, // n0x0bbb c0x0000 (---------------) + I org + 0x0022edc3, // n0x0bbc c0x0000 (---------------) + I com + 0x002349c3, // n0x0bbd c0x0000 (---------------) + I edu + 0x00275003, // n0x0bbe c0x0000 (---------------) + I gov + 0x00215b43, // n0x0bbf c0x0000 (---------------) + I mil + 0x0027ca84, // n0x0bc0 c0x0000 (---------------) + I name + 0x0021d8c3, // n0x0bc1 c0x0000 (---------------) + I net + 0x00229a83, // n0x0bc2 c0x0000 (---------------) + I org + 0x00215d43, // n0x0bc3 c0x0000 (---------------) + I sch + 0x00205882, // n0x0bc4 c0x0000 (---------------) + I ac + 0x00203d82, // n0x0bc5 c0x0000 (---------------) + I ad + 0x1fa86b45, // n0x0bc6 c0x007e (n0x0c33-n0x0c67) + I aichi + 0x1fe1e685, // n0x0bc7 c0x007f (n0x0c67-n0x0c83) + I akita + 0x2030adc6, // n0x0bc8 c0x0080 (n0x0c83-n0x0c99) + I aomori + 0x000f5248, // n0x0bc9 c0x0000 (---------------) + blogspot + 0x206a7685, // n0x0bca c0x0081 (n0x0c99-n0x0cd3) + I chiba + 0x00208182, // n0x0bcb c0x0000 (---------------) + I co + 0x002003c2, // n0x0bcc c0x0000 (---------------) + I ed + 0x20b1ac45, // n0x0bcd c0x0082 (n0x0cd3-n0x0ce9) + I ehime + 0x20e75605, // n0x0bce c0x0083 (n0x0ce9-n0x0cf8) + I fukui + 0x21276447, // n0x0bcf c0x0084 (n0x0cf8-n0x0d37) + I fukuoka + 0x2167f209, // n0x0bd0 c0x0085 (n0x0d37-n0x0d6a) + I fukushima + 0x21aa4d04, // n0x0bd1 c0x0086 (n0x0d6a-n0x0d90) + I gifu + 0x00208502, // n0x0bd2 c0x0000 (---------------) + I go + 0x002089c2, // n0x0bd3 c0x0000 (---------------) + I gr + 0x21f47445, // n0x0bd4 c0x0087 (n0x0d90-n0x0db4) + I gunma + 0x2220cc49, // n0x0bd5 c0x0088 (n0x0db4-n0x0dcd) + I hiroshima + 0x22768608, // n0x0bd6 c0x0089 (n0x0dcd-n0x0e5b) + I hokkaido + 0x22aa35c5, // n0x0bd7 c0x008a (n0x0e5b-n0x0e89) + I hyogo + 0x22ebebc7, // n0x0bd8 c0x008b (n0x0e89-n0x0ebc) + I ibaraki + 0x2321af48, // n0x0bd9 c0x008c (n0x0ebc-n0x0ecf) + I ishikawa + 0x236d2505, // n0x0bda c0x008d (n0x0ecf-n0x0ef1) + I iwate + 0x23a00fc6, // n0x0bdb c0x008e (n0x0ef1-n0x0f00) + I kagawa + 0x23ec3e09, // n0x0bdc c0x008f (n0x0f00-n0x0f14) + I kagoshima + 0x242c8d08, // n0x0bdd c0x0090 (n0x0f14-n0x0f32) + I kanagawa + 0x246b3b88, // n0x0bde c0x0091 (n0x0f32-n0x0f33)* o I kawasaki + 0x24a93eca, // n0x0bdf c0x0092 (n0x0f33-n0x0f34)* o I kitakyushu + 0x24e437c4, // n0x0be0 c0x0093 (n0x0f34-n0x0f35)* o I kobe + 0x252c8f85, // n0x0be1 c0x0094 (n0x0f35-n0x0f54) + I kochi + 0x256b0408, // n0x0be2 c0x0095 (n0x0f54-n0x0f6e) + I kumamoto + 0x25ab8805, // n0x0be3 c0x0096 (n0x0f6e-n0x0f8d) + I kyoto + 0x00217282, // n0x0be4 c0x0000 (---------------) + I lg + 0x25e18d43, // n0x0be5 c0x0097 (n0x0f8d-n0x0fab) + I mie + 0x2629a146, // n0x0be6 c0x0098 (n0x0fab-n0x0fcc) + I miyagi + 0x2665d308, // n0x0be7 c0x0099 (n0x0fcc-n0x0fe7) + I miyazaki + 0x26b0f1c6, // n0x0be8 c0x009a (n0x0fe7-n0x1032) + I nagano + 0x26ecd608, // n0x0be9 c0x009b (n0x1032-n0x1048) + I nagasaki + 0x2722d886, // n0x0bea c0x009c (n0x1048-n0x1049)* o I nagoya + 0x276b8c84, // n0x0beb c0x009d (n0x1049-n0x106f) + I nara + 0x00203282, // n0x0bec c0x0000 (---------------) + I ne + 0x27b6b607, // n0x0bed c0x009e (n0x106f-n0x1091) + I niigata + 0x27e9ed44, // n0x0bee c0x009f (n0x1091-n0x10a4) + I oita + 0x28271747, // n0x0bef c0x00a0 (n0x10a4-n0x10be) + I okayama + 0x28790f07, // n0x0bf0 c0x00a1 (n0x10be-n0x10e8) + I okinawa + 0x00200282, // n0x0bf1 c0x0000 (---------------) + I or + 0x28a91e85, // n0x0bf2 c0x00a2 (n0x10e8-n0x111a) + I osaka + 0x28f5a904, // n0x0bf3 c0x00a3 (n0x111a-n0x1134) + I saga + 0x292ecc47, // n0x0bf4 c0x00a4 (n0x1134-n0x1179) + I saitama + 0x296204c7, // n0x0bf5 c0x00a5 (n0x1179-n0x117a)* o I sapporo + 0x29a796c6, // n0x0bf6 c0x00a6 (n0x117a-n0x117b)* o I sendai + 0x29e6ff45, // n0x0bf7 c0x00a7 (n0x117b-n0x1192) + I shiga + 0x2a28ab47, // n0x0bf8 c0x00a8 (n0x1192-n0x11a9) + I shimane + 0x2a6f2e48, // n0x0bf9 c0x00a9 (n0x11a9-n0x11cd) + I shizuoka + 0x2ab42447, // n0x0bfa c0x00aa (n0x11cd-n0x11ec) + I tochigi + 0x2ae85d89, // n0x0bfb c0x00ab (n0x11ec-n0x11fd) + I tokushima + 0x2b2ef045, // n0x0bfc c0x00ac (n0x11fd-n0x1236) + I tokyo + 0x2b6f0147, // n0x0bfd c0x00ad (n0x1236-n0x1243) + I tottori + 0x2ba86046, // n0x0bfe c0x00ae (n0x1243-n0x125b) + I toyama + 0x2bf3da48, // n0x0bff c0x00af (n0x125b-n0x1278) + I wakayama + 0x0034efcd, // n0x0c00 c0x0000 (---------------) + I xn--0trq7p7nn + 0x00241b49, // n0x0c01 c0x0000 (---------------) + I xn--1ctwo + 0x0024b90b, // n0x0c02 c0x0000 (---------------) + I xn--1lqs03n + 0x0025520b, // n0x0c03 c0x0000 (---------------) + I xn--1lqs71d + 0x0026bb8b, // n0x0c04 c0x0000 (---------------) + I xn--2m4a15e + 0x0029c70b, // n0x0c05 c0x0000 (---------------) + I xn--32vp30h + 0x002f898b, // n0x0c06 c0x0000 (---------------) + I xn--4it168d + 0x002f8c4b, // n0x0c07 c0x0000 (---------------) + I xn--4it797k + 0x002f9749, // n0x0c08 c0x0000 (---------------) + I xn--4pvxs + 0x002faf0b, // n0x0c09 c0x0000 (---------------) + I xn--5js045d + 0x002fb1cb, // n0x0c0a c0x0000 (---------------) + I xn--5rtp49c + 0x002fb68b, // n0x0c0b c0x0000 (---------------) + I xn--5rtq34k + 0x002fc18a, // n0x0c0c c0x0000 (---------------) + I xn--6btw5a + 0x002fc6ca, // n0x0c0d c0x0000 (---------------) + I xn--6orx2r + 0x002fcccc, // n0x0c0e c0x0000 (---------------) + I xn--7t0a264c + 0x003042cb, // n0x0c0f c0x0000 (---------------) + I xn--8ltr62k + 0x00304c0a, // n0x0c10 c0x0000 (---------------) + I xn--8pvr4u + 0x0031874a, // n0x0c11 c0x0000 (---------------) + I xn--c3s14m + 0x0032550e, // n0x0c12 c0x0000 (---------------) + I xn--d5qv7z876c + 0x0032640e, // n0x0c13 c0x0000 (---------------) + I xn--djrs72d6uy + 0x0032678a, // n0x0c14 c0x0000 (---------------) + I xn--djty4k + 0x00327d0a, // n0x0c15 c0x0000 (---------------) + I xn--efvn9s + 0x003289cb, // n0x0c16 c0x0000 (---------------) + I xn--ehqz56n + 0x00328c8b, // n0x0c17 c0x0000 (---------------) + I xn--elqq16h + 0x0032978b, // n0x0c18 c0x0000 (---------------) + I xn--f6qx53a + 0x0034458b, // n0x0c19 c0x0000 (---------------) + I xn--k7yn95e + 0x00344b8a, // n0x0c1a c0x0000 (---------------) + I xn--kbrq7o + 0x0034584b, // n0x0c1b c0x0000 (---------------) + I xn--klt787d + 0x00345b0a, // n0x0c1c c0x0000 (---------------) + I xn--kltp7d + 0x00345d8a, // n0x0c1d c0x0000 (---------------) + I xn--kltx9a + 0x0034600a, // n0x0c1e c0x0000 (---------------) + I xn--klty5x + 0x0036628b, // n0x0c1f c0x0000 (---------------) + I xn--mkru45i + 0x0036e10b, // n0x0c20 c0x0000 (---------------) + I xn--nit225k + 0x0036fb8e, // n0x0c21 c0x0000 (---------------) + I xn--ntso0iqx3a + 0x0036ff0b, // n0x0c22 c0x0000 (---------------) + I xn--ntsq17g + 0x0037604b, // n0x0c23 c0x0000 (---------------) + I xn--pssu33l + 0x0037748b, // n0x0c24 c0x0000 (---------------) + I xn--qqqt11m + 0x0037c34a, // n0x0c25 c0x0000 (---------------) + I xn--rht27z + 0x0037c5c9, // n0x0c26 c0x0000 (---------------) + I xn--rht3d + 0x0037c80a, // n0x0c27 c0x0000 (---------------) + I xn--rht61e + 0x0037de8a, // n0x0c28 c0x0000 (---------------) + I xn--rny31h + 0x0038e5cb, // n0x0c29 c0x0000 (---------------) + I xn--tor131o + 0x0039010b, // n0x0c2a c0x0000 (---------------) + I xn--uist22h + 0x0039084a, // n0x0c2b c0x0000 (---------------) + I xn--uisz3g + 0x00391d0b, // n0x0c2c c0x0000 (---------------) + I xn--uuwu58a + 0x00397f0b, // n0x0c2d c0x0000 (---------------) + I xn--vgu402c + 0x003a1e0b, // n0x0c2e c0x0000 (---------------) + I xn--zbx025d + 0x2c277b48, // n0x0c2f c0x00b0 (n0x1278-n0x129a) + I yamagata + 0x2c6806c9, // n0x0c30 c0x00b1 (n0x129a-n0x12aa) + I yamaguchi + 0x2ca98d49, // n0x0c31 c0x00b2 (n0x12aa-n0x12c6) + I yamanashi + 0x2ce4d248, // n0x0c32 c0x00b3 (n0x12c6-n0x12c7)* o I yokohama + 0x0032eb45, // n0x0c33 c0x0000 (---------------) + I aisai + 0x00201383, // n0x0c34 c0x0000 (---------------) + I ama + 0x0020a0c4, // n0x0c35 c0x0000 (---------------) + I anjo + 0x002bb7c5, // n0x0c36 c0x0000 (---------------) + I asuke + 0x002a4a46, // n0x0c37 c0x0000 (---------------) + I chiryu + 0x002a6585, // n0x0c38 c0x0000 (---------------) + I chita + 0x0027ecc4, // n0x0c39 c0x0000 (---------------) + I fuso + 0x00372bc8, // n0x0c3a c0x0000 (---------------) + I gamagori + 0x0024e385, // n0x0c3b c0x0000 (---------------) + I handa + 0x00288284, // n0x0c3c c0x0000 (---------------) + I hazu + 0x002c0347, // n0x0c3d c0x0000 (---------------) + I hekinan + 0x0029480a, // n0x0c3e c0x0000 (---------------) + I higashiura + 0x002c394a, // n0x0c3f c0x0000 (---------------) + I ichinomiya + 0x003281c7, // n0x0c40 c0x0000 (---------------) + I inazawa + 0x0039dc07, // n0x0c41 c0x0000 (---------------) + I inuyama + 0x002e6c07, // n0x0c42 c0x0000 (---------------) + I isshiki + 0x0035a5c7, // n0x0c43 c0x0000 (---------------) + I iwakura + 0x002c5e45, // n0x0c44 c0x0000 (---------------) + I kanie + 0x002568c6, // n0x0c45 c0x0000 (---------------) + I kariya + 0x00300307, // n0x0c46 c0x0000 (---------------) + I kasugai + 0x00249e04, // n0x0c47 c0x0000 (---------------) + I kira + 0x002f2b86, // n0x0c48 c0x0000 (---------------) + I kiyosu + 0x00287986, // n0x0c49 c0x0000 (---------------) + I komaki + 0x0020d205, // n0x0c4a c0x0000 (---------------) + I konan + 0x00224c84, // n0x0c4b c0x0000 (---------------) + I kota + 0x0028d806, // n0x0c4c c0x0000 (---------------) + I mihama + 0x00293a07, // n0x0c4d c0x0000 (---------------) + I miyoshi + 0x0022aa06, // n0x0c4e c0x0000 (---------------) + I nishio + 0x002a94c7, // n0x0c4f c0x0000 (---------------) + I nisshin + 0x00227f83, // n0x0c50 c0x0000 (---------------) + I obu + 0x0024a8c6, // n0x0c51 c0x0000 (---------------) + I oguchi + 0x00232745, // n0x0c52 c0x0000 (---------------) + I oharu + 0x00276547, // n0x0c53 c0x0000 (---------------) + I okazaki + 0x002b8f4a, // n0x0c54 c0x0000 (---------------) + I owariasahi + 0x002a8f44, // n0x0c55 c0x0000 (---------------) + I seto + 0x00219388, // n0x0c56 c0x0000 (---------------) + I shikatsu + 0x0037ee49, // n0x0c57 c0x0000 (---------------) + I shinshiro + 0x002a8987, // n0x0c58 c0x0000 (---------------) + I shitara + 0x002e1486, // n0x0c59 c0x0000 (---------------) + I tahara + 0x0035a388, // n0x0c5a c0x0000 (---------------) + I takahama + 0x00307e09, // n0x0c5b c0x0000 (---------------) + I tobishima + 0x0036b804, // n0x0c5c c0x0000 (---------------) + I toei + 0x002f6a44, // n0x0c5d c0x0000 (---------------) + I togo + 0x002f1405, // n0x0c5e c0x0000 (---------------) + I tokai + 0x002b9648, // n0x0c5f c0x0000 (---------------) + I tokoname + 0x002ba487, // n0x0c60 c0x0000 (---------------) + I toyoake + 0x0027f8c9, // n0x0c61 c0x0000 (---------------) + I toyohashi + 0x00241608, // n0x0c62 c0x0000 (---------------) + I toyokawa + 0x00364dc6, // n0x0c63 c0x0000 (---------------) + I toyone + 0x00254b06, // n0x0c64 c0x0000 (---------------) + I toyota + 0x0028e448, // n0x0c65 c0x0000 (---------------) + I tsushima + 0x003693c6, // n0x0c66 c0x0000 (---------------) + I yatomi + 0x0021e685, // n0x0c67 c0x0000 (---------------) + I akita + 0x00279786, // n0x0c68 c0x0000 (---------------) + I daisen + 0x00271d08, // n0x0c69 c0x0000 (---------------) + I fujisato + 0x00234dc6, // n0x0c6a c0x0000 (---------------) + I gojome + 0x00248ccb, // n0x0c6b c0x0000 (---------------) + I hachirogata + 0x00283106, // n0x0c6c c0x0000 (---------------) + I happou + 0x0029084d, // n0x0c6d c0x0000 (---------------) + I higashinaruse + 0x00201785, // n0x0c6e c0x0000 (---------------) + I honjo + 0x0029ec06, // n0x0c6f c0x0000 (---------------) + I honjyo + 0x0021b005, // n0x0c70 c0x0000 (---------------) + I ikawa + 0x00286509, // n0x0c71 c0x0000 (---------------) + I kamikoani + 0x002e3107, // n0x0c72 c0x0000 (---------------) + I kamioka + 0x0034e208, // n0x0c73 c0x0000 (---------------) + I katagami + 0x0025f246, // n0x0c74 c0x0000 (---------------) + I kazuno + 0x0028f209, // n0x0c75 c0x0000 (---------------) + I kitaakita + 0x002dc706, // n0x0c76 c0x0000 (---------------) + I kosaka + 0x002b8ec5, // n0x0c77 c0x0000 (---------------) + I kyowa + 0x002964c6, // n0x0c78 c0x0000 (---------------) + I misato + 0x0029dec6, // n0x0c79 c0x0000 (---------------) + I mitane + 0x002c4ac9, // n0x0c7a c0x0000 (---------------) + I moriyoshi + 0x0034ea46, // n0x0c7b c0x0000 (---------------) + I nikaho + 0x0024a547, // n0x0c7c c0x0000 (---------------) + I noshiro + 0x003286c5, // n0x0c7d c0x0000 (---------------) + I odate + 0x00203083, // n0x0c7e c0x0000 (---------------) + I oga + 0x00222a85, // n0x0c7f c0x0000 (---------------) + I ogata + 0x0029cdc7, // n0x0c80 c0x0000 (---------------) + I semboku + 0x00309fc6, // n0x0c81 c0x0000 (---------------) + I yokote + 0x00201689, // n0x0c82 c0x0000 (---------------) + I yurihonjo + 0x0030adc6, // n0x0c83 c0x0000 (---------------) + I aomori + 0x00248686, // n0x0c84 c0x0000 (---------------) + I gonohe + 0x00205849, // n0x0c85 c0x0000 (---------------) + I hachinohe + 0x00279189, // n0x0c86 c0x0000 (---------------) + I hashikami + 0x00296c47, // n0x0c87 c0x0000 (---------------) + I hiranai + 0x00324188, // n0x0c88 c0x0000 (---------------) + I hirosaki + 0x00261849, // n0x0c89 c0x0000 (---------------) + I itayanagi + 0x00276d48, // n0x0c8a c0x0000 (---------------) + I kuroishi + 0x0036d986, // n0x0c8b c0x0000 (---------------) + I misawa + 0x002ccb45, // n0x0c8c c0x0000 (---------------) + I mutsu + 0x0023a58a, // n0x0c8d c0x0000 (---------------) + I nakadomari + 0x00248706, // n0x0c8e c0x0000 (---------------) + I noheji + 0x00300ac6, // n0x0c8f c0x0000 (---------------) + I oirase + 0x0029a305, // n0x0c90 c0x0000 (---------------) + I owani + 0x002a5048, // n0x0c91 c0x0000 (---------------) + I rokunohe + 0x0020c887, // n0x0c92 c0x0000 (---------------) + I sannohe + 0x0023160a, // n0x0c93 c0x0000 (---------------) + I shichinohe + 0x00248586, // n0x0c94 c0x0000 (---------------) + I shingo + 0x00339185, // n0x0c95 c0x0000 (---------------) + I takko + 0x00256286, // n0x0c96 c0x0000 (---------------) + I towada + 0x002880c7, // n0x0c97 c0x0000 (---------------) + I tsugaru + 0x002e1347, // n0x0c98 c0x0000 (---------------) + I tsuruta + 0x00380305, // n0x0c99 c0x0000 (---------------) + I abiko + 0x002b9085, // n0x0c9a c0x0000 (---------------) + I asahi + 0x002dfb46, // n0x0c9b c0x0000 (---------------) + I chonan + 0x002f6146, // n0x0c9c c0x0000 (---------------) + I chosei + 0x003a2886, // n0x0c9d c0x0000 (---------------) + I choshi + 0x00359404, // n0x0c9e c0x0000 (---------------) + I chuo + 0x00278249, // n0x0c9f c0x0000 (---------------) + I funabashi + 0x00281586, // n0x0ca0 c0x0000 (---------------) + I futtsu + 0x00279d4a, // n0x0ca1 c0x0000 (---------------) + I hanamigawa + 0x00286b88, // n0x0ca2 c0x0000 (---------------) + I ichihara + 0x003335c8, // n0x0ca3 c0x0000 (---------------) + I ichikawa + 0x002c394a, // n0x0ca4 c0x0000 (---------------) + I ichinomiya + 0x0020c145, // n0x0ca5 c0x0000 (---------------) + I inzai + 0x00293945, // n0x0ca6 c0x0000 (---------------) + I isumi + 0x00264508, // n0x0ca7 c0x0000 (---------------) + I kamagaya + 0x002c4d48, // n0x0ca8 c0x0000 (---------------) + I kamogawa + 0x00310787, // n0x0ca9 c0x0000 (---------------) + I kashiwa + 0x0028bb06, // n0x0caa c0x0000 (---------------) + I katori + 0x00314048, // n0x0cab c0x0000 (---------------) + I katsuura + 0x00229407, // n0x0cac c0x0000 (---------------) + I kimitsu + 0x00277448, // n0x0cad c0x0000 (---------------) + I kisarazu + 0x00368b46, // n0x0cae c0x0000 (---------------) + I kozaki + 0x0027a308, // n0x0caf c0x0000 (---------------) + I kujukuri + 0x0028a086, // n0x0cb0 c0x0000 (---------------) + I kyonan + 0x00237c47, // n0x0cb1 c0x0000 (---------------) + I matsudo + 0x0028fc46, // n0x0cb2 c0x0000 (---------------) + I midori + 0x0028d806, // n0x0cb3 c0x0000 (---------------) + I mihama + 0x0033078a, // n0x0cb4 c0x0000 (---------------) + I minamiboso + 0x0022f586, // n0x0cb5 c0x0000 (---------------) + I mobara + 0x002ccb49, // n0x0cb6 c0x0000 (---------------) + I mutsuzawa + 0x002a7986, // n0x0cb7 c0x0000 (---------------) + I nagara + 0x002a7bca, // n0x0cb8 c0x0000 (---------------) + I nagareyama + 0x002b8c89, // n0x0cb9 c0x0000 (---------------) + I narashino + 0x00357906, // n0x0cba c0x0000 (---------------) + I narita + 0x00383dc4, // n0x0cbb c0x0000 (---------------) + I noda + 0x00307b4d, // n0x0cbc c0x0000 (---------------) + I oamishirasato + 0x00280947, // n0x0cbd c0x0000 (---------------) + I omigawa + 0x00306346, // n0x0cbe c0x0000 (---------------) + I onjuku + 0x002b3a45, // n0x0cbf c0x0000 (---------------) + I otaki + 0x002dc785, // n0x0cc0 c0x0000 (---------------) + I sakae + 0x002fe346, // n0x0cc1 c0x0000 (---------------) + I sakura + 0x002859c9, // n0x0cc2 c0x0000 (---------------) + I shimofusa + 0x0029afc7, // n0x0cc3 c0x0000 (---------------) + I shirako + 0x00272946, // n0x0cc4 c0x0000 (---------------) + I shiroi + 0x002d41c6, // n0x0cc5 c0x0000 (---------------) + I shisui + 0x0027ed49, // n0x0cc6 c0x0000 (---------------) + I sodegaura + 0x0021e5c4, // n0x0cc7 c0x0000 (---------------) + I sosa + 0x002a5b04, // n0x0cc8 c0x0000 (---------------) + I tako + 0x00201248, // n0x0cc9 c0x0000 (---------------) + I tateyama + 0x00366cc6, // n0x0cca c0x0000 (---------------) + I togane + 0x002965c8, // n0x0ccb c0x0000 (---------------) + I tohnosho + 0x002eeec8, // n0x0ccc c0x0000 (---------------) + I tomisato + 0x0026aa47, // n0x0ccd c0x0000 (---------------) + I urayasu + 0x003a3249, // n0x0cce c0x0000 (---------------) + I yachimata + 0x003a2a87, // n0x0ccf c0x0000 (---------------) + I yachiyo + 0x002a754a, // n0x0cd0 c0x0000 (---------------) + I yokaichiba + 0x0022fc8f, // n0x0cd1 c0x0000 (---------------) + I yokoshibahikari + 0x0025ddca, // n0x0cd2 c0x0000 (---------------) + I yotsukaido + 0x00222485, // n0x0cd3 c0x0000 (---------------) + I ainan + 0x00271f45, // n0x0cd4 c0x0000 (---------------) + I honai + 0x002181c5, // n0x0cd5 c0x0000 (---------------) + I ikata + 0x00308407, // n0x0cd6 c0x0000 (---------------) + I imabari + 0x00273f43, // n0x0cd7 c0x0000 (---------------) + I iyo + 0x00324388, // n0x0cd8 c0x0000 (---------------) + I kamijima + 0x002ead06, // n0x0cd9 c0x0000 (---------------) + I kihoku + 0x002eae09, // n0x0cda c0x0000 (---------------) + I kumakogen + 0x002fa006, // n0x0cdb c0x0000 (---------------) + I masaki + 0x002c4907, // n0x0cdc c0x0000 (---------------) + I matsuno + 0x0028efc9, // n0x0cdd c0x0000 (---------------) + I matsuyama + 0x0034e108, // n0x0cde c0x0000 (---------------) + I namikata + 0x0029a3c7, // n0x0cdf c0x0000 (---------------) + I niihama + 0x002f6fc3, // n0x0ce0 c0x0000 (---------------) + I ozu + 0x0032ebc5, // n0x0ce1 c0x0000 (---------------) + I saijo + 0x0035b6c5, // n0x0ce2 c0x0000 (---------------) + I seiyo + 0x0035924b, // n0x0ce3 c0x0000 (---------------) + I shikokuchuo + 0x002b88c4, // n0x0ce4 c0x0000 (---------------) + I tobe + 0x002d40c4, // n0x0ce5 c0x0000 (---------------) + I toon + 0x00270a06, // n0x0ce6 c0x0000 (---------------) + I uchiko + 0x002f7347, // n0x0ce7 c0x0000 (---------------) + I uwajima + 0x0038a64a, // n0x0ce8 c0x0000 (---------------) + I yawatahama + 0x0023d687, // n0x0ce9 c0x0000 (---------------) + I echizen + 0x0036b887, // n0x0cea c0x0000 (---------------) + I eiheiji + 0x00275605, // n0x0ceb c0x0000 (---------------) + I fukui + 0x00202b85, // n0x0cec c0x0000 (---------------) + I ikeda + 0x0020d6c9, // n0x0ced c0x0000 (---------------) + I katsuyama + 0x0028d806, // n0x0cee c0x0000 (---------------) + I mihama + 0x0023d50d, // n0x0cef c0x0000 (---------------) + I minamiechizen + 0x003912c5, // n0x0cf0 c0x0000 (---------------) + I obama + 0x002967c3, // n0x0cf1 c0x0000 (---------------) + I ohi + 0x0020e703, // n0x0cf2 c0x0000 (---------------) + I ono + 0x002eb685, // n0x0cf3 c0x0000 (---------------) + I sabae + 0x003487c5, // n0x0cf4 c0x0000 (---------------) + I sakai + 0x0035a388, // n0x0cf5 c0x0000 (---------------) + I takahama + 0x00273607, // n0x0cf6 c0x0000 (---------------) + I tsuruga + 0x002a5886, // n0x0cf7 c0x0000 (---------------) + I wakasa + 0x00294ec6, // n0x0cf8 c0x0000 (---------------) + I ashiya + 0x00227fc5, // n0x0cf9 c0x0000 (---------------) + I buzen + 0x00234c87, // n0x0cfa c0x0000 (---------------) + I chikugo + 0x0039de87, // n0x0cfb c0x0000 (---------------) + I chikuho + 0x0020b747, // n0x0cfc c0x0000 (---------------) + I chikujo + 0x002c900a, // n0x0cfd c0x0000 (---------------) + I chikushino + 0x0024a988, // n0x0cfe c0x0000 (---------------) + I chikuzen + 0x00359404, // n0x0cff c0x0000 (---------------) + I chuo + 0x0025ca87, // n0x0d00 c0x0000 (---------------) + I dazaifu + 0x002748c7, // n0x0d01 c0x0000 (---------------) + I fukuchi + 0x0030bb06, // n0x0d02 c0x0000 (---------------) + I hakata + 0x00260407, // n0x0d03 c0x0000 (---------------) + I higashi + 0x002c2c08, // n0x0d04 c0x0000 (---------------) + I hirokawa + 0x00298c48, // n0x0d05 c0x0000 (---------------) + I hisayama + 0x00260a06, // n0x0d06 c0x0000 (---------------) + I iizuka + 0x00322f48, // n0x0d07 c0x0000 (---------------) + I inatsuki + 0x002c5484, // n0x0d08 c0x0000 (---------------) + I kaho + 0x00300306, // n0x0d09 c0x0000 (---------------) + I kasuga + 0x00394686, // n0x0d0a c0x0000 (---------------) + I kasuya + 0x0031a406, // n0x0d0b c0x0000 (---------------) + I kawara + 0x0027cc86, // n0x0d0c c0x0000 (---------------) + I keisen + 0x00223544, // n0x0d0d c0x0000 (---------------) + I koga + 0x0035a686, // n0x0d0e c0x0000 (---------------) + I kurate + 0x002b2ac6, // n0x0d0f c0x0000 (---------------) + I kurogi + 0x0028dbc6, // n0x0d10 c0x0000 (---------------) + I kurume + 0x00236f86, // n0x0d11 c0x0000 (---------------) + I minami + 0x0020e5c6, // n0x0d12 c0x0000 (---------------) + I miyako + 0x002c2a46, // n0x0d13 c0x0000 (---------------) + I miyama + 0x002a5788, // n0x0d14 c0x0000 (---------------) + I miyawaka + 0x003533c8, // n0x0d15 c0x0000 (---------------) + I mizumaki + 0x002c9bc8, // n0x0d16 c0x0000 (---------------) + I munakata + 0x002a6788, // n0x0d17 c0x0000 (---------------) + I nakagawa + 0x00264486, // n0x0d18 c0x0000 (---------------) + I nakama + 0x002123c5, // n0x0d19 c0x0000 (---------------) + I nishi + 0x00222a46, // n0x0d1a c0x0000 (---------------) + I nogata + 0x002a3645, // n0x0d1b c0x0000 (---------------) + I ogori + 0x0037b787, // n0x0d1c c0x0000 (---------------) + I okagaki + 0x002416c5, // n0x0d1d c0x0000 (---------------) + I okawa + 0x00214a43, // n0x0d1e c0x0000 (---------------) + I oki + 0x00201f05, // n0x0d1f c0x0000 (---------------) + I omuta + 0x00312384, // n0x0d20 c0x0000 (---------------) + I onga + 0x0020e705, // n0x0d21 c0x0000 (---------------) + I onojo + 0x00215103, // n0x0d22 c0x0000 (---------------) + I oto + 0x002d7787, // n0x0d23 c0x0000 (---------------) + I saigawa + 0x00343e48, // n0x0d24 c0x0000 (---------------) + I sasaguri + 0x002a9586, // n0x0d25 c0x0000 (---------------) + I shingu + 0x0028d0cd, // n0x0d26 c0x0000 (---------------) + I shinyoshitomi + 0x00271f06, // n0x0d27 c0x0000 (---------------) + I shonai + 0x0028c585, // n0x0d28 c0x0000 (---------------) + I soeda + 0x00260c43, // n0x0d29 c0x0000 (---------------) + I sue + 0x002afdc9, // n0x0d2a c0x0000 (---------------) + I tachiarai + 0x002bed86, // n0x0d2b c0x0000 (---------------) + I tagawa + 0x0028cb86, // n0x0d2c c0x0000 (---------------) + I takata + 0x002fef04, // n0x0d2d c0x0000 (---------------) + I toho + 0x0025dd47, // n0x0d2e c0x0000 (---------------) + I toyotsu + 0x00236606, // n0x0d2f c0x0000 (---------------) + I tsuiki + 0x002a4e85, // n0x0d30 c0x0000 (---------------) + I ukiha + 0x00210603, // n0x0d31 c0x0000 (---------------) + I umi + 0x00206884, // n0x0d32 c0x0000 (---------------) + I usui + 0x00274a86, // n0x0d33 c0x0000 (---------------) + I yamada + 0x002924c4, // n0x0d34 c0x0000 (---------------) + I yame + 0x0030d248, // n0x0d35 c0x0000 (---------------) + I yanagawa + 0x0039d909, // n0x0d36 c0x0000 (---------------) + I yukuhashi + 0x002e3609, // n0x0d37 c0x0000 (---------------) + I aizubange + 0x002963ca, // n0x0d38 c0x0000 (---------------) + I aizumisato + 0x0022c10d, // n0x0d39 c0x0000 (---------------) + I aizuwakamatsu + 0x0024cdc7, // n0x0d3a c0x0000 (---------------) + I asakawa + 0x00300946, // n0x0d3b c0x0000 (---------------) + I bandai + 0x00205dc4, // n0x0d3c c0x0000 (---------------) + I date + 0x0027f209, // n0x0d3d c0x0000 (---------------) + I fukushima + 0x0027e188, // n0x0d3e c0x0000 (---------------) + I furudono + 0x00280546, // n0x0d3f c0x0000 (---------------) + I futaba + 0x00253546, // n0x0d40 c0x0000 (---------------) + I hanawa + 0x00260407, // n0x0d41 c0x0000 (---------------) + I higashi + 0x002edcc6, // n0x0d42 c0x0000 (---------------) + I hirata + 0x0021d386, // n0x0d43 c0x0000 (---------------) + I hirono + 0x002fe4c6, // n0x0d44 c0x0000 (---------------) + I iitate + 0x00390f8a, // n0x0d45 c0x0000 (---------------) + I inawashiro + 0x0021af48, // n0x0d46 c0x0000 (---------------) + I ishikawa + 0x0025ef45, // n0x0d47 c0x0000 (---------------) + I iwaki + 0x0026a789, // n0x0d48 c0x0000 (---------------) + I izumizaki + 0x002bac0a, // n0x0d49 c0x0000 (---------------) + I kagamiishi + 0x0021b1c8, // n0x0d4a c0x0000 (---------------) + I kaneyama + 0x00292e48, // n0x0d4b c0x0000 (---------------) + I kawamata + 0x0028cb08, // n0x0d4c c0x0000 (---------------) + I kitakata + 0x0039e28c, // n0x0d4d c0x0000 (---------------) + I kitashiobara + 0x002d5e45, // n0x0d4e c0x0000 (---------------) + I koori + 0x00295148, // n0x0d4f c0x0000 (---------------) + I koriyama + 0x00304986, // n0x0d50 c0x0000 (---------------) + I kunimi + 0x0029e646, // n0x0d51 c0x0000 (---------------) + I miharu + 0x0039fb87, // n0x0d52 c0x0000 (---------------) + I mishima + 0x0023d585, // n0x0d53 c0x0000 (---------------) + I namie + 0x00279905, // n0x0d54 c0x0000 (---------------) + I nango + 0x002e34c9, // n0x0d55 c0x0000 (---------------) + I nishiaizu + 0x002143c7, // n0x0d56 c0x0000 (---------------) + I nishigo + 0x002eadc5, // n0x0d57 c0x0000 (---------------) + I okuma + 0x0021e2c7, // n0x0d58 c0x0000 (---------------) + I omotego + 0x0020e703, // n0x0d59 c0x0000 (---------------) + I ono + 0x002bb0c5, // n0x0d5a c0x0000 (---------------) + I otama + 0x00396b48, // n0x0d5b c0x0000 (---------------) + I samegawa + 0x002a9d47, // n0x0d5c c0x0000 (---------------) + I shimogo + 0x00292d09, // n0x0d5d c0x0000 (---------------) + I shirakawa + 0x002ab745, // n0x0d5e c0x0000 (---------------) + I showa + 0x002ef804, // n0x0d5f c0x0000 (---------------) + I soma + 0x00297648, // n0x0d60 c0x0000 (---------------) + I sukagawa + 0x00213007, // n0x0d61 c0x0000 (---------------) + I taishin + 0x0029a588, // n0x0d62 c0x0000 (---------------) + I tamakawa + 0x0030a508, // n0x0d63 c0x0000 (---------------) + I tanagura + 0x002ed285, // n0x0d64 c0x0000 (---------------) + I tenei + 0x0034c806, // n0x0d65 c0x0000 (---------------) + I yabuki + 0x0021ec86, // n0x0d66 c0x0000 (---------------) + I yamato + 0x00349109, // n0x0d67 c0x0000 (---------------) + I yamatsuri + 0x003148c7, // n0x0d68 c0x0000 (---------------) + I yanaizu + 0x002a3f06, // n0x0d69 c0x0000 (---------------) + I yugawa + 0x00283687, // n0x0d6a c0x0000 (---------------) + I anpachi + 0x00201d83, // n0x0d6b c0x0000 (---------------) + I ena + 0x002a4d04, // n0x0d6c c0x0000 (---------------) + I gifu + 0x00297f85, // n0x0d6d c0x0000 (---------------) + I ginan + 0x002ebe44, // n0x0d6e c0x0000 (---------------) + I godo + 0x0022e444, // n0x0d6f c0x0000 (---------------) + I gujo + 0x00277dc7, // n0x0d70 c0x0000 (---------------) + I hashima + 0x00210a07, // n0x0d71 c0x0000 (---------------) + I hichiso + 0x00254984, // n0x0d72 c0x0000 (---------------) + I hida + 0x00292b50, // n0x0d73 c0x0000 (---------------) + I higashishirakawa + 0x0031adc7, // n0x0d74 c0x0000 (---------------) + I ibigawa + 0x00202b85, // n0x0d75 c0x0000 (---------------) + I ikeda + 0x002c414c, // n0x0d76 c0x0000 (---------------) + I kakamigahara + 0x0027bf84, // n0x0d77 c0x0000 (---------------) + I kani + 0x002892c8, // n0x0d78 c0x0000 (---------------) + I kasahara + 0x00237b49, // n0x0d79 c0x0000 (---------------) + I kasamatsu + 0x002f8806, // n0x0d7a c0x0000 (---------------) + I kawaue + 0x0021e6c8, // n0x0d7b c0x0000 (---------------) + I kitagata + 0x00248084, // n0x0d7c c0x0000 (---------------) + I mino + 0x00248088, // n0x0d7d c0x0000 (---------------) + I minokamo + 0x002b9d86, // n0x0d7e c0x0000 (---------------) + I mitake + 0x00352348, // n0x0d7f c0x0000 (---------------) + I mizunami + 0x00297c86, // n0x0d80 c0x0000 (---------------) + I motosu + 0x0020efcb, // n0x0d81 c0x0000 (---------------) + I nakatsugawa + 0x00203085, // n0x0d82 c0x0000 (---------------) + I ogaki + 0x002c5408, // n0x0d83 c0x0000 (---------------) + I sakahogi + 0x00216944, // n0x0d84 c0x0000 (---------------) + I seki + 0x00278e0a, // n0x0d85 c0x0000 (---------------) + I sekigahara + 0x00292d09, // n0x0d86 c0x0000 (---------------) + I shirakawa + 0x00331246, // n0x0d87 c0x0000 (---------------) + I tajimi + 0x002b98c8, // n0x0d88 c0x0000 (---------------) + I takayama + 0x0026c945, // n0x0d89 c0x0000 (---------------) + I tarui + 0x00221b44, // n0x0d8a c0x0000 (---------------) + I toki + 0x002891c6, // n0x0d8b c0x0000 (---------------) + I tomika + 0x0020b608, // n0x0d8c c0x0000 (---------------) + I wanouchi + 0x00277b48, // n0x0d8d c0x0000 (---------------) + I yamagata + 0x00340346, // n0x0d8e c0x0000 (---------------) + I yaotsu + 0x00201e44, // n0x0d8f c0x0000 (---------------) + I yoro + 0x0023a506, // n0x0d90 c0x0000 (---------------) + I annaka + 0x003a2b07, // n0x0d91 c0x0000 (---------------) + I chiyoda + 0x00271647, // n0x0d92 c0x0000 (---------------) + I fujioka + 0x0026040f, // n0x0d93 c0x0000 (---------------) + I higashiagatsuma + 0x00204407, // n0x0d94 c0x0000 (---------------) + I isesaki + 0x003579c7, // n0x0d95 c0x0000 (---------------) + I itakura + 0x0029e505, // n0x0d96 c0x0000 (---------------) + I kanna + 0x002f2fc5, // n0x0d97 c0x0000 (---------------) + I kanra + 0x00296909, // n0x0d98 c0x0000 (---------------) + I katashina + 0x002432c6, // n0x0d99 c0x0000 (---------------) + I kawaba + 0x00276685, // n0x0d9a c0x0000 (---------------) + I kiryu + 0x00279487, // n0x0d9b c0x0000 (---------------) + I kusatsu + 0x0039fe08, // n0x0d9c c0x0000 (---------------) + I maebashi + 0x002b4b45, // n0x0d9d c0x0000 (---------------) + I meiwa + 0x0028fc46, // n0x0d9e c0x0000 (---------------) + I midori + 0x0020f808, // n0x0d9f c0x0000 (---------------) + I minakami + 0x0030f1ca, // n0x0da0 c0x0000 (---------------) + I naganohara + 0x00320048, // n0x0da1 c0x0000 (---------------) + I nakanojo + 0x00390447, // n0x0da2 c0x0000 (---------------) + I nanmoku + 0x002300c6, // n0x0da3 c0x0000 (---------------) + I numata + 0x0026a746, // n0x0da4 c0x0000 (---------------) + I oizumi + 0x0021ad83, // n0x0da5 c0x0000 (---------------) + I ora + 0x0020a183, // n0x0da6 c0x0000 (---------------) + I ota + 0x002badc9, // n0x0da7 c0x0000 (---------------) + I shibukawa + 0x002616c9, // n0x0da8 c0x0000 (---------------) + I shimonita + 0x00285c86, // n0x0da9 c0x0000 (---------------) + I shinto + 0x002ab745, // n0x0daa c0x0000 (---------------) + I showa + 0x00297a08, // n0x0dab c0x0000 (---------------) + I takasaki + 0x002b98c8, // n0x0dac c0x0000 (---------------) + I takayama + 0x002e26c8, // n0x0dad c0x0000 (---------------) + I tamamura + 0x002fe54b, // n0x0dae c0x0000 (---------------) + I tatebayashi + 0x0028d307, // n0x0daf c0x0000 (---------------) + I tomioka + 0x002f4d89, // n0x0db0 c0x0000 (---------------) + I tsukiyono + 0x00260688, // n0x0db1 c0x0000 (---------------) + I tsumagoi + 0x003855c4, // n0x0db2 c0x0000 (---------------) + I ueno + 0x002c4bc8, // n0x0db3 c0x0000 (---------------) + I yoshioka + 0x002848c9, // n0x0db4 c0x0000 (---------------) + I asaminami + 0x002a4205, // n0x0db5 c0x0000 (---------------) + I daiwa + 0x00308307, // n0x0db6 c0x0000 (---------------) + I etajima + 0x002b7305, // n0x0db7 c0x0000 (---------------) + I fuchu + 0x00277a48, // n0x0db8 c0x0000 (---------------) + I fukuyama + 0x002869cb, // n0x0db9 c0x0000 (---------------) + I hatsukaichi + 0x0028a890, // n0x0dba c0x0000 (---------------) + I higashihiroshima + 0x0029ea05, // n0x0dbb c0x0000 (---------------) + I hongo + 0x0021688c, // n0x0dbc c0x0000 (---------------) + I jinsekikogen + 0x002a5a45, // n0x0dbd c0x0000 (---------------) + I kaita + 0x00275683, // n0x0dbe c0x0000 (---------------) + I kui + 0x0027eb46, // n0x0dbf c0x0000 (---------------) + I kumano + 0x002b1f04, // n0x0dc0 c0x0000 (---------------) + I kure + 0x00362c86, // n0x0dc1 c0x0000 (---------------) + I mihara + 0x00293a07, // n0x0dc2 c0x0000 (---------------) + I miyoshi + 0x0020efc4, // n0x0dc3 c0x0000 (---------------) + I naka + 0x002c3848, // n0x0dc4 c0x0000 (---------------) + I onomichi + 0x0032424d, // n0x0dc5 c0x0000 (---------------) + I osakikamijima + 0x002d3ac5, // n0x0dc6 c0x0000 (---------------) + I otake + 0x0022c604, // n0x0dc7 c0x0000 (---------------) + I saka + 0x0020d904, // n0x0dc8 c0x0000 (---------------) + I sera + 0x0026a209, // n0x0dc9 c0x0000 (---------------) + I seranishi + 0x0027ab48, // n0x0dca c0x0000 (---------------) + I shinichi + 0x0030ac47, // n0x0dcb c0x0000 (---------------) + I shobara + 0x002b9e08, // n0x0dcc c0x0000 (---------------) + I takehara + 0x00278308, // n0x0dcd c0x0000 (---------------) + I abashiri + 0x00272c45, // n0x0dce c0x0000 (---------------) + I abira + 0x00378a87, // n0x0dcf c0x0000 (---------------) + I aibetsu + 0x00272bc7, // n0x0dd0 c0x0000 (---------------) + I akabira + 0x00379187, // n0x0dd1 c0x0000 (---------------) + I akkeshi + 0x002b9089, // n0x0dd2 c0x0000 (---------------) + I asahikawa + 0x00236489, // n0x0dd3 c0x0000 (---------------) + I ashibetsu + 0x0023e7c6, // n0x0dd4 c0x0000 (---------------) + I ashoro + 0x002ac806, // n0x0dd5 c0x0000 (---------------) + I assabu + 0x00260646, // n0x0dd6 c0x0000 (---------------) + I atsuma + 0x002621c5, // n0x0dd7 c0x0000 (---------------) + I bibai + 0x002723c4, // n0x0dd8 c0x0000 (---------------) + I biei + 0x00200ec6, // n0x0dd9 c0x0000 (---------------) + I bifuka + 0x00201446, // n0x0dda c0x0000 (---------------) + I bihoro + 0x00272c88, // n0x0ddb c0x0000 (---------------) + I biratori + 0x00287d8b, // n0x0ddc c0x0000 (---------------) + I chippubetsu + 0x002a8e07, // n0x0ddd c0x0000 (---------------) + I chitose + 0x00205dc4, // n0x0dde c0x0000 (---------------) + I date + 0x0033d0c6, // n0x0ddf c0x0000 (---------------) + I ebetsu + 0x00356907, // n0x0de0 c0x0000 (---------------) + I embetsu + 0x002eafc5, // n0x0de1 c0x0000 (---------------) + I eniwa + 0x0035b145, // n0x0de2 c0x0000 (---------------) + I erimo + 0x0033b1c4, // n0x0de3 c0x0000 (---------------) + I esan + 0x00236406, // n0x0de4 c0x0000 (---------------) + I esashi + 0x00200f48, // n0x0de5 c0x0000 (---------------) + I fukagawa + 0x0027f209, // n0x0de6 c0x0000 (---------------) + I fukushima + 0x00244106, // n0x0de7 c0x0000 (---------------) + I furano + 0x0027cf08, // n0x0de8 c0x0000 (---------------) + I furubira + 0x002a4f46, // n0x0de9 c0x0000 (---------------) + I haboro + 0x00328608, // n0x0dea c0x0000 (---------------) + I hakodate + 0x00299b0c, // n0x0deb c0x0000 (---------------) + I hamatonbetsu + 0x00272b06, // n0x0dec c0x0000 (---------------) + I hidaka + 0x0028c24d, // n0x0ded c0x0000 (---------------) + I higashikagura + 0x0028c6cb, // n0x0dee c0x0000 (---------------) + I higashikawa + 0x0024a605, // n0x0def c0x0000 (---------------) + I hiroo + 0x0039dfc7, // n0x0df0 c0x0000 (---------------) + I hokuryu + 0x0034eb46, // n0x0df1 c0x0000 (---------------) + I hokuto + 0x002e1208, // n0x0df2 c0x0000 (---------------) + I honbetsu + 0x0023e849, // n0x0df3 c0x0000 (---------------) + I horokanai + 0x00348d48, // n0x0df4 c0x0000 (---------------) + I horonobe + 0x00202b85, // n0x0df5 c0x0000 (---------------) + I ikeda + 0x002af387, // n0x0df6 c0x0000 (---------------) + I imakane + 0x00276e48, // n0x0df7 c0x0000 (---------------) + I ishikari + 0x00255f49, // n0x0df8 c0x0000 (---------------) + I iwamizawa + 0x00235306, // n0x0df9 c0x0000 (---------------) + I iwanai + 0x0024620a, // n0x0dfa c0x0000 (---------------) + I kamifurano + 0x002e0f88, // n0x0dfb c0x0000 (---------------) + I kamikawa + 0x00348b8b, // n0x0dfc c0x0000 (---------------) + I kamishihoro + 0x002ae88c, // n0x0dfd c0x0000 (---------------) + I kamisunagawa + 0x00248188, // n0x0dfe c0x0000 (---------------) + I kamoenai + 0x002741c6, // n0x0dff c0x0000 (---------------) + I kayabe + 0x00268208, // n0x0e00 c0x0000 (---------------) + I kembuchi + 0x00204547, // n0x0e01 c0x0000 (---------------) + I kikonai + 0x00236709, // n0x0e02 c0x0000 (---------------) + I kimobetsu + 0x0020cb4d, // n0x0e03 c0x0000 (---------------) + I kitahiroshima + 0x00294b46, // n0x0e04 c0x0000 (---------------) + I kitami + 0x00287a88, // n0x0e05 c0x0000 (---------------) + I kiyosato + 0x00353289, // n0x0e06 c0x0000 (---------------) + I koshimizu + 0x002b07c8, // n0x0e07 c0x0000 (---------------) + I kunneppu + 0x0027a408, // n0x0e08 c0x0000 (---------------) + I kuriyama + 0x002b338c, // n0x0e09 c0x0000 (---------------) + I kuromatsunai + 0x002b4407, // n0x0e0a c0x0000 (---------------) + I kushiro + 0x002b5747, // n0x0e0b c0x0000 (---------------) + I kutchan + 0x002b8ec5, // n0x0e0c c0x0000 (---------------) + I kyowa + 0x0028ec47, // n0x0e0d c0x0000 (---------------) + I mashike + 0x0039fcc8, // n0x0e0e c0x0000 (---------------) + I matsumae + 0x00289246, // n0x0e0f c0x0000 (---------------) + I mikasa + 0x00243f8c, // n0x0e10 c0x0000 (---------------) + I minamifurano + 0x002dd808, // n0x0e11 c0x0000 (---------------) + I mombetsu + 0x002c6048, // n0x0e12 c0x0000 (---------------) + I moseushi + 0x0025c546, // n0x0e13 c0x0000 (---------------) + I mukawa + 0x00391587, // n0x0e14 c0x0000 (---------------) + I muroran + 0x0023e9c4, // n0x0e15 c0x0000 (---------------) + I naie + 0x002a6788, // n0x0e16 c0x0000 (---------------) + I nakagawa + 0x0027b40c, // n0x0e17 c0x0000 (---------------) + I nakasatsunai + 0x0021034c, // n0x0e18 c0x0000 (---------------) + I nakatombetsu + 0x00222505, // n0x0e19 c0x0000 (---------------) + I nanae + 0x00200b87, // n0x0e1a c0x0000 (---------------) + I nanporo + 0x00201dc6, // n0x0e1b c0x0000 (---------------) + I nayoro + 0x00391506, // n0x0e1c c0x0000 (---------------) + I nemuro + 0x002866c8, // n0x0e1d c0x0000 (---------------) + I niikappu + 0x00264044, // n0x0e1e c0x0000 (---------------) + I niki + 0x0022aa0b, // n0x0e1f c0x0000 (---------------) + I nishiokoppe + 0x002be20b, // n0x0e20 c0x0000 (---------------) + I noboribetsu + 0x002300c6, // n0x0e21 c0x0000 (---------------) + I numata + 0x003240c7, // n0x0e22 c0x0000 (---------------) + I obihiro + 0x003022c5, // n0x0e23 c0x0000 (---------------) + I obira + 0x00268fc5, // n0x0e24 c0x0000 (---------------) + I oketo + 0x0022ab46, // n0x0e25 c0x0000 (---------------) + I okoppe + 0x0026c905, // n0x0e26 c0x0000 (---------------) + I otaru + 0x002b8885, // n0x0e27 c0x0000 (---------------) + I otobe + 0x002b9bc7, // n0x0e28 c0x0000 (---------------) + I otofuke + 0x00271009, // n0x0e29 c0x0000 (---------------) + I otoineppu + 0x002f6304, // n0x0e2a c0x0000 (---------------) + I oumu + 0x0026f485, // n0x0e2b c0x0000 (---------------) + I ozora + 0x002d1d85, // n0x0e2c c0x0000 (---------------) + I pippu + 0x0026fe08, // n0x0e2d c0x0000 (---------------) + I rankoshi + 0x002c3685, // n0x0e2e c0x0000 (---------------) + I rebun + 0x0029d649, // n0x0e2f c0x0000 (---------------) + I rikubetsu + 0x002910c7, // n0x0e30 c0x0000 (---------------) + I rishiri + 0x002910cb, // n0x0e31 c0x0000 (---------------) + I rishirifuji + 0x00227706, // n0x0e32 c0x0000 (---------------) + I saroma + 0x002a54c9, // n0x0e33 c0x0000 (---------------) + I sarufutsu + 0x00224bc8, // n0x0e34 c0x0000 (---------------) + I shakotan + 0x00251705, // n0x0e35 c0x0000 (---------------) + I shari + 0x00379288, // n0x0e36 c0x0000 (---------------) + I shibecha + 0x002364c8, // n0x0e37 c0x0000 (---------------) + I shibetsu + 0x0020af47, // n0x0e38 c0x0000 (---------------) + I shikabe + 0x0026a607, // n0x0e39 c0x0000 (---------------) + I shikaoi + 0x00277e49, // n0x0e3a c0x0000 (---------------) + I shimamaki + 0x00352287, // n0x0e3b c0x0000 (---------------) + I shimizu + 0x0025aa89, // n0x0e3c c0x0000 (---------------) + I shimokawa + 0x00371f4c, // n0x0e3d c0x0000 (---------------) + I shinshinotsu + 0x00285c88, // n0x0e3e c0x0000 (---------------) + I shintoku + 0x0029e349, // n0x0e3f c0x0000 (---------------) + I shiranuka + 0x0029fe47, // n0x0e40 c0x0000 (---------------) + I shiraoi + 0x002783c9, // n0x0e41 c0x0000 (---------------) + I shiriuchi + 0x00210b47, // n0x0e42 c0x0000 (---------------) + I sobetsu + 0x002ae988, // n0x0e43 c0x0000 (---------------) + I sunagawa + 0x00270145, // n0x0e44 c0x0000 (---------------) + I taiki + 0x00300286, // n0x0e45 c0x0000 (---------------) + I takasu + 0x002b3a88, // n0x0e46 c0x0000 (---------------) + I takikawa + 0x002301c8, // n0x0e47 c0x0000 (---------------) + I takinoue + 0x002baac9, // n0x0e48 c0x0000 (---------------) + I teshikaga + 0x002b88c7, // n0x0e49 c0x0000 (---------------) + I tobetsu + 0x00269945, // n0x0e4a c0x0000 (---------------) + I tohma + 0x00335489, // n0x0e4b c0x0000 (---------------) + I tomakomai + 0x00219806, // n0x0e4c c0x0000 (---------------) + I tomari + 0x00286044, // n0x0e4d c0x0000 (---------------) + I toya + 0x00348a06, // n0x0e4e c0x0000 (---------------) + I toyako + 0x0025d188, // n0x0e4f c0x0000 (---------------) + I toyotomi + 0x00261e07, // n0x0e50 c0x0000 (---------------) + I toyoura + 0x00287f88, // n0x0e51 c0x0000 (---------------) + I tsubetsu + 0x00323009, // n0x0e52 c0x0000 (---------------) + I tsukigata + 0x0025c2c7, // n0x0e53 c0x0000 (---------------) + I urakawa + 0x002949c6, // n0x0e54 c0x0000 (---------------) + I urausu + 0x0039e084, // n0x0e55 c0x0000 (---------------) + I uryu + 0x00201f89, // n0x0e56 c0x0000 (---------------) + I utashinai + 0x00378908, // n0x0e57 c0x0000 (---------------) + I wakkanai + 0x0025c407, // n0x0e58 c0x0000 (---------------) + I wassamu + 0x002569c6, // n0x0e59 c0x0000 (---------------) + I yakumo + 0x0035b786, // n0x0e5a c0x0000 (---------------) + I yoichi + 0x00300a44, // n0x0e5b c0x0000 (---------------) + I aioi + 0x0029ee06, // n0x0e5c c0x0000 (---------------) + I akashi + 0x0020e683, // n0x0e5d c0x0000 (---------------) + I ako + 0x002bce89, // n0x0e5e c0x0000 (---------------) + I amagasaki + 0x00203046, // n0x0e5f c0x0000 (---------------) + I aogaki + 0x00293085, // n0x0e60 c0x0000 (---------------) + I asago + 0x00294ec6, // n0x0e61 c0x0000 (---------------) + I ashiya + 0x0029a6c5, // n0x0e62 c0x0000 (---------------) + I awaji + 0x002772c8, // n0x0e63 c0x0000 (---------------) + I fukusaki + 0x00247ec7, // n0x0e64 c0x0000 (---------------) + I goshiki + 0x00207186, // n0x0e65 c0x0000 (---------------) + I harima + 0x0031ac86, // n0x0e66 c0x0000 (---------------) + I himeji + 0x003335c8, // n0x0e67 c0x0000 (---------------) + I ichikawa + 0x00296a87, // n0x0e68 c0x0000 (---------------) + I inagawa + 0x00294b85, // n0x0e69 c0x0000 (---------------) + I itami + 0x002953c8, // n0x0e6a c0x0000 (---------------) + I kakogawa + 0x00371c88, // n0x0e6b c0x0000 (---------------) + I kamigori + 0x002e0f88, // n0x0e6c c0x0000 (---------------) + I kamikawa + 0x002a5905, // n0x0e6d c0x0000 (---------------) + I kasai + 0x00300306, // n0x0e6e c0x0000 (---------------) + I kasuga + 0x002e33c9, // n0x0e6f c0x0000 (---------------) + I kawanishi + 0x0021eb04, // n0x0e70 c0x0000 (---------------) + I miki + 0x003694cb, // n0x0e71 c0x0000 (---------------) + I minamiawaji + 0x0021d08b, // n0x0e72 c0x0000 (---------------) + I nishinomiya + 0x0025ee49, // n0x0e73 c0x0000 (---------------) + I nishiwaki + 0x0020e703, // n0x0e74 c0x0000 (---------------) + I ono + 0x002529c5, // n0x0e75 c0x0000 (---------------) + I sanda + 0x0020a686, // n0x0e76 c0x0000 (---------------) + I sannan + 0x002ad908, // n0x0e77 c0x0000 (---------------) + I sasayama + 0x0022fc04, // n0x0e78 c0x0000 (---------------) + I sayo + 0x002a9586, // n0x0e79 c0x0000 (---------------) + I shingu + 0x002c9149, // n0x0e7a c0x0000 (---------------) + I shinonsen + 0x002b6345, // n0x0e7b c0x0000 (---------------) + I shiso + 0x002b9b06, // n0x0e7c c0x0000 (---------------) + I sumoto + 0x00213006, // n0x0e7d c0x0000 (---------------) + I taishi + 0x002155c4, // n0x0e7e c0x0000 (---------------) + I taka + 0x0028cc8a, // n0x0e7f c0x0000 (---------------) + I takarazuka + 0x00292fc8, // n0x0e80 c0x0000 (---------------) + I takasago + 0x002301c6, // n0x0e81 c0x0000 (---------------) + I takino + 0x00301785, // n0x0e82 c0x0000 (---------------) + I tamba + 0x00208c07, // n0x0e83 c0x0000 (---------------) + I tatsuno + 0x00251a87, // n0x0e84 c0x0000 (---------------) + I toyooka + 0x0034c804, // n0x0e85 c0x0000 (---------------) + I yabu + 0x0021d2c7, // n0x0e86 c0x0000 (---------------) + I yashiro + 0x00241684, // n0x0e87 c0x0000 (---------------) + I yoka + 0x00241686, // n0x0e88 c0x0000 (---------------) + I yokawa + 0x0020f943, // n0x0e89 c0x0000 (---------------) + I ami + 0x002b9085, // n0x0e8a c0x0000 (---------------) + I asahi + 0x00347c45, // n0x0e8b c0x0000 (---------------) + I bando + 0x00213388, // n0x0e8c c0x0000 (---------------) + I chikusei + 0x0025cc45, // n0x0e8d c0x0000 (---------------) + I daigo + 0x00272849, // n0x0e8e c0x0000 (---------------) + I fujishiro + 0x00299f47, // n0x0e8f c0x0000 (---------------) + I hitachi + 0x002a65cb, // n0x0e90 c0x0000 (---------------) + I hitachinaka + 0x00299f4c, // n0x0e91 c0x0000 (---------------) + I hitachiomiya + 0x0029abca, // n0x0e92 c0x0000 (---------------) + I hitachiota + 0x002bebc7, // n0x0e93 c0x0000 (---------------) + I ibaraki + 0x002020c3, // n0x0e94 c0x0000 (---------------) + I ina + 0x00318e48, // n0x0e95 c0x0000 (---------------) + I inashiki + 0x002a5ac5, // n0x0e96 c0x0000 (---------------) + I itako + 0x002b4bc5, // n0x0e97 c0x0000 (---------------) + I iwama + 0x0032ec84, // n0x0e98 c0x0000 (---------------) + I joso + 0x002ae886, // n0x0e99 c0x0000 (---------------) + I kamisu + 0x00237b46, // n0x0e9a c0x0000 (---------------) + I kasama + 0x0029ee47, // n0x0e9b c0x0000 (---------------) + I kashima + 0x0037fa8b, // n0x0e9c c0x0000 (---------------) + I kasumigaura + 0x00223544, // n0x0e9d c0x0000 (---------------) + I koga + 0x0034e384, // n0x0e9e c0x0000 (---------------) + I miho + 0x002ba004, // n0x0e9f c0x0000 (---------------) + I mito + 0x002c4786, // n0x0ea0 c0x0000 (---------------) + I moriya + 0x0020efc4, // n0x0ea1 c0x0000 (---------------) + I naka + 0x002b9748, // n0x0ea2 c0x0000 (---------------) + I namegata + 0x0032ea85, // n0x0ea3 c0x0000 (---------------) + I oarai + 0x00227945, // n0x0ea4 c0x0000 (---------------) + I ogawa + 0x002e2607, // n0x0ea5 c0x0000 (---------------) + I omitama + 0x0039e0c9, // n0x0ea6 c0x0000 (---------------) + I ryugasaki + 0x003487c5, // n0x0ea7 c0x0000 (---------------) + I sakai + 0x0036f20a, // n0x0ea8 c0x0000 (---------------) + I sakuragawa + 0x0039ff49, // n0x0ea9 c0x0000 (---------------) + I shimodate + 0x0027328a, // n0x0eaa c0x0000 (---------------) + I shimotsuma + 0x003910c9, // n0x0eab c0x0000 (---------------) + I shirosato + 0x0032c904, // n0x0eac c0x0000 (---------------) + I sowa + 0x002d4285, // n0x0ead c0x0000 (---------------) + I suifu + 0x002eddc8, // n0x0eae c0x0000 (---------------) + I takahagi + 0x002ecd0b, // n0x0eaf c0x0000 (---------------) + I tamatsukuri + 0x002f1405, // n0x0eb0 c0x0000 (---------------) + I tokai + 0x0027fb86, // n0x0eb1 c0x0000 (---------------) + I tomobe + 0x0021fdc4, // n0x0eb2 c0x0000 (---------------) + I tone + 0x00272d86, // n0x0eb3 c0x0000 (---------------) + I toride + 0x0025c149, // n0x0eb4 c0x0000 (---------------) + I tsuchiura + 0x0033d187, // n0x0eb5 c0x0000 (---------------) + I tsukuba + 0x0030af88, // n0x0eb6 c0x0000 (---------------) + I uchihara + 0x0022c486, // n0x0eb7 c0x0000 (---------------) + I ushiku + 0x003a2a87, // n0x0eb8 c0x0000 (---------------) + I yachiyo + 0x00277b48, // n0x0eb9 c0x0000 (---------------) + I yamagata + 0x00382306, // n0x0eba c0x0000 (---------------) + I yawara + 0x00242084, // n0x0ebb c0x0000 (---------------) + I yuki + 0x00358a07, // n0x0ebc c0x0000 (---------------) + I anamizu + 0x00337085, // n0x0ebd c0x0000 (---------------) + I hakui + 0x003419c7, // n0x0ebe c0x0000 (---------------) + I hakusan + 0x00200fc4, // n0x0ebf c0x0000 (---------------) + I kaga + 0x0034eac6, // n0x0ec0 c0x0000 (---------------) + I kahoku + 0x00386988, // n0x0ec1 c0x0000 (---------------) + I kanazawa + 0x0028c888, // n0x0ec2 c0x0000 (---------------) + I kawakita + 0x0028e9c7, // n0x0ec3 c0x0000 (---------------) + I komatsu + 0x00303408, // n0x0ec4 c0x0000 (---------------) + I nakanoto + 0x0028a145, // n0x0ec5 c0x0000 (---------------) + I nanao + 0x0020e544, // n0x0ec6 c0x0000 (---------------) + I nomi + 0x003334c8, // n0x0ec7 c0x0000 (---------------) + I nonoichi + 0x0024f5c4, // n0x0ec8 c0x0000 (---------------) + I noto + 0x0020af45, // n0x0ec9 c0x0000 (---------------) + I shika + 0x002e2e04, // n0x0eca c0x0000 (---------------) + I suzu + 0x00229507, // n0x0ecb c0x0000 (---------------) + I tsubata + 0x00281647, // n0x0ecc c0x0000 (---------------) + I tsurugi + 0x00278508, // n0x0ecd c0x0000 (---------------) + I uchinada + 0x0029a706, // n0x0ece c0x0000 (---------------) + I wajima + 0x0025cbc5, // n0x0ecf c0x0000 (---------------) + I fudai + 0x00272648, // n0x0ed0 c0x0000 (---------------) + I fujisawa + 0x00320248, // n0x0ed1 c0x0000 (---------------) + I hanamaki + 0x00296309, // n0x0ed2 c0x0000 (---------------) + I hiraizumi + 0x0021d386, // n0x0ed3 c0x0000 (---------------) + I hirono + 0x00231688, // n0x0ed4 c0x0000 (---------------) + I ichinohe + 0x00278c8a, // n0x0ed5 c0x0000 (---------------) + I ichinoseki + 0x002eb048, // n0x0ed6 c0x0000 (---------------) + I iwaizumi + 0x002d2505, // n0x0ed7 c0x0000 (---------------) + I iwate + 0x00222c46, // n0x0ed8 c0x0000 (---------------) + I joboji + 0x00285888, // n0x0ed9 c0x0000 (---------------) + I kamaishi + 0x002af44a, // n0x0eda c0x0000 (---------------) + I kanegasaki + 0x002a0d87, // n0x0edb c0x0000 (---------------) + I karumai + 0x0027e585, // n0x0edc c0x0000 (---------------) + I kawai + 0x0028b088, // n0x0edd c0x0000 (---------------) + I kitakami + 0x002f7c44, // n0x0ede c0x0000 (---------------) + I kuji + 0x002a50c6, // n0x0edf c0x0000 (---------------) + I kunohe + 0x002b5ec8, // n0x0ee0 c0x0000 (---------------) + I kuzumaki + 0x0020e5c6, // n0x0ee1 c0x0000 (---------------) + I miyako + 0x002bc248, // n0x0ee2 c0x0000 (---------------) + I mizusawa + 0x0021e947, // n0x0ee3 c0x0000 (---------------) + I morioka + 0x0020ddc6, // n0x0ee4 c0x0000 (---------------) + I ninohe + 0x00383dc4, // n0x0ee5 c0x0000 (---------------) + I noda + 0x002d4c07, // n0x0ee6 c0x0000 (---------------) + I ofunato + 0x002f2804, // n0x0ee7 c0x0000 (---------------) + I oshu + 0x0025c107, // n0x0ee8 c0x0000 (---------------) + I otsuchi + 0x0035a0cd, // n0x0ee9 c0x0000 (---------------) + I rikuzentakata + 0x0025eec5, // n0x0eea c0x0000 (---------------) + I shiwa + 0x002a9b4b, // n0x0eeb c0x0000 (---------------) + I shizukuishi + 0x00297d86, // n0x0eec c0x0000 (---------------) + I sumita + 0x0024b208, // n0x0eed c0x0000 (---------------) + I tanohata + 0x00398284, // n0x0eee c0x0000 (---------------) + I tono + 0x0026f246, // n0x0eef c0x0000 (---------------) + I yahaba + 0x00274a86, // n0x0ef0 c0x0000 (---------------) + I yamada + 0x00268547, // n0x0ef1 c0x0000 (---------------) + I ayagawa + 0x0028bf0d, // n0x0ef2 c0x0000 (---------------) + I higashikagawa + 0x002bbec7, // n0x0ef3 c0x0000 (---------------) + I kanonji + 0x002f8ec8, // n0x0ef4 c0x0000 (---------------) + I kotohira + 0x0024a485, // n0x0ef5 c0x0000 (---------------) + I manno + 0x0029ef88, // n0x0ef6 c0x0000 (---------------) + I marugame + 0x002ba406, // n0x0ef7 c0x0000 (---------------) + I mitoyo + 0x0028a1c8, // n0x0ef8 c0x0000 (---------------) + I naoshima + 0x00213906, // n0x0ef9 c0x0000 (---------------) + I sanuki + 0x00322747, // n0x0efa c0x0000 (---------------) + I tadotsu + 0x003231c9, // n0x0efb c0x0000 (---------------) + I takamatsu + 0x00398287, // n0x0efc c0x0000 (---------------) + I tonosho + 0x00280808, // n0x0efd c0x0000 (---------------) + I uchinomi + 0x0026bf85, // n0x0efe c0x0000 (---------------) + I utazu + 0x0021a888, // n0x0eff c0x0000 (---------------) + I zentsuji + 0x003234c5, // n0x0f00 c0x0000 (---------------) + I akune + 0x00245d05, // n0x0f01 c0x0000 (---------------) + I amami + 0x0027ff05, // n0x0f02 c0x0000 (---------------) + I hioki + 0x00222783, // n0x0f03 c0x0000 (---------------) + I isa + 0x00279804, // n0x0f04 c0x0000 (---------------) + I isen + 0x0026a785, // n0x0f05 c0x0000 (---------------) + I izumi + 0x002c3e09, // n0x0f06 c0x0000 (---------------) + I kagoshima + 0x002a2a46, // n0x0f07 c0x0000 (---------------) + I kanoya + 0x002c2d08, // n0x0f08 c0x0000 (---------------) + I kawanabe + 0x002af645, // n0x0f09 c0x0000 (---------------) + I kinko + 0x00329cc7, // n0x0f0a c0x0000 (---------------) + I kouyama + 0x00249c0a, // n0x0f0b c0x0000 (---------------) + I makurazaki + 0x002b9a49, // n0x0f0c c0x0000 (---------------) + I matsumoto + 0x0029ddca, // n0x0f0d c0x0000 (---------------) + I minamitane + 0x002c9c48, // n0x0f0e c0x0000 (---------------) + I nakatane + 0x0021e10c, // n0x0f0f c0x0000 (---------------) + I nishinoomote + 0x0027950d, // n0x0f10 c0x0000 (---------------) + I satsumasendai + 0x002e7983, // n0x0f11 c0x0000 (---------------) + I soo + 0x002bc148, // n0x0f12 c0x0000 (---------------) + I tarumizu + 0x00206845, // n0x0f13 c0x0000 (---------------) + I yusui + 0x0030ef86, // n0x0f14 c0x0000 (---------------) + I aikawa + 0x0034df86, // n0x0f15 c0x0000 (---------------) + I atsugi + 0x00246c05, // n0x0f16 c0x0000 (---------------) + I ayase + 0x00283789, // n0x0f17 c0x0000 (---------------) + I chigasaki + 0x002a1885, // n0x0f18 c0x0000 (---------------) + I ebina + 0x00272648, // n0x0f19 c0x0000 (---------------) + I fujisawa + 0x0024f4c6, // n0x0f1a c0x0000 (---------------) + I hadano + 0x00328f06, // n0x0f1b c0x0000 (---------------) + I hakone + 0x00297509, // n0x0f1c c0x0000 (---------------) + I hiratsuka + 0x00381b07, // n0x0f1d c0x0000 (---------------) + I isehara + 0x002f4386, // n0x0f1e c0x0000 (---------------) + I kaisei + 0x00249b88, // n0x0f1f c0x0000 (---------------) + I kamakura + 0x0031a308, // n0x0f20 c0x0000 (---------------) + I kiyokawa + 0x0024d447, // n0x0f21 c0x0000 (---------------) + I matsuda + 0x003524ce, // n0x0f22 c0x0000 (---------------) + I minamiashigara + 0x002ba645, // n0x0f23 c0x0000 (---------------) + I miura + 0x00255e45, // n0x0f24 c0x0000 (---------------) + I nakai + 0x0020e4c8, // n0x0f25 c0x0000 (---------------) + I ninomiya + 0x00207bc7, // n0x0f26 c0x0000 (---------------) + I odawara + 0x0022d6c2, // n0x0f27 c0x0000 (---------------) + I oi + 0x002b2f04, // n0x0f28 c0x0000 (---------------) + I oiso + 0x00362b8a, // n0x0f29 c0x0000 (---------------) + I sagamihara + 0x0025c4c8, // n0x0f2a c0x0000 (---------------) + I samukawa + 0x00356a06, // n0x0f2b c0x0000 (---------------) + I tsukui + 0x0028f108, // n0x0f2c c0x0000 (---------------) + I yamakita + 0x0021ec86, // n0x0f2d c0x0000 (---------------) + I yamato + 0x00256748, // n0x0f2e c0x0000 (---------------) + I yokosuka + 0x002a3f08, // n0x0f2f c0x0000 (---------------) + I yugawara + 0x00245cc4, // n0x0f30 c0x0000 (---------------) + I zama + 0x00359085, // n0x0f31 c0x0000 (---------------) + I zushi + 0x0067e804, // n0x0f32 c0x0001 (---------------) ! I city + 0x0067e804, // n0x0f33 c0x0001 (---------------) ! I city + 0x0067e804, // n0x0f34 c0x0001 (---------------) ! I city + 0x00203103, // n0x0f35 c0x0000 (---------------) + I aki + 0x0035b606, // n0x0f36 c0x0000 (---------------) + I geisei + 0x00272b06, // n0x0f37 c0x0000 (---------------) + I hidaka + 0x0029420c, // n0x0f38 c0x0000 (---------------) + I higashitsuno + 0x00205943, // n0x0f39 c0x0000 (---------------) + I ino + 0x002b6c86, // n0x0f3a c0x0000 (---------------) + I kagami + 0x0020f904, // n0x0f3b c0x0000 (---------------) + I kami + 0x002bed08, // n0x0f3c c0x0000 (---------------) + I kitagawa + 0x002c8f85, // n0x0f3d c0x0000 (---------------) + I kochi + 0x00362c86, // n0x0f3e c0x0000 (---------------) + I mihara + 0x002b0508, // n0x0f3f c0x0000 (---------------) + I motoyama + 0x002cb286, // n0x0f40 c0x0000 (---------------) + I muroto + 0x00207106, // n0x0f41 c0x0000 (---------------) + I nahari + 0x00359dc8, // n0x0f42 c0x0000 (---------------) + I nakamura + 0x00298007, // n0x0f43 c0x0000 (---------------) + I nankoku + 0x00352049, // n0x0f44 c0x0000 (---------------) + I nishitosa + 0x002f654a, // n0x0f45 c0x0000 (---------------) + I niyodogawa + 0x0024cb44, // n0x0f46 c0x0000 (---------------) + I ochi + 0x002416c5, // n0x0f47 c0x0000 (---------------) + I okawa + 0x00254ac5, // n0x0f48 c0x0000 (---------------) + I otoyo + 0x0021e446, // n0x0f49 c0x0000 (---------------) + I otsuki + 0x0024ce06, // n0x0f4a c0x0000 (---------------) + I sakawa + 0x0029d206, // n0x0f4b c0x0000 (---------------) + I sukumo + 0x002e22c6, // n0x0f4c c0x0000 (---------------) + I susaki + 0x00352184, // n0x0f4d c0x0000 (---------------) + I tosa + 0x0035218b, // n0x0f4e c0x0000 (---------------) + I tosashimizu + 0x00241604, // n0x0f4f c0x0000 (---------------) + I toyo + 0x00208c85, // n0x0f50 c0x0000 (---------------) + I tsuno + 0x002a2f05, // n0x0f51 c0x0000 (---------------) + I umaji + 0x0026ab06, // n0x0f52 c0x0000 (---------------) + I yasuda + 0x00202948, // n0x0f53 c0x0000 (---------------) + I yusuhara + 0x002793c7, // n0x0f54 c0x0000 (---------------) + I amakusa + 0x0030ad44, // n0x0f55 c0x0000 (---------------) + I arao + 0x00233543, // n0x0f56 c0x0000 (---------------) + I aso + 0x002f7745, // n0x0f57 c0x0000 (---------------) + I choyo + 0x00242947, // n0x0f58 c0x0000 (---------------) + I gyokuto + 0x0029b289, // n0x0f59 c0x0000 (---------------) + I hitoyoshi + 0x002792cb, // n0x0f5a c0x0000 (---------------) + I kamiamakusa + 0x0029ee47, // n0x0f5b c0x0000 (---------------) + I kashima + 0x00213287, // n0x0f5c c0x0000 (---------------) + I kikuchi + 0x002d7704, // n0x0f5d c0x0000 (---------------) + I kosa + 0x002b0408, // n0x0f5e c0x0000 (---------------) + I kumamoto + 0x00329e07, // n0x0f5f c0x0000 (---------------) + I mashiki + 0x0029b4c6, // n0x0f60 c0x0000 (---------------) + I mifune + 0x00241e08, // n0x0f61 c0x0000 (---------------) + I minamata + 0x0028180b, // n0x0f62 c0x0000 (---------------) + I minamioguni + 0x002bb706, // n0x0f63 c0x0000 (---------------) + I nagasu + 0x00214789, // n0x0f64 c0x0000 (---------------) + I nishihara + 0x00281985, // n0x0f65 c0x0000 (---------------) + I oguni + 0x002f6fc3, // n0x0f66 c0x0000 (---------------) + I ozu + 0x002b9b06, // n0x0f67 c0x0000 (---------------) + I sumoto + 0x0021e848, // n0x0f68 c0x0000 (---------------) + I takamori + 0x002139c3, // n0x0f69 c0x0000 (---------------) + I uki + 0x00216443, // n0x0f6a c0x0000 (---------------) + I uto + 0x00277b46, // n0x0f6b c0x0000 (---------------) + I yamaga + 0x0021ec86, // n0x0f6c c0x0000 (---------------) + I yamato + 0x0037dc0a, // n0x0f6d c0x0000 (---------------) + I yatsushiro + 0x00274205, // n0x0f6e c0x0000 (---------------) + I ayabe + 0x002748cb, // n0x0f6f c0x0000 (---------------) + I fukuchiyama + 0x00294e0b, // n0x0f70 c0x0000 (---------------) + I higashiyama + 0x0022d703, // n0x0f71 c0x0000 (---------------) + I ide + 0x0021b783, // n0x0f72 c0x0000 (---------------) + I ine + 0x002a74c4, // n0x0f73 c0x0000 (---------------) + I joyo + 0x00322b87, // n0x0f74 c0x0000 (---------------) + I kameoka + 0x0021e8c4, // n0x0f75 c0x0000 (---------------) + I kamo + 0x0020cb44, // n0x0f76 c0x0000 (---------------) + I kita + 0x00304804, // n0x0f77 c0x0000 (---------------) + I kizu + 0x002eb348, // n0x0f78 c0x0000 (---------------) + I kumiyama + 0x003016c8, // n0x0f79 c0x0000 (---------------) + I kyotamba + 0x002ffa89, // n0x0f7a c0x0000 (---------------) + I kyotanabe + 0x002ef0c8, // n0x0f7b c0x0000 (---------------) + I kyotango + 0x002a7dc7, // n0x0f7c c0x0000 (---------------) + I maizuru + 0x00236f86, // n0x0f7d c0x0000 (---------------) + I minami + 0x002c294f, // n0x0f7e c0x0000 (---------------) + I minamiyamashiro + 0x002ba786, // n0x0f7f c0x0000 (---------------) + I miyazu + 0x002c8f04, // n0x0f80 c0x0000 (---------------) + I muko + 0x0030150a, // n0x0f81 c0x0000 (---------------) + I nagaokakyo + 0x00242847, // n0x0f82 c0x0000 (---------------) + I nakagyo + 0x0020d286, // n0x0f83 c0x0000 (---------------) + I nantan + 0x00286089, // n0x0f84 c0x0000 (---------------) + I oyamazaki + 0x002ffa05, // n0x0f85 c0x0000 (---------------) + I sakyo + 0x002134c5, // n0x0f86 c0x0000 (---------------) + I seika + 0x002ffb46, // n0x0f87 c0x0000 (---------------) + I tanabe + 0x0021a9c3, // n0x0f88 c0x0000 (---------------) + I uji + 0x002f7c89, // n0x0f89 c0x0000 (---------------) + I ujitawara + 0x0021b0c6, // n0x0f8a c0x0000 (---------------) + I wazuka + 0x00322dc9, // n0x0f8b c0x0000 (---------------) + I yamashina + 0x0038a646, // n0x0f8c c0x0000 (---------------) + I yawata + 0x002b9085, // n0x0f8d c0x0000 (---------------) + I asahi + 0x00222905, // n0x0f8e c0x0000 (---------------) + I inabe + 0x00204403, // n0x0f8f c0x0000 (---------------) + I ise + 0x00322cc8, // n0x0f90 c0x0000 (---------------) + I kameyama + 0x00396247, // n0x0f91 c0x0000 (---------------) + I kawagoe + 0x002ead04, // n0x0f92 c0x0000 (---------------) + I kiho + 0x0021e548, // n0x0f93 c0x0000 (---------------) + I kisosaki + 0x0028d584, // n0x0f94 c0x0000 (---------------) + I kiwa + 0x0038e086, // n0x0f95 c0x0000 (---------------) + I komono + 0x0027eb46, // n0x0f96 c0x0000 (---------------) + I kumano + 0x0023db46, // n0x0f97 c0x0000 (---------------) + I kuwana + 0x002c52c9, // n0x0f98 c0x0000 (---------------) + I matsusaka + 0x002b4b45, // n0x0f99 c0x0000 (---------------) + I meiwa + 0x0028d806, // n0x0f9a c0x0000 (---------------) + I mihama + 0x00253d89, // n0x0f9b c0x0000 (---------------) + I minamiise + 0x002b94c6, // n0x0f9c c0x0000 (---------------) + I misugi + 0x002c2a46, // n0x0f9d c0x0000 (---------------) + I miyama + 0x0037abc6, // n0x0f9e c0x0000 (---------------) + I nabari + 0x00209c05, // n0x0f9f c0x0000 (---------------) + I shima + 0x002e2e06, // n0x0fa0 c0x0000 (---------------) + I suzuka + 0x00322744, // n0x0fa1 c0x0000 (---------------) + I tado + 0x00270145, // n0x0fa2 c0x0000 (---------------) + I taiki + 0x002301c4, // n0x0fa3 c0x0000 (---------------) + I taki + 0x00304706, // n0x0fa4 c0x0000 (---------------) + I tamaki + 0x00391284, // n0x0fa5 c0x0000 (---------------) + I toba + 0x00208c83, // n0x0fa6 c0x0000 (---------------) + I tsu + 0x0027e245, // n0x0fa7 c0x0000 (---------------) + I udono + 0x002361c8, // n0x0fa8 c0x0000 (---------------) + I ureshino + 0x0021a287, // n0x0fa9 c0x0000 (---------------) + I watarai + 0x002adcc9, // n0x0faa c0x0000 (---------------) + I yokkaichi + 0x0027e488, // n0x0fab c0x0000 (---------------) + I furukawa + 0x0028e211, // n0x0fac c0x0000 (---------------) + I higashimatsushima + 0x0021308a, // n0x0fad c0x0000 (---------------) + I ishinomaki + 0x00230007, // n0x0fae c0x0000 (---------------) + I iwanuma + 0x002e42c6, // n0x0faf c0x0000 (---------------) + I kakuda + 0x0020f904, // n0x0fb0 c0x0000 (---------------) + I kami + 0x002b3b88, // n0x0fb1 c0x0000 (---------------) + I kawasaki + 0x0020bc09, // n0x0fb2 c0x0000 (---------------) + I kesennuma + 0x002546c8, // n0x0fb3 c0x0000 (---------------) + I marumori + 0x0028e3ca, // n0x0fb4 c0x0000 (---------------) + I matsushima + 0x0029d40d, // n0x0fb5 c0x0000 (---------------) + I minamisanriku + 0x002964c6, // n0x0fb6 c0x0000 (---------------) + I misato + 0x00359ec6, // n0x0fb7 c0x0000 (---------------) + I murata + 0x002d4cc6, // n0x0fb8 c0x0000 (---------------) + I natori + 0x00380187, // n0x0fb9 c0x0000 (---------------) + I ogawara + 0x002967c5, // n0x0fba c0x0000 (---------------) + I ohira + 0x0034c5c7, // n0x0fbb c0x0000 (---------------) + I onagawa + 0x0021e605, // n0x0fbc c0x0000 (---------------) + I osaki + 0x00291204, // n0x0fbd c0x0000 (---------------) + I rifu + 0x0029f686, // n0x0fbe c0x0000 (---------------) + I semine + 0x00300147, // n0x0fbf c0x0000 (---------------) + I shibata + 0x002f798d, // n0x0fc0 c0x0000 (---------------) + I shichikashuku + 0x002857c7, // n0x0fc1 c0x0000 (---------------) + I shikama + 0x00372ac8, // n0x0fc2 c0x0000 (---------------) + I shiogama + 0x00272949, // n0x0fc3 c0x0000 (---------------) + I shiroishi + 0x00222b46, // n0x0fc4 c0x0000 (---------------) + I tagajo + 0x00235285, // n0x0fc5 c0x0000 (---------------) + I taiwa + 0x00215144, // n0x0fc6 c0x0000 (---------------) + I tome + 0x0025d286, // n0x0fc7 c0x0000 (---------------) + I tomiya + 0x0034c706, // n0x0fc8 c0x0000 (---------------) + I wakuya + 0x0025c646, // n0x0fc9 c0x0000 (---------------) + I watari + 0x00292048, // n0x0fca c0x0000 (---------------) + I yamamoto + 0x00209ac3, // n0x0fcb c0x0000 (---------------) + I zao + 0x0020ea43, // n0x0fcc c0x0000 (---------------) + I aya + 0x00309905, // n0x0fcd c0x0000 (---------------) + I ebino + 0x00237fc6, // n0x0fce c0x0000 (---------------) + I gokase + 0x002a3ec5, // n0x0fcf c0x0000 (---------------) + I hyuga + 0x0022c688, // n0x0fd0 c0x0000 (---------------) + I kadogawa + 0x00293bca, // n0x0fd1 c0x0000 (---------------) + I kawaminami + 0x002cd784, // n0x0fd2 c0x0000 (---------------) + I kijo + 0x002bed08, // n0x0fd3 c0x0000 (---------------) + I kitagawa + 0x0028cb08, // n0x0fd4 c0x0000 (---------------) + I kitakata + 0x0026a947, // n0x0fd5 c0x0000 (---------------) + I kitaura + 0x002af709, // n0x0fd6 c0x0000 (---------------) + I kobayashi + 0x002b0108, // n0x0fd7 c0x0000 (---------------) + I kunitomi + 0x0027f287, // n0x0fd8 c0x0000 (---------------) + I kushima + 0x0028b986, // n0x0fd9 c0x0000 (---------------) + I mimata + 0x0020e5ca, // n0x0fda c0x0000 (---------------) + I miyakonojo + 0x0025d308, // n0x0fdb c0x0000 (---------------) + I miyazaki + 0x002ae6c9, // n0x0fdc c0x0000 (---------------) + I morotsuka + 0x0027ac08, // n0x0fdd c0x0000 (---------------) + I nichinan + 0x0021bd49, // n0x0fde c0x0000 (---------------) + I nishimera + 0x00348e47, // n0x0fdf c0x0000 (---------------) + I nobeoka + 0x00340745, // n0x0fe0 c0x0000 (---------------) + I saito + 0x00298ec6, // n0x0fe1 c0x0000 (---------------) + I shiiba + 0x002890c8, // n0x0fe2 c0x0000 (---------------) + I shintomi + 0x0024b388, // n0x0fe3 c0x0000 (---------------) + I takaharu + 0x002155c8, // n0x0fe4 c0x0000 (---------------) + I takanabe + 0x00218288, // n0x0fe5 c0x0000 (---------------) + I takazaki + 0x00208c85, // n0x0fe6 c0x0000 (---------------) + I tsuno + 0x00205884, // n0x0fe7 c0x0000 (---------------) + I achi + 0x00395f48, // n0x0fe8 c0x0000 (---------------) + I agematsu + 0x00200b44, // n0x0fe9 c0x0000 (---------------) + I anan + 0x00390ec4, // n0x0fea c0x0000 (---------------) + I aoki + 0x002b9085, // n0x0feb c0x0000 (---------------) + I asahi + 0x002882c7, // n0x0fec c0x0000 (---------------) + I azumino + 0x0039de89, // n0x0fed c0x0000 (---------------) + I chikuhoku + 0x00268347, // n0x0fee c0x0000 (---------------) + I chikuma + 0x002058c5, // n0x0fef c0x0000 (---------------) + I chino + 0x00270c06, // n0x0ff0 c0x0000 (---------------) + I fujimi + 0x00334346, // n0x0ff1 c0x0000 (---------------) + I hakuba + 0x00202a44, // n0x0ff2 c0x0000 (---------------) + I hara + 0x00297846, // n0x0ff3 c0x0000 (---------------) + I hiraya + 0x0025ca04, // n0x0ff4 c0x0000 (---------------) + I iida + 0x002545c6, // n0x0ff5 c0x0000 (---------------) + I iijima + 0x00300486, // n0x0ff6 c0x0000 (---------------) + I iiyama + 0x00217506, // n0x0ff7 c0x0000 (---------------) + I iizuna + 0x00202b85, // n0x0ff8 c0x0000 (---------------) + I ikeda + 0x0022c547, // n0x0ff9 c0x0000 (---------------) + I ikusaka + 0x002020c3, // n0x0ffa c0x0000 (---------------) + I ina + 0x00224dc9, // n0x0ffb c0x0000 (---------------) + I karuizawa + 0x002f4088, // n0x0ffc c0x0000 (---------------) + I kawakami + 0x0021e544, // n0x0ffd c0x0000 (---------------) + I kiso + 0x0027f10d, // n0x0ffe c0x0000 (---------------) + I kisofukushima + 0x0028c988, // n0x0fff c0x0000 (---------------) + I kitaaiki + 0x002852c8, // n0x1000 c0x0000 (---------------) + I komagane + 0x002ae646, // n0x1001 c0x0000 (---------------) + I komoro + 0x003232c9, // n0x1002 c0x0000 (---------------) + I matsukawa + 0x002b9a49, // n0x1003 c0x0000 (---------------) + I matsumoto + 0x0025be45, // n0x1004 c0x0000 (---------------) + I miasa + 0x00293cca, // n0x1005 c0x0000 (---------------) + I minamiaiki + 0x0026710a, // n0x1006 c0x0000 (---------------) + I minamimaki + 0x002769cc, // n0x1007 c0x0000 (---------------) + I minamiminowa + 0x00276b46, // n0x1008 c0x0000 (---------------) + I minowa + 0x002714c6, // n0x1009 c0x0000 (---------------) + I miyada + 0x002bb006, // n0x100a c0x0000 (---------------) + I miyota + 0x0024ff49, // n0x100b c0x0000 (---------------) + I mochizuki + 0x0030f1c6, // n0x100c c0x0000 (---------------) + I nagano + 0x00296ac6, // n0x100d c0x0000 (---------------) + I nagawa + 0x002a1946, // n0x100e c0x0000 (---------------) + I nagiso + 0x002a6788, // n0x100f c0x0000 (---------------) + I nakagawa + 0x00303406, // n0x1010 c0x0000 (---------------) + I nakano + 0x002c560b, // n0x1011 c0x0000 (---------------) + I nozawaonsen + 0x00288445, // n0x1012 c0x0000 (---------------) + I obuse + 0x00227945, // n0x1013 c0x0000 (---------------) + I ogawa + 0x00271745, // n0x1014 c0x0000 (---------------) + I okaya + 0x00389cc6, // n0x1015 c0x0000 (---------------) + I omachi + 0x0020e583, // n0x1016 c0x0000 (---------------) + I omi + 0x0023dac6, // n0x1017 c0x0000 (---------------) + I ookuwa + 0x00285747, // n0x1018 c0x0000 (---------------) + I ooshika + 0x002b3a45, // n0x1019 c0x0000 (---------------) + I otaki + 0x00254bc5, // n0x101a c0x0000 (---------------) + I otari + 0x002dc785, // n0x101b c0x0000 (---------------) + I sakae + 0x002f5506, // n0x101c c0x0000 (---------------) + I sakaki + 0x0025bf04, // n0x101d c0x0000 (---------------) + I saku + 0x00368506, // n0x101e c0x0000 (---------------) + I sakuho + 0x00265109, // n0x101f c0x0000 (---------------) + I shimosuwa + 0x00389b4c, // n0x1020 c0x0000 (---------------) + I shinanomachi + 0x00290f48, // n0x1021 c0x0000 (---------------) + I shiojiri + 0x0020b584, // n0x1022 c0x0000 (---------------) + I suwa + 0x002e2a46, // n0x1023 c0x0000 (---------------) + I suzaka + 0x00297e86, // n0x1024 c0x0000 (---------------) + I takagi + 0x0021e848, // n0x1025 c0x0000 (---------------) + I takamori + 0x002b98c8, // n0x1026 c0x0000 (---------------) + I takayama + 0x00389a49, // n0x1027 c0x0000 (---------------) + I tateshina + 0x00208c07, // n0x1028 c0x0000 (---------------) + I tatsuno + 0x00366a09, // n0x1029 c0x0000 (---------------) + I togakushi + 0x00269086, // n0x102a c0x0000 (---------------) + I togura + 0x0022b304, // n0x102b c0x0000 (---------------) + I tomi + 0x0020b204, // n0x102c c0x0000 (---------------) + I ueda + 0x00256304, // n0x102d c0x0000 (---------------) + I wada + 0x00277b48, // n0x102e c0x0000 (---------------) + I yamagata + 0x0039dcca, // n0x102f c0x0000 (---------------) + I yamanouchi + 0x00348746, // n0x1030 c0x0000 (---------------) + I yasaka + 0x0034dd87, // n0x1031 c0x0000 (---------------) + I yasuoka + 0x00330fc7, // n0x1032 c0x0000 (---------------) + I chijiwa + 0x002a55c5, // n0x1033 c0x0000 (---------------) + I futsu + 0x0027f844, // n0x1034 c0x0000 (---------------) + I goto + 0x00284886, // n0x1035 c0x0000 (---------------) + I hasami + 0x002f8fc6, // n0x1036 c0x0000 (---------------) + I hirado + 0x0021eb43, // n0x1037 c0x0000 (---------------) + I iki + 0x002f3ec7, // n0x1038 c0x0000 (---------------) + I isahaya + 0x0030a408, // n0x1039 c0x0000 (---------------) + I kawatana + 0x0025bf8a, // n0x103a c0x0000 (---------------) + I kuchinotsu + 0x002cbd08, // n0x103b c0x0000 (---------------) + I matsuura + 0x002cd608, // n0x103c c0x0000 (---------------) + I nagasaki + 0x003912c5, // n0x103d c0x0000 (---------------) + I obama + 0x0024a705, // n0x103e c0x0000 (---------------) + I omura + 0x002a8f05, // n0x103f c0x0000 (---------------) + I oseto + 0x002a5986, // n0x1040 c0x0000 (---------------) + I saikai + 0x002d5086, // n0x1041 c0x0000 (---------------) + I sasebo + 0x00210945, // n0x1042 c0x0000 (---------------) + I seihi + 0x002bd0c9, // n0x1043 c0x0000 (---------------) + I shimabara + 0x0027f64c, // n0x1044 c0x0000 (---------------) + I shinkamigoto + 0x002a8fc7, // n0x1045 c0x0000 (---------------) + I togitsu + 0x0028e448, // n0x1046 c0x0000 (---------------) + I tsushima + 0x00284ec5, // n0x1047 c0x0000 (---------------) + I unzen + 0x0067e804, // n0x1048 c0x0001 (---------------) ! I city + 0x00347c84, // n0x1049 c0x0000 (---------------) + I ando + 0x002a9e84, // n0x104a c0x0000 (---------------) + I gose + 0x00205a06, // n0x104b c0x0000 (---------------) + I heguri + 0x0029598e, // n0x104c c0x0000 (---------------) + I higashiyoshino + 0x00213547, // n0x104d c0x0000 (---------------) + I ikaruga + 0x00285285, // n0x104e c0x0000 (---------------) + I ikoma + 0x0021ea8c, // n0x104f c0x0000 (---------------) + I kamikitayama + 0x0028d447, // n0x1050 c0x0000 (---------------) + I kanmaki + 0x003000c7, // n0x1051 c0x0000 (---------------) + I kashiba + 0x00308a09, // n0x1052 c0x0000 (---------------) + I kashihara + 0x00219449, // n0x1053 c0x0000 (---------------) + I katsuragi + 0x0027e585, // n0x1054 c0x0000 (---------------) + I kawai + 0x002f4088, // n0x1055 c0x0000 (---------------) + I kawakami + 0x002e33c9, // n0x1056 c0x0000 (---------------) + I kawanishi + 0x002d27c5, // n0x1057 c0x0000 (---------------) + I koryo + 0x002b3988, // n0x1058 c0x0000 (---------------) + I kurotaki + 0x00260b86, // n0x1059 c0x0000 (---------------) + I mitsue + 0x002c3ac6, // n0x105a c0x0000 (---------------) + I miyake + 0x002b8c84, // n0x105b c0x0000 (---------------) + I nara + 0x00380688, // n0x105c c0x0000 (---------------) + I nosegawa + 0x00222d03, // n0x105d c0x0000 (---------------) + I oji + 0x0037e4c4, // n0x105e c0x0000 (---------------) + I ouda + 0x002f77c5, // n0x105f c0x0000 (---------------) + I oyodo + 0x002fe347, // n0x1060 c0x0000 (---------------) + I sakurai + 0x00208445, // n0x1061 c0x0000 (---------------) + I sango + 0x00278b49, // n0x1062 c0x0000 (---------------) + I shimoichi + 0x0025fc0d, // n0x1063 c0x0000 (---------------) + I shimokitayama + 0x0027d4c6, // n0x1064 c0x0000 (---------------) + I shinjo + 0x00233584, // n0x1065 c0x0000 (---------------) + I soni + 0x0028ba88, // n0x1066 c0x0000 (---------------) + I takatori + 0x00270e4a, // n0x1067 c0x0000 (---------------) + I tawaramoto + 0x002160c7, // n0x1068 c0x0000 (---------------) + I tenkawa + 0x0035a785, // n0x1069 c0x0000 (---------------) + I tenri + 0x0024d543, // n0x106a c0x0000 (---------------) + I uda + 0x00294fce, // n0x106b c0x0000 (---------------) + I yamatokoriyama + 0x0021ec8c, // n0x106c c0x0000 (---------------) + I yamatotakada + 0x002e7d87, // n0x106d c0x0000 (---------------) + I yamazoe + 0x00295b47, // n0x106e c0x0000 (---------------) + I yoshino + 0x00201003, // n0x106f c0x0000 (---------------) + I aga + 0x0030f205, // n0x1070 c0x0000 (---------------) + I agano + 0x002a9e85, // n0x1071 c0x0000 (---------------) + I gosen + 0x0028f4c8, // n0x1072 c0x0000 (---------------) + I itoigawa + 0x0028aec9, // n0x1073 c0x0000 (---------------) + I izumozaki + 0x0020b486, // n0x1074 c0x0000 (---------------) + I joetsu + 0x0021e8c4, // n0x1075 c0x0000 (---------------) + I kamo + 0x0022ff46, // n0x1076 c0x0000 (---------------) + I kariwa + 0x0031a0cb, // n0x1077 c0x0000 (---------------) + I kashiwazaki + 0x002ab94c, // n0x1078 c0x0000 (---------------) + I minamiuonuma + 0x00229dc7, // n0x1079 c0x0000 (---------------) + I mitsuke + 0x002c8c45, // n0x107a c0x0000 (---------------) + I muika + 0x00371b88, // n0x107b c0x0000 (---------------) + I murakami + 0x0024d205, // n0x107c c0x0000 (---------------) + I myoko + 0x00301507, // n0x107d c0x0000 (---------------) + I nagaoka + 0x0036b607, // n0x107e c0x0000 (---------------) + I niigata + 0x00243605, // n0x107f c0x0000 (---------------) + I ojiya + 0x0020e583, // n0x1080 c0x0000 (---------------) + I omi + 0x0035da84, // n0x1081 c0x0000 (---------------) + I sado + 0x0020a085, // n0x1082 c0x0000 (---------------) + I sanjo + 0x002f6205, // n0x1083 c0x0000 (---------------) + I seiro + 0x002f6206, // n0x1084 c0x0000 (---------------) + I seirou + 0x00262888, // n0x1085 c0x0000 (---------------) + I sekikawa + 0x00300147, // n0x1086 c0x0000 (---------------) + I shibata + 0x0034e286, // n0x1087 c0x0000 (---------------) + I tagami + 0x0030ee86, // n0x1088 c0x0000 (---------------) + I tainai + 0x0027fe46, // n0x1089 c0x0000 (---------------) + I tochio + 0x00287c09, // n0x108a c0x0000 (---------------) + I tokamachi + 0x00378b87, // n0x108b c0x0000 (---------------) + I tsubame + 0x0020b306, // n0x108c c0x0000 (---------------) + I tsunan + 0x002abac6, // n0x108d c0x0000 (---------------) + I uonuma + 0x002436c6, // n0x108e c0x0000 (---------------) + I yahiko + 0x0029ed05, // n0x108f c0x0000 (---------------) + I yoita + 0x00214e06, // n0x1090 c0x0000 (---------------) + I yuzawa + 0x0037f305, // n0x1091 c0x0000 (---------------) + I beppu + 0x002c3708, // n0x1092 c0x0000 (---------------) + I bungoono + 0x002873cb, // n0x1093 c0x0000 (---------------) + I bungotakada + 0x00284686, // n0x1094 c0x0000 (---------------) + I hasama + 0x00331004, // n0x1095 c0x0000 (---------------) + I hiji + 0x002af209, // n0x1096 c0x0000 (---------------) + I himeshima + 0x00299f44, // n0x1097 c0x0000 (---------------) + I hita + 0x00260b08, // n0x1098 c0x0000 (---------------) + I kamitsue + 0x00334507, // n0x1099 c0x0000 (---------------) + I kokonoe + 0x0027a304, // n0x109a c0x0000 (---------------) + I kuju + 0x002aeb88, // n0x109b c0x0000 (---------------) + I kunisaki + 0x002b5004, // n0x109c c0x0000 (---------------) + I kusu + 0x0029ed44, // n0x109d c0x0000 (---------------) + I oita + 0x0027f045, // n0x109e c0x0000 (---------------) + I saiki + 0x002d3b06, // n0x109f c0x0000 (---------------) + I taketa + 0x002eb287, // n0x10a0 c0x0000 (---------------) + I tsukumi + 0x00204783, // n0x10a1 c0x0000 (---------------) + I usa + 0x00294a85, // n0x10a2 c0x0000 (---------------) + I usuki + 0x002b7284, // n0x10a3 c0x0000 (---------------) + I yufu + 0x00255e86, // n0x10a4 c0x0000 (---------------) + I akaiwa + 0x0025bec8, // n0x10a5 c0x0000 (---------------) + I asakuchi + 0x0030a145, // n0x10a6 c0x0000 (---------------) + I bizen + 0x00287089, // n0x10a7 c0x0000 (---------------) + I hayashima + 0x002bebc5, // n0x10a8 c0x0000 (---------------) + I ibara + 0x002b6c88, // n0x10a9 c0x0000 (---------------) + I kagamino + 0x002fec47, // n0x10aa c0x0000 (---------------) + I kasaoka + 0x0037b8c8, // n0x10ab c0x0000 (---------------) + I kibichuo + 0x002adb07, // n0x10ac c0x0000 (---------------) + I kumenan + 0x00357a89, // n0x10ad c0x0000 (---------------) + I kurashiki + 0x0035a506, // n0x10ae c0x0000 (---------------) + I maniwa + 0x00318986, // n0x10af c0x0000 (---------------) + I misaki + 0x00261984, // n0x10b0 c0x0000 (---------------) + I nagi + 0x0028b8c5, // n0x10b1 c0x0000 (---------------) + I niimi + 0x002e994c, // n0x10b2 c0x0000 (---------------) + I nishiawakura + 0x00271747, // n0x10b3 c0x0000 (---------------) + I okayama + 0x00271e07, // n0x10b4 c0x0000 (---------------) + I satosho + 0x00330e88, // n0x10b5 c0x0000 (---------------) + I setouchi + 0x0027d4c6, // n0x10b6 c0x0000 (---------------) + I shinjo + 0x00296704, // n0x10b7 c0x0000 (---------------) + I shoo + 0x00317984, // n0x10b8 c0x0000 (---------------) + I soja + 0x00277cc9, // n0x10b9 c0x0000 (---------------) + I takahashi + 0x002bb106, // n0x10ba c0x0000 (---------------) + I tamano + 0x0020d747, // n0x10bb c0x0000 (---------------) + I tsuyama + 0x0027cc04, // n0x10bc c0x0000 (---------------) + I wake + 0x002a2b46, // n0x10bd c0x0000 (---------------) + I yakage + 0x00263f85, // n0x10be c0x0000 (---------------) + I aguni + 0x0029a247, // n0x10bf c0x0000 (---------------) + I ginowan + 0x002c5586, // n0x10c0 c0x0000 (---------------) + I ginoza + 0x002460c9, // n0x10c1 c0x0000 (---------------) + I gushikami + 0x00276807, // n0x10c2 c0x0000 (---------------) + I haebaru + 0x00260407, // n0x10c3 c0x0000 (---------------) + I higashi + 0x00297386, // n0x10c4 c0x0000 (---------------) + I hirara + 0x0022c005, // n0x10c5 c0x0000 (---------------) + I iheya + 0x00275fc8, // n0x10c6 c0x0000 (---------------) + I ishigaki + 0x0021af48, // n0x10c7 c0x0000 (---------------) + I ishikawa + 0x00237186, // n0x10c8 c0x0000 (---------------) + I itoman + 0x0030a185, // n0x10c9 c0x0000 (---------------) + I izena + 0x002bdd46, // n0x10ca c0x0000 (---------------) + I kadena + 0x00214a83, // n0x10cb c0x0000 (---------------) + I kin + 0x0028f349, // n0x10cc c0x0000 (---------------) + I kitadaito + 0x0029cf8e, // n0x10cd c0x0000 (---------------) + I kitanakagusuku + 0x002abfc8, // n0x10ce c0x0000 (---------------) + I kumejima + 0x0028d688, // n0x10cf c0x0000 (---------------) + I kunigami + 0x00236f8b, // n0x10d0 c0x0000 (---------------) + I minamidaito + 0x002872c6, // n0x10d1 c0x0000 (---------------) + I motobu + 0x0022d884, // n0x10d2 c0x0000 (---------------) + I nago + 0x00207104, // n0x10d3 c0x0000 (---------------) + I naha + 0x0029d08a, // n0x10d4 c0x0000 (---------------) + I nakagusuku + 0x00216787, // n0x10d5 c0x0000 (---------------) + I nakijin + 0x0020b3c5, // n0x10d6 c0x0000 (---------------) + I nanjo + 0x00214789, // n0x10d7 c0x0000 (---------------) + I nishihara + 0x002b2b85, // n0x10d8 c0x0000 (---------------) + I ogimi + 0x00390f07, // n0x10d9 c0x0000 (---------------) + I okinawa + 0x002f8604, // n0x10da c0x0000 (---------------) + I onna + 0x0039da87, // n0x10db c0x0000 (---------------) + I shimoji + 0x002eedc8, // n0x10dc c0x0000 (---------------) + I taketomi + 0x002a8a46, // n0x10dd c0x0000 (---------------) + I tarama + 0x002f29c9, // n0x10de c0x0000 (---------------) + I tokashiki + 0x002b020a, // n0x10df c0x0000 (---------------) + I tomigusuku + 0x00216706, // n0x10e0 c0x0000 (---------------) + I tonaki + 0x0028c4c6, // n0x10e1 c0x0000 (---------------) + I urasoe + 0x002a2e85, // n0x10e2 c0x0000 (---------------) + I uruma + 0x003704c5, // n0x10e3 c0x0000 (---------------) + I yaese + 0x00321bc7, // n0x10e4 c0x0000 (---------------) + I yomitan + 0x00322048, // n0x10e5 c0x0000 (---------------) + I yonabaru + 0x00263ec8, // n0x10e6 c0x0000 (---------------) + I yonaguni + 0x00245cc6, // n0x10e7 c0x0000 (---------------) + I zamami + 0x00222985, // n0x10e8 c0x0000 (---------------) + I abeno + 0x0024cb8e, // n0x10e9 c0x0000 (---------------) + I chihayaakasaka + 0x00359404, // n0x10ea c0x0000 (---------------) + I chuo + 0x00237105, // n0x10eb c0x0000 (---------------) + I daito + 0x00270589, // n0x10ec c0x0000 (---------------) + I fujiidera + 0x002430c8, // n0x10ed c0x0000 (---------------) + I habikino + 0x00390386, // n0x10ee c0x0000 (---------------) + I hannan + 0x00291ccc, // n0x10ef c0x0000 (---------------) + I higashiosaka + 0x002937d0, // n0x10f0 c0x0000 (---------------) + I higashisumiyoshi + 0x002955cf, // n0x10f1 c0x0000 (---------------) + I higashiyodogawa + 0x00296808, // n0x10f2 c0x0000 (---------------) + I hirakata + 0x002bebc7, // n0x10f3 c0x0000 (---------------) + I ibaraki + 0x00202b85, // n0x10f4 c0x0000 (---------------) + I ikeda + 0x0026a785, // n0x10f5 c0x0000 (---------------) + I izumi + 0x002eb109, // n0x10f6 c0x0000 (---------------) + I izumiotsu + 0x0028b289, // n0x10f7 c0x0000 (---------------) + I izumisano + 0x0023a606, // n0x10f8 c0x0000 (---------------) + I kadoma + 0x002f1487, // n0x10f9 c0x0000 (---------------) + I kaizuka + 0x00200b05, // n0x10fa c0x0000 (---------------) + I kanan + 0x00310789, // n0x10fb c0x0000 (---------------) + I kashiwara + 0x0030bb86, // n0x10fc c0x0000 (---------------) + I katano + 0x0030f00d, // n0x10fd c0x0000 (---------------) + I kawachinagano + 0x00278009, // n0x10fe c0x0000 (---------------) + I kishiwada + 0x0020cb44, // n0x10ff c0x0000 (---------------) + I kita + 0x002abd48, // n0x1100 c0x0000 (---------------) + I kumatori + 0x00396009, // n0x1101 c0x0000 (---------------) + I matsubara + 0x00348906, // n0x1102 c0x0000 (---------------) + I minato + 0x00270d05, // n0x1103 c0x0000 (---------------) + I minoh + 0x00318986, // n0x1104 c0x0000 (---------------) + I misaki + 0x0030ae49, // n0x1105 c0x0000 (---------------) + I moriguchi + 0x00378788, // n0x1106 c0x0000 (---------------) + I neyagawa + 0x002123c5, // n0x1107 c0x0000 (---------------) + I nishi + 0x00262804, // n0x1108 c0x0000 (---------------) + I nose + 0x00291e8b, // n0x1109 c0x0000 (---------------) + I osakasayama + 0x003487c5, // n0x110a c0x0000 (---------------) + I sakai + 0x00291fc6, // n0x110b c0x0000 (---------------) + I sayama + 0x00279846, // n0x110c c0x0000 (---------------) + I sennan + 0x002465c6, // n0x110d c0x0000 (---------------) + I settsu + 0x002fe74b, // n0x110e c0x0000 (---------------) + I shijonawate + 0x00287189, // n0x110f c0x0000 (---------------) + I shimamoto + 0x00210c85, // n0x1110 c0x0000 (---------------) + I suita + 0x0037b687, // n0x1111 c0x0000 (---------------) + I tadaoka + 0x00213006, // n0x1112 c0x0000 (---------------) + I taishi + 0x00359fc6, // n0x1113 c0x0000 (---------------) + I tajiri + 0x00278a08, // n0x1114 c0x0000 (---------------) + I takaishi + 0x002d3c09, // n0x1115 c0x0000 (---------------) + I takatsuki + 0x0037288c, // n0x1116 c0x0000 (---------------) + I tondabayashi + 0x00242748, // n0x1117 c0x0000 (---------------) + I toyonaka + 0x00249546, // n0x1118 c0x0000 (---------------) + I toyono + 0x00340343, // n0x1119 c0x0000 (---------------) + I yao + 0x00308506, // n0x111a c0x0000 (---------------) + I ariake + 0x0026a445, // n0x111b c0x0000 (---------------) + I arita + 0x00274c08, // n0x111c c0x0000 (---------------) + I fukudomi + 0x00222386, // n0x111d c0x0000 (---------------) + I genkai + 0x0029a488, // n0x111e c0x0000 (---------------) + I hamatama + 0x0023d705, // n0x111f c0x0000 (---------------) + I hizen + 0x00273845, // n0x1120 c0x0000 (---------------) + I imari + 0x0028ce88, // n0x1121 c0x0000 (---------------) + I kamimine + 0x002e2b47, // n0x1122 c0x0000 (---------------) + I kanzaki + 0x0034dec7, // n0x1123 c0x0000 (---------------) + I karatsu + 0x0029ee47, // n0x1124 c0x0000 (---------------) + I kashima + 0x0021e6c8, // n0x1125 c0x0000 (---------------) + I kitagata + 0x00286248, // n0x1126 c0x0000 (---------------) + I kitahata + 0x00238ec6, // n0x1127 c0x0000 (---------------) + I kiyama + 0x00304547, // n0x1128 c0x0000 (---------------) + I kouhoku + 0x002a4bc7, // n0x1129 c0x0000 (---------------) + I kyuragi + 0x0026a30a, // n0x112a c0x0000 (---------------) + I nishiarita + 0x00225d03, // n0x112b c0x0000 (---------------) + I ogi + 0x00389cc6, // n0x112c c0x0000 (---------------) + I omachi + 0x0020b6c5, // n0x112d c0x0000 (---------------) + I ouchi + 0x0035a904, // n0x112e c0x0000 (---------------) + I saga + 0x00272949, // n0x112f c0x0000 (---------------) + I shiroishi + 0x00357a04, // n0x1130 c0x0000 (---------------) + I taku + 0x0021a304, // n0x1131 c0x0000 (---------------) + I tara + 0x00297d04, // n0x1132 c0x0000 (---------------) + I tosu + 0x00295b4b, // n0x1133 c0x0000 (---------------) + I yoshinogari + 0x00396187, // n0x1134 c0x0000 (---------------) + I arakawa + 0x0024cdc5, // n0x1135 c0x0000 (---------------) + I asaka + 0x00289e48, // n0x1136 c0x0000 (---------------) + I chichibu + 0x00270c06, // n0x1137 c0x0000 (---------------) + I fujimi + 0x00270c08, // n0x1138 c0x0000 (---------------) + I fujimino + 0x00274146, // n0x1139 c0x0000 (---------------) + I fukaya + 0x0039ed85, // n0x113a c0x0000 (---------------) + I hanno + 0x00282d85, // n0x113b c0x0000 (---------------) + I hanyu + 0x00285006, // n0x113c c0x0000 (---------------) + I hasuda + 0x002854c8, // n0x113d c0x0000 (---------------) + I hatogaya + 0x00285fc8, // n0x113e c0x0000 (---------------) + I hatoyama + 0x00272b06, // n0x113f c0x0000 (---------------) + I hidaka + 0x00289c8f, // n0x1140 c0x0000 (---------------) + I higashichichibu + 0x0028ee10, // n0x1141 c0x0000 (---------------) + I higashimatsuyama + 0x00201785, // n0x1142 c0x0000 (---------------) + I honjo + 0x002020c3, // n0x1143 c0x0000 (---------------) + I ina + 0x0024a3c5, // n0x1144 c0x0000 (---------------) + I iruma + 0x002f4cc8, // n0x1145 c0x0000 (---------------) + I iwatsuki + 0x0028b189, // n0x1146 c0x0000 (---------------) + I kamiizumi + 0x002e0f88, // n0x1147 c0x0000 (---------------) + I kamikawa + 0x002fed88, // n0x1148 c0x0000 (---------------) + I kamisato + 0x00362648, // n0x1149 c0x0000 (---------------) + I kasukabe + 0x00396247, // n0x114a c0x0000 (---------------) + I kawagoe + 0x002708c9, // n0x114b c0x0000 (---------------) + I kawaguchi + 0x0029a688, // n0x114c c0x0000 (---------------) + I kawajima + 0x00227ec4, // n0x114d c0x0000 (---------------) + I kazo + 0x00297b88, // n0x114e c0x0000 (---------------) + I kitamoto + 0x0026fec9, // n0x114f c0x0000 (---------------) + I koshigaya + 0x003269c7, // n0x1150 c0x0000 (---------------) + I kounosu + 0x0029cf04, // n0x1151 c0x0000 (---------------) + I kuki + 0x00268408, // n0x1152 c0x0000 (---------------) + I kumagaya + 0x0022c30a, // n0x1153 c0x0000 (---------------) + I matsubushi + 0x002cf1c6, // n0x1154 c0x0000 (---------------) + I minano + 0x002964c6, // n0x1155 c0x0000 (---------------) + I misato + 0x0021d249, // n0x1156 c0x0000 (---------------) + I miyashiro + 0x00293a07, // n0x1157 c0x0000 (---------------) + I miyoshi + 0x002c5148, // n0x1158 c0x0000 (---------------) + I moroyama + 0x0037f588, // n0x1159 c0x0000 (---------------) + I nagatoro + 0x0027ca88, // n0x115a c0x0000 (---------------) + I namegawa + 0x0034d8c5, // n0x115b c0x0000 (---------------) + I niiza + 0x00371485, // n0x115c c0x0000 (---------------) + I ogano + 0x00227945, // n0x115d c0x0000 (---------------) + I ogawa + 0x002a9e45, // n0x115e c0x0000 (---------------) + I ogose + 0x002e4ac7, // n0x115f c0x0000 (---------------) + I okegawa + 0x0020e585, // n0x1160 c0x0000 (---------------) + I omiya + 0x002b3a45, // n0x1161 c0x0000 (---------------) + I otaki + 0x00325386, // n0x1162 c0x0000 (---------------) + I ranzan + 0x002e0ec7, // n0x1163 c0x0000 (---------------) + I ryokami + 0x002ecc47, // n0x1164 c0x0000 (---------------) + I saitama + 0x0022c606, // n0x1165 c0x0000 (---------------) + I sakado + 0x002ca185, // n0x1166 c0x0000 (---------------) + I satte + 0x00291fc6, // n0x1167 c0x0000 (---------------) + I sayama + 0x00247f45, // n0x1168 c0x0000 (---------------) + I shiki + 0x002a28c8, // n0x1169 c0x0000 (---------------) + I shiraoka + 0x002d1484, // n0x116a c0x0000 (---------------) + I soka + 0x002b9546, // n0x116b c0x0000 (---------------) + I sugito + 0x003338c4, // n0x116c c0x0000 (---------------) + I toda + 0x00221b48, // n0x116d c0x0000 (---------------) + I tokigawa + 0x003814ca, // n0x116e c0x0000 (---------------) + I tokorozawa + 0x0027360c, // n0x116f c0x0000 (---------------) + I tsurugashima + 0x0037fc85, // n0x1170 c0x0000 (---------------) + I urawa + 0x00380246, // n0x1171 c0x0000 (---------------) + I warabi + 0x00372a46, // n0x1172 c0x0000 (---------------) + I yashio + 0x0031ab06, // n0x1173 c0x0000 (---------------) + I yokoze + 0x002495c4, // n0x1174 c0x0000 (---------------) + I yono + 0x0037f945, // n0x1175 c0x0000 (---------------) + I yorii + 0x00273f87, // n0x1176 c0x0000 (---------------) + I yoshida + 0x00293a89, // n0x1177 c0x0000 (---------------) + I yoshikawa + 0x0029b387, // n0x1178 c0x0000 (---------------) + I yoshimi + 0x0067e804, // n0x1179 c0x0001 (---------------) ! I city + 0x0067e804, // n0x117a c0x0001 (---------------) ! I city + 0x0030abc5, // n0x117b c0x0000 (---------------) + I aisho + 0x0022d3c4, // n0x117c c0x0000 (---------------) + I gamo + 0x0029168a, // n0x117d c0x0000 (---------------) + I higashiomi + 0x00270a86, // n0x117e c0x0000 (---------------) + I hikone + 0x00348b04, // n0x117f c0x0000 (---------------) + I koka + 0x0020d205, // n0x1180 c0x0000 (---------------) + I konan + 0x00356245, // n0x1181 c0x0000 (---------------) + I kosei + 0x002f8ec4, // n0x1182 c0x0000 (---------------) + I koto + 0x00279487, // n0x1183 c0x0000 (---------------) + I kusatsu + 0x00335607, // n0x1184 c0x0000 (---------------) + I maibara + 0x002c4788, // n0x1185 c0x0000 (---------------) + I moriyama + 0x00302488, // n0x1186 c0x0000 (---------------) + I nagahama + 0x002123c9, // n0x1187 c0x0000 (---------------) + I nishiazai + 0x0024f5c8, // n0x1188 c0x0000 (---------------) + I notogawa + 0x0029184b, // n0x1189 c0x0000 (---------------) + I omihachiman + 0x0021e444, // n0x118a c0x0000 (---------------) + I otsu + 0x002f6985, // n0x118b c0x0000 (---------------) + I ritto + 0x00276705, // n0x118c c0x0000 (---------------) + I ryuoh + 0x0029edc9, // n0x118d c0x0000 (---------------) + I takashima + 0x002d3c09, // n0x118e c0x0000 (---------------) + I takatsuki + 0x002af108, // n0x118f c0x0000 (---------------) + I torahime + 0x00254088, // n0x1190 c0x0000 (---------------) + I toyosato + 0x0026ab04, // n0x1191 c0x0000 (---------------) + I yasu + 0x00297ec5, // n0x1192 c0x0000 (---------------) + I akagi + 0x00201383, // n0x1193 c0x0000 (---------------) + I ama + 0x0021e405, // n0x1194 c0x0000 (---------------) + I gotsu + 0x0028d886, // n0x1195 c0x0000 (---------------) + I hamada + 0x0028ad0c, // n0x1196 c0x0000 (---------------) + I higashiizumo + 0x0021afc6, // n0x1197 c0x0000 (---------------) + I hikawa + 0x00247f86, // n0x1198 c0x0000 (---------------) + I hikimi + 0x0028aec5, // n0x1199 c0x0000 (---------------) + I izumo + 0x002f5588, // n0x119a c0x0000 (---------------) + I kakinoki + 0x002abbc6, // n0x119b c0x0000 (---------------) + I masuda + 0x002e4446, // n0x119c c0x0000 (---------------) + I matsue + 0x002964c6, // n0x119d c0x0000 (---------------) + I misato + 0x002280cc, // n0x119e c0x0000 (---------------) + I nishinoshima + 0x0025c804, // n0x119f c0x0000 (---------------) + I ohda + 0x0027ff8a, // n0x11a0 c0x0000 (---------------) + I okinoshima + 0x00390548, // n0x11a1 c0x0000 (---------------) + I okuizumo + 0x0028ab47, // n0x11a2 c0x0000 (---------------) + I shimane + 0x00241f86, // n0x11a3 c0x0000 (---------------) + I tamayu + 0x0020b547, // n0x11a4 c0x0000 (---------------) + I tsuwano + 0x002d9e05, // n0x11a5 c0x0000 (---------------) + I unnan + 0x002569c6, // n0x11a6 c0x0000 (---------------) + I yakumo + 0x0034b606, // n0x11a7 c0x0000 (---------------) + I yasugi + 0x003745c7, // n0x11a8 c0x0000 (---------------) + I yatsuka + 0x0021a344, // n0x11a9 c0x0000 (---------------) + I arai + 0x00229605, // n0x11aa c0x0000 (---------------) + I atami + 0x00270584, // n0x11ab c0x0000 (---------------) + I fuji + 0x00291287, // n0x11ac c0x0000 (---------------) + I fujieda + 0x002707c8, // n0x11ad c0x0000 (---------------) + I fujikawa + 0x0027134a, // n0x11ae c0x0000 (---------------) + I fujinomiya + 0x00276cc7, // n0x11af c0x0000 (---------------) + I fukuroi + 0x00237307, // n0x11b0 c0x0000 (---------------) + I gotemba + 0x002beb47, // n0x11b1 c0x0000 (---------------) + I haibara + 0x0024d349, // n0x11b2 c0x0000 (---------------) + I hamamatsu + 0x0028ad0a, // n0x11b3 c0x0000 (---------------) + I higashiizu + 0x0022b2c3, // n0x11b4 c0x0000 (---------------) + I ito + 0x0021a245, // n0x11b5 c0x0000 (---------------) + I iwata + 0x00217543, // n0x11b6 c0x0000 (---------------) + I izu + 0x00304849, // n0x11b7 c0x0000 (---------------) + I izunokuni + 0x0022bd88, // n0x11b8 c0x0000 (---------------) + I kakegawa + 0x0029e507, // n0x11b9 c0x0000 (---------------) + I kannami + 0x002e1089, // n0x11ba c0x0000 (---------------) + I kawanehon + 0x0021b046, // n0x11bb c0x0000 (---------------) + I kawazu + 0x002fa108, // n0x11bc c0x0000 (---------------) + I kikugawa + 0x002d7705, // n0x11bd c0x0000 (---------------) + I kosai + 0x0032034a, // n0x11be c0x0000 (---------------) + I makinohara + 0x00228349, // n0x11bf c0x0000 (---------------) + I matsuzaki + 0x002608c9, // n0x11c0 c0x0000 (---------------) + I minamiizu + 0x0039fb87, // n0x11c1 c0x0000 (---------------) + I mishima + 0x002547c9, // n0x11c2 c0x0000 (---------------) + I morimachi + 0x00217408, // n0x11c3 c0x0000 (---------------) + I nishiizu + 0x002d1586, // n0x11c4 c0x0000 (---------------) + I numazu + 0x00380408, // n0x11c5 c0x0000 (---------------) + I omaezaki + 0x00209c07, // n0x11c6 c0x0000 (---------------) + I shimada + 0x00352287, // n0x11c7 c0x0000 (---------------) + I shimizu + 0x0039ff47, // n0x11c8 c0x0000 (---------------) + I shimoda + 0x002f2e48, // n0x11c9 c0x0000 (---------------) + I shizuoka + 0x002e28c6, // n0x11ca c0x0000 (---------------) + I susono + 0x0022c0c5, // n0x11cb c0x0000 (---------------) + I yaizu + 0x00273f87, // n0x11cc c0x0000 (---------------) + I yoshida + 0x0028bfc8, // n0x11cd c0x0000 (---------------) + I ashikaga + 0x003423c4, // n0x11ce c0x0000 (---------------) + I bato + 0x00279c04, // n0x11cf c0x0000 (---------------) + I haga + 0x002f4287, // n0x11d0 c0x0000 (---------------) + I ichikai + 0x002a4287, // n0x11d1 c0x0000 (---------------) + I iwafune + 0x002e324a, // n0x11d2 c0x0000 (---------------) + I kaminokawa + 0x002d1506, // n0x11d3 c0x0000 (---------------) + I kanuma + 0x002e7c0a, // n0x11d4 c0x0000 (---------------) + I karasuyama + 0x002b2e47, // n0x11d5 c0x0000 (---------------) + I kuroiso + 0x003591c7, // n0x11d6 c0x0000 (---------------) + I mashiko + 0x00331344, // n0x11d7 c0x0000 (---------------) + I mibu + 0x0025ab44, // n0x11d8 c0x0000 (---------------) + I moka + 0x0022a386, // n0x11d9 c0x0000 (---------------) + I motegi + 0x00225804, // n0x11da c0x0000 (---------------) + I nasu + 0x0022580c, // n0x11db c0x0000 (---------------) + I nasushiobara + 0x0020a7c5, // n0x11dc c0x0000 (---------------) + I nikko + 0x002180c9, // n0x11dd c0x0000 (---------------) + I nishikata + 0x0027bb44, // n0x11de c0x0000 (---------------) + I nogi + 0x002967c5, // n0x11df c0x0000 (---------------) + I ohira + 0x00270dc8, // n0x11e0 c0x0000 (---------------) + I ohtawara + 0x00286085, // n0x11e1 c0x0000 (---------------) + I oyama + 0x002fe346, // n0x11e2 c0x0000 (---------------) + I sakura + 0x0020d5c4, // n0x11e3 c0x0000 (---------------) + I sano + 0x0026b5ca, // n0x11e4 c0x0000 (---------------) + I shimotsuke + 0x002923c6, // n0x11e5 c0x0000 (---------------) + I shioya + 0x00248f0a, // n0x11e6 c0x0000 (---------------) + I takanezawa + 0x00342447, // n0x11e7 c0x0000 (---------------) + I tochigi + 0x0020f0c5, // n0x11e8 c0x0000 (---------------) + I tsuga + 0x0021a9c5, // n0x11e9 c0x0000 (---------------) + I ujiie + 0x002a560a, // n0x11ea c0x0000 (---------------) + I utsunomiya + 0x00297945, // n0x11eb c0x0000 (---------------) + I yaita + 0x002963c6, // n0x11ec c0x0000 (---------------) + I aizumi + 0x00200b44, // n0x11ed c0x0000 (---------------) + I anan + 0x002a7646, // n0x11ee c0x0000 (---------------) + I ichiba + 0x00321c85, // n0x11ef c0x0000 (---------------) + I itano + 0x00222446, // n0x11f0 c0x0000 (---------------) + I kainan + 0x0028e9cc, // n0x11f1 c0x0000 (---------------) + I komatsushima + 0x002c7e8a, // n0x11f2 c0x0000 (---------------) + I matsushige + 0x00267204, // n0x11f3 c0x0000 (---------------) + I mima + 0x00236f86, // n0x11f4 c0x0000 (---------------) + I minami + 0x00293a07, // n0x11f5 c0x0000 (---------------) + I miyoshi + 0x002c8304, // n0x11f6 c0x0000 (---------------) + I mugi + 0x002a6788, // n0x11f7 c0x0000 (---------------) + I nakagawa + 0x003813c6, // n0x11f8 c0x0000 (---------------) + I naruto + 0x0024ca09, // n0x11f9 c0x0000 (---------------) + I sanagochi + 0x002ed689, // n0x11fa c0x0000 (---------------) + I shishikui + 0x00285d89, // n0x11fb c0x0000 (---------------) + I tokushima + 0x00369686, // n0x11fc c0x0000 (---------------) + I wajiki + 0x00209d06, // n0x11fd c0x0000 (---------------) + I adachi + 0x00380547, // n0x11fe c0x0000 (---------------) + I akiruno + 0x002bd008, // n0x11ff c0x0000 (---------------) + I akishima + 0x00209b09, // n0x1200 c0x0000 (---------------) + I aogashima + 0x00396187, // n0x1201 c0x0000 (---------------) + I arakawa + 0x00289fc6, // n0x1202 c0x0000 (---------------) + I bunkyo + 0x003a2b07, // n0x1203 c0x0000 (---------------) + I chiyoda + 0x002d4b85, // n0x1204 c0x0000 (---------------) + I chofu + 0x00359404, // n0x1205 c0x0000 (---------------) + I chuo + 0x00380107, // n0x1206 c0x0000 (---------------) + I edogawa + 0x002b7305, // n0x1207 c0x0000 (---------------) + I fuchu + 0x0027ef85, // n0x1208 c0x0000 (---------------) + I fussa + 0x002f5d47, // n0x1209 c0x0000 (---------------) + I hachijo + 0x002434c8, // n0x120a c0x0000 (---------------) + I hachioji + 0x00371b06, // n0x120b c0x0000 (---------------) + I hamura + 0x0028da0d, // n0x120c c0x0000 (---------------) + I higashikurume + 0x0028f6cf, // n0x120d c0x0000 (---------------) + I higashimurayama + 0x00294e0d, // n0x120e c0x0000 (---------------) + I higashiyamato + 0x00205904, // n0x120f c0x0000 (---------------) + I hino + 0x002362c6, // n0x1210 c0x0000 (---------------) + I hinode + 0x002cc048, // n0x1211 c0x0000 (---------------) + I hinohara + 0x002a1905, // n0x1212 c0x0000 (---------------) + I inagi + 0x0026a4c8, // n0x1213 c0x0000 (---------------) + I itabashi + 0x0020ae0a, // n0x1214 c0x0000 (---------------) + I katsushika + 0x0020cb44, // n0x1215 c0x0000 (---------------) + I kita + 0x00353546, // n0x1216 c0x0000 (---------------) + I kiyose + 0x002a1487, // n0x1217 c0x0000 (---------------) + I kodaira + 0x00223547, // n0x1218 c0x0000 (---------------) + I koganei + 0x002980c9, // n0x1219 c0x0000 (---------------) + I kokubunji + 0x003803c5, // n0x121a c0x0000 (---------------) + I komae + 0x002f8ec4, // n0x121b c0x0000 (---------------) + I koto + 0x00358fca, // n0x121c c0x0000 (---------------) + I kouzushima + 0x002afcc9, // n0x121d c0x0000 (---------------) + I kunitachi + 0x002548c7, // n0x121e c0x0000 (---------------) + I machida + 0x0028dcc6, // n0x121f c0x0000 (---------------) + I meguro + 0x00348906, // n0x1220 c0x0000 (---------------) + I minato + 0x00297e06, // n0x1221 c0x0000 (---------------) + I mitaka + 0x00358ac6, // n0x1222 c0x0000 (---------------) + I mizuho + 0x002cb9cf, // n0x1223 c0x0000 (---------------) + I musashimurayama + 0x002cbf09, // n0x1224 c0x0000 (---------------) + I musashino + 0x00303406, // n0x1225 c0x0000 (---------------) + I nakano + 0x0024fc46, // n0x1226 c0x0000 (---------------) + I nerima + 0x00379a49, // n0x1227 c0x0000 (---------------) + I ogasawara + 0x00304647, // n0x1228 c0x0000 (---------------) + I okutama + 0x00211c03, // n0x1229 c0x0000 (---------------) + I ome + 0x0020cd06, // n0x122a c0x0000 (---------------) + I oshima + 0x0020a183, // n0x122b c0x0000 (---------------) + I ota + 0x00246ac8, // n0x122c c0x0000 (---------------) + I setagaya + 0x003a2947, // n0x122d c0x0000 (---------------) + I shibuya + 0x00296a09, // n0x122e c0x0000 (---------------) + I shinagawa + 0x0027e9c8, // n0x122f c0x0000 (---------------) + I shinjuku + 0x0034e008, // n0x1230 c0x0000 (---------------) + I suginami + 0x002105c6, // n0x1231 c0x0000 (---------------) + I sumida + 0x0033d889, // n0x1232 c0x0000 (---------------) + I tachikawa + 0x0036b745, // n0x1233 c0x0000 (---------------) + I taito + 0x00241f84, // n0x1234 c0x0000 (---------------) + I tama + 0x00242a87, // n0x1235 c0x0000 (---------------) + I toshima + 0x0024ffc5, // n0x1236 c0x0000 (---------------) + I chizu + 0x00205904, // n0x1237 c0x0000 (---------------) + I hino + 0x0024ce88, // n0x1238 c0x0000 (---------------) + I kawahara + 0x00216a44, // n0x1239 c0x0000 (---------------) + I koge + 0x002fb907, // n0x123a c0x0000 (---------------) + I kotoura + 0x00343dc6, // n0x123b c0x0000 (---------------) + I misasa + 0x002dfc05, // n0x123c c0x0000 (---------------) + I nanbu + 0x0027ac08, // n0x123d c0x0000 (---------------) + I nichinan + 0x003487cb, // n0x123e c0x0000 (---------------) + I sakaiminato + 0x002f0147, // n0x123f c0x0000 (---------------) + I tottori + 0x002a5886, // n0x1240 c0x0000 (---------------) + I wakasa + 0x002ba804, // n0x1241 c0x0000 (---------------) + I yazu + 0x0022d806, // n0x1242 c0x0000 (---------------) + I yonago + 0x002b9085, // n0x1243 c0x0000 (---------------) + I asahi + 0x002b7305, // n0x1244 c0x0000 (---------------) + I fuchu + 0x00275d49, // n0x1245 c0x0000 (---------------) + I fukumitsu + 0x00279089, // n0x1246 c0x0000 (---------------) + I funahashi + 0x0029b444, // n0x1247 c0x0000 (---------------) + I himi + 0x00352305, // n0x1248 c0x0000 (---------------) + I imizu + 0x00236fc5, // n0x1249 c0x0000 (---------------) + I inami + 0x003201c6, // n0x124a c0x0000 (---------------) + I johana + 0x002f4188, // n0x124b c0x0000 (---------------) + I kamiichi + 0x002b2746, // n0x124c c0x0000 (---------------) + I kurobe + 0x0030a24b, // n0x124d c0x0000 (---------------) + I nakaniikawa + 0x002f868a, // n0x124e c0x0000 (---------------) + I namerikawa + 0x002f2905, // n0x124f c0x0000 (---------------) + I nanto + 0x00282e06, // n0x1250 c0x0000 (---------------) + I nyuzen + 0x002eaa05, // n0x1251 c0x0000 (---------------) + I oyabe + 0x00210d45, // n0x1252 c0x0000 (---------------) + I taira + 0x002863c7, // n0x1253 c0x0000 (---------------) + I takaoka + 0x00201248, // n0x1254 c0x0000 (---------------) + I tateyama + 0x0024f644, // n0x1255 c0x0000 (---------------) + I toga + 0x0025bd46, // n0x1256 c0x0000 (---------------) + I tonami + 0x00286046, // n0x1257 c0x0000 (---------------) + I toyama + 0x002175c7, // n0x1258 c0x0000 (---------------) + I unazuki + 0x002f6f84, // n0x1259 c0x0000 (---------------) + I uozu + 0x00274a86, // n0x125a c0x0000 (---------------) + I yamada + 0x0030e285, // n0x125b c0x0000 (---------------) + I arida + 0x0030e289, // n0x125c c0x0000 (---------------) + I aridagawa + 0x00209f04, // n0x125d c0x0000 (---------------) + I gobo + 0x0027f9c9, // n0x125e c0x0000 (---------------) + I hashimoto + 0x00272b06, // n0x125f c0x0000 (---------------) + I hidaka + 0x002b44c8, // n0x1260 c0x0000 (---------------) + I hirogawa + 0x00236fc5, // n0x1261 c0x0000 (---------------) + I inami + 0x003310c5, // n0x1262 c0x0000 (---------------) + I iwade + 0x00222446, // n0x1263 c0x0000 (---------------) + I kainan + 0x00372789, // n0x1264 c0x0000 (---------------) + I kamitonda + 0x00219449, // n0x1265 c0x0000 (---------------) + I katsuragi + 0x00248006, // n0x1266 c0x0000 (---------------) + I kimino + 0x002431c8, // n0x1267 c0x0000 (---------------) + I kinokawa + 0x0021eb88, // n0x1268 c0x0000 (---------------) + I kitayama + 0x002ea9c4, // n0x1269 c0x0000 (---------------) + I koya + 0x00367984, // n0x126a c0x0000 (---------------) + I koza + 0x00367988, // n0x126b c0x0000 (---------------) + I kozagawa + 0x00306448, // n0x126c c0x0000 (---------------) + I kudoyama + 0x00366b09, // n0x126d c0x0000 (---------------) + I kushimoto + 0x0028d806, // n0x126e c0x0000 (---------------) + I mihama + 0x002964c6, // n0x126f c0x0000 (---------------) + I misato + 0x00313f0d, // n0x1270 c0x0000 (---------------) + I nachikatsuura + 0x002a9586, // n0x1271 c0x0000 (---------------) + I shingu + 0x002999c9, // n0x1272 c0x0000 (---------------) + I shirahama + 0x00389e85, // n0x1273 c0x0000 (---------------) + I taiji + 0x002ffb46, // n0x1274 c0x0000 (---------------) + I tanabe + 0x0033da48, // n0x1275 c0x0000 (---------------) + I wakayama + 0x00311445, // n0x1276 c0x0000 (---------------) + I yuasa + 0x002a4c04, // n0x1277 c0x0000 (---------------) + I yura + 0x002b9085, // n0x1278 c0x0000 (---------------) + I asahi + 0x00278708, // n0x1279 c0x0000 (---------------) + I funagata + 0x00291449, // n0x127a c0x0000 (---------------) + I higashine + 0x00270644, // n0x127b c0x0000 (---------------) + I iide + 0x0034eac6, // n0x127c c0x0000 (---------------) + I kahoku + 0x00348f8a, // n0x127d c0x0000 (---------------) + I kaminoyama + 0x0021b1c8, // n0x127e c0x0000 (---------------) + I kaneyama + 0x002e33c9, // n0x127f c0x0000 (---------------) + I kawanishi + 0x0022780a, // n0x1280 c0x0000 (---------------) + I mamurogawa + 0x002e1006, // n0x1281 c0x0000 (---------------) + I mikawa + 0x0028f888, // n0x1282 c0x0000 (---------------) + I murayama + 0x003012c5, // n0x1283 c0x0000 (---------------) + I nagai + 0x002c7d08, // n0x1284 c0x0000 (---------------) + I nakayama + 0x002adc05, // n0x1285 c0x0000 (---------------) + I nanyo + 0x0021af09, // n0x1286 c0x0000 (---------------) + I nishikawa + 0x0035e9c9, // n0x1287 c0x0000 (---------------) + I obanazawa + 0x00206e82, // n0x1288 c0x0000 (---------------) + I oe + 0x00281985, // n0x1289 c0x0000 (---------------) + I oguni + 0x00268d06, // n0x128a c0x0000 (---------------) + I ohkura + 0x00272a47, // n0x128b c0x0000 (---------------) + I oishida + 0x0035a905, // n0x128c c0x0000 (---------------) + I sagae + 0x002eecc6, // n0x128d c0x0000 (---------------) + I sakata + 0x00311508, // n0x128e c0x0000 (---------------) + I sakegawa + 0x0027d4c6, // n0x128f c0x0000 (---------------) + I shinjo + 0x002edc89, // n0x1290 c0x0000 (---------------) + I shirataka + 0x00271f06, // n0x1291 c0x0000 (---------------) + I shonai + 0x00278888, // n0x1292 c0x0000 (---------------) + I takahata + 0x0029f8c5, // n0x1293 c0x0000 (---------------) + I tendo + 0x00263206, // n0x1294 c0x0000 (---------------) + I tozawa + 0x00322848, // n0x1295 c0x0000 (---------------) + I tsuruoka + 0x00277b48, // n0x1296 c0x0000 (---------------) + I yamagata + 0x00300508, // n0x1297 c0x0000 (---------------) + I yamanobe + 0x00364e48, // n0x1298 c0x0000 (---------------) + I yonezawa + 0x00214e04, // n0x1299 c0x0000 (---------------) + I yuza + 0x00242fc3, // n0x129a c0x0000 (---------------) + I abu + 0x002edec4, // n0x129b c0x0000 (---------------) + I hagi + 0x0022fec6, // n0x129c c0x0000 (---------------) + I hikari + 0x002d4bc4, // n0x129d c0x0000 (---------------) + I hofu + 0x0028d5c7, // n0x129e c0x0000 (---------------) + I iwakuni + 0x002e4349, // n0x129f c0x0000 (---------------) + I kudamatsu + 0x002ba005, // n0x12a0 c0x0000 (---------------) + I mitou + 0x0037f586, // n0x12a1 c0x0000 (---------------) + I nagato + 0x0020cd06, // n0x12a2 c0x0000 (---------------) + I oshima + 0x002626cb, // n0x12a3 c0x0000 (---------------) + I shimonoseki + 0x002f2846, // n0x12a4 c0x0000 (---------------) + I shunan + 0x00306746, // n0x12a5 c0x0000 (---------------) + I tabuse + 0x00340808, // n0x12a6 c0x0000 (---------------) + I tokuyama + 0x00254b06, // n0x12a7 c0x0000 (---------------) + I toyota + 0x00287ec3, // n0x12a8 c0x0000 (---------------) + I ube + 0x00214083, // n0x12a9 c0x0000 (---------------) + I yuu + 0x00359404, // n0x12aa c0x0000 (---------------) + I chuo + 0x00231585, // n0x12ab c0x0000 (---------------) + I doshi + 0x002a4d87, // n0x12ac c0x0000 (---------------) + I fuefuki + 0x002707c8, // n0x12ad c0x0000 (---------------) + I fujikawa + 0x002707cf, // n0x12ae c0x0000 (---------------) + I fujikawaguchiko + 0x00273e8b, // n0x12af c0x0000 (---------------) + I fujiyoshida + 0x002f3f88, // n0x12b0 c0x0000 (---------------) + I hayakawa + 0x0034eb46, // n0x12b1 c0x0000 (---------------) + I hokuto + 0x003335ce, // n0x12b2 c0x0000 (---------------) + I ichikawamisato + 0x00222443, // n0x12b3 c0x0000 (---------------) + I kai + 0x00339244, // n0x12b4 c0x0000 (---------------) + I kofu + 0x002f27c5, // n0x12b5 c0x0000 (---------------) + I koshu + 0x00346486, // n0x12b6 c0x0000 (---------------) + I kosuge + 0x0028498b, // n0x12b7 c0x0000 (---------------) + I minami-alps + 0x00288386, // n0x12b8 c0x0000 (---------------) + I minobu + 0x0020f889, // n0x12b9 c0x0000 (---------------) + I nakamichi + 0x002dfc05, // n0x12ba c0x0000 (---------------) + I nanbu + 0x0037cd08, // n0x12bb c0x0000 (---------------) + I narusawa + 0x0020fc48, // n0x12bc c0x0000 (---------------) + I nirasaki + 0x0021930c, // n0x12bd c0x0000 (---------------) + I nishikatsura + 0x00295b86, // n0x12be c0x0000 (---------------) + I oshino + 0x0021e446, // n0x12bf c0x0000 (---------------) + I otsuki + 0x002ab745, // n0x12c0 c0x0000 (---------------) + I showa + 0x002805c8, // n0x12c1 c0x0000 (---------------) + I tabayama + 0x00273605, // n0x12c2 c0x0000 (---------------) + I tsuru + 0x003855c8, // n0x12c3 c0x0000 (---------------) + I uenohara + 0x0029524a, // n0x12c4 c0x0000 (---------------) + I yamanakako + 0x00298d49, // n0x12c5 c0x0000 (---------------) + I yamanashi + 0x0067e804, // n0x12c6 c0x0001 (---------------) ! I city + 0x2d608182, // n0x12c7 c0x00b5 (n0x12c8-n0x12c9) o I co + 0x000f5248, // n0x12c8 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x12c9 c0x0000 (---------------) + I com + 0x002349c3, // n0x12ca c0x0000 (---------------) + I edu + 0x00275003, // n0x12cb c0x0000 (---------------) + I gov + 0x00215b43, // n0x12cc c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x12cd c0x0000 (---------------) + I net + 0x00229a83, // n0x12ce c0x0000 (---------------) + I org + 0x0030a143, // n0x12cf c0x0000 (---------------) + I biz + 0x0022edc3, // n0x12d0 c0x0000 (---------------) + I com + 0x002349c3, // n0x12d1 c0x0000 (---------------) + I edu + 0x00275003, // n0x12d2 c0x0000 (---------------) + I gov + 0x0038a144, // n0x12d3 c0x0000 (---------------) + I info + 0x0021d8c3, // n0x12d4 c0x0000 (---------------) + I net + 0x00229a83, // n0x12d5 c0x0000 (---------------) + I org + 0x0024be83, // n0x12d6 c0x0000 (---------------) + I ass + 0x002b1c44, // n0x12d7 c0x0000 (---------------) + I asso + 0x0022edc3, // n0x12d8 c0x0000 (---------------) + I com + 0x00238284, // n0x12d9 c0x0000 (---------------) + I coop + 0x002349c3, // n0x12da c0x0000 (---------------) + I edu + 0x002fa744, // n0x12db c0x0000 (---------------) + I gouv + 0x00275003, // n0x12dc c0x0000 (---------------) + I gov + 0x0035abc7, // n0x12dd c0x0000 (---------------) + I medecin + 0x00215b43, // n0x12de c0x0000 (---------------) + I mil + 0x0020e543, // n0x12df c0x0000 (---------------) + I nom + 0x00246408, // n0x12e0 c0x0000 (---------------) + I notaires + 0x00229a83, // n0x12e1 c0x0000 (---------------) + I org + 0x002d5a0b, // n0x12e2 c0x0000 (---------------) + I pharmaciens + 0x002da783, // n0x12e3 c0x0000 (---------------) + I prd + 0x00240d06, // n0x12e4 c0x0000 (---------------) + I presse + 0x00200142, // n0x12e5 c0x0000 (---------------) + I tm + 0x003781cb, // n0x12e6 c0x0000 (---------------) + I veterinaire + 0x002349c3, // n0x12e7 c0x0000 (---------------) + I edu + 0x00275003, // n0x12e8 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x12e9 c0x0000 (---------------) + I net + 0x00229a83, // n0x12ea c0x0000 (---------------) + I org + 0x0022edc3, // n0x12eb c0x0000 (---------------) + I com + 0x002349c3, // n0x12ec c0x0000 (---------------) + I edu + 0x00275003, // n0x12ed c0x0000 (---------------) + I gov + 0x00229a83, // n0x12ee c0x0000 (---------------) + I org + 0x00228d03, // n0x12ef c0x0000 (---------------) + I rep + 0x00203643, // n0x12f0 c0x0000 (---------------) + I tra + 0x00205882, // n0x12f1 c0x0000 (---------------) + I ac + 0x000f5248, // n0x12f2 c0x0000 (---------------) + blogspot + 0x00204745, // n0x12f3 c0x0000 (---------------) + I busan + 0x00325848, // n0x12f4 c0x0000 (---------------) + I chungbuk + 0x0032f688, // n0x12f5 c0x0000 (---------------) + I chungnam + 0x00208182, // n0x12f6 c0x0000 (---------------) + I co + 0x0024d585, // n0x12f7 c0x0000 (---------------) + I daegu + 0x00256387, // n0x12f8 c0x0000 (---------------) + I daejeon + 0x00202242, // n0x12f9 c0x0000 (---------------) + I es + 0x0020fac7, // n0x12fa c0x0000 (---------------) + I gangwon + 0x00208502, // n0x12fb c0x0000 (---------------) + I go + 0x0023d2c7, // n0x12fc c0x0000 (---------------) + I gwangju + 0x0038dc09, // n0x12fd c0x0000 (---------------) + I gyeongbuk + 0x00300e88, // n0x12fe c0x0000 (---------------) + I gyeonggi + 0x0027c909, // n0x12ff c0x0000 (---------------) + I gyeongnam + 0x00207ec2, // n0x1300 c0x0000 (---------------) + I hs + 0x00261387, // n0x1301 c0x0000 (---------------) + I incheon + 0x00247d84, // n0x1302 c0x0000 (---------------) + I jeju + 0x00256447, // n0x1303 c0x0000 (---------------) + I jeonbuk + 0x002f8587, // n0x1304 c0x0000 (---------------) + I jeonnam + 0x002b1882, // n0x1305 c0x0000 (---------------) + I kg + 0x00215b43, // n0x1306 c0x0000 (---------------) + I mil + 0x00202482, // n0x1307 c0x0000 (---------------) + I ms + 0x00203282, // n0x1308 c0x0000 (---------------) + I ne + 0x00200282, // n0x1309 c0x0000 (---------------) + I or + 0x00209a02, // n0x130a c0x0000 (---------------) + I pe + 0x00204d82, // n0x130b c0x0000 (---------------) + I re + 0x002024c2, // n0x130c c0x0000 (---------------) + I sc + 0x00275905, // n0x130d c0x0000 (---------------) + I seoul + 0x00244c45, // n0x130e c0x0000 (---------------) + I ulsan + 0x0022edc3, // n0x130f c0x0000 (---------------) + I com + 0x002349c3, // n0x1310 c0x0000 (---------------) + I edu + 0x00275003, // n0x1311 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1312 c0x0000 (---------------) + I net + 0x00229a83, // n0x1313 c0x0000 (---------------) + I org + 0x0022edc3, // n0x1314 c0x0000 (---------------) + I com + 0x002349c3, // n0x1315 c0x0000 (---------------) + I edu + 0x00275003, // n0x1316 c0x0000 (---------------) + I gov + 0x00215b43, // n0x1317 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1318 c0x0000 (---------------) + I net + 0x00229a83, // n0x1319 c0x0000 (---------------) + I org + 0x00000301, // n0x131a c0x0000 (---------------) + c + 0x0022edc3, // n0x131b c0x0000 (---------------) + I com + 0x002349c3, // n0x131c c0x0000 (---------------) + I edu + 0x00275003, // n0x131d c0x0000 (---------------) + I gov + 0x0038a144, // n0x131e c0x0000 (---------------) + I info + 0x0026f683, // n0x131f c0x0000 (---------------) + I int + 0x0021d8c3, // n0x1320 c0x0000 (---------------) + I net + 0x00229a83, // n0x1321 c0x0000 (---------------) + I org + 0x0021ffc3, // n0x1322 c0x0000 (---------------) + I per + 0x0022edc3, // n0x1323 c0x0000 (---------------) + I com + 0x002349c3, // n0x1324 c0x0000 (---------------) + I edu + 0x00275003, // n0x1325 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1326 c0x0000 (---------------) + I net + 0x00229a83, // n0x1327 c0x0000 (---------------) + I org + 0x00208182, // n0x1328 c0x0000 (---------------) + I co + 0x0022edc3, // n0x1329 c0x0000 (---------------) + I com + 0x002349c3, // n0x132a c0x0000 (---------------) + I edu + 0x00275003, // n0x132b c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x132c c0x0000 (---------------) + I net + 0x00229a83, // n0x132d c0x0000 (---------------) + I org + 0x000f5248, // n0x132e c0x0000 (---------------) + blogspot + 0x00205882, // n0x132f c0x0000 (---------------) + I ac + 0x002b5bc4, // n0x1330 c0x0000 (---------------) + I assn + 0x0022edc3, // n0x1331 c0x0000 (---------------) + I com + 0x002349c3, // n0x1332 c0x0000 (---------------) + I edu + 0x00275003, // n0x1333 c0x0000 (---------------) + I gov + 0x003395c3, // n0x1334 c0x0000 (---------------) + I grp + 0x0022fac5, // n0x1335 c0x0000 (---------------) + I hotel + 0x0026f683, // n0x1336 c0x0000 (---------------) + I int + 0x00342703, // n0x1337 c0x0000 (---------------) + I ltd + 0x0021d8c3, // n0x1338 c0x0000 (---------------) + I net + 0x002084c3, // n0x1339 c0x0000 (---------------) + I ngo + 0x00229a83, // n0x133a c0x0000 (---------------) + I org + 0x00215d43, // n0x133b c0x0000 (---------------) + I sch + 0x0026d043, // n0x133c c0x0000 (---------------) + I soc + 0x0021fa83, // n0x133d c0x0000 (---------------) + I web + 0x0022edc3, // n0x133e c0x0000 (---------------) + I com + 0x002349c3, // n0x133f c0x0000 (---------------) + I edu + 0x00275003, // n0x1340 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1341 c0x0000 (---------------) + I net + 0x00229a83, // n0x1342 c0x0000 (---------------) + I org + 0x00208182, // n0x1343 c0x0000 (---------------) + I co + 0x00229a83, // n0x1344 c0x0000 (---------------) + I org + 0x000f5248, // n0x1345 c0x0000 (---------------) + blogspot + 0x00275003, // n0x1346 c0x0000 (---------------) + I gov + 0x000f5248, // n0x1347 c0x0000 (---------------) + blogspot + 0x0022d9c3, // n0x1348 c0x0000 (---------------) + I asn + 0x0022edc3, // n0x1349 c0x0000 (---------------) + I com + 0x00231fc4, // n0x134a c0x0000 (---------------) + I conf + 0x002349c3, // n0x134b c0x0000 (---------------) + I edu + 0x00275003, // n0x134c c0x0000 (---------------) + I gov + 0x00205d82, // n0x134d c0x0000 (---------------) + I id + 0x00215b43, // n0x134e c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x134f c0x0000 (---------------) + I net + 0x00229a83, // n0x1350 c0x0000 (---------------) + I org + 0x0022edc3, // n0x1351 c0x0000 (---------------) + I com + 0x002349c3, // n0x1352 c0x0000 (---------------) + I edu + 0x00275003, // n0x1353 c0x0000 (---------------) + I gov + 0x00205d82, // n0x1354 c0x0000 (---------------) + I id + 0x00211c43, // n0x1355 c0x0000 (---------------) + I med + 0x0021d8c3, // n0x1356 c0x0000 (---------------) + I net + 0x00229a83, // n0x1357 c0x0000 (---------------) + I org + 0x002d4b03, // n0x1358 c0x0000 (---------------) + I plc + 0x00215d43, // n0x1359 c0x0000 (---------------) + I sch + 0x00205882, // n0x135a c0x0000 (---------------) + I ac + 0x00208182, // n0x135b c0x0000 (---------------) + I co + 0x00275003, // n0x135c c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x135d c0x0000 (---------------) + I net + 0x00229a83, // n0x135e c0x0000 (---------------) + I org + 0x00240d05, // n0x135f c0x0000 (---------------) + I press + 0x002b1c44, // n0x1360 c0x0000 (---------------) + I asso + 0x00200142, // n0x1361 c0x0000 (---------------) + I tm + 0x000f5248, // n0x1362 c0x0000 (---------------) + blogspot + 0x00205882, // n0x1363 c0x0000 (---------------) + I ac + 0x00208182, // n0x1364 c0x0000 (---------------) + I co + 0x002349c3, // n0x1365 c0x0000 (---------------) + I edu + 0x00275003, // n0x1366 c0x0000 (---------------) + I gov + 0x002294c3, // n0x1367 c0x0000 (---------------) + I its + 0x0021d8c3, // n0x1368 c0x0000 (---------------) + I net + 0x00229a83, // n0x1369 c0x0000 (---------------) + I org + 0x002db244, // n0x136a c0x0000 (---------------) + I priv + 0x00208182, // n0x136b c0x0000 (---------------) + I co + 0x0022edc3, // n0x136c c0x0000 (---------------) + I com + 0x002349c3, // n0x136d c0x0000 (---------------) + I edu + 0x00275003, // n0x136e c0x0000 (---------------) + I gov + 0x00215b43, // n0x136f c0x0000 (---------------) + I mil + 0x0020e543, // n0x1370 c0x0000 (---------------) + I nom + 0x00229a83, // n0x1371 c0x0000 (---------------) + I org + 0x002da783, // n0x1372 c0x0000 (---------------) + I prd + 0x00200142, // n0x1373 c0x0000 (---------------) + I tm + 0x000f5248, // n0x1374 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x1375 c0x0000 (---------------) + I com + 0x002349c3, // n0x1376 c0x0000 (---------------) + I edu + 0x00275003, // n0x1377 c0x0000 (---------------) + I gov + 0x00389f83, // n0x1378 c0x0000 (---------------) + I inf + 0x0027ca84, // n0x1379 c0x0000 (---------------) + I name + 0x0021d8c3, // n0x137a c0x0000 (---------------) + I net + 0x00229a83, // n0x137b c0x0000 (---------------) + I org + 0x0022edc3, // n0x137c c0x0000 (---------------) + I com + 0x002349c3, // n0x137d c0x0000 (---------------) + I edu + 0x002fa744, // n0x137e c0x0000 (---------------) + I gouv + 0x00275003, // n0x137f c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1380 c0x0000 (---------------) + I net + 0x00229a83, // n0x1381 c0x0000 (---------------) + I org + 0x00240d06, // n0x1382 c0x0000 (---------------) + I presse + 0x002349c3, // n0x1383 c0x0000 (---------------) + I edu + 0x00275003, // n0x1384 c0x0000 (---------------) + I gov + 0x0016c603, // n0x1385 c0x0000 (---------------) + nyc + 0x00229a83, // n0x1386 c0x0000 (---------------) + I org + 0x0022edc3, // n0x1387 c0x0000 (---------------) + I com + 0x002349c3, // n0x1388 c0x0000 (---------------) + I edu + 0x00275003, // n0x1389 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x138a c0x0000 (---------------) + I net + 0x00229a83, // n0x138b c0x0000 (---------------) + I org + 0x000f5248, // n0x138c c0x0000 (---------------) + blogspot + 0x00275003, // n0x138d c0x0000 (---------------) + I gov + 0x0022edc3, // n0x138e c0x0000 (---------------) + I com + 0x002349c3, // n0x138f c0x0000 (---------------) + I edu + 0x00275003, // n0x1390 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1391 c0x0000 (---------------) + I net + 0x00229a83, // n0x1392 c0x0000 (---------------) + I org + 0x3562edc3, // n0x1393 c0x00d5 (n0x1397-n0x1398) + I com + 0x002349c3, // n0x1394 c0x0000 (---------------) + I edu + 0x0021d8c3, // n0x1395 c0x0000 (---------------) + I net + 0x00229a83, // n0x1396 c0x0000 (---------------) + I org + 0x000f5248, // n0x1397 c0x0000 (---------------) + blogspot + 0x00205882, // n0x1398 c0x0000 (---------------) + I ac + 0x00208182, // n0x1399 c0x0000 (---------------) + I co + 0x0022edc3, // n0x139a c0x0000 (---------------) + I com + 0x00275003, // n0x139b c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x139c c0x0000 (---------------) + I net + 0x00200282, // n0x139d c0x0000 (---------------) + I or + 0x00229a83, // n0x139e c0x0000 (---------------) + I org + 0x00305387, // n0x139f c0x0000 (---------------) + I academy + 0x002ce4cb, // n0x13a0 c0x0000 (---------------) + I agriculture + 0x00204683, // n0x13a1 c0x0000 (---------------) + I air + 0x00248308, // n0x13a2 c0x0000 (---------------) + I airguard + 0x002bcd87, // n0x13a3 c0x0000 (---------------) + I alabama + 0x0027be86, // n0x13a4 c0x0000 (---------------) + I alaska + 0x00365a45, // n0x13a5 c0x0000 (---------------) + I amber + 0x002b0ec9, // n0x13a6 c0x0000 (---------------) + I ambulance + 0x00240a88, // n0x13a7 c0x0000 (---------------) + I american + 0x002a1f89, // n0x13a8 c0x0000 (---------------) + I americana + 0x002a1f90, // n0x13a9 c0x0000 (---------------) + I americanantiques + 0x00352e8b, // n0x13aa c0x0000 (---------------) + I americanart + 0x002b0d09, // n0x13ab c0x0000 (---------------) + I amsterdam + 0x00204e83, // n0x13ac c0x0000 (---------------) + I and + 0x00338749, // n0x13ad c0x0000 (---------------) + I annefrank + 0x00232ac6, // n0x13ae c0x0000 (---------------) + I anthro + 0x00232acc, // n0x13af c0x0000 (---------------) + I anthropology + 0x00204808, // n0x13b0 c0x0000 (---------------) + I antiques + 0x0039f9c8, // n0x13b1 c0x0000 (---------------) + I aquarium + 0x002506c9, // n0x13b2 c0x0000 (---------------) + I arboretum + 0x0029030e, // n0x13b3 c0x0000 (---------------) + I archaeological + 0x0036ea4b, // n0x13b4 c0x0000 (---------------) + I archaeology + 0x002c340c, // n0x13b5 c0x0000 (---------------) + I architecture + 0x002011c3, // n0x13b6 c0x0000 (---------------) + I art + 0x0022510c, // n0x13b7 c0x0000 (---------------) + I artanddesign + 0x00204149, // n0x13b8 c0x0000 (---------------) + I artcenter + 0x00362287, // n0x13b9 c0x0000 (---------------) + I artdeco + 0x0023490c, // n0x13ba c0x0000 (---------------) + I arteducation + 0x00397c8a, // n0x13bb c0x0000 (---------------) + I artgallery + 0x00243984, // n0x13bc c0x0000 (---------------) + I arts + 0x0024398d, // n0x13bd c0x0000 (---------------) + I artsandcrafts + 0x00224fc8, // n0x13be c0x0000 (---------------) + I asmatart + 0x00395a4d, // n0x13bf c0x0000 (---------------) + I assassination + 0x0024be86, // n0x13c0 c0x0000 (---------------) + I assisi + 0x002b1c4b, // n0x13c1 c0x0000 (---------------) + I association + 0x0024d049, // n0x13c2 c0x0000 (---------------) + I astronomy + 0x0033d747, // n0x13c3 c0x0000 (---------------) + I atlanta + 0x00308c06, // n0x13c4 c0x0000 (---------------) + I austin + 0x00310989, // n0x13c5 c0x0000 (---------------) + I australia + 0x0032058a, // n0x13c6 c0x0000 (---------------) + I automotive + 0x00354ec8, // n0x13c7 c0x0000 (---------------) + I aviation + 0x002da144, // n0x13c8 c0x0000 (---------------) + I axis + 0x0026f347, // n0x13c9 c0x0000 (---------------) + I badajoz + 0x00298fc7, // n0x13ca c0x0000 (---------------) + I baghdad + 0x0027ce04, // n0x13cb c0x0000 (---------------) + I bahn + 0x0022d044, // n0x13cc c0x0000 (---------------) + I bale + 0x00263909, // n0x13cd c0x0000 (---------------) + I baltimore + 0x002bb549, // n0x13ce c0x0000 (---------------) + I barcelona + 0x00339a08, // n0x13cf c0x0000 (---------------) + I baseball + 0x0020f5c5, // n0x13d0 c0x0000 (---------------) + I basel + 0x003852c5, // n0x13d1 c0x0000 (---------------) + I baths + 0x002095c6, // n0x13d2 c0x0000 (---------------) + I bauern + 0x00243849, // n0x13d3 c0x0000 (---------------) + I beauxarts + 0x003627cd, // n0x13d4 c0x0000 (---------------) + I beeldengeluid + 0x002c2e88, // n0x13d5 c0x0000 (---------------) + I bellevue + 0x002094c7, // n0x13d6 c0x0000 (---------------) + I bergbau + 0x00365ac8, // n0x13d7 c0x0000 (---------------) + I berkeley + 0x00351e06, // n0x13d8 c0x0000 (---------------) + I berlin + 0x00389904, // n0x13d9 c0x0000 (---------------) + I bern + 0x00351845, // n0x13da c0x0000 (---------------) + I bible + 0x00202f46, // n0x13db c0x0000 (---------------) + I bilbao + 0x002034c4, // n0x13dc c0x0000 (---------------) + I bill + 0x00204047, // n0x13dd c0x0000 (---------------) + I birdart + 0x0020644a, // n0x13de c0x0000 (---------------) + I birthplace + 0x00214304, // n0x13df c0x0000 (---------------) + I bonn + 0x00216646, // n0x13e0 c0x0000 (---------------) + I boston + 0x00217089, // n0x13e1 c0x0000 (---------------) + I botanical + 0x0021708f, // n0x13e2 c0x0000 (---------------) + I botanicalgarden + 0x0021900d, // n0x13e3 c0x0000 (---------------) + I botanicgarden + 0x00219d46, // n0x13e4 c0x0000 (---------------) + I botany + 0x0021b5d0, // n0x13e5 c0x0000 (---------------) + I brandywinevalley + 0x0021b9c6, // n0x13e6 c0x0000 (---------------) + I brasil + 0x0021c4c7, // n0x13e7 c0x0000 (---------------) + I bristol + 0x0021c847, // n0x13e8 c0x0000 (---------------) + I british + 0x0021c84f, // n0x13e9 c0x0000 (---------------) + I britishcolumbia + 0x0021d509, // n0x13ea c0x0000 (---------------) + I broadcast + 0x00221d46, // n0x13eb c0x0000 (---------------) + I brunel + 0x002230c7, // n0x13ec c0x0000 (---------------) + I brussel + 0x002230c8, // n0x13ed c0x0000 (---------------) + I brussels + 0x00223a09, // n0x13ee c0x0000 (---------------) + I bruxelles + 0x003313c8, // n0x13ef c0x0000 (---------------) + I building + 0x002d2107, // n0x13f0 c0x0000 (---------------) + I burghof + 0x00204743, // n0x13f1 c0x0000 (---------------) + I bus + 0x0022ec46, // n0x13f2 c0x0000 (---------------) + I bushey + 0x00229748, // n0x13f3 c0x0000 (---------------) + I cadaques + 0x002905ca, // n0x13f4 c0x0000 (---------------) + I california + 0x0021fb49, // n0x13f5 c0x0000 (---------------) + I cambridge + 0x00205c83, // n0x13f6 c0x0000 (---------------) + I can + 0x00321746, // n0x13f7 c0x0000 (---------------) + I canada + 0x0025bb8a, // n0x13f8 c0x0000 (---------------) + I capebreton + 0x002dcfc7, // n0x13f9 c0x0000 (---------------) + I carrier + 0x003620ca, // n0x13fa c0x0000 (---------------) + I cartoonart + 0x00203cce, // n0x13fb c0x0000 (---------------) + I casadelamoneda + 0x0021d646, // n0x13fc c0x0000 (---------------) + I castle + 0x002d2e87, // n0x13fd c0x0000 (---------------) + I castres + 0x0020db86, // n0x13fe c0x0000 (---------------) + I celtic + 0x00204206, // n0x13ff c0x0000 (---------------) + I center + 0x0037128b, // n0x1400 c0x0000 (---------------) + I chattanooga + 0x0025e40a, // n0x1401 c0x0000 (---------------) + I cheltenham + 0x0030b4cd, // n0x1402 c0x0000 (---------------) + I chesapeakebay + 0x00209dc7, // n0x1403 c0x0000 (---------------) + I chicago + 0x0026d0c8, // n0x1404 c0x0000 (---------------) + I children + 0x0026d0c9, // n0x1405 c0x0000 (---------------) + I childrens + 0x0026d0cf, // n0x1406 c0x0000 (---------------) + I childrensgarden + 0x0035b84c, // n0x1407 c0x0000 (---------------) + I chiropractic + 0x002acd89, // n0x1408 c0x0000 (---------------) + I chocolate + 0x002a6c4e, // n0x1409 c0x0000 (---------------) + I christiansburg + 0x0035acca, // n0x140a c0x0000 (---------------) + I cincinnati + 0x00301b46, // n0x140b c0x0000 (---------------) + I cinema + 0x0034cc06, // n0x140c c0x0000 (---------------) + I circus + 0x00360a0c, // n0x140d c0x0000 (---------------) + I civilisation + 0x00365f8c, // n0x140e c0x0000 (---------------) + I civilization + 0x0036c688, // n0x140f c0x0000 (---------------) + I civilwar + 0x00398187, // n0x1410 c0x0000 (---------------) + I clinton + 0x002a6b05, // n0x1411 c0x0000 (---------------) + I clock + 0x0030f484, // n0x1412 c0x0000 (---------------) + I coal + 0x0038280e, // n0x1413 c0x0000 (---------------) + I coastaldefence + 0x00320804, // n0x1414 c0x0000 (---------------) + I cody + 0x00382f47, // n0x1415 c0x0000 (---------------) + I coldwar + 0x0021deca, // n0x1416 c0x0000 (---------------) + I collection + 0x0022df94, // n0x1417 c0x0000 (---------------) + I colonialwilliamsburg + 0x0022e68f, // n0x1418 c0x0000 (---------------) + I coloradoplateau + 0x0021ca08, // n0x1419 c0x0000 (---------------) + I columbia + 0x0022eb08, // n0x141a c0x0000 (---------------) + I columbus + 0x0035d68d, // n0x141b c0x0000 (---------------) + I communication + 0x0035d68e, // n0x141c c0x0000 (---------------) + I communications + 0x0022f149, // n0x141d c0x0000 (---------------) + I community + 0x00230608, // n0x141e c0x0000 (---------------) + I computer + 0x0023060f, // n0x141f c0x0000 (---------------) + I computerhistory + 0x0023460c, // n0x1420 c0x0000 (---------------) + I contemporary + 0x0023460f, // n0x1421 c0x0000 (---------------) + I contemporaryart + 0x00236007, // n0x1422 c0x0000 (---------------) + I convent + 0x0023924a, // n0x1423 c0x0000 (---------------) + I copenhagen + 0x0021ac8b, // n0x1424 c0x0000 (---------------) + I corporation + 0x0023b2c8, // n0x1425 c0x0000 (---------------) + I corvette + 0x0023bc87, // n0x1426 c0x0000 (---------------) + I costume + 0x00337c8d, // n0x1427 c0x0000 (---------------) + I countryestate + 0x0031e7c6, // n0x1428 c0x0000 (---------------) + I county + 0x00243b46, // n0x1429 c0x0000 (---------------) + I crafts + 0x0023d949, // n0x142a c0x0000 (---------------) + I cranbrook + 0x0031ca08, // n0x142b c0x0000 (---------------) + I creation + 0x002410c8, // n0x142c c0x0000 (---------------) + I cultural + 0x002410ce, // n0x142d c0x0000 (---------------) + I culturalcenter + 0x002ce5c7, // n0x142e c0x0000 (---------------) + I culture + 0x002bba85, // n0x142f c0x0000 (---------------) + I cyber + 0x00242545, // n0x1430 c0x0000 (---------------) + I cymru + 0x00202684, // n0x1431 c0x0000 (---------------) + I dali + 0x0027c146, // n0x1432 c0x0000 (---------------) + I dallas + 0x00339908, // n0x1433 c0x0000 (---------------) + I database + 0x00226103, // n0x1434 c0x0000 (---------------) + I ddr + 0x00256f0e, // n0x1435 c0x0000 (---------------) + I decorativearts + 0x00338048, // n0x1436 c0x0000 (---------------) + I delaware + 0x00272e8b, // n0x1437 c0x0000 (---------------) + I delmenhorst + 0x0022db87, // n0x1438 c0x0000 (---------------) + I denmark + 0x0026c845, // n0x1439 c0x0000 (---------------) + I depot + 0x00222ec6, // n0x143a c0x0000 (---------------) + I design + 0x002a07c7, // n0x143b c0x0000 (---------------) + I detroit + 0x002efd48, // n0x143c c0x0000 (---------------) + I dinosaur + 0x0033b449, // n0x143d c0x0000 (---------------) + I discovery + 0x0031ea45, // n0x143e c0x0000 (---------------) + I dolls + 0x0027e288, // n0x143f c0x0000 (---------------) + I donostia + 0x00205346, // n0x1440 c0x0000 (---------------) + I durham + 0x0036ae0a, // n0x1441 c0x0000 (---------------) + I eastafrica + 0x00382709, // n0x1442 c0x0000 (---------------) + I eastcoast + 0x002349c9, // n0x1443 c0x0000 (---------------) + I education + 0x002349cb, // n0x1444 c0x0000 (---------------) + I educational + 0x00283508, // n0x1445 c0x0000 (---------------) + I egyptian + 0x0027ccc9, // n0x1446 c0x0000 (---------------) + I eisenbahn + 0x0020f686, // n0x1447 c0x0000 (---------------) + I elburg + 0x0020beca, // n0x1448 c0x0000 (---------------) + I elvendrell + 0x0022d5ca, // n0x1449 c0x0000 (---------------) + I embroidery + 0x0023944c, // n0x144a c0x0000 (---------------) + I encyclopedic + 0x002c45c7, // n0x144b c0x0000 (---------------) + I england + 0x0038da0a, // n0x144c c0x0000 (---------------) + I entomology + 0x0032b7cb, // n0x144d c0x0000 (---------------) + I environment + 0x0032b7d9, // n0x144e c0x0000 (---------------) + I environmentalconservation + 0x0022b688, // n0x144f c0x0000 (---------------) + I epilepsy + 0x00240d85, // n0x1450 c0x0000 (---------------) + I essex + 0x002bf586, // n0x1451 c0x0000 (---------------) + I estate + 0x0030c209, // n0x1452 c0x0000 (---------------) + I ethnology + 0x003a3906, // n0x1453 c0x0000 (---------------) + I exeter + 0x0021218a, // n0x1454 c0x0000 (---------------) + I exhibition + 0x0036c346, // n0x1455 c0x0000 (---------------) + I family + 0x002a0f44, // n0x1456 c0x0000 (---------------) + I farm + 0x002bf70d, // n0x1457 c0x0000 (---------------) + I farmequipment + 0x00302a87, // n0x1458 c0x0000 (---------------) + I farmers + 0x002a0f49, // n0x1459 c0x0000 (---------------) + I farmstead + 0x00364685, // n0x145a c0x0000 (---------------) + I field + 0x00364a48, // n0x145b c0x0000 (---------------) + I figueres + 0x00375e09, // n0x145c c0x0000 (---------------) + I filatelia + 0x00243ec4, // n0x145d c0x0000 (---------------) + I film + 0x00244587, // n0x145e c0x0000 (---------------) + I fineart + 0x00244588, // n0x145f c0x0000 (---------------) + I finearts + 0x00245547, // n0x1460 c0x0000 (---------------) + I finland + 0x0025fa48, // n0x1461 c0x0000 (---------------) + I flanders + 0x0024aec7, // n0x1462 c0x0000 (---------------) + I florida + 0x0023bb05, // n0x1463 c0x0000 (---------------) + I force + 0x00252dcc, // n0x1464 c0x0000 (---------------) + I fortmissoula + 0x002536c9, // n0x1465 c0x0000 (---------------) + I fortworth + 0x002b370a, // n0x1466 c0x0000 (---------------) + I foundation + 0x00381989, // n0x1467 c0x0000 (---------------) + I francaise + 0x00338849, // n0x1468 c0x0000 (---------------) + I frankfurt + 0x0024fa0c, // n0x1469 c0x0000 (---------------) + I franziskaner + 0x002e0c8b, // n0x146a c0x0000 (---------------) + I freemasonry + 0x002554c8, // n0x146b c0x0000 (---------------) + I freiburg + 0x00257548, // n0x146c c0x0000 (---------------) + I fribourg + 0x0025a904, // n0x146d c0x0000 (---------------) + I frog + 0x00279fc8, // n0x146e c0x0000 (---------------) + I fundacio + 0x0027ae09, // n0x146f c0x0000 (---------------) + I furniture + 0x00397d47, // n0x1470 c0x0000 (---------------) + I gallery + 0x002172c6, // n0x1471 c0x0000 (---------------) + I garden + 0x0023f6c7, // n0x1472 c0x0000 (---------------) + I gateway + 0x0033b6c9, // n0x1473 c0x0000 (---------------) + I geelvinck + 0x0039174b, // n0x1474 c0x0000 (---------------) + I gemological + 0x00321a47, // n0x1475 c0x0000 (---------------) + I geology + 0x0031e1c7, // n0x1476 c0x0000 (---------------) + I georgia + 0x0027bbc7, // n0x1477 c0x0000 (---------------) + I giessen + 0x003959c4, // n0x1478 c0x0000 (---------------) + I glas + 0x003959c5, // n0x1479 c0x0000 (---------------) + I glass + 0x0029eac5, // n0x147a c0x0000 (---------------) + I gorge + 0x0032e34b, // n0x147b c0x0000 (---------------) + I grandrapids + 0x0038aec4, // n0x147c c0x0000 (---------------) + I graz + 0x002a9688, // n0x147d c0x0000 (---------------) + I guernsey + 0x003723ca, // n0x147e c0x0000 (---------------) + I halloffame + 0x00205407, // n0x147f c0x0000 (---------------) + I hamburg + 0x0031be07, // n0x1480 c0x0000 (---------------) + I handson + 0x00284212, // n0x1481 c0x0000 (---------------) + I harvestcelebration + 0x002544c6, // n0x1482 c0x0000 (---------------) + I hawaii + 0x002a51c6, // n0x1483 c0x0000 (---------------) + I health + 0x0031a68e, // n0x1484 c0x0000 (---------------) + I heimatunduhren + 0x00257286, // n0x1485 c0x0000 (---------------) + I hellas + 0x0020c9c8, // n0x1486 c0x0000 (---------------) + I helsinki + 0x00288bcf, // n0x1487 c0x0000 (---------------) + I hembygdsforbund + 0x00395e08, // n0x1488 c0x0000 (---------------) + I heritage + 0x0035c688, // n0x1489 c0x0000 (---------------) + I histoire + 0x002d620a, // n0x148a c0x0000 (---------------) + I historical + 0x002d6211, // n0x148b c0x0000 (---------------) + I historicalsociety + 0x0029968e, // n0x148c c0x0000 (---------------) + I historichouses + 0x0024e9ca, // n0x148d c0x0000 (---------------) + I historisch + 0x0024e9cc, // n0x148e c0x0000 (---------------) + I historisches + 0x00230807, // n0x148f c0x0000 (---------------) + I history + 0x00230810, // n0x1490 c0x0000 (---------------) + I historyofscience + 0x002014c8, // n0x1491 c0x0000 (---------------) + I horology + 0x00299885, // n0x1492 c0x0000 (---------------) + I house + 0x002a268a, // n0x1493 c0x0000 (---------------) + I humanities + 0x0020350c, // n0x1494 c0x0000 (---------------) + I illustration + 0x0028a30d, // n0x1495 c0x0000 (---------------) + I imageandsound + 0x002986c6, // n0x1496 c0x0000 (---------------) + I indian + 0x002986c7, // n0x1497 c0x0000 (---------------) + I indiana + 0x002986cc, // n0x1498 c0x0000 (---------------) + I indianapolis + 0x002e5e0c, // n0x1499 c0x0000 (---------------) + I indianmarket + 0x002f6c4c, // n0x149a c0x0000 (---------------) + I intelligence + 0x00281f8b, // n0x149b c0x0000 (---------------) + I interactive + 0x0027d044, // n0x149c c0x0000 (---------------) + I iraq + 0x0021d3c4, // n0x149d c0x0000 (---------------) + I iron + 0x00349309, // n0x149e c0x0000 (---------------) + I isleofman + 0x002c6e47, // n0x149f c0x0000 (---------------) + I jamison + 0x00332409, // n0x14a0 c0x0000 (---------------) + I jefferson + 0x00356749, // n0x14a1 c0x0000 (---------------) + I jerusalem + 0x0035e0c7, // n0x14a2 c0x0000 (---------------) + I jewelry + 0x00397b06, // n0x14a3 c0x0000 (---------------) + I jewish + 0x00397b09, // n0x14a4 c0x0000 (---------------) + I jewishart + 0x002a4443, // n0x14a5 c0x0000 (---------------) + I jfk + 0x0027d5ca, // n0x14a6 c0x0000 (---------------) + I journalism + 0x0030f6c7, // n0x14a7 c0x0000 (---------------) + I judaica + 0x002050cb, // n0x14a8 c0x0000 (---------------) + I judygarland + 0x0030b34a, // n0x14a9 c0x0000 (---------------) + I juedisches + 0x0023d404, // n0x14aa c0x0000 (---------------) + I juif + 0x002f15c6, // n0x14ab c0x0000 (---------------) + I karate + 0x00276f49, // n0x14ac c0x0000 (---------------) + I karikatur + 0x00283944, // n0x14ad c0x0000 (---------------) + I kids + 0x0020a88a, // n0x14ae c0x0000 (---------------) + I koebenhavn + 0x002a5b85, // n0x14af c0x0000 (---------------) + I koeln + 0x002b1105, // n0x14b0 c0x0000 (---------------) + I kunst + 0x002b110d, // n0x14b1 c0x0000 (---------------) + I kunstsammlung + 0x002b144e, // n0x14b2 c0x0000 (---------------) + I kunstunddesign + 0x00315845, // n0x14b3 c0x0000 (---------------) + I labor + 0x00386dc6, // n0x14b4 c0x0000 (---------------) + I labour + 0x00240907, // n0x14b5 c0x0000 (---------------) + I lajolla + 0x002c788a, // n0x14b6 c0x0000 (---------------) + I lancashire + 0x00320b06, // n0x14b7 c0x0000 (---------------) + I landes + 0x00357784, // n0x14b8 c0x0000 (---------------) + I lans + 0x002da5c7, // n0x14b9 c0x0000 (---------------) + I larsson + 0x00215a0b, // n0x14ba c0x0000 (---------------) + I lewismiller + 0x00351ec7, // n0x14bb c0x0000 (---------------) + I lincoln + 0x0020c104, // n0x14bc c0x0000 (---------------) + I linz + 0x002d8446, // n0x14bd c0x0000 (---------------) + I living + 0x002d844d, // n0x14be c0x0000 (---------------) + I livinghistory + 0x0023a18c, // n0x14bf c0x0000 (---------------) + I localhistory + 0x00310546, // n0x14c0 c0x0000 (---------------) + I london + 0x002c308a, // n0x14c1 c0x0000 (---------------) + I losangeles + 0x00228c06, // n0x14c2 c0x0000 (---------------) + I louvre + 0x002925c8, // n0x14c3 c0x0000 (---------------) + I loyalist + 0x00312587, // n0x14c4 c0x0000 (---------------) + I lucerne + 0x0033938a, // n0x14c5 c0x0000 (---------------) + I luxembourg + 0x00233106, // n0x14c6 c0x0000 (---------------) + I luzern + 0x00209cc3, // n0x14c7 c0x0000 (---------------) + I mad + 0x00306e06, // n0x14c8 c0x0000 (---------------) + I madrid + 0x00200188, // n0x14c9 c0x0000 (---------------) + I mallorca + 0x00291a4a, // n0x14ca c0x0000 (---------------) + I manchester + 0x00262507, // n0x14cb c0x0000 (---------------) + I mansion + 0x00262508, // n0x14cc c0x0000 (---------------) + I mansions + 0x00269a04, // n0x14cd c0x0000 (---------------) + I manx + 0x0027a587, // n0x14ce c0x0000 (---------------) + I marburg + 0x00219888, // n0x14cf c0x0000 (---------------) + I maritime + 0x0029a808, // n0x14d0 c0x0000 (---------------) + I maritimo + 0x0026cc48, // n0x14d1 c0x0000 (---------------) + I maryland + 0x002b4c8a, // n0x14d2 c0x0000 (---------------) + I marylhurst + 0x002fb545, // n0x14d3 c0x0000 (---------------) + I media + 0x00234ec7, // n0x14d4 c0x0000 (---------------) + I medical + 0x0024e813, // n0x14d5 c0x0000 (---------------) + I medizinhistorisches + 0x002515c6, // n0x14d6 c0x0000 (---------------) + I meeres + 0x00338b08, // n0x14d7 c0x0000 (---------------) + I memorial + 0x00221409, // n0x14d8 c0x0000 (---------------) + I mesaverde + 0x0020f988, // n0x14d9 c0x0000 (---------------) + I michigan + 0x0021064b, // n0x14da c0x0000 (---------------) + I midatlantic + 0x002b2c48, // n0x14db c0x0000 (---------------) + I military + 0x00215b44, // n0x14dc c0x0000 (---------------) + I mill + 0x0028cf86, // n0x14dd c0x0000 (---------------) + I miners + 0x002f8106, // n0x14de c0x0000 (---------------) + I mining + 0x002d3949, // n0x14df c0x0000 (---------------) + I minnesota + 0x002b92c7, // n0x14e0 c0x0000 (---------------) + I missile + 0x00252ec8, // n0x14e1 c0x0000 (---------------) + I missoula + 0x003906c6, // n0x14e2 c0x0000 (---------------) + I modern + 0x0020ed84, // n0x14e3 c0x0000 (---------------) + I moma + 0x002c5005, // n0x14e4 c0x0000 (---------------) + I money + 0x002be988, // n0x14e5 c0x0000 (---------------) + I monmouth + 0x002bf0ca, // n0x14e6 c0x0000 (---------------) + I monticello + 0x002bf388, // n0x14e7 c0x0000 (---------------) + I montreal + 0x002c5ac6, // n0x14e8 c0x0000 (---------------) + I moscow + 0x0029214a, // n0x14e9 c0x0000 (---------------) + I motorcycle + 0x002f6388, // n0x14ea c0x0000 (---------------) + I muenchen + 0x002c8108, // n0x14eb c0x0000 (---------------) + I muenster + 0x002c9488, // n0x14ec c0x0000 (---------------) + I mulhouse + 0x002c9e46, // n0x14ed c0x0000 (---------------) + I muncie + 0x002cc246, // n0x14ee c0x0000 (---------------) + I museet + 0x0030910c, // n0x14ef c0x0000 (---------------) + I museumcenter + 0x002cc750, // n0x14f0 c0x0000 (---------------) + I museumvereniging + 0x00270385, // n0x14f1 c0x0000 (---------------) + I music + 0x002fd6c8, // n0x14f2 c0x0000 (---------------) + I national + 0x002fd6d0, // n0x14f3 c0x0000 (---------------) + I nationalfirearms + 0x00395c10, // n0x14f4 c0x0000 (---------------) + I nationalheritage + 0x002a1e0e, // n0x14f5 c0x0000 (---------------) + I nativeamerican + 0x00308d8e, // n0x14f6 c0x0000 (---------------) + I naturalhistory + 0x00308d94, // n0x14f7 c0x0000 (---------------) + I naturalhistorymuseum + 0x0032bdcf, // n0x14f8 c0x0000 (---------------) + I naturalsciences + 0x0032c186, // n0x14f9 c0x0000 (---------------) + I nature + 0x003100d1, // n0x14fa c0x0000 (---------------) + I naturhistorisches + 0x003196d3, // n0x14fb c0x0000 (---------------) + I natuurwetenschappen + 0x00319b48, // n0x14fc c0x0000 (---------------) + I naumburg + 0x0039d445, // n0x14fd c0x0000 (---------------) + I naval + 0x00272148, // n0x14fe c0x0000 (---------------) + I nebraska + 0x002cdc05, // n0x14ff c0x0000 (---------------) + I neues + 0x00226c8c, // n0x1500 c0x0000 (---------------) + I newhampshire + 0x00366dc9, // n0x1501 c0x0000 (---------------) + I newjersey + 0x0021dd09, // n0x1502 c0x0000 (---------------) + I newmexico + 0x0023f447, // n0x1503 c0x0000 (---------------) + I newport + 0x0021fe49, // n0x1504 c0x0000 (---------------) + I newspaper + 0x00302cc7, // n0x1505 c0x0000 (---------------) + I newyork + 0x002c5ec6, // n0x1506 c0x0000 (---------------) + I niepce + 0x00351647, // n0x1507 c0x0000 (---------------) + I norfolk + 0x00238445, // n0x1508 c0x0000 (---------------) + I north + 0x00332603, // n0x1509 c0x0000 (---------------) + I nrw + 0x002262c9, // n0x150a c0x0000 (---------------) + I nuernberg + 0x00209709, // n0x150b c0x0000 (---------------) + I nuremberg + 0x0036c603, // n0x150c c0x0000 (---------------) + I nyc + 0x0039ab44, // n0x150d c0x0000 (---------------) + I nyny + 0x002ff6cd, // n0x150e c0x0000 (---------------) + I oceanographic + 0x00393d4f, // n0x150f c0x0000 (---------------) + I oceanographique + 0x002f5c85, // n0x1510 c0x0000 (---------------) + I omaha + 0x00316946, // n0x1511 c0x0000 (---------------) + I online + 0x00393bc7, // n0x1512 c0x0000 (---------------) + I ontario + 0x0033cc07, // n0x1513 c0x0000 (---------------) + I openair + 0x002811c6, // n0x1514 c0x0000 (---------------) + I oregon + 0x002811cb, // n0x1515 c0x0000 (---------------) + I oregontrail + 0x0029ad85, // n0x1516 c0x0000 (---------------) + I otago + 0x00395106, // n0x1517 c0x0000 (---------------) + I oxford + 0x00350507, // n0x1518 c0x0000 (---------------) + I pacific + 0x00269509, // n0x1519 c0x0000 (---------------) + I paderborn + 0x003097c6, // n0x151a c0x0000 (---------------) + I palace + 0x002ff5c5, // n0x151b c0x0000 (---------------) + I paleo + 0x0022408b, // n0x151c c0x0000 (---------------) + I palmsprings + 0x00339646, // n0x151d c0x0000 (---------------) + I panama + 0x00252285, // n0x151e c0x0000 (---------------) + I paris + 0x002a6148, // n0x151f c0x0000 (---------------) + I pasadena + 0x002ec948, // n0x1520 c0x0000 (---------------) + I pharmacy + 0x002cf34c, // n0x1521 c0x0000 (---------------) + I philadelphia + 0x002cf350, // n0x1522 c0x0000 (---------------) + I philadelphiaarea + 0x002cfa09, // n0x1523 c0x0000 (---------------) + I philately + 0x002cfe47, // n0x1524 c0x0000 (---------------) + I phoenix + 0x002d02cb, // n0x1525 c0x0000 (---------------) + I photography + 0x002d1346, // n0x1526 c0x0000 (---------------) + I pilots + 0x002d1fca, // n0x1527 c0x0000 (---------------) + I pittsburgh + 0x002d2a8b, // n0x1528 c0x0000 (---------------) + I planetarium + 0x002d320a, // n0x1529 c0x0000 (---------------) + I plantation + 0x002d3486, // n0x152a c0x0000 (---------------) + I plants + 0x002d49c5, // n0x152b c0x0000 (---------------) + I plaza + 0x002bcc86, // n0x152c c0x0000 (---------------) + I portal + 0x0027b748, // n0x152d c0x0000 (---------------) + I portland + 0x0023f50a, // n0x152e c0x0000 (---------------) + I portlligat + 0x0035d31c, // n0x152f c0x0000 (---------------) + I posts-and-telecommunications + 0x002da84c, // n0x1530 c0x0000 (---------------) + I preservation + 0x002dab48, // n0x1531 c0x0000 (---------------) + I presidio + 0x00240d05, // n0x1532 c0x0000 (---------------) + I press + 0x002dd187, // n0x1533 c0x0000 (---------------) + I project + 0x0028ff46, // n0x1534 c0x0000 (---------------) + I public + 0x0037f3c5, // n0x1535 c0x0000 (---------------) + I pubol + 0x0021a006, // n0x1536 c0x0000 (---------------) + I quebec + 0x00281388, // n0x1537 c0x0000 (---------------) + I railroad + 0x002aff47, // n0x1538 c0x0000 (---------------) + I railway + 0x00290208, // n0x1539 c0x0000 (---------------) + I research + 0x002d2f8a, // n0x153a c0x0000 (---------------) + I resistance + 0x00310d0c, // n0x153b c0x0000 (---------------) + I riodejaneiro + 0x00310f89, // n0x153c c0x0000 (---------------) + I rochester + 0x0037f707, // n0x153d c0x0000 (---------------) + I rockart + 0x00227784, // n0x153e c0x0000 (---------------) + I roma + 0x0024b506, // n0x153f c0x0000 (---------------) + I russia + 0x0035c20a, // n0x1540 c0x0000 (---------------) + I saintlouis + 0x00356845, // n0x1541 c0x0000 (---------------) + I salem + 0x0039328c, // n0x1542 c0x0000 (---------------) + I salvadordali + 0x00395808, // n0x1543 c0x0000 (---------------) + I salzburg + 0x00237e48, // n0x1544 c0x0000 (---------------) + I sandiego + 0x00207f0c, // n0x1545 c0x0000 (---------------) + I sanfrancisco + 0x0021164c, // n0x1546 c0x0000 (---------------) + I santabarbara + 0x00211d49, // n0x1547 c0x0000 (---------------) + I santacruz + 0x00211f87, // n0x1548 c0x0000 (---------------) + I santafe + 0x002fa40c, // n0x1549 c0x0000 (---------------) + I saskatchewan + 0x0034ef04, // n0x154a c0x0000 (---------------) + I satx + 0x0038340a, // n0x154b c0x0000 (---------------) + I savannahga + 0x0039554c, // n0x154c c0x0000 (---------------) + I schlesisches + 0x0026adcb, // n0x154d c0x0000 (---------------) + I schoenbrunn + 0x0023120b, // n0x154e c0x0000 (---------------) + I schokoladen + 0x00231d06, // n0x154f c0x0000 (---------------) + I school + 0x0023de07, // n0x1550 c0x0000 (---------------) + I schweiz + 0x00230a47, // n0x1551 c0x0000 (---------------) + I science + 0x00230a4f, // n0x1552 c0x0000 (---------------) + I science-fiction + 0x002e6751, // n0x1553 c0x0000 (---------------) + I scienceandhistory + 0x0039cfd2, // n0x1554 c0x0000 (---------------) + I scienceandindustry + 0x0023fa4d, // n0x1555 c0x0000 (---------------) + I sciencecenter + 0x0023fa4e, // n0x1556 c0x0000 (---------------) + I sciencecenters + 0x0023fd8e, // n0x1557 c0x0000 (---------------) + I sciencehistory + 0x0032bf88, // n0x1558 c0x0000 (---------------) + I sciences + 0x0032bf92, // n0x1559 c0x0000 (---------------) + I sciencesnaturelles + 0x00208148, // n0x155a c0x0000 (---------------) + I scotland + 0x002f1d87, // n0x155b c0x0000 (---------------) + I seaport + 0x0024930a, // n0x155c c0x0000 (---------------) + I settlement + 0x0020a4c8, // n0x155d c0x0000 (---------------) + I settlers + 0x00257245, // n0x155e c0x0000 (---------------) + I shell + 0x002e490a, // n0x155f c0x0000 (---------------) + I sherbrooke + 0x0021c2c7, // n0x1560 c0x0000 (---------------) + I sibenik + 0x003531c4, // n0x1561 c0x0000 (---------------) + I silk + 0x0021cf83, // n0x1562 c0x0000 (---------------) + I ski + 0x0028dec5, // n0x1563 c0x0000 (---------------) + I skole + 0x002d6487, // n0x1564 c0x0000 (---------------) + I society + 0x002db8c7, // n0x1565 c0x0000 (---------------) + I sologne + 0x0028a50e, // n0x1566 c0x0000 (---------------) + I soundandvision + 0x00327f4d, // n0x1567 c0x0000 (---------------) + I southcarolina + 0x0032ad49, // n0x1568 c0x0000 (---------------) + I southwest + 0x00335085, // n0x1569 c0x0000 (---------------) + I space + 0x0032e5c3, // n0x156a c0x0000 (---------------) + I spy + 0x0027c606, // n0x156b c0x0000 (---------------) + I square + 0x00361245, // n0x156c c0x0000 (---------------) + I stadt + 0x002730c8, // n0x156d c0x0000 (---------------) + I stalbans + 0x00317c49, // n0x156e c0x0000 (---------------) + I starnberg + 0x0028e7c5, // n0x156f c0x0000 (---------------) + I state + 0x00337e8f, // n0x1570 c0x0000 (---------------) + I stateofdelaware + 0x002d4807, // n0x1571 c0x0000 (---------------) + I station + 0x003658c5, // n0x1572 c0x0000 (---------------) + I steam + 0x00305b8a, // n0x1573 c0x0000 (---------------) + I steiermark + 0x002b4e86, // n0x1574 c0x0000 (---------------) + I stjohn + 0x00292749, // n0x1575 c0x0000 (---------------) + I stockholm + 0x002e058c, // n0x1576 c0x0000 (---------------) + I stpetersburg + 0x002e1909, // n0x1577 c0x0000 (---------------) + I stuttgart + 0x002068c6, // n0x1578 c0x0000 (---------------) + I suisse + 0x003721cc, // n0x1579 c0x0000 (---------------) + I surgeonshall + 0x002e2146, // n0x157a c0x0000 (---------------) + I surrey + 0x002e4c88, // n0x157b c0x0000 (---------------) + I svizzera + 0x002e4e86, // n0x157c c0x0000 (---------------) + I sweden + 0x0022b806, // n0x157d c0x0000 (---------------) + I sydney + 0x00224d04, // n0x157e c0x0000 (---------------) + I tank + 0x00255843, // n0x157f c0x0000 (---------------) + I tcm + 0x002a3c4a, // n0x1580 c0x0000 (---------------) + I technology + 0x0025ea51, // n0x1581 c0x0000 (---------------) + I telekommunikation + 0x0023b44a, // n0x1582 c0x0000 (---------------) + I television + 0x002ff185, // n0x1583 c0x0000 (---------------) + I texas + 0x002fe987, // n0x1584 c0x0000 (---------------) + I textile + 0x0031b107, // n0x1585 c0x0000 (---------------) + I theater + 0x00219984, // n0x1586 c0x0000 (---------------) + I time + 0x0021998b, // n0x1587 c0x0000 (---------------) + I timekeeping + 0x00300d08, // n0x1588 c0x0000 (---------------) + I topology + 0x002abe46, // n0x1589 c0x0000 (---------------) + I torino + 0x00330f05, // n0x158a c0x0000 (---------------) + I touch + 0x002a9404, // n0x158b c0x0000 (---------------) + I town + 0x0028b589, // n0x158c c0x0000 (---------------) + I transport + 0x0024f1c4, // n0x158d c0x0000 (---------------) + I tree + 0x002b2407, // n0x158e c0x0000 (---------------) + I trolley + 0x0031f0c5, // n0x158f c0x0000 (---------------) + I trust + 0x0031f0c7, // n0x1590 c0x0000 (---------------) + I trustee + 0x0031a8c5, // n0x1591 c0x0000 (---------------) + I uhren + 0x00330703, // n0x1592 c0x0000 (---------------) + I ulm + 0x002f1c48, // n0x1593 c0x0000 (---------------) + I undersea + 0x00281a0a, // n0x1594 c0x0000 (---------------) + I university + 0x00204783, // n0x1595 c0x0000 (---------------) + I usa + 0x0020478a, // n0x1596 c0x0000 (---------------) + I usantiques + 0x00285b46, // n0x1597 c0x0000 (---------------) + I usarts + 0x00337c0f, // n0x1598 c0x0000 (---------------) + I uscountryestate + 0x0034cd09, // n0x1599 c0x0000 (---------------) + I usculture + 0x00256e90, // n0x159a c0x0000 (---------------) + I usdecorativearts + 0x00266448, // n0x159b c0x0000 (---------------) + I usgarden + 0x002c6149, // n0x159c c0x0000 (---------------) + I ushistory + 0x00294047, // n0x159d c0x0000 (---------------) + I ushuaia + 0x002d83cf, // n0x159e c0x0000 (---------------) + I uslivinghistory + 0x002e1444, // n0x159f c0x0000 (---------------) + I utah + 0x002fa7c4, // n0x15a0 c0x0000 (---------------) + I uvic + 0x00213f46, // n0x15a1 c0x0000 (---------------) + I valley + 0x00265f06, // n0x15a2 c0x0000 (---------------) + I vantaa + 0x00314eca, // n0x15a3 c0x0000 (---------------) + I versailles + 0x0036cf46, // n0x15a4 c0x0000 (---------------) + I viking + 0x002f0507, // n0x15a5 c0x0000 (---------------) + I village + 0x002ee6c8, // n0x15a6 c0x0000 (---------------) + I virginia + 0x002ee8c7, // n0x15a7 c0x0000 (---------------) + I virtual + 0x002eea87, // n0x15a8 c0x0000 (---------------) + I virtuel + 0x003434ca, // n0x15a9 c0x0000 (---------------) + I vlaanderen + 0x002f1a8b, // n0x15aa c0x0000 (---------------) + I volkenkunde + 0x0030e445, // n0x15ab c0x0000 (---------------) + I wales + 0x0039cc08, // n0x15ac c0x0000 (---------------) + I wallonie + 0x00207c83, // n0x15ad c0x0000 (---------------) + I war + 0x00227b8c, // n0x15ae c0x0000 (---------------) + I washingtondc + 0x0037364f, // n0x15af c0x0000 (---------------) + I watch-and-clock + 0x002a690d, // n0x15b0 c0x0000 (---------------) + I watchandclock + 0x00238587, // n0x15b1 c0x0000 (---------------) + I western + 0x0032ae89, // n0x15b2 c0x0000 (---------------) + I westfalen + 0x00330c07, // n0x15b3 c0x0000 (---------------) + I whaling + 0x0023eb88, // n0x15b4 c0x0000 (---------------) + I wildlife + 0x0022e18c, // n0x15b5 c0x0000 (---------------) + I williamsburg + 0x0025b848, // n0x15b6 c0x0000 (---------------) + I windmill + 0x00332b48, // n0x15b7 c0x0000 (---------------) + I workshop + 0x0030be8e, // n0x15b8 c0x0000 (---------------) + I xn--9dbhblg6di + 0x0031cc14, // n0x15b9 c0x0000 (---------------) + I xn--comunicaes-v6a2o + 0x0031d124, // n0x15ba c0x0000 (---------------) + I xn--correios-e-telecomunicaes-ghc29a + 0x00336e4a, // n0x15bb c0x0000 (---------------) + I xn--h1aegh + 0x003537cb, // n0x15bc c0x0000 (---------------) + I xn--lns-qla + 0x00302d84, // n0x15bd c0x0000 (---------------) + I york + 0x00302d89, // n0x15be c0x0000 (---------------) + I yorkshire + 0x003535c8, // n0x15bf c0x0000 (---------------) + I yosemite + 0x00242c85, // n0x15c0 c0x0000 (---------------) + I youth + 0x00225c0a, // n0x15c1 c0x0000 (---------------) + I zoological + 0x0027c7c7, // n0x15c2 c0x0000 (---------------) + I zoology + 0x002bcb84, // n0x15c3 c0x0000 (---------------) + I aero + 0x0030a143, // n0x15c4 c0x0000 (---------------) + I biz + 0x0022edc3, // n0x15c5 c0x0000 (---------------) + I com + 0x00238284, // n0x15c6 c0x0000 (---------------) + I coop + 0x002349c3, // n0x15c7 c0x0000 (---------------) + I edu + 0x00275003, // n0x15c8 c0x0000 (---------------) + I gov + 0x0038a144, // n0x15c9 c0x0000 (---------------) + I info + 0x0026f683, // n0x15ca c0x0000 (---------------) + I int + 0x00215b43, // n0x15cb c0x0000 (---------------) + I mil + 0x002cc746, // n0x15cc c0x0000 (---------------) + I museum + 0x0027ca84, // n0x15cd c0x0000 (---------------) + I name + 0x0021d8c3, // n0x15ce c0x0000 (---------------) + I net + 0x00229a83, // n0x15cf c0x0000 (---------------) + I org + 0x00220283, // n0x15d0 c0x0000 (---------------) + I pro + 0x00205882, // n0x15d1 c0x0000 (---------------) + I ac + 0x0030a143, // n0x15d2 c0x0000 (---------------) + I biz + 0x00208182, // n0x15d3 c0x0000 (---------------) + I co + 0x0022edc3, // n0x15d4 c0x0000 (---------------) + I com + 0x00238284, // n0x15d5 c0x0000 (---------------) + I coop + 0x002349c3, // n0x15d6 c0x0000 (---------------) + I edu + 0x00275003, // n0x15d7 c0x0000 (---------------) + I gov + 0x0026f683, // n0x15d8 c0x0000 (---------------) + I int + 0x002cc746, // n0x15d9 c0x0000 (---------------) + I museum + 0x0021d8c3, // n0x15da c0x0000 (---------------) + I net + 0x00229a83, // n0x15db c0x0000 (---------------) + I org + 0x000f5248, // n0x15dc c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x15dd c0x0000 (---------------) + I com + 0x002349c3, // n0x15de c0x0000 (---------------) + I edu + 0x00209f03, // n0x15df c0x0000 (---------------) + I gob + 0x0021d8c3, // n0x15e0 c0x0000 (---------------) + I net + 0x00229a83, // n0x15e1 c0x0000 (---------------) + I org + 0x000f5248, // n0x15e2 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x15e3 c0x0000 (---------------) + I com + 0x002349c3, // n0x15e4 c0x0000 (---------------) + I edu + 0x00275003, // n0x15e5 c0x0000 (---------------) + I gov + 0x00215b43, // n0x15e6 c0x0000 (---------------) + I mil + 0x0027ca84, // n0x15e7 c0x0000 (---------------) + I name + 0x0021d8c3, // n0x15e8 c0x0000 (---------------) + I net + 0x00229a83, // n0x15e9 c0x0000 (---------------) + I org + 0x00739808, // n0x15ea c0x0001 (---------------) ! I teledata + 0x00200302, // n0x15eb c0x0000 (---------------) + I ca + 0x0021db82, // n0x15ec c0x0000 (---------------) + I cc + 0x00208182, // n0x15ed c0x0000 (---------------) + I co + 0x0022edc3, // n0x15ee c0x0000 (---------------) + I com + 0x00204d42, // n0x15ef c0x0000 (---------------) + I dr + 0x002020c2, // n0x15f0 c0x0000 (---------------) + I in + 0x0038a144, // n0x15f1 c0x0000 (---------------) + I info + 0x00207804, // n0x15f2 c0x0000 (---------------) + I mobi + 0x00214b82, // n0x15f3 c0x0000 (---------------) + I mx + 0x0027ca84, // n0x15f4 c0x0000 (---------------) + I name + 0x00200282, // n0x15f5 c0x0000 (---------------) + I or + 0x00229a83, // n0x15f6 c0x0000 (---------------) + I org + 0x00220283, // n0x15f7 c0x0000 (---------------) + I pro + 0x00231d06, // n0x15f8 c0x0000 (---------------) + I school + 0x00206fc2, // n0x15f9 c0x0000 (---------------) + I tv + 0x00202982, // n0x15fa c0x0000 (---------------) + I us + 0x0021fec2, // n0x15fb c0x0000 (---------------) + I ws + 0x37e21343, // n0x15fc c0x00df (n0x15fe-n0x15ff) o I her + 0x38210ac3, // n0x15fd c0x00e0 (n0x15ff-n0x1600) o I his + 0x0004f7c6, // n0x15fe c0x0000 (---------------) + forgot + 0x0004f7c6, // n0x15ff c0x0000 (---------------) + forgot + 0x002b1c44, // n0x1600 c0x0000 (---------------) + I asso + 0x001068cc, // n0x1601 c0x0000 (---------------) + at-band-camp + 0x0007758c, // n0x1602 c0x0000 (---------------) + azure-mobile + 0x000ba84d, // n0x1603 c0x0000 (---------------) + azurewebsites + 0x00029007, // n0x1604 c0x0000 (---------------) + blogdns + 0x0001f188, // n0x1605 c0x0000 (---------------) + broke-it + 0x0019304a, // n0x1606 c0x0000 (---------------) + buyshouses + 0x38e39705, // n0x1607 c0x00e3 (n0x1632-n0x1633) o I cdn77 + 0x00039709, // n0x1608 c0x0000 (---------------) + cdn77-ssl + 0x0017e448, // n0x1609 c0x0000 (---------------) + cloudapp + 0x0002c88a, // n0x160a c0x0000 (---------------) + cloudfront + 0x00147e08, // n0x160b c0x0000 (---------------) + dnsalias + 0x00074607, // n0x160c c0x0000 (---------------) + dnsdojo + 0x00006e47, // n0x160d c0x0000 (---------------) + does-it + 0x00168789, // n0x160e c0x0000 (---------------) + dontexist + 0x0018bd88, // n0x160f c0x0000 (---------------) + dynalias + 0x0005ce49, // n0x1610 c0x0000 (---------------) + dynathome + 0x0009f90d, // n0x1611 c0x0000 (---------------) + endofinternet + 0x392e01c6, // n0x1612 c0x00e4 (n0x1633-n0x1635) o I fastly + 0x0005b687, // n0x1613 c0x0000 (---------------) + from-az + 0x0005d787, // n0x1614 c0x0000 (---------------) + from-co + 0x00061fc7, // n0x1615 c0x0000 (---------------) + from-la + 0x00068a07, // n0x1616 c0x0000 (---------------) + from-ny + 0x00009582, // n0x1617 c0x0000 (---------------) + gb + 0x00163107, // n0x1618 c0x0000 (---------------) + gets-it + 0x0005e5cc, // n0x1619 c0x0000 (---------------) + ham-radio-op + 0x000ad607, // n0x161a c0x0000 (---------------) + homeftp + 0x0009c286, // n0x161b c0x0000 (---------------) + homeip + 0x0009c509, // n0x161c c0x0000 (---------------) + homelinux + 0x0009d988, // n0x161d c0x0000 (---------------) + homeunix + 0x0000d0c2, // n0x161e c0x0000 (---------------) + hu + 0x000020c2, // n0x161f c0x0000 (---------------) + in + 0x0010078b, // n0x1620 c0x0000 (---------------) + in-the-band + 0x0000fe09, // n0x1621 c0x0000 (---------------) + is-a-chef + 0x0005f049, // n0x1622 c0x0000 (---------------) + is-a-geek + 0x000fff08, // n0x1623 c0x0000 (---------------) + isa-geek + 0x000a8bc2, // n0x1624 c0x0000 (---------------) + jp + 0x0014c909, // n0x1625 c0x0000 (---------------) + kicks-ass + 0x0001f70d, // n0x1626 c0x0000 (---------------) + office-on-the + 0x000d7147, // n0x1627 c0x0000 (---------------) + podzone + 0x0004700d, // n0x1628 c0x0000 (---------------) + scrapper-site + 0x00001d42, // n0x1629 c0x0000 (---------------) + se + 0x00053986, // n0x162a c0x0000 (---------------) + selfip + 0x00088508, // n0x162b c0x0000 (---------------) + sells-it + 0x000c9608, // n0x162c c0x0000 (---------------) + servebbs + 0x0006e648, // n0x162d c0x0000 (---------------) + serveftp + 0x0004c288, // n0x162e c0x0000 (---------------) + thruhere + 0x00000f82, // n0x162f c0x0000 (---------------) + uk + 0x00123b06, // n0x1630 c0x0000 (---------------) + webhop + 0x00009ac2, // n0x1631 c0x0000 (---------------) + za + 0x000002c1, // n0x1632 c0x0000 (---------------) + r + 0x396db644, // n0x1633 c0x00e5 (n0x1635-n0x1637) o I prod + 0x39a39883, // n0x1634 c0x00e6 (n0x1637-n0x163a) o I ssl + 0x00000101, // n0x1635 c0x0000 (---------------) + a + 0x00005586, // n0x1636 c0x0000 (---------------) + global + 0x00000101, // n0x1637 c0x0000 (---------------) + a + 0x00000001, // n0x1638 c0x0000 (---------------) + b + 0x00005586, // n0x1639 c0x0000 (---------------) + global + 0x00243984, // n0x163a c0x0000 (---------------) + I arts + 0x0022edc3, // n0x163b c0x0000 (---------------) + I com + 0x00247a04, // n0x163c c0x0000 (---------------) + I firm + 0x0038a144, // n0x163d c0x0000 (---------------) + I info + 0x0021d8c3, // n0x163e c0x0000 (---------------) + I net + 0x002212c5, // n0x163f c0x0000 (---------------) + I other + 0x0021ffc3, // n0x1640 c0x0000 (---------------) + I per + 0x00226f03, // n0x1641 c0x0000 (---------------) + I rec + 0x0038c985, // n0x1642 c0x0000 (---------------) + I store + 0x0021fa83, // n0x1643 c0x0000 (---------------) + I web + 0x3a62edc3, // n0x1644 c0x00e9 (n0x164d-n0x164e) + I com + 0x002349c3, // n0x1645 c0x0000 (---------------) + I edu + 0x00275003, // n0x1646 c0x0000 (---------------) + I gov + 0x00215b43, // n0x1647 c0x0000 (---------------) + I mil + 0x00207804, // n0x1648 c0x0000 (---------------) + I mobi + 0x0027ca84, // n0x1649 c0x0000 (---------------) + I name + 0x0021d8c3, // n0x164a c0x0000 (---------------) + I net + 0x00229a83, // n0x164b c0x0000 (---------------) + I org + 0x00215d43, // n0x164c c0x0000 (---------------) + I sch + 0x000f5248, // n0x164d c0x0000 (---------------) + blogspot + 0x000f5248, // n0x164e c0x0000 (---------------) + blogspot + 0x00364282, // n0x164f c0x0000 (---------------) + I bv + 0x00008182, // n0x1650 c0x0000 (---------------) + co + 0x3b222142, // n0x1651 c0x00ec (n0x1927-n0x1928) + I aa + 0x00379688, // n0x1652 c0x0000 (---------------) + I aarborte + 0x002225c6, // n0x1653 c0x0000 (---------------) + I aejrie + 0x002b65c6, // n0x1654 c0x0000 (---------------) + I afjord + 0x00221f47, // n0x1655 c0x0000 (---------------) + I agdenes + 0x3b607142, // n0x1656 c0x00ed (n0x1928-n0x1929) + I ah + 0x3bb1b508, // n0x1657 c0x00ee (n0x1929-n0x192a) o I akershus + 0x0030ec8a, // n0x1658 c0x0000 (---------------) + I aknoluokta + 0x0025b108, // n0x1659 c0x0000 (---------------) + I akrehamn + 0x002001c2, // n0x165a c0x0000 (---------------) + I al + 0x0030f509, // n0x165b c0x0000 (---------------) + I alaheadju + 0x0030e487, // n0x165c c0x0000 (---------------) + I alesund + 0x00217246, // n0x165d c0x0000 (---------------) + I algard + 0x00235909, // n0x165e c0x0000 (---------------) + I alstahaug + 0x00235004, // n0x165f c0x0000 (---------------) + I alta + 0x002b7046, // n0x1660 c0x0000 (---------------) + I alvdal + 0x002b69c4, // n0x1661 c0x0000 (---------------) + I amli + 0x00270f84, // n0x1662 c0x0000 (---------------) + I amot + 0x00252a09, // n0x1663 c0x0000 (---------------) + I andasuolo + 0x00204e86, // n0x1664 c0x0000 (---------------) + I andebu + 0x0036bd45, // n0x1665 c0x0000 (---------------) + I andoy + 0x00260185, // n0x1666 c0x0000 (---------------) + I ardal + 0x0022f807, // n0x1667 c0x0000 (---------------) + I aremark + 0x002b30c7, // n0x1668 c0x0000 (---------------) + I arendal + 0x00347544, // n0x1669 c0x0000 (---------------) + I arna + 0x00222186, // n0x166a c0x0000 (---------------) + I aseral + 0x002dc105, // n0x166b c0x0000 (---------------) + I asker + 0x00229385, // n0x166c c0x0000 (---------------) + I askim + 0x002ea945, // n0x166d c0x0000 (---------------) + I askoy + 0x00385087, // n0x166e c0x0000 (---------------) + I askvoll + 0x0022d9c5, // n0x166f c0x0000 (---------------) + I asnes + 0x00304089, // n0x1670 c0x0000 (---------------) + I audnedaln + 0x002a1605, // n0x1671 c0x0000 (---------------) + I aukra + 0x002efe84, // n0x1672 c0x0000 (---------------) + I aure + 0x00320a47, // n0x1673 c0x0000 (---------------) + I aurland + 0x002bc40e, // n0x1674 c0x0000 (---------------) + I aurskog-holand + 0x00301fc9, // n0x1675 c0x0000 (---------------) + I austevoll + 0x0031a549, // n0x1676 c0x0000 (---------------) + I austrheim + 0x0032b606, // n0x1677 c0x0000 (---------------) + I averoy + 0x002e6f88, // n0x1678 c0x0000 (---------------) + I badaddja + 0x002a774b, // n0x1679 c0x0000 (---------------) + I bahcavuotna + 0x002cd38c, // n0x167a c0x0000 (---------------) + I bahccavuotna + 0x00262246, // n0x167b c0x0000 (---------------) + I baidar + 0x0036e907, // n0x167c c0x0000 (---------------) + I bajddar + 0x00224745, // n0x167d c0x0000 (---------------) + I balat + 0x0022d04a, // n0x167e c0x0000 (---------------) + I balestrand + 0x00307909, // n0x167f c0x0000 (---------------) + I ballangen + 0x002559c9, // n0x1680 c0x0000 (---------------) + I balsfjord + 0x002a0b46, // n0x1681 c0x0000 (---------------) + I bamble + 0x002e40c5, // n0x1682 c0x0000 (---------------) + I bardu + 0x002768c5, // n0x1683 c0x0000 (---------------) + I barum + 0x00350189, // n0x1684 c0x0000 (---------------) + I batsfjord + 0x002eaacb, // n0x1685 c0x0000 (---------------) + I bearalvahki + 0x002742c6, // n0x1686 c0x0000 (---------------) + I beardu + 0x0032a546, // n0x1687 c0x0000 (---------------) + I beiarn + 0x002094c4, // n0x1688 c0x0000 (---------------) + I berg + 0x00283ec6, // n0x1689 c0x0000 (---------------) + I bergen + 0x002bbb08, // n0x168a c0x0000 (---------------) + I berlevag + 0x00200006, // n0x168b c0x0000 (---------------) + I bievat + 0x002025c6, // n0x168c c0x0000 (---------------) + I bindal + 0x00205ec8, // n0x168d c0x0000 (---------------) + I birkenes + 0x002066c7, // n0x168e c0x0000 (---------------) + I bjarkoy + 0x002075c9, // n0x168f c0x0000 (---------------) + I bjerkreim + 0x00207d85, // n0x1690 c0x0000 (---------------) + I bjugn + 0x000f5248, // n0x1691 c0x0000 (---------------) + blogspot + 0x00206dc4, // n0x1692 c0x0000 (---------------) + I bodo + 0x002f0804, // n0x1693 c0x0000 (---------------) + I bokn + 0x00211485, // n0x1694 c0x0000 (---------------) + I bomlo + 0x00388089, // n0x1695 c0x0000 (---------------) + I bremanger + 0x00220687, // n0x1696 c0x0000 (---------------) + I bronnoy + 0x0022068b, // n0x1697 c0x0000 (---------------) + I bronnoysund + 0x0022184a, // n0x1698 c0x0000 (---------------) + I brumunddal + 0x00224445, // n0x1699 c0x0000 (---------------) + I bryne + 0x3be04742, // n0x169a c0x00ef (n0x192a-n0x192b) + I bu + 0x00204f87, // n0x169b c0x0000 (---------------) + I budejju + 0x3c226a48, // n0x169c c0x00f0 (n0x192b-n0x192c) o I buskerud + 0x002cb0c7, // n0x169d c0x0000 (---------------) + I bygland + 0x002acb45, // n0x169e c0x0000 (---------------) + I bykle + 0x00239f8a, // n0x169f c0x0000 (---------------) + I cahcesuolo + 0x00008182, // n0x16a0 c0x0000 (---------------) + co + 0x0028760b, // n0x16a1 c0x0000 (---------------) + I davvenjarga + 0x0025c88a, // n0x16a2 c0x0000 (---------------) + I davvesiida + 0x00395246, // n0x16a3 c0x0000 (---------------) + I deatnu + 0x0026c843, // n0x16a4 c0x0000 (---------------) + I dep + 0x002ad18d, // n0x16a5 c0x0000 (---------------) + I dielddanuorri + 0x00255bcc, // n0x16a6 c0x0000 (---------------) + I divtasvuodna + 0x002641cd, // n0x16a7 c0x0000 (---------------) + I divttasvuotna + 0x00359d05, // n0x16a8 c0x0000 (---------------) + I donna + 0x0025dfc5, // n0x16a9 c0x0000 (---------------) + I dovre + 0x00226147, // n0x16aa c0x0000 (---------------) + I drammen + 0x0030e609, // n0x16ab c0x0000 (---------------) + I drangedal + 0x0030eb86, // n0x16ac c0x0000 (---------------) + I drobak + 0x0036cdc5, // n0x16ad c0x0000 (---------------) + I dyroy + 0x0025d9c8, // n0x16ae c0x0000 (---------------) + I egersund + 0x00272443, // n0x16af c0x0000 (---------------) + I eid + 0x0032f988, // n0x16b0 c0x0000 (---------------) + I eidfjord + 0x00283dc8, // n0x16b1 c0x0000 (---------------) + I eidsberg + 0x002b7f47, // n0x16b2 c0x0000 (---------------) + I eidskog + 0x00272448, // n0x16b3 c0x0000 (---------------) + I eidsvoll + 0x003a3509, // n0x16b4 c0x0000 (---------------) + I eigersund + 0x00236e07, // n0x16b5 c0x0000 (---------------) + I elverum + 0x00379087, // n0x16b6 c0x0000 (---------------) + I enebakk + 0x0027bd08, // n0x16b7 c0x0000 (---------------) + I engerdal + 0x002afb04, // n0x16b8 c0x0000 (---------------) + I etne + 0x002afb07, // n0x16b9 c0x0000 (---------------) + I etnedal + 0x0024bd88, // n0x16ba c0x0000 (---------------) + I evenassi + 0x002031c6, // n0x16bb c0x0000 (---------------) + I evenes + 0x003967cf, // n0x16bc c0x0000 (---------------) + I evje-og-hornnes + 0x00210007, // n0x16bd c0x0000 (---------------) + I farsund + 0x00246786, // n0x16be c0x0000 (---------------) + I fauske + 0x00247cc5, // n0x16bf c0x0000 (---------------) + I fedje + 0x00341603, // n0x16c0 c0x0000 (---------------) + I fet + 0x00341607, // n0x16c1 c0x0000 (---------------) + I fetsund + 0x00325a43, // n0x16c2 c0x0000 (---------------) + I fhs + 0x00245706, // n0x16c3 c0x0000 (---------------) + I finnoy + 0x00248b06, // n0x16c4 c0x0000 (---------------) + I fitjar + 0x002496c6, // n0x16c5 c0x0000 (---------------) + I fjaler + 0x00286e85, // n0x16c6 c0x0000 (---------------) + I fjell + 0x00203803, // n0x16c7 c0x0000 (---------------) + I fla + 0x0037b548, // n0x16c8 c0x0000 (---------------) + I flakstad + 0x00203809, // n0x16c9 c0x0000 (---------------) + I flatanger + 0x00361b0b, // n0x16ca c0x0000 (---------------) + I flekkefjord + 0x00373d08, // n0x16cb c0x0000 (---------------) + I flesberg + 0x0024ab85, // n0x16cc c0x0000 (---------------) + I flora + 0x0024b685, // n0x16cd c0x0000 (---------------) + I floro + 0x3c63d4c2, // n0x16ce c0x00f1 (n0x192c-n0x192d) + I fm + 0x00351709, // n0x16cf c0x0000 (---------------) + I folkebibl + 0x0024dac7, // n0x16d0 c0x0000 (---------------) + I folldal + 0x00395185, // n0x16d1 c0x0000 (---------------) + I forde + 0x00252907, // n0x16d2 c0x0000 (---------------) + I forsand + 0x00254346, // n0x16d3 c0x0000 (---------------) + I fosnes + 0x00358985, // n0x16d4 c0x0000 (---------------) + I frana + 0x0036108b, // n0x16d5 c0x0000 (---------------) + I fredrikstad + 0x002554c4, // n0x16d6 c0x0000 (---------------) + I frei + 0x0025acc5, // n0x16d7 c0x0000 (---------------) + I frogn + 0x0025ae07, // n0x16d8 c0x0000 (---------------) + I froland + 0x0026ed46, // n0x16d9 c0x0000 (---------------) + I frosta + 0x0026f185, // n0x16da c0x0000 (---------------) + I froya + 0x0027a1c7, // n0x16db c0x0000 (---------------) + I fuoisku + 0x0027a747, // n0x16dc c0x0000 (---------------) + I fuossko + 0x00285b04, // n0x16dd c0x0000 (---------------) + I fusa + 0x002826ca, // n0x16de c0x0000 (---------------) + I fylkesbibl + 0x00282b88, // n0x16df c0x0000 (---------------) + I fyresdal + 0x00301349, // n0x16e0 c0x0000 (---------------) + I gaivuotna + 0x0021c685, // n0x16e1 c0x0000 (---------------) + I galsa + 0x00287846, // n0x16e2 c0x0000 (---------------) + I gamvik + 0x002bbcca, // n0x16e3 c0x0000 (---------------) + I gangaviika + 0x00260086, // n0x16e4 c0x0000 (---------------) + I gaular + 0x00312407, // n0x16e5 c0x0000 (---------------) + I gausdal + 0x0030100d, // n0x16e6 c0x0000 (---------------) + I giehtavuoatna + 0x0022a489, // n0x16e7 c0x0000 (---------------) + I gildeskal + 0x00363785, // n0x16e8 c0x0000 (---------------) + I giske + 0x003639c7, // n0x16e9 c0x0000 (---------------) + I gjemnes + 0x00309c48, // n0x16ea c0x0000 (---------------) + I gjerdrum + 0x00322608, // n0x16eb c0x0000 (---------------) + I gjerstad + 0x0033af47, // n0x16ec c0x0000 (---------------) + I gjesdal + 0x003088c6, // n0x16ed c0x0000 (---------------) + I gjovik + 0x00209907, // n0x16ee c0x0000 (---------------) + I gloppen + 0x00247c03, // n0x16ef c0x0000 (---------------) + I gol + 0x0032e344, // n0x16f0 c0x0000 (---------------) + I gran + 0x00355305, // n0x16f1 c0x0000 (---------------) + I grane + 0x00380ac7, // n0x16f2 c0x0000 (---------------) + I granvin + 0x00384a89, // n0x16f3 c0x0000 (---------------) + I gratangen + 0x00216c48, // n0x16f4 c0x0000 (---------------) + I grimstad + 0x00312305, // n0x16f5 c0x0000 (---------------) + I grong + 0x00339d44, // n0x16f6 c0x0000 (---------------) + I grue + 0x00240f85, // n0x16f7 c0x0000 (---------------) + I gulen + 0x0024494d, // n0x16f8 c0x0000 (---------------) + I guovdageaidnu + 0x00201c82, // n0x16f9 c0x0000 (---------------) + I ha + 0x0035c886, // n0x16fa c0x0000 (---------------) + I habmer + 0x002538c6, // n0x16fb c0x0000 (---------------) + I hadsel + 0x0029c98a, // n0x16fc c0x0000 (---------------) + I hagebostad + 0x00346a86, // n0x16fd c0x0000 (---------------) + I halden + 0x0035c145, // n0x16fe c0x0000 (---------------) + I halsa + 0x00302585, // n0x16ff c0x0000 (---------------) + I hamar + 0x00302587, // n0x1700 c0x0000 (---------------) + I hamaroy + 0x0036ac4c, // n0x1701 c0x0000 (---------------) + I hammarfeasta + 0x0027da0a, // n0x1702 c0x0000 (---------------) + I hammerfest + 0x00282f86, // n0x1703 c0x0000 (---------------) + I hapmir + 0x002b9f05, // n0x1704 c0x0000 (---------------) + I haram + 0x00283d06, // n0x1705 c0x0000 (---------------) + I hareid + 0x00284047, // n0x1706 c0x0000 (---------------) + I harstad + 0x00285186, // n0x1707 c0x0000 (---------------) + I hasvik + 0x00286d8c, // n0x1708 c0x0000 (---------------) + I hattfjelldal + 0x00235a49, // n0x1709 c0x0000 (---------------) + I haugesund + 0x3ca31807, // n0x170a c0x00f2 (n0x192d-n0x1930) o I hedmark + 0x00288f85, // n0x170b c0x0000 (---------------) + I hemne + 0x00288f86, // n0x170c c0x0000 (---------------) + I hemnes + 0x002894c8, // n0x170d c0x0000 (---------------) + I hemsedal + 0x002aacc5, // n0x170e c0x0000 (---------------) + I herad + 0x0029b645, // n0x170f c0x0000 (---------------) + I hitra + 0x0029b888, // n0x1710 c0x0000 (---------------) + I hjartdal + 0x0029ba8a, // n0x1711 c0x0000 (---------------) + I hjelmeland + 0x3cea9982, // n0x1712 c0x00f3 (n0x1930-n0x1931) + I hl + 0x3d20c742, // n0x1713 c0x00f4 (n0x1931-n0x1932) + I hm + 0x0034e405, // n0x1714 c0x0000 (---------------) + I hobol + 0x002d2203, // n0x1715 c0x0000 (---------------) + I hof + 0x003327c8, // n0x1716 c0x0000 (---------------) + I hokksund + 0x00231ac3, // n0x1717 c0x0000 (---------------) + I hol + 0x0029bd04, // n0x1718 c0x0000 (---------------) + I hole + 0x0029288b, // n0x1719 c0x0000 (---------------) + I holmestrand + 0x002c4448, // n0x171a c0x0000 (---------------) + I holtalen + 0x0029e188, // n0x171b c0x0000 (---------------) + I honefoss + 0x3d71e409, // n0x171c c0x00f5 (n0x1932-n0x1933) o I hordaland + 0x0029f389, // n0x171d c0x0000 (---------------) + I hornindal + 0x0029f806, // n0x171e c0x0000 (---------------) + I horten + 0x002a0448, // n0x171f c0x0000 (---------------) + I hoyanger + 0x002a0649, // n0x1720 c0x0000 (---------------) + I hoylandet + 0x002a2cc6, // n0x1721 c0x0000 (---------------) + I hurdal + 0x002a2e45, // n0x1722 c0x0000 (---------------) + I hurum + 0x00360406, // n0x1723 c0x0000 (---------------) + I hvaler + 0x002a3389, // n0x1724 c0x0000 (---------------) + I hyllestad + 0x00363387, // n0x1725 c0x0000 (---------------) + I ibestad + 0x002630c6, // n0x1726 c0x0000 (---------------) + I idrett + 0x00306007, // n0x1727 c0x0000 (---------------) + I inderoy + 0x0030ea07, // n0x1728 c0x0000 (---------------) + I iveland + 0x0036b344, // n0x1729 c0x0000 (---------------) + I ivgu + 0x3da1bb49, // n0x172a c0x00f6 (n0x1933-n0x1934) + I jan-mayen + 0x002c2788, // n0x172b c0x0000 (---------------) + I jessheim + 0x00350f48, // n0x172c c0x0000 (---------------) + I jevnaker + 0x0022e4c7, // n0x172d c0x0000 (---------------) + I jolster + 0x002bb2c6, // n0x172e c0x0000 (---------------) + I jondal + 0x002f5e89, // n0x172f c0x0000 (---------------) + I jorpeland + 0x002b7507, // n0x1730 c0x0000 (---------------) + I kafjord + 0x002e2f0a, // n0x1731 c0x0000 (---------------) + I karasjohka + 0x00251bc8, // n0x1732 c0x0000 (---------------) + I karasjok + 0x002565c7, // n0x1733 c0x0000 (---------------) + I karlsoy + 0x00321f06, // n0x1734 c0x0000 (---------------) + I karmoy + 0x002163ca, // n0x1735 c0x0000 (---------------) + I kautokeino + 0x00250108, // n0x1736 c0x0000 (---------------) + I kirkenes + 0x00242f45, // n0x1737 c0x0000 (---------------) + I klabu + 0x00223f85, // n0x1738 c0x0000 (---------------) + I klepp + 0x002d1a07, // n0x1739 c0x0000 (---------------) + I kommune + 0x002b85c9, // n0x173a c0x0000 (---------------) + I kongsberg + 0x002c174b, // n0x173b c0x0000 (---------------) + I kongsvinger + 0x002d1848, // n0x173c c0x0000 (---------------) + I kopervik + 0x002a1689, // n0x173d c0x0000 (---------------) + I kraanghke + 0x00249947, // n0x173e c0x0000 (---------------) + I kragero + 0x002aa24c, // n0x173f c0x0000 (---------------) + I kristiansand + 0x002aa88c, // n0x1740 c0x0000 (---------------) + I kristiansund + 0x002aab8a, // n0x1741 c0x0000 (---------------) + I krodsherad + 0x002aae0c, // n0x1742 c0x0000 (---------------) + I krokstadelva + 0x002b6548, // n0x1743 c0x0000 (---------------) + I kvafjord + 0x002b6748, // n0x1744 c0x0000 (---------------) + I kvalsund + 0x002b6944, // n0x1745 c0x0000 (---------------) + I kvam + 0x002b76c9, // n0x1746 c0x0000 (---------------) + I kvanangen + 0x002b7909, // n0x1747 c0x0000 (---------------) + I kvinesdal + 0x002b7b4a, // n0x1748 c0x0000 (---------------) + I kvinnherad + 0x002b7dc9, // n0x1749 c0x0000 (---------------) + I kviteseid + 0x002b8107, // n0x174a c0x0000 (---------------) + I kvitsoy + 0x003a19cc, // n0x174b c0x0000 (---------------) + I laakesvuemie + 0x00338406, // n0x174c c0x0000 (---------------) + I lahppi + 0x00250488, // n0x174d c0x0000 (---------------) + I langevag + 0x00260146, // n0x174e c0x0000 (---------------) + I lardal + 0x0037a5c6, // n0x174f c0x0000 (---------------) + I larvik + 0x00363687, // n0x1750 c0x0000 (---------------) + I lavagis + 0x00225648, // n0x1751 c0x0000 (---------------) + I lavangen + 0x002bdb0b, // n0x1752 c0x0000 (---------------) + I leangaviika + 0x002caf87, // n0x1753 c0x0000 (---------------) + I lebesby + 0x002526c9, // n0x1754 c0x0000 (---------------) + I leikanger + 0x00277809, // n0x1755 c0x0000 (---------------) + I leirfjord + 0x00358e47, // n0x1756 c0x0000 (---------------) + I leirvik + 0x002b6c04, // n0x1757 c0x0000 (---------------) + I leka + 0x002feac7, // n0x1758 c0x0000 (---------------) + I leksvik + 0x0031fec6, // n0x1759 c0x0000 (---------------) + I lenvik + 0x00215f06, // n0x175a c0x0000 (---------------) + I lerdal + 0x002c3245, // n0x175b c0x0000 (---------------) + I lesja + 0x002ccf08, // n0x175c c0x0000 (---------------) + I levanger + 0x002cdb04, // n0x175d c0x0000 (---------------) + I lier + 0x002cdb06, // n0x175e c0x0000 (---------------) + I lierne + 0x0027d8cb, // n0x175f c0x0000 (---------------) + I lillehammer + 0x0033b0c9, // n0x1760 c0x0000 (---------------) + I lillesand + 0x0036a746, // n0x1761 c0x0000 (---------------) + I lindas + 0x0039ae49, // n0x1762 c0x0000 (---------------) + I lindesnes + 0x00385206, // n0x1763 c0x0000 (---------------) + I loabat + 0x00252bc8, // n0x1764 c0x0000 (---------------) + I lodingen + 0x00212bc3, // n0x1765 c0x0000 (---------------) + I lom + 0x00350445, // n0x1766 c0x0000 (---------------) + I loppa + 0x00215309, // n0x1767 c0x0000 (---------------) + I lorenskog + 0x00216045, // n0x1768 c0x0000 (---------------) + I loten + 0x002dc544, // n0x1769 c0x0000 (---------------) + I lund + 0x0026e246, // n0x176a c0x0000 (---------------) + I lunner + 0x00332e05, // n0x176b c0x0000 (---------------) + I luroy + 0x002d6f06, // n0x176c c0x0000 (---------------) + I luster + 0x002f3187, // n0x176d c0x0000 (---------------) + I lyngdal + 0x00378f86, // n0x176e c0x0000 (---------------) + I lyngen + 0x0028fa0b, // n0x176f c0x0000 (---------------) + I malatvuopmi + 0x0020bdc7, // n0x1770 c0x0000 (---------------) + I malselv + 0x00207286, // n0x1771 c0x0000 (---------------) + I malvik + 0x00349486, // n0x1772 c0x0000 (---------------) + I mandal + 0x0022f8c6, // n0x1773 c0x0000 (---------------) + I marker + 0x00347509, // n0x1774 c0x0000 (---------------) + I marnardal + 0x00238fca, // n0x1775 c0x0000 (---------------) + I masfjorden + 0x002b0685, // n0x1776 c0x0000 (---------------) + I masoy + 0x0032450d, // n0x1777 c0x0000 (---------------) + I matta-varjjat + 0x0029bb86, // n0x1778 c0x0000 (---------------) + I meland + 0x002151c6, // n0x1779 c0x0000 (---------------) + I meldal + 0x003725c6, // n0x177a c0x0000 (---------------) + I melhus + 0x00292545, // n0x177b c0x0000 (---------------) + I meloy + 0x0031b447, // n0x177c c0x0000 (---------------) + I meraker + 0x00294c47, // n0x177d c0x0000 (---------------) + I midsund + 0x00233b8e, // n0x177e c0x0000 (---------------) + I midtre-gauldal + 0x00215b43, // n0x177f c0x0000 (---------------) + I mil + 0x002bb289, // n0x1780 c0x0000 (---------------) + I mjondalen + 0x0035b209, // n0x1781 c0x0000 (---------------) + I mo-i-rana + 0x0022d447, // n0x1782 c0x0000 (---------------) + I moareke + 0x00264dc7, // n0x1783 c0x0000 (---------------) + I modalen + 0x0029d305, // n0x1784 c0x0000 (---------------) + I modum + 0x00256ac5, // n0x1785 c0x0000 (---------------) + I molde + 0x3de63a4f, // n0x1786 c0x00f7 (n0x1934-n0x1936) o I more-og-romsdal + 0x002c6387, // n0x1787 c0x0000 (---------------) + I mosjoen + 0x002c6548, // n0x1788 c0x0000 (---------------) + I moskenes + 0x002c6984, // n0x1789 c0x0000 (---------------) + I moss + 0x002c6bc6, // n0x178a c0x0000 (---------------) + I mosvik + 0x3e2425c2, // n0x178b c0x00f8 (n0x1936-n0x1937) + I mr + 0x002ca0c6, // n0x178c c0x0000 (---------------) + I muosat + 0x002cc746, // n0x178d c0x0000 (---------------) + I museum + 0x002bde4e, // n0x178e c0x0000 (---------------) + I naamesjevuemie + 0x0032f7ca, // n0x178f c0x0000 (---------------) + I namdalseid + 0x002a62c6, // n0x1790 c0x0000 (---------------) + I namsos + 0x0022340a, // n0x1791 c0x0000 (---------------) + I namsskogan + 0x002c0449, // n0x1792 c0x0000 (---------------) + I nannestad + 0x00316005, // n0x1793 c0x0000 (---------------) + I naroy + 0x00386808, // n0x1794 c0x0000 (---------------) + I narviika + 0x003a03c6, // n0x1795 c0x0000 (---------------) + I narvik + 0x0036a588, // n0x1796 c0x0000 (---------------) + I naustdal + 0x00200808, // n0x1797 c0x0000 (---------------) + I navuotna + 0x0032358b, // n0x1798 c0x0000 (---------------) + I nedre-eiker + 0x00222045, // n0x1799 c0x0000 (---------------) + I nesna + 0x0022da48, // n0x179a c0x0000 (---------------) + I nesodden + 0x0020600c, // n0x179b c0x0000 (---------------) + I nesoddtangen + 0x002aca07, // n0x179c c0x0000 (---------------) + I nesseby + 0x00249246, // n0x179d c0x0000 (---------------) + I nesset + 0x002a5c88, // n0x179e c0x0000 (---------------) + I nissedal + 0x0027c008, // n0x179f c0x0000 (---------------) + I nittedal + 0x3e63e082, // n0x17a0 c0x00f9 (n0x1937-n0x1938) + I nl + 0x002b6e0b, // n0x17a1 c0x0000 (---------------) + I nord-aurdal + 0x0038c1c9, // n0x17a2 c0x0000 (---------------) + I nord-fron + 0x00348209, // n0x17a3 c0x0000 (---------------) + I nord-odal + 0x002254c7, // n0x17a4 c0x0000 (---------------) + I norddal + 0x003086c8, // n0x17a5 c0x0000 (---------------) + I nordkapp + 0x3eb93948, // n0x17a6 c0x00fa (n0x1938-n0x193c) o I nordland + 0x002248cb, // n0x17a7 c0x0000 (---------------) + I nordre-land + 0x002ffd89, // n0x17a8 c0x0000 (---------------) + I nordreisa + 0x00210fcd, // n0x17a9 c0x0000 (---------------) + I nore-og-uvdal + 0x00303508, // n0x17aa c0x0000 (---------------) + I notodden + 0x0030bc88, // n0x17ab c0x0000 (---------------) + I notteroy + 0x3ee02382, // n0x17ac c0x00fb (n0x193c-n0x193d) + I nt + 0x00200dc4, // n0x17ad c0x0000 (---------------) + I odda + 0x3f21f702, // n0x17ae c0x00fc (n0x193d-n0x193e) + I of + 0x00251d46, // n0x17af c0x0000 (---------------) + I oksnes + 0x3f601582, // n0x17b0 c0x00fd (n0x193e-n0x193f) + I ol + 0x0020edca, // n0x17b1 c0x0000 (---------------) + I omasvuotna + 0x00332cc6, // n0x17b2 c0x0000 (---------------) + I oppdal + 0x0022abc8, // n0x17b3 c0x0000 (---------------) + I oppegard + 0x0024de88, // n0x17b4 c0x0000 (---------------) + I orkanger + 0x002e7286, // n0x17b5 c0x0000 (---------------) + I orkdal + 0x0033e006, // n0x17b6 c0x0000 (---------------) + I orland + 0x002decc6, // n0x17b7 c0x0000 (---------------) + I orskog + 0x00273045, // n0x17b8 c0x0000 (---------------) + I orsta + 0x0023b704, // n0x17b9 c0x0000 (---------------) + I osen + 0x3fac11c4, // n0x17ba c0x00fe (n0x193f-n0x1940) + I oslo + 0x0032ecc6, // n0x17bb c0x0000 (---------------) + I osoyro + 0x00376c87, // n0x17bc c0x0000 (---------------) + I osteroy + 0x3ff94147, // n0x17bd c0x00ff (n0x1940-n0x1941) o I ostfold + 0x002ed08b, // n0x17be c0x0000 (---------------) + I ostre-toten + 0x002bc7c9, // n0x17bf c0x0000 (---------------) + I overhalla + 0x0025e00a, // n0x17c0 c0x0000 (---------------) + I ovre-eiker + 0x00306144, // n0x17c1 c0x0000 (---------------) + I oyer + 0x00307088, // n0x17c2 c0x0000 (---------------) + I oygarden + 0x00262e8d, // n0x17c3 c0x0000 (---------------) + I oystre-slidre + 0x002d97c9, // n0x17c4 c0x0000 (---------------) + I porsanger + 0x002d9a08, // n0x17c5 c0x0000 (---------------) + I porsangu + 0x002d9c89, // n0x17c6 c0x0000 (---------------) + I porsgrunn + 0x002db244, // n0x17c7 c0x0000 (---------------) + I priv + 0x0021ab44, // n0x17c8 c0x0000 (---------------) + I rade + 0x00276305, // n0x17c9 c0x0000 (---------------) + I radoy + 0x0030b10b, // n0x17ca c0x0000 (---------------) + I rahkkeravju + 0x002c43c6, // n0x17cb c0x0000 (---------------) + I raholt + 0x0032eb05, // n0x17cc c0x0000 (---------------) + I raisa + 0x003519c9, // n0x17cd c0x0000 (---------------) + I rakkestad + 0x00222248, // n0x17ce c0x0000 (---------------) + I ralingen + 0x00296cc4, // n0x17cf c0x0000 (---------------) + I rana + 0x0022d1c9, // n0x17d0 c0x0000 (---------------) + I randaberg + 0x0026f545, // n0x17d1 c0x0000 (---------------) + I rauma + 0x002b3108, // n0x17d2 c0x0000 (---------------) + I rendalen + 0x002ce707, // n0x17d3 c0x0000 (---------------) + I rennebu + 0x0031a948, // n0x17d4 c0x0000 (---------------) + I rennesoy + 0x00277146, // n0x17d5 c0x0000 (---------------) + I rindal + 0x00233787, // n0x17d6 c0x0000 (---------------) + I ringebu + 0x00288989, // n0x17d7 c0x0000 (---------------) + I ringerike + 0x00224209, // n0x17d8 c0x0000 (---------------) + I ringsaker + 0x00252305, // n0x17d9 c0x0000 (---------------) + I risor + 0x0035a845, // n0x17da c0x0000 (---------------) + I rissa + 0x40205242, // n0x17db c0x0100 (n0x1941-n0x1942) + I rl + 0x002efc44, // n0x17dc c0x0000 (---------------) + I roan + 0x002946c5, // n0x17dd c0x0000 (---------------) + I rodoy + 0x002ce3c6, // n0x17de c0x0000 (---------------) + I rollag + 0x002f5445, // n0x17df c0x0000 (---------------) + I romsa + 0x0024b747, // n0x17e0 c0x0000 (---------------) + I romskog + 0x0028ddc5, // n0x17e1 c0x0000 (---------------) + I roros + 0x0026ed84, // n0x17e2 c0x0000 (---------------) + I rost + 0x0032b6c6, // n0x17e3 c0x0000 (---------------) + I royken + 0x0036ce47, // n0x17e4 c0x0000 (---------------) + I royrvik + 0x00242606, // n0x17e5 c0x0000 (---------------) + I ruovat + 0x0033b605, // n0x17e6 c0x0000 (---------------) + I rygge + 0x0030fbc8, // n0x17e7 c0x0000 (---------------) + I salangen + 0x002227c5, // n0x17e8 c0x0000 (---------------) + I salat + 0x00342687, // n0x17e9 c0x0000 (---------------) + I saltdal + 0x0039b049, // n0x17ea c0x0000 (---------------) + I samnanger + 0x0033b20a, // n0x17eb c0x0000 (---------------) + I sandefjord + 0x00341ac7, // n0x17ec c0x0000 (---------------) + I sandnes + 0x00341acc, // n0x17ed c0x0000 (---------------) + I sandnessjoen + 0x0036bd06, // n0x17ee c0x0000 (---------------) + I sandoy + 0x00229909, // n0x17ef c0x0000 (---------------) + I sarpsborg + 0x0036d2c5, // n0x17f0 c0x0000 (---------------) + I sauda + 0x00375508, // n0x17f1 c0x0000 (---------------) + I sauherad + 0x0020be83, // n0x17f2 c0x0000 (---------------) + I sel + 0x0020f645, // n0x17f3 c0x0000 (---------------) + I selbu + 0x00332345, // n0x17f4 c0x0000 (---------------) + I selje + 0x002380c7, // n0x17f5 c0x0000 (---------------) + I seljord + 0x4060dd02, // n0x17f6 c0x0101 (n0x1942-n0x1943) + I sf + 0x002379c7, // n0x17f7 c0x0000 (---------------) + I siellak + 0x002fda86, // n0x17f8 c0x0000 (---------------) + I sigdal + 0x0021ba86, // n0x17f9 c0x0000 (---------------) + I siljan + 0x002c6a46, // n0x17fa c0x0000 (---------------) + I sirdal + 0x0027bf46, // n0x17fb c0x0000 (---------------) + I skanit + 0x00280348, // n0x17fc c0x0000 (---------------) + I skanland + 0x00272285, // n0x17fd c0x0000 (---------------) + I skaun + 0x00246847, // n0x17fe c0x0000 (---------------) + I skedsmo + 0x0024684d, // n0x17ff c0x0000 (---------------) + I skedsmokorset + 0x0021cf83, // n0x1800 c0x0000 (---------------) + I ski + 0x0021cf85, // n0x1801 c0x0000 (---------------) + I skien + 0x00305947, // n0x1802 c0x0000 (---------------) + I skierva + 0x00378088, // n0x1803 c0x0000 (---------------) + I skiptvet + 0x00377c45, // n0x1804 c0x0000 (---------------) + I skjak + 0x002a80c8, // n0x1805 c0x0000 (---------------) + I skjervoy + 0x0022b506, // n0x1806 c0x0000 (---------------) + I skodje + 0x002398c7, // n0x1807 c0x0000 (---------------) + I slattum + 0x002ba1c5, // n0x1808 c0x0000 (---------------) + I smola + 0x002220c6, // n0x1809 c0x0000 (---------------) + I snaase + 0x0035d9c5, // n0x180a c0x0000 (---------------) + I snasa + 0x002b5c4a, // n0x180b c0x0000 (---------------) + I snillfjord + 0x002ecb46, // n0x180c c0x0000 (---------------) + I snoasa + 0x00330987, // n0x180d c0x0000 (---------------) + I sogndal + 0x002b6405, // n0x180e c0x0000 (---------------) + I sogne + 0x002d35c7, // n0x180f c0x0000 (---------------) + I sokndal + 0x002da544, // n0x1810 c0x0000 (---------------) + I sola + 0x002dc4c6, // n0x1811 c0x0000 (---------------) + I solund + 0x00357845, // n0x1812 c0x0000 (---------------) + I somna + 0x00204c8b, // n0x1813 c0x0000 (---------------) + I sondre-land + 0x0031fd49, // n0x1814 c0x0000 (---------------) + I songdalen + 0x002289ca, // n0x1815 c0x0000 (---------------) + I sor-aurdal + 0x00252388, // n0x1816 c0x0000 (---------------) + I sor-fron + 0x002e8c08, // n0x1817 c0x0000 (---------------) + I sor-odal + 0x002e934c, // n0x1818 c0x0000 (---------------) + I sor-varanger + 0x002f23c7, // n0x1819 c0x0000 (---------------) + I sorfold + 0x002f3d88, // n0x181a c0x0000 (---------------) + I sorreisa + 0x002f9948, // n0x181b c0x0000 (---------------) + I sortland + 0x002fd445, // n0x181c c0x0000 (---------------) + I sorum + 0x002b838a, // n0x181d c0x0000 (---------------) + I spjelkavik + 0x0032e5c9, // n0x181e c0x0000 (---------------) + I spydeberg + 0x40a01a42, // n0x181f c0x0102 (n0x1943-n0x1944) + I st + 0x00321946, // n0x1820 c0x0000 (---------------) + I stange + 0x0028e7c4, // n0x1821 c0x0000 (---------------) + I stat + 0x002d8149, // n0x1822 c0x0000 (---------------) + I stathelle + 0x00245309, // n0x1823 c0x0000 (---------------) + I stavanger + 0x00217f47, // n0x1824 c0x0000 (---------------) + I stavern + 0x0023b107, // n0x1825 c0x0000 (---------------) + I steigen + 0x003565c9, // n0x1826 c0x0000 (---------------) + I steinkjer + 0x00201a48, // n0x1827 c0x0000 (---------------) + I stjordal + 0x00201a4f, // n0x1828 c0x0000 (---------------) + I stjordalshalsen + 0x00268106, // n0x1829 c0x0000 (---------------) + I stokke + 0x0024044b, // n0x182a c0x0000 (---------------) + I stor-elvdal + 0x003772c5, // n0x182b c0x0000 (---------------) + I stord + 0x003772c7, // n0x182c c0x0000 (---------------) + I stordal + 0x002e0349, // n0x182d c0x0000 (---------------) + I storfjord + 0x0022d146, // n0x182e c0x0000 (---------------) + I strand + 0x0022d147, // n0x182f c0x0000 (---------------) + I stranda + 0x0039d345, // n0x1830 c0x0000 (---------------) + I stryn + 0x00232604, // n0x1831 c0x0000 (---------------) + I sula + 0x002a9106, // n0x1832 c0x0000 (---------------) + I suldal + 0x002100c4, // n0x1833 c0x0000 (---------------) + I sund + 0x00326b07, // n0x1834 c0x0000 (---------------) + I sunndal + 0x002e1f48, // n0x1835 c0x0000 (---------------) + I surnadal + 0x40ee3fc8, // n0x1836 c0x0103 (n0x1944-n0x1945) + I svalbard + 0x002e45c5, // n0x1837 c0x0000 (---------------) + I sveio + 0x002e4707, // n0x1838 c0x0000 (---------------) + I svelvik + 0x00366789, // n0x1839 c0x0000 (---------------) + I sykkylven + 0x0020d344, // n0x183a c0x0000 (---------------) + I tana + 0x0020d348, // n0x183b c0x0000 (---------------) + I tananger + 0x412acf48, // n0x183c c0x0104 (n0x1945-n0x1947) o I telemark + 0x00219984, // n0x183d c0x0000 (---------------) + I time + 0x00232f48, // n0x183e c0x0000 (---------------) + I tingvoll + 0x00308cc4, // n0x183f c0x0000 (---------------) + I tinn + 0x0021f349, // n0x1840 c0x0000 (---------------) + I tjeldsund + 0x00338a45, // n0x1841 c0x0000 (---------------) + I tjome + 0x41600142, // n0x1842 c0x0105 (n0x1947-n0x1948) + I tm + 0x00268145, // n0x1843 c0x0000 (---------------) + I tokke + 0x0021c5c5, // n0x1844 c0x0000 (---------------) + I tolga + 0x00309a88, // n0x1845 c0x0000 (---------------) + I tonsberg + 0x00235e47, // n0x1846 c0x0000 (---------------) + I torsken + 0x41a03642, // n0x1847 c0x0106 (n0x1948-n0x1949) + I tr + 0x002c7c45, // n0x1848 c0x0000 (---------------) + I trana + 0x00266e06, // n0x1849 c0x0000 (---------------) + I tranby + 0x002886c6, // n0x184a c0x0000 (---------------) + I tranoy + 0x002efc08, // n0x184b c0x0000 (---------------) + I troandin + 0x002f1f08, // n0x184c c0x0000 (---------------) + I trogstad + 0x002f5406, // n0x184d c0x0000 (---------------) + I tromsa + 0x00317886, // n0x184e c0x0000 (---------------) + I tromso + 0x00234289, // n0x184f c0x0000 (---------------) + I trondheim + 0x00353106, // n0x1850 c0x0000 (---------------) + I trysil + 0x00283a4b, // n0x1851 c0x0000 (---------------) + I tvedestrand + 0x0039ad45, // n0x1852 c0x0000 (---------------) + I tydal + 0x0020a406, // n0x1853 c0x0000 (---------------) + I tynset + 0x0022f308, // n0x1854 c0x0000 (---------------) + I tysfjord + 0x00231046, // n0x1855 c0x0000 (---------------) + I tysnes + 0x0031e8c6, // n0x1856 c0x0000 (---------------) + I tysvar + 0x002ec24a, // n0x1857 c0x0000 (---------------) + I ullensaker + 0x002759ca, // n0x1858 c0x0000 (---------------) + I ullensvang + 0x00283245, // n0x1859 c0x0000 (---------------) + I ulvik + 0x0021b407, // n0x185a c0x0000 (---------------) + I unjarga + 0x00340546, // n0x185b c0x0000 (---------------) + I utsira + 0x41e000c2, // n0x185c c0x0107 (n0x1949-n0x194a) + I va + 0x00305a87, // n0x185d c0x0000 (---------------) + I vaapste + 0x0026cf85, // n0x185e c0x0000 (---------------) + I vadso + 0x002bbc44, // n0x185f c0x0000 (---------------) + I vaga + 0x002bbc45, // n0x1860 c0x0000 (---------------) + I vagan + 0x00306f86, // n0x1861 c0x0000 (---------------) + I vagsoy + 0x00328807, // n0x1862 c0x0000 (---------------) + I vaksdal + 0x00213f45, // n0x1863 c0x0000 (---------------) + I valle + 0x002256c4, // n0x1864 c0x0000 (---------------) + I vang + 0x0023ccc8, // n0x1865 c0x0000 (---------------) + I vanylven + 0x0031e985, // n0x1866 c0x0000 (---------------) + I vardo + 0x0039eec7, // n0x1867 c0x0000 (---------------) + I varggat + 0x00289b45, // n0x1868 c0x0000 (---------------) + I varoy + 0x00212985, // n0x1869 c0x0000 (---------------) + I vefsn + 0x002292c4, // n0x186a c0x0000 (---------------) + I vega + 0x002821c9, // n0x186b c0x0000 (---------------) + I vegarshei + 0x002dbf48, // n0x186c c0x0000 (---------------) + I vennesla + 0x003708c6, // n0x186d c0x0000 (---------------) + I verdal + 0x003252c6, // n0x186e c0x0000 (---------------) + I verran + 0x00219686, // n0x186f c0x0000 (---------------) + I vestby + 0x42399688, // n0x1870 c0x0108 (n0x194a-n0x194b) o I vestfold + 0x002e8a87, // n0x1871 c0x0000 (---------------) + I vestnes + 0x002e8e0d, // n0x1872 c0x0000 (---------------) + I vestre-slidre + 0x002e964c, // n0x1873 c0x0000 (---------------) + I vestre-toten + 0x002e9c49, // n0x1874 c0x0000 (---------------) + I vestvagoy + 0x002e9e89, // n0x1875 c0x0000 (---------------) + I vevelstad + 0x4274b082, // n0x1876 c0x0109 (n0x194b-n0x194c) + I vf + 0x003978c3, // n0x1877 c0x0000 (---------------) + I vgs + 0x00207343, // n0x1878 c0x0000 (---------------) + I vik + 0x0031ff85, // n0x1879 c0x0000 (---------------) + I vikna + 0x00380bca, // n0x187a c0x0000 (---------------) + I vindafjord + 0x00317746, // n0x187b c0x0000 (---------------) + I voagat + 0x002f0b85, // n0x187c c0x0000 (---------------) + I volda + 0x002f36c4, // n0x187d c0x0000 (---------------) + I voss + 0x002f36cb, // n0x187e c0x0000 (---------------) + I vossevangen + 0x0030cc0c, // n0x187f c0x0000 (---------------) + I xn--andy-ira + 0x0030d44c, // n0x1880 c0x0000 (---------------) + I xn--asky-ira + 0x0030d755, // n0x1881 c0x0000 (---------------) + I xn--aurskog-hland-jnb + 0x003111cd, // n0x1882 c0x0000 (---------------) + I xn--avery-yua + 0x0031274f, // n0x1883 c0x0000 (---------------) + I xn--bdddj-mrabd + 0x00312b12, // n0x1884 c0x0000 (---------------) + I xn--bearalvhki-y4a + 0x00312f8f, // n0x1885 c0x0000 (---------------) + I xn--berlevg-jxa + 0x00313352, // n0x1886 c0x0000 (---------------) + I xn--bhcavuotna-s4a + 0x003137d3, // n0x1887 c0x0000 (---------------) + I xn--bhccavuotna-k7a + 0x00313c8d, // n0x1888 c0x0000 (---------------) + I xn--bidr-5nac + 0x0031424d, // n0x1889 c0x0000 (---------------) + I xn--bievt-0qa + 0x003145ce, // n0x188a c0x0000 (---------------) + I xn--bjarky-fya + 0x00314a8e, // n0x188b c0x0000 (---------------) + I xn--bjddar-pta + 0x0031560c, // n0x188c c0x0000 (---------------) + I xn--blt-elab + 0x0031598c, // n0x188d c0x0000 (---------------) + I xn--bmlo-gra + 0x00315dcb, // n0x188e c0x0000 (---------------) + I xn--bod-2na + 0x0031614e, // n0x188f c0x0000 (---------------) + I xn--brnny-wuac + 0x00316c52, // n0x1890 c0x0000 (---------------) + I xn--brnnysund-m8ac + 0x0031750c, // n0x1891 c0x0000 (---------------) + I xn--brum-voa + 0x00317e90, // n0x1892 c0x0000 (---------------) + I xn--btsfjord-9za + 0x00325f92, // n0x1893 c0x0000 (---------------) + I xn--davvenjrga-y4a + 0x00326ccc, // n0x1894 c0x0000 (---------------) + I xn--dnna-gra + 0x0032738d, // n0x1895 c0x0000 (---------------) + I xn--drbak-wua + 0x003276cc, // n0x1896 c0x0000 (---------------) + I xn--dyry-ira + 0x00329351, // n0x1897 c0x0000 (---------------) + I xn--eveni-0qa01ga + 0x0032a6cd, // n0x1898 c0x0000 (---------------) + I xn--finny-yua + 0x0032cf8d, // n0x1899 c0x0000 (---------------) + I xn--fjord-lra + 0x0032d58a, // n0x189a c0x0000 (---------------) + I xn--fl-zia + 0x0032d80c, // n0x189b c0x0000 (---------------) + I xn--flor-jra + 0x0032e10c, // n0x189c c0x0000 (---------------) + I xn--frde-gra + 0x0032e80c, // n0x189d c0x0000 (---------------) + I xn--frna-woa + 0x0032f08c, // n0x189e c0x0000 (---------------) + I xn--frya-hra + 0x00333ed3, // n0x189f c0x0000 (---------------) + I xn--ggaviika-8ya47h + 0x003346d0, // n0x18a0 c0x0000 (---------------) + I xn--gildeskl-g0a + 0x00334ad0, // n0x18a1 c0x0000 (---------------) + I xn--givuotna-8ya + 0x003357cd, // n0x18a2 c0x0000 (---------------) + I xn--gjvik-wua + 0x00335dcc, // n0x18a3 c0x0000 (---------------) + I xn--gls-elac + 0x003369c9, // n0x18a4 c0x0000 (---------------) + I xn--h-2fa + 0x00339e4d, // n0x18a5 c0x0000 (---------------) + I xn--hbmer-xqa + 0x0033a193, // n0x18a6 c0x0000 (---------------) + I xn--hcesuolo-7ya35b + 0x0033bf51, // n0x18a7 c0x0000 (---------------) + I xn--hgebostad-g3a + 0x0033c393, // n0x18a8 c0x0000 (---------------) + I xn--hmmrfeasta-s4ac + 0x0033e18f, // n0x18a9 c0x0000 (---------------) + I xn--hnefoss-q1a + 0x0033e54c, // n0x18aa c0x0000 (---------------) + I xn--hobl-ira + 0x0033e84f, // n0x18ab c0x0000 (---------------) + I xn--holtlen-hxa + 0x0033ec0d, // n0x18ac c0x0000 (---------------) + I xn--hpmir-xqa + 0x0033f20f, // n0x18ad c0x0000 (---------------) + I xn--hyanger-q1a + 0x0033f5d0, // n0x18ae c0x0000 (---------------) + I xn--hylandet-54a + 0x0034004e, // n0x18af c0x0000 (---------------) + I xn--indery-fya + 0x0034300e, // n0x18b0 c0x0000 (---------------) + I xn--jlster-bya + 0x00343750, // n0x18b1 c0x0000 (---------------) + I xn--jrpeland-54a + 0x0034484d, // n0x18b2 c0x0000 (---------------) + I xn--karmy-yua + 0x003451ce, // n0x18b3 c0x0000 (---------------) + I xn--kfjord-iua + 0x0034554c, // n0x18b4 c0x0000 (---------------) + I xn--klbu-woa + 0x00346613, // n0x18b5 c0x0000 (---------------) + I xn--koluokta-7ya57h + 0x0034844e, // n0x18b6 c0x0000 (---------------) + I xn--krager-gya + 0x00349610, // n0x18b7 c0x0000 (---------------) + I xn--kranghke-b0a + 0x00349a11, // n0x18b8 c0x0000 (---------------) + I xn--krdsherad-m8a + 0x00349e4f, // n0x18b9 c0x0000 (---------------) + I xn--krehamn-dxa + 0x0034a213, // n0x18ba c0x0000 (---------------) + I xn--krjohka-hwab49j + 0x0034ac0d, // n0x18bb c0x0000 (---------------) + I xn--ksnes-uua + 0x0034af4f, // n0x18bc c0x0000 (---------------) + I xn--kvfjord-nxa + 0x0034b30e, // n0x18bd c0x0000 (---------------) + I xn--kvitsy-fya + 0x0034bb50, // n0x18be c0x0000 (---------------) + I xn--kvnangen-k0a + 0x0034bf49, // n0x18bf c0x0000 (---------------) + I xn--l-1fa + 0x0034da10, // n0x18c0 c0x0000 (---------------) + I xn--laheadju-7ya + 0x0034f30f, // n0x18c1 c0x0000 (---------------) + I xn--langevg-jxa + 0x0034f98f, // n0x18c2 c0x0000 (---------------) + I xn--ldingen-q1a + 0x0034fd52, // n0x18c3 c0x0000 (---------------) + I xn--leagaviika-52b + 0x0035084e, // n0x18c4 c0x0000 (---------------) + I xn--lesund-hua + 0x0035114d, // n0x18c5 c0x0000 (---------------) + I xn--lgrd-poac + 0x0035284d, // n0x18c6 c0x0000 (---------------) + I xn--lhppi-xqa + 0x00352b8d, // n0x18c7 c0x0000 (---------------) + I xn--linds-pra + 0x0035408d, // n0x18c8 c0x0000 (---------------) + I xn--loabt-0qa + 0x003543cd, // n0x18c9 c0x0000 (---------------) + I xn--lrdal-sra + 0x00354710, // n0x18ca c0x0000 (---------------) + I xn--lrenskog-54a + 0x00354b0b, // n0x18cb c0x0000 (---------------) + I xn--lt-liac + 0x003550cc, // n0x18cc c0x0000 (---------------) + I xn--lten-gra + 0x0035544c, // n0x18cd c0x0000 (---------------) + I xn--lury-ira + 0x0035574c, // n0x18ce c0x0000 (---------------) + I xn--mely-ira + 0x00355a4e, // n0x18cf c0x0000 (---------------) + I xn--merker-kua + 0x00365050, // n0x18d0 c0x0000 (---------------) + I xn--mjndalen-64a + 0x00367012, // n0x18d1 c0x0000 (---------------) + I xn--mlatvuopmi-s4a + 0x0036748b, // n0x18d2 c0x0000 (---------------) + I xn--mli-tla + 0x00367b8e, // n0x18d3 c0x0000 (---------------) + I xn--mlselv-iua + 0x00367f0e, // n0x18d4 c0x0000 (---------------) + I xn--moreke-jua + 0x003690ce, // n0x18d5 c0x0000 (---------------) + I xn--mosjen-eya + 0x0036980b, // n0x18d6 c0x0000 (---------------) + I xn--mot-tla + 0x42b69dd6, // n0x18d7 c0x010a (n0x194c-n0x194e) o I xn--mre-og-romsdal-qqb + 0x0036a94d, // n0x18d8 c0x0000 (---------------) + I xn--msy-ula0h + 0x0036be94, // n0x18d9 c0x0000 (---------------) + I xn--mtta-vrjjat-k7af + 0x0036d40d, // n0x18da c0x0000 (---------------) + I xn--muost-0qa + 0x0036e455, // n0x18db c0x0000 (---------------) + I xn--nmesjevuemie-tcba + 0x0036f84d, // n0x18dc c0x0000 (---------------) + I xn--nry-yla5g + 0x003701cf, // n0x18dd c0x0000 (---------------) + I xn--nttery-byae + 0x00370a4f, // n0x18de c0x0000 (---------------) + I xn--nvuotna-hwa + 0x00373f0f, // n0x18df c0x0000 (---------------) + I xn--oppegrd-ixa + 0x003742ce, // n0x18e0 c0x0000 (---------------) + I xn--ostery-fya + 0x0037498d, // n0x18e1 c0x0000 (---------------) + I xn--osyro-wua + 0x00375a11, // n0x18e2 c0x0000 (---------------) + I xn--porsgu-sta26f + 0x00379d8c, // n0x18e3 c0x0000 (---------------) + I xn--rady-ira + 0x0037a08c, // n0x18e4 c0x0000 (---------------) + I xn--rdal-poa + 0x0037a38b, // n0x18e5 c0x0000 (---------------) + I xn--rde-ula + 0x0037a98c, // n0x18e6 c0x0000 (---------------) + I xn--rdy-0nab + 0x0037ad4f, // n0x18e7 c0x0000 (---------------) + I xn--rennesy-v1a + 0x0037b112, // n0x18e8 c0x0000 (---------------) + I xn--rhkkervju-01af + 0x0037bacd, // n0x18e9 c0x0000 (---------------) + I xn--rholt-mra + 0x0037ca8c, // n0x18ea c0x0000 (---------------) + I xn--risa-5na + 0x0037cf0c, // n0x18eb c0x0000 (---------------) + I xn--risr-ira + 0x0037d20d, // n0x18ec c0x0000 (---------------) + I xn--rland-uua + 0x0037d54f, // n0x18ed c0x0000 (---------------) + I xn--rlingen-mxa + 0x0037d90e, // n0x18ee c0x0000 (---------------) + I xn--rmskog-bya + 0x0038088c, // n0x18ef c0x0000 (---------------) + I xn--rros-gra + 0x00380e4d, // n0x18f0 c0x0000 (---------------) + I xn--rskog-uua + 0x0038118b, // n0x18f1 c0x0000 (---------------) + I xn--rst-0na + 0x0038174c, // n0x18f2 c0x0000 (---------------) + I xn--rsta-fra + 0x00381ccd, // n0x18f3 c0x0000 (---------------) + I xn--ryken-vua + 0x0038200e, // n0x18f4 c0x0000 (---------------) + I xn--ryrvik-bya + 0x00382489, // n0x18f5 c0x0000 (---------------) + I xn--s-1fa + 0x00383693, // n0x18f6 c0x0000 (---------------) + I xn--sandnessjen-ogb + 0x00383f0d, // n0x18f7 c0x0000 (---------------) + I xn--sandy-yua + 0x0038424d, // n0x18f8 c0x0000 (---------------) + I xn--seral-lra + 0x0038484c, // n0x18f9 c0x0000 (---------------) + I xn--sgne-gra + 0x00384cce, // n0x18fa c0x0000 (---------------) + I xn--skierv-uta + 0x003857cf, // n0x18fb c0x0000 (---------------) + I xn--skjervy-v1a + 0x00385b8c, // n0x18fc c0x0000 (---------------) + I xn--skjk-soa + 0x00385e8d, // n0x18fd c0x0000 (---------------) + I xn--sknit-yqa + 0x003861cf, // n0x18fe c0x0000 (---------------) + I xn--sknland-fxa + 0x0038658c, // n0x18ff c0x0000 (---------------) + I xn--slat-5na + 0x00386b8c, // n0x1900 c0x0000 (---------------) + I xn--slt-elab + 0x00386f4c, // n0x1901 c0x0000 (---------------) + I xn--smla-hra + 0x0038724c, // n0x1902 c0x0000 (---------------) + I xn--smna-gra + 0x0038790d, // n0x1903 c0x0000 (---------------) + I xn--snase-nra + 0x00387c52, // n0x1904 c0x0000 (---------------) + I xn--sndre-land-0cb + 0x003882cc, // n0x1905 c0x0000 (---------------) + I xn--snes-poa + 0x003885cc, // n0x1906 c0x0000 (---------------) + I xn--snsa-roa + 0x003888d1, // n0x1907 c0x0000 (---------------) + I xn--sr-aurdal-l8a + 0x00388d0f, // n0x1908 c0x0000 (---------------) + I xn--sr-fron-q1a + 0x003890cf, // n0x1909 c0x0000 (---------------) + I xn--sr-odal-q1a + 0x00389493, // n0x190a c0x0000 (---------------) + I xn--sr-varanger-ggb + 0x0038a34e, // n0x190b c0x0000 (---------------) + I xn--srfold-bya + 0x0038a8cf, // n0x190c c0x0000 (---------------) + I xn--srreisa-q1a + 0x0038ac8c, // n0x190d c0x0000 (---------------) + I xn--srum-gra + 0x42f8afce, // n0x190e c0x010b (n0x194e-n0x194f) o I xn--stfold-9xa + 0x0038b34f, // n0x190f c0x0000 (---------------) + I xn--stjrdal-s1a + 0x0038b716, // n0x1910 c0x0000 (---------------) + I xn--stjrdalshalsen-sqb + 0x0038c512, // n0x1911 c0x0000 (---------------) + I xn--stre-toten-zcb + 0x0038d40c, // n0x1912 c0x0000 (---------------) + I xn--tjme-hra + 0x0038e20f, // n0x1913 c0x0000 (---------------) + I xn--tnsberg-q1a + 0x0038e88d, // n0x1914 c0x0000 (---------------) + I xn--trany-yua + 0x0038ebcf, // n0x1915 c0x0000 (---------------) + I xn--trgstad-r1a + 0x0038ef8c, // n0x1916 c0x0000 (---------------) + I xn--trna-woa + 0x0038f28d, // n0x1917 c0x0000 (---------------) + I xn--troms-zua + 0x0038f5cd, // n0x1918 c0x0000 (---------------) + I xn--tysvr-vra + 0x00390ace, // n0x1919 c0x0000 (---------------) + I xn--unjrga-rta + 0x00391fcc, // n0x191a c0x0000 (---------------) + I xn--vads-jra + 0x003922cc, // n0x191b c0x0000 (---------------) + I xn--vard-jra + 0x003925d0, // n0x191c c0x0000 (---------------) + I xn--vegrshei-c0a + 0x00396d51, // n0x191d c0x0000 (---------------) + I xn--vestvgy-ixa6o + 0x0039718b, // n0x191e c0x0000 (---------------) + I xn--vg-yiab + 0x003974cc, // n0x191f c0x0000 (---------------) + I xn--vgan-qoa + 0x003977ce, // n0x1920 c0x0000 (---------------) + I xn--vgsy-qoa0j + 0x00399b91, // n0x1921 c0x0000 (---------------) + I xn--vre-eiker-k8a + 0x00399fce, // n0x1922 c0x0000 (---------------) + I xn--vrggt-xqad + 0x0039a34d, // n0x1923 c0x0000 (---------------) + I xn--vry-yla5g + 0x003a018b, // n0x1924 c0x0000 (---------------) + I xn--yer-zna + 0x003a0a8f, // n0x1925 c0x0000 (---------------) + I xn--ygarden-p1a + 0x003a1414, // n0x1926 c0x0000 (---------------) + I xn--ystre-slidre-ujb + 0x002242c2, // n0x1927 c0x0000 (---------------) + I gs + 0x002242c2, // n0x1928 c0x0000 (---------------) + I gs + 0x00203283, // n0x1929 c0x0000 (---------------) + I nes + 0x002242c2, // n0x192a c0x0000 (---------------) + I gs + 0x00203283, // n0x192b c0x0000 (---------------) + I nes + 0x002242c2, // n0x192c c0x0000 (---------------) + I gs + 0x00203ac2, // n0x192d c0x0000 (---------------) + I os + 0x00360445, // n0x192e c0x0000 (---------------) + I valer + 0x0039988c, // n0x192f c0x0000 (---------------) + I xn--vler-qoa + 0x002242c2, // n0x1930 c0x0000 (---------------) + I gs + 0x002242c2, // n0x1931 c0x0000 (---------------) + I gs + 0x00203ac2, // n0x1932 c0x0000 (---------------) + I os + 0x002242c2, // n0x1933 c0x0000 (---------------) + I gs + 0x00289945, // n0x1934 c0x0000 (---------------) + I heroy + 0x0033b205, // n0x1935 c0x0000 (---------------) + I sande + 0x002242c2, // n0x1936 c0x0000 (---------------) + I gs + 0x002242c2, // n0x1937 c0x0000 (---------------) + I gs + 0x00206dc2, // n0x1938 c0x0000 (---------------) + I bo + 0x00289945, // n0x1939 c0x0000 (---------------) + I heroy + 0x00311709, // n0x193a c0x0000 (---------------) + I xn--b-5ga + 0x0033bc4c, // n0x193b c0x0000 (---------------) + I xn--hery-ira + 0x002242c2, // n0x193c c0x0000 (---------------) + I gs + 0x002242c2, // n0x193d c0x0000 (---------------) + I gs + 0x002242c2, // n0x193e c0x0000 (---------------) + I gs + 0x002242c2, // n0x193f c0x0000 (---------------) + I gs + 0x00360445, // n0x1940 c0x0000 (---------------) + I valer + 0x002242c2, // n0x1941 c0x0000 (---------------) + I gs + 0x002242c2, // n0x1942 c0x0000 (---------------) + I gs + 0x002242c2, // n0x1943 c0x0000 (---------------) + I gs + 0x002242c2, // n0x1944 c0x0000 (---------------) + I gs + 0x00206dc2, // n0x1945 c0x0000 (---------------) + I bo + 0x00311709, // n0x1946 c0x0000 (---------------) + I xn--b-5ga + 0x002242c2, // n0x1947 c0x0000 (---------------) + I gs + 0x002242c2, // n0x1948 c0x0000 (---------------) + I gs + 0x002242c2, // n0x1949 c0x0000 (---------------) + I gs + 0x0033b205, // n0x194a c0x0000 (---------------) + I sande + 0x002242c2, // n0x194b c0x0000 (---------------) + I gs + 0x0033b205, // n0x194c c0x0000 (---------------) + I sande + 0x0033bc4c, // n0x194d c0x0000 (---------------) + I xn--hery-ira + 0x0039988c, // n0x194e c0x0000 (---------------) + I xn--vler-qoa + 0x0030a143, // n0x194f c0x0000 (---------------) + I biz + 0x0022edc3, // n0x1950 c0x0000 (---------------) + I com + 0x002349c3, // n0x1951 c0x0000 (---------------) + I edu + 0x00275003, // n0x1952 c0x0000 (---------------) + I gov + 0x0038a144, // n0x1953 c0x0000 (---------------) + I info + 0x0021d8c3, // n0x1954 c0x0000 (---------------) + I net + 0x00229a83, // n0x1955 c0x0000 (---------------) + I org + 0x00102b48, // n0x1956 c0x0000 (---------------) + merseine + 0x0008cf84, // n0x1957 c0x0000 (---------------) + mine + 0x000af988, // n0x1958 c0x0000 (---------------) + shacknet + 0x00205882, // n0x1959 c0x0000 (---------------) + I ac + 0x43e08182, // n0x195a c0x010f (n0x1969-n0x196a) + I co + 0x0023eec3, // n0x195b c0x0000 (---------------) + I cri + 0x0025f184, // n0x195c c0x0000 (---------------) + I geek + 0x00206243, // n0x195d c0x0000 (---------------) + I gen + 0x002ef244, // n0x195e c0x0000 (---------------) + I govt + 0x002a51c6, // n0x195f c0x0000 (---------------) + I health + 0x00202e03, // n0x1960 c0x0000 (---------------) + I iwi + 0x002e2c84, // n0x1961 c0x0000 (---------------) + I kiwi + 0x00271885, // n0x1962 c0x0000 (---------------) + I maori + 0x00215b43, // n0x1963 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1964 c0x0000 (---------------) + I net + 0x00229a83, // n0x1965 c0x0000 (---------------) + I org + 0x00266bca, // n0x1966 c0x0000 (---------------) + I parliament + 0x00231d06, // n0x1967 c0x0000 (---------------) + I school + 0x0036828c, // n0x1968 c0x0000 (---------------) + I xn--mori-qsa + 0x000f5248, // n0x1969 c0x0000 (---------------) + blogspot + 0x00208182, // n0x196a c0x0000 (---------------) + I co + 0x0022edc3, // n0x196b c0x0000 (---------------) + I com + 0x002349c3, // n0x196c c0x0000 (---------------) + I edu + 0x00275003, // n0x196d c0x0000 (---------------) + I gov + 0x00211c43, // n0x196e c0x0000 (---------------) + I med + 0x002cc746, // n0x196f c0x0000 (---------------) + I museum + 0x0021d8c3, // n0x1970 c0x0000 (---------------) + I net + 0x00229a83, // n0x1971 c0x0000 (---------------) + I org + 0x00220283, // n0x1972 c0x0000 (---------------) + I pro + 0x0000ac02, // n0x1973 c0x0000 (---------------) + ae + 0x00029007, // n0x1974 c0x0000 (---------------) + blogdns + 0x000cf808, // n0x1975 c0x0000 (---------------) + blogsite + 0x0000c54e, // n0x1976 c0x0000 (---------------) + bmoattachments + 0x00080bd2, // n0x1977 c0x0000 (---------------) + boldlygoingnowhere + 0x44a39705, // n0x1978 c0x0112 (n0x19ae-n0x19b0) o I cdn77 + 0x44f1c70c, // n0x1979 c0x0113 (n0x19b0-n0x19b1) o I cdn77-secure + 0x00147e08, // n0x197a c0x0000 (---------------) + dnsalias + 0x00074607, // n0x197b c0x0000 (---------------) + dnsdojo + 0x000ebecb, // n0x197c c0x0000 (---------------) + doesntexist + 0x00168789, // n0x197d c0x0000 (---------------) + dontexist + 0x00147d07, // n0x197e c0x0000 (---------------) + doomdns + 0x00074507, // n0x197f c0x0000 (---------------) + duckdns + 0x00008306, // n0x1980 c0x0000 (---------------) + dvrdns + 0x0018bd88, // n0x1981 c0x0000 (---------------) + dynalias + 0x45411a06, // n0x1982 c0x0115 (n0x19b2-n0x19b4) + dyndns + 0x0009f90d, // n0x1983 c0x0000 (---------------) + endofinternet + 0x00107210, // n0x1984 c0x0000 (---------------) + endoftheinternet + 0x45824542, // n0x1985 c0x0116 (n0x19b4-n0x19eb) + eu + 0x00062c47, // n0x1986 c0x0000 (---------------) + from-me + 0x0009f089, // n0x1987 c0x0000 (---------------) + game-host + 0x0004f886, // n0x1988 c0x0000 (---------------) + gotdns + 0x0000e882, // n0x1989 c0x0000 (---------------) + hk + 0x000fef8a, // n0x198a c0x0000 (---------------) + hobby-site + 0x00011bc7, // n0x198b c0x0000 (---------------) + homedns + 0x000ad607, // n0x198c c0x0000 (---------------) + homeftp + 0x0009c509, // n0x198d c0x0000 (---------------) + homelinux + 0x0009d988, // n0x198e c0x0000 (---------------) + homeunix + 0x000da1ce, // n0x198f c0x0000 (---------------) + is-a-bruinsfan + 0x00005b4e, // n0x1990 c0x0000 (---------------) + is-a-candidate + 0x0000da4f, // n0x1991 c0x0000 (---------------) + is-a-celticsfan + 0x0000fe09, // n0x1992 c0x0000 (---------------) + is-a-chef + 0x0005f049, // n0x1993 c0x0000 (---------------) + is-a-geek + 0x0005180b, // n0x1994 c0x0000 (---------------) + is-a-knight + 0x00069f0f, // n0x1995 c0x0000 (---------------) + is-a-linux-user + 0x000823cc, // n0x1996 c0x0000 (---------------) + is-a-patsfan + 0x0009ffcb, // n0x1997 c0x0000 (---------------) + is-a-soxfan + 0x000b3648, // n0x1998 c0x0000 (---------------) + is-found + 0x000ecf87, // n0x1999 c0x0000 (---------------) + is-lost + 0x000f44c8, // n0x199a c0x0000 (---------------) + is-saved + 0x000e6d8b, // n0x199b c0x0000 (---------------) + is-very-bad + 0x000f02cc, // n0x199c c0x0000 (---------------) + is-very-evil + 0x0011bb0c, // n0x199d c0x0000 (---------------) + is-very-good + 0x0013644c, // n0x199e c0x0000 (---------------) + is-very-nice + 0x00140c4d, // n0x199f c0x0000 (---------------) + is-very-sweet + 0x000fff08, // n0x19a0 c0x0000 (---------------) + isa-geek + 0x0014c909, // n0x19a1 c0x0000 (---------------) + kicks-ass + 0x0017770b, // n0x19a2 c0x0000 (---------------) + misconfused + 0x000d7147, // n0x19a3 c0x0000 (---------------) + podzone + 0x000cf68a, // n0x19a4 c0x0000 (---------------) + readmyblog + 0x00053986, // n0x19a5 c0x0000 (---------------) + selfip + 0x00090b0d, // n0x19a6 c0x0000 (---------------) + sellsyourhome + 0x000c9608, // n0x19a7 c0x0000 (---------------) + servebbs + 0x0006e648, // n0x19a8 c0x0000 (---------------) + serveftp + 0x00170589, // n0x19a9 c0x0000 (---------------) + servegame + 0x000e160c, // n0x19aa c0x0000 (---------------) + stuff-4-sale + 0x00002982, // n0x19ab c0x0000 (---------------) + us + 0x00123b06, // n0x19ac c0x0000 (---------------) + webhop + 0x00009ac2, // n0x19ad c0x0000 (---------------) + za + 0x00000301, // n0x19ae c0x0000 (---------------) + c + 0x0003fa03, // n0x19af c0x0000 (---------------) + rsc + 0x45371dc6, // n0x19b0 c0x0114 (n0x19b1-n0x19b2) o I origin + 0x00039883, // n0x19b1 c0x0000 (---------------) + ssl + 0x00008502, // n0x19b2 c0x0000 (---------------) + go + 0x00011bc4, // n0x19b3 c0x0000 (---------------) + home + 0x000001c2, // n0x19b4 c0x0000 (---------------) + al + 0x000b1c44, // n0x19b5 c0x0000 (---------------) + asso + 0x00000102, // n0x19b6 c0x0000 (---------------) + at + 0x00009602, // n0x19b7 c0x0000 (---------------) + au + 0x000094c2, // n0x19b8 c0x0000 (---------------) + be + 0x00026882, // n0x19b9 c0x0000 (---------------) + bg + 0x00000302, // n0x19ba c0x0000 (---------------) + ca + 0x00039702, // n0x19bb c0x0000 (---------------) + cd + 0x000058c2, // n0x19bc c0x0000 (---------------) + ch + 0x0001a142, // n0x19bd c0x0000 (---------------) + cn + 0x000394c2, // n0x19be c0x0000 (---------------) + cy + 0x00033fc2, // n0x19bf c0x0000 (---------------) + cz + 0x00000402, // n0x19c0 c0x0000 (---------------) + de + 0x00000ac2, // n0x19c1 c0x0000 (---------------) + dk + 0x000349c3, // n0x19c2 c0x0000 (---------------) + edu + 0x0000b0c2, // n0x19c3 c0x0000 (---------------) + ee + 0x00002242, // n0x19c4 c0x0000 (---------------) + es + 0x0000e002, // n0x19c5 c0x0000 (---------------) + fi + 0x00007fc2, // n0x19c6 c0x0000 (---------------) + fr + 0x000089c2, // n0x19c7 c0x0000 (---------------) + gr + 0x00032882, // n0x19c8 c0x0000 (---------------) + hr + 0x0000d0c2, // n0x19c9 c0x0000 (---------------) + hu + 0x00000042, // n0x19ca c0x0000 (---------------) + ie + 0x00002f82, // n0x19cb c0x0000 (---------------) + il + 0x000020c2, // n0x19cc c0x0000 (---------------) + in + 0x0006f683, // n0x19cd c0x0000 (---------------) + int + 0x00001a02, // n0x19ce c0x0000 (---------------) + is + 0x00006f82, // n0x19cf c0x0000 (---------------) + it + 0x000a8bc2, // n0x19d0 c0x0000 (---------------) + jp + 0x000076c2, // n0x19d1 c0x0000 (---------------) + kr + 0x00008bc2, // n0x19d2 c0x0000 (---------------) + lt + 0x00002542, // n0x19d3 c0x0000 (---------------) + lu + 0x00007302, // n0x19d4 c0x0000 (---------------) + lv + 0x000d2e42, // n0x19d5 c0x0000 (---------------) + mc + 0x00002302, // n0x19d6 c0x0000 (---------------) + me + 0x00165542, // n0x19d7 c0x0000 (---------------) + mk + 0x00035702, // n0x19d8 c0x0000 (---------------) + mt + 0x0002a6c2, // n0x19d9 c0x0000 (---------------) + my + 0x0001d8c3, // n0x19da c0x0000 (---------------) + net + 0x00002d42, // n0x19db c0x0000 (---------------) + ng + 0x0003e082, // n0x19dc c0x0000 (---------------) + nl + 0x00000d82, // n0x19dd c0x0000 (---------------) + no + 0x00009a82, // n0x19de c0x0000 (---------------) + nz + 0x00052285, // n0x19df c0x0000 (---------------) + paris + 0x00006582, // n0x19e0 c0x0000 (---------------) + pl + 0x000835c2, // n0x19e1 c0x0000 (---------------) + pt + 0x0003d883, // n0x19e2 c0x0000 (---------------) + q-a + 0x00000cc2, // n0x19e3 c0x0000 (---------------) + ro + 0x00011ec2, // n0x19e4 c0x0000 (---------------) + ru + 0x00001d42, // n0x19e5 c0x0000 (---------------) + se + 0x0000ca82, // n0x19e6 c0x0000 (---------------) + si + 0x0000e342, // n0x19e7 c0x0000 (---------------) + sk + 0x00003642, // n0x19e8 c0x0000 (---------------) + tr + 0x00000f82, // n0x19e9 c0x0000 (---------------) + uk + 0x00002982, // n0x19ea c0x0000 (---------------) + us + 0x00210e43, // n0x19eb c0x0000 (---------------) + I abo + 0x00205882, // n0x19ec c0x0000 (---------------) + I ac + 0x0022edc3, // n0x19ed c0x0000 (---------------) + I com + 0x002349c3, // n0x19ee c0x0000 (---------------) + I edu + 0x00209f03, // n0x19ef c0x0000 (---------------) + I gob + 0x00202d03, // n0x19f0 c0x0000 (---------------) + I ing + 0x00211c43, // n0x19f1 c0x0000 (---------------) + I med + 0x0021d8c3, // n0x19f2 c0x0000 (---------------) + I net + 0x0020e543, // n0x19f3 c0x0000 (---------------) + I nom + 0x00229a83, // n0x19f4 c0x0000 (---------------) + I org + 0x00289883, // n0x19f5 c0x0000 (---------------) + I sld + 0x000f5248, // n0x19f6 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x19f7 c0x0000 (---------------) + I com + 0x002349c3, // n0x19f8 c0x0000 (---------------) + I edu + 0x00209f03, // n0x19f9 c0x0000 (---------------) + I gob + 0x00215b43, // n0x19fa c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x19fb c0x0000 (---------------) + I net + 0x0020e543, // n0x19fc c0x0000 (---------------) + I nom + 0x00229a83, // n0x19fd c0x0000 (---------------) + I org + 0x0022edc3, // n0x19fe c0x0000 (---------------) + I com + 0x002349c3, // n0x19ff c0x0000 (---------------) + I edu + 0x00229a83, // n0x1a00 c0x0000 (---------------) + I org + 0x0022edc3, // n0x1a01 c0x0000 (---------------) + I com + 0x002349c3, // n0x1a02 c0x0000 (---------------) + I edu + 0x00275003, // n0x1a03 c0x0000 (---------------) + I gov + 0x00200041, // n0x1a04 c0x0000 (---------------) + I i + 0x00215b43, // n0x1a05 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1a06 c0x0000 (---------------) + I net + 0x002084c3, // n0x1a07 c0x0000 (---------------) + I ngo + 0x00229a83, // n0x1a08 c0x0000 (---------------) + I org + 0x0030a143, // n0x1a09 c0x0000 (---------------) + I biz + 0x0022edc3, // n0x1a0a c0x0000 (---------------) + I com + 0x002349c3, // n0x1a0b c0x0000 (---------------) + I edu + 0x00365a03, // n0x1a0c c0x0000 (---------------) + I fam + 0x00209f03, // n0x1a0d c0x0000 (---------------) + I gob + 0x00237fc3, // n0x1a0e c0x0000 (---------------) + I gok + 0x00248683, // n0x1a0f c0x0000 (---------------) + I gon + 0x0029ae43, // n0x1a10 c0x0000 (---------------) + I gop + 0x00208503, // n0x1a11 c0x0000 (---------------) + I gos + 0x00275003, // n0x1a12 c0x0000 (---------------) + I gov + 0x0038a144, // n0x1a13 c0x0000 (---------------) + I info + 0x0021d8c3, // n0x1a14 c0x0000 (---------------) + I net + 0x00229a83, // n0x1a15 c0x0000 (---------------) + I org + 0x0021fa83, // n0x1a16 c0x0000 (---------------) + I web + 0x0031af44, // n0x1a17 c0x0000 (---------------) + I agro + 0x0021a3c3, // n0x1a18 c0x0000 (---------------) + I aid + 0x000011c3, // n0x1a19 c0x0000 (---------------) + art + 0x00200103, // n0x1a1a c0x0000 (---------------) + I atm + 0x00256148, // n0x1a1b c0x0000 (---------------) + I augustow + 0x00216404, // n0x1a1c c0x0000 (---------------) + I auto + 0x0033d2ca, // n0x1a1d c0x0000 (---------------) + I babia-gora + 0x00300686, // n0x1a1e c0x0000 (---------------) + I bedzin + 0x0038bc47, // n0x1a1f c0x0000 (---------------) + I beskidy + 0x0021cb4a, // n0x1a20 c0x0000 (---------------) + I bialowieza + 0x00267fc9, // n0x1a21 c0x0000 (---------------) + I bialystok + 0x0039cac7, // n0x1a22 c0x0000 (---------------) + I bielawa + 0x003a2f4a, // n0x1a23 c0x0000 (---------------) + I bieszczady + 0x0030a143, // n0x1a24 c0x0000 (---------------) + I biz + 0x0034e48b, // n0x1a25 c0x0000 (---------------) + I boleslawiec + 0x003018c9, // n0x1a26 c0x0000 (---------------) + I bydgoszcz + 0x00219785, // n0x1a27 c0x0000 (---------------) + I bytom + 0x002c9f07, // n0x1a28 c0x0000 (---------------) + I cieszyn + 0x00008182, // n0x1a29 c0x0000 (---------------) + co + 0x0022edc3, // n0x1a2a c0x0000 (---------------) + I com + 0x0033ba07, // n0x1a2b c0x0000 (---------------) + I czeladz + 0x00233fc5, // n0x1a2c c0x0000 (---------------) + I czest + 0x002b6ac9, // n0x1a2d c0x0000 (---------------) + I dlugoleka + 0x002349c3, // n0x1a2e c0x0000 (---------------) + I edu + 0x00221e46, // n0x1a2f c0x0000 (---------------) + I elblag + 0x002b5903, // n0x1a30 c0x0000 (---------------) + I elk + 0x000f2683, // n0x1a31 c0x0000 (---------------) + gda + 0x000f2686, // n0x1a32 c0x0000 (---------------) + gdansk + 0x000264c6, // n0x1a33 c0x0000 (---------------) + gdynia + 0x00002d87, // n0x1a34 c0x0000 (---------------) + gliwice + 0x00208806, // n0x1a35 c0x0000 (---------------) + I glogow + 0x0020f7c5, // n0x1a36 c0x0000 (---------------) + I gmina + 0x00225387, // n0x1a37 c0x0000 (---------------) + I gniezno + 0x0032eec7, // n0x1a38 c0x0000 (---------------) + I gorlice + 0x47675003, // n0x1a39 c0x011d (n0x1abc-n0x1aeb) + I gov + 0x00326f07, // n0x1a3a c0x0000 (---------------) + I grajewo + 0x00358d43, // n0x1a3b c0x0000 (---------------) + I gsm + 0x00209145, // n0x1a3c c0x0000 (---------------) + I ilawa + 0x0038a144, // n0x1a3d c0x0000 (---------------) + I info + 0x00275408, // n0x1a3e c0x0000 (---------------) + I jaworzno + 0x002a71cc, // n0x1a3f c0x0000 (---------------) + I jelenia-gora + 0x002a4885, // n0x1a40 c0x0000 (---------------) + I jgora + 0x003936c6, // n0x1a41 c0x0000 (---------------) + I kalisz + 0x0033b8c7, // n0x1a42 c0x0000 (---------------) + I karpacz + 0x0037f7c7, // n0x1a43 c0x0000 (---------------) + I kartuzy + 0x002027c7, // n0x1a44 c0x0000 (---------------) + I kaszuby + 0x002073c8, // n0x1a45 c0x0000 (---------------) + I katowice + 0x00218c4f, // n0x1a46 c0x0000 (---------------) + I kazimierz-dolny + 0x00308605, // n0x1a47 c0x0000 (---------------) + I kepno + 0x0023efc7, // n0x1a48 c0x0000 (---------------) + I ketrzyn + 0x002a1347, // n0x1a49 c0x0000 (---------------) + I klodzko + 0x0029be4a, // n0x1a4a c0x0000 (---------------) + I kobierzyce + 0x00283349, // n0x1a4b c0x0000 (---------------) + I kolobrzeg + 0x002c6d05, // n0x1a4c c0x0000 (---------------) + I konin + 0x002c768a, // n0x1a4d c0x0000 (---------------) + I konskowola + 0x001239c6, // n0x1a4e c0x0000 (---------------) + krakow + 0x002b5985, // n0x1a4f c0x0000 (---------------) + I kutno + 0x003676c4, // n0x1a50 c0x0000 (---------------) + I lapy + 0x002a0c46, // n0x1a51 c0x0000 (---------------) + I lebork + 0x0032fe87, // n0x1a52 c0x0000 (---------------) + I legnica + 0x0023cac7, // n0x1a53 c0x0000 (---------------) + I lezajsk + 0x00301d08, // n0x1a54 c0x0000 (---------------) + I limanowa + 0x00212bc5, // n0x1a55 c0x0000 (---------------) + I lomza + 0x00233ec6, // n0x1a56 c0x0000 (---------------) + I lowicz + 0x00202545, // n0x1a57 c0x0000 (---------------) + I lubin + 0x00330b05, // n0x1a58 c0x0000 (---------------) + I lukow + 0x0021a604, // n0x1a59 c0x0000 (---------------) + I mail + 0x002e7187, // n0x1a5a c0x0000 (---------------) + I malbork + 0x0028018a, // n0x1a5b c0x0000 (---------------) + I malopolska + 0x0037fe08, // n0x1a5c c0x0000 (---------------) + I mazowsze + 0x002d1606, // n0x1a5d c0x0000 (---------------) + I mazury + 0x00011c43, // n0x1a5e c0x0000 (---------------) + med + 0x002fb545, // n0x1a5f c0x0000 (---------------) + I media + 0x003831c6, // n0x1a60 c0x0000 (---------------) + I miasta + 0x003a1c06, // n0x1a61 c0x0000 (---------------) + I mielec + 0x002be106, // n0x1a62 c0x0000 (---------------) + I mielno + 0x00215b43, // n0x1a63 c0x0000 (---------------) + I mil + 0x0037bd47, // n0x1a64 c0x0000 (---------------) + I mragowo + 0x002a12c5, // n0x1a65 c0x0000 (---------------) + I naklo + 0x0021d8c3, // n0x1a66 c0x0000 (---------------) + I net + 0x0039cd4d, // n0x1a67 c0x0000 (---------------) + I nieruchomosci + 0x0020e543, // n0x1a68 c0x0000 (---------------) + I nom + 0x00301e08, // n0x1a69 c0x0000 (---------------) + I nowaruda + 0x0039abc4, // n0x1a6a c0x0000 (---------------) + I nysa + 0x0026f045, // n0x1a6b c0x0000 (---------------) + I olawa + 0x0029bd46, // n0x1a6c c0x0000 (---------------) + I olecko + 0x00237686, // n0x1a6d c0x0000 (---------------) + I olkusz + 0x0020a307, // n0x1a6e c0x0000 (---------------) + I olsztyn + 0x00238307, // n0x1a6f c0x0000 (---------------) + I opoczno + 0x0024a205, // n0x1a70 c0x0000 (---------------) + I opole + 0x00229a83, // n0x1a71 c0x0000 (---------------) + I org + 0x00207ac7, // n0x1a72 c0x0000 (---------------) + I ostroda + 0x002c5c89, // n0x1a73 c0x0000 (---------------) + I ostroleka + 0x00203ac9, // n0x1a74 c0x0000 (---------------) + I ostrowiec + 0x0020854a, // n0x1a75 c0x0000 (---------------) + I ostrowwlkp + 0x002419c2, // n0x1a76 c0x0000 (---------------) + I pc + 0x00209104, // n0x1a77 c0x0000 (---------------) + I pila + 0x002d1ec4, // n0x1a78 c0x0000 (---------------) + I pisz + 0x002158c7, // n0x1a79 c0x0000 (---------------) + I podhale + 0x00237888, // n0x1a7a c0x0000 (---------------) + I podlasie + 0x002d7bc9, // n0x1a7b c0x0000 (---------------) + I polkowice + 0x0021ce49, // n0x1a7c c0x0000 (---------------) + I pomorskie + 0x002d8787, // n0x1a7d c0x0000 (---------------) + I pomorze + 0x00308106, // n0x1a7e c0x0000 (---------------) + I powiat + 0x000d9f46, // n0x1a7f c0x0000 (---------------) + poznan + 0x002db244, // n0x1a80 c0x0000 (---------------) + I priv + 0x002db3ca, // n0x1a81 c0x0000 (---------------) + I prochowice + 0x002de5c8, // n0x1a82 c0x0000 (---------------) + I pruszkow + 0x002deb89, // n0x1a83 c0x0000 (---------------) + I przeworsk + 0x00286846, // n0x1a84 c0x0000 (---------------) + I pulawy + 0x002f9045, // n0x1a85 c0x0000 (---------------) + I radom + 0x0037fcc8, // n0x1a86 c0x0000 (---------------) + I rawa-maz + 0x002bf48a, // n0x1a87 c0x0000 (---------------) + I realestate + 0x0020c043, // n0x1a88 c0x0000 (---------------) + I rel + 0x0034e986, // n0x1a89 c0x0000 (---------------) + I rybnik + 0x002d8887, // n0x1a8a c0x0000 (---------------) + I rzeszow + 0x0020d5c5, // n0x1a8b c0x0000 (---------------) + I sanok + 0x00221705, // n0x1a8c c0x0000 (---------------) + I sejny + 0x00240e03, // n0x1a8d c0x0000 (---------------) + I sex + 0x00332c44, // n0x1a8e c0x0000 (---------------) + I shop + 0x00223f45, // n0x1a8f c0x0000 (---------------) + I sklep + 0x0027a847, // n0x1a90 c0x0000 (---------------) + I skoczow + 0x002dc085, // n0x1a91 c0x0000 (---------------) + I slask + 0x002cdd06, // n0x1a92 c0x0000 (---------------) + I slupsk + 0x00115105, // n0x1a93 c0x0000 (---------------) + sopot + 0x0021e5c3, // n0x1a94 c0x0000 (---------------) + I sos + 0x002a6389, // n0x1a95 c0x0000 (---------------) + I sosnowiec + 0x0026ee0c, // n0x1a96 c0x0000 (---------------) + I stalowa-wola + 0x0029600c, // n0x1a97 c0x0000 (---------------) + I starachowice + 0x002c7248, // n0x1a98 c0x0000 (---------------) + I stargard + 0x00265247, // n0x1a99 c0x0000 (---------------) + I suwalki + 0x002e5008, // n0x1a9a c0x0000 (---------------) + I swidnica + 0x002e5c0a, // n0x1a9b c0x0000 (---------------) + I swiebodzin + 0x002e658b, // n0x1a9c c0x0000 (---------------) + I swinoujscie + 0x00301a08, // n0x1a9d c0x0000 (---------------) + I szczecin + 0x003937c8, // n0x1a9e c0x0000 (---------------) + I szczytno + 0x0020b986, // n0x1a9f c0x0000 (---------------) + I szkola + 0x00363285, // n0x1aa0 c0x0000 (---------------) + I targi + 0x003223ca, // n0x1aa1 c0x0000 (---------------) + I tarnobrzeg + 0x00218745, // n0x1aa2 c0x0000 (---------------) + I tgory + 0x00200142, // n0x1aa3 c0x0000 (---------------) + I tm + 0x002ba087, // n0x1aa4 c0x0000 (---------------) + I tourism + 0x00293486, // n0x1aa5 c0x0000 (---------------) + I travel + 0x0034d545, // n0x1aa6 c0x0000 (---------------) + I turek + 0x002e7a49, // n0x1aa7 c0x0000 (---------------) + I turystyka + 0x00378505, // n0x1aa8 c0x0000 (---------------) + I tychy + 0x003726c5, // n0x1aa9 c0x0000 (---------------) + I ustka + 0x00268689, // n0x1aaa c0x0000 (---------------) + I walbrzych + 0x00383046, // n0x1aab c0x0000 (---------------) + I warmia + 0x00227a08, // n0x1aac c0x0000 (---------------) + I warszawa + 0x0022bf03, // n0x1aad c0x0000 (---------------) + I waw + 0x00208946, // n0x1aae c0x0000 (---------------) + I wegrow + 0x0026e186, // n0x1aaf c0x0000 (---------------) + I wielun + 0x002f5945, // n0x1ab0 c0x0000 (---------------) + I wlocl + 0x002f5949, // n0x1ab1 c0x0000 (---------------) + I wloclawek + 0x002ab3c9, // n0x1ab2 c0x0000 (---------------) + I wodzislaw + 0x00241d07, // n0x1ab3 c0x0000 (---------------) + I wolomin + 0x000f57c4, // n0x1ab4 c0x0000 (---------------) + wroc + 0x002f57c7, // n0x1ab5 c0x0000 (---------------) + I wroclaw + 0x0021cd49, // n0x1ab6 c0x0000 (---------------) + I zachpomor + 0x00338685, // n0x1ab7 c0x0000 (---------------) + I zagan + 0x0003b808, // n0x1ab8 c0x0000 (---------------) + zakopane + 0x0033acc5, // n0x1ab9 c0x0000 (---------------) + I zarow + 0x0033a9c5, // n0x1aba c0x0000 (---------------) + I zgora + 0x0021d989, // n0x1abb c0x0000 (---------------) + I zgorzelec + 0x002136c2, // n0x1abc c0x0000 (---------------) + I ap + 0x0021a1c4, // n0x1abd c0x0000 (---------------) + I griw + 0x00202e82, // n0x1abe c0x0000 (---------------) + I ic + 0x00201a02, // n0x1abf c0x0000 (---------------) + I is + 0x002637c5, // n0x1ac0 c0x0000 (---------------) + I kmpsp + 0x002cab08, // n0x1ac1 c0x0000 (---------------) + I konsulat + 0x0037a705, // n0x1ac2 c0x0000 (---------------) + I kppsp + 0x002b82c3, // n0x1ac3 c0x0000 (---------------) + I kwp + 0x002b82c5, // n0x1ac4 c0x0000 (---------------) + I kwpsp + 0x002ca2c3, // n0x1ac5 c0x0000 (---------------) + I mup + 0x0020f2c2, // n0x1ac6 c0x0000 (---------------) + I mw + 0x00260804, // n0x1ac7 c0x0000 (---------------) + I oirm + 0x002f6303, // n0x1ac8 c0x0000 (---------------) + I oum + 0x0020ec42, // n0x1ac9 c0x0000 (---------------) + I pa + 0x002dcbc4, // n0x1aca c0x0000 (---------------) + I pinb + 0x002d24c3, // n0x1acb c0x0000 (---------------) + I piw + 0x00200c42, // n0x1acc c0x0000 (---------------) + I po + 0x00245b03, // n0x1acd c0x0000 (---------------) + I psp + 0x00284bc4, // n0x1ace c0x0000 (---------------) + I psse + 0x002b0943, // n0x1acf c0x0000 (---------------) + I pup + 0x0023d244, // n0x1ad0 c0x0000 (---------------) + I rzgw + 0x00202402, // n0x1ad1 c0x0000 (---------------) + I sa + 0x0026b1c3, // n0x1ad2 c0x0000 (---------------) + I sdn + 0x00215443, // n0x1ad3 c0x0000 (---------------) + I sko + 0x00204c82, // n0x1ad4 c0x0000 (---------------) + I so + 0x00336d82, // n0x1ad5 c0x0000 (---------------) + I sr + 0x002ab209, // n0x1ad6 c0x0000 (---------------) + I starostwo + 0x00207e02, // n0x1ad7 c0x0000 (---------------) + I ug + 0x00281744, // n0x1ad8 c0x0000 (---------------) + I ugim + 0x0020bd82, // n0x1ad9 c0x0000 (---------------) + I um + 0x0037fb44, // n0x1ada c0x0000 (---------------) + I umig + 0x003080c4, // n0x1adb c0x0000 (---------------) + I upow + 0x002dd9c4, // n0x1adc c0x0000 (---------------) + I uppo + 0x00202982, // n0x1add c0x0000 (---------------) + I us + 0x0020b5c2, // n0x1ade c0x0000 (---------------) + I uw + 0x00211f03, // n0x1adf c0x0000 (---------------) + I uzs + 0x002e6203, // n0x1ae0 c0x0000 (---------------) + I wif + 0x0022bf84, // n0x1ae1 c0x0000 (---------------) + I wiih + 0x00255904, // n0x1ae2 c0x0000 (---------------) + I winb + 0x002c5c04, // n0x1ae3 c0x0000 (---------------) + I wios + 0x002c7584, // n0x1ae4 c0x0000 (---------------) + I witd + 0x002f4c83, // n0x1ae5 c0x0000 (---------------) + I wiw + 0x002eb643, // n0x1ae6 c0x0000 (---------------) + I wsa + 0x00323944, // n0x1ae7 c0x0000 (---------------) + I wskr + 0x002f6f44, // n0x1ae8 c0x0000 (---------------) + I wuoz + 0x002f7246, // n0x1ae9 c0x0000 (---------------) + I wzmiuw + 0x00252242, // n0x1aea c0x0000 (---------------) + I zp + 0x00208182, // n0x1aeb c0x0000 (---------------) + I co + 0x002349c3, // n0x1aec c0x0000 (---------------) + I edu + 0x00275003, // n0x1aed c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1aee c0x0000 (---------------) + I net + 0x00229a83, // n0x1aef c0x0000 (---------------) + I org + 0x00205882, // n0x1af0 c0x0000 (---------------) + I ac + 0x0030a143, // n0x1af1 c0x0000 (---------------) + I biz + 0x0022edc3, // n0x1af2 c0x0000 (---------------) + I com + 0x002349c3, // n0x1af3 c0x0000 (---------------) + I edu + 0x00202243, // n0x1af4 c0x0000 (---------------) + I est + 0x00275003, // n0x1af5 c0x0000 (---------------) + I gov + 0x0038a144, // n0x1af6 c0x0000 (---------------) + I info + 0x002ab4c4, // n0x1af7 c0x0000 (---------------) + I isla + 0x0027ca84, // n0x1af8 c0x0000 (---------------) + I name + 0x0021d8c3, // n0x1af9 c0x0000 (---------------) + I net + 0x00229a83, // n0x1afa c0x0000 (---------------) + I org + 0x00220283, // n0x1afb c0x0000 (---------------) + I pro + 0x002dba84, // n0x1afc c0x0000 (---------------) + I prof + 0x002ac5c3, // n0x1afd c0x0000 (---------------) + I aca + 0x00211783, // n0x1afe c0x0000 (---------------) + I bar + 0x00213b83, // n0x1aff c0x0000 (---------------) + I cpa + 0x0027bd03, // n0x1b00 c0x0000 (---------------) + I eng + 0x002aa183, // n0x1b01 c0x0000 (---------------) + I jur + 0x00209183, // n0x1b02 c0x0000 (---------------) + I law + 0x00211c43, // n0x1b03 c0x0000 (---------------) + I med + 0x0022edc3, // n0x1b04 c0x0000 (---------------) + I com + 0x002349c3, // n0x1b05 c0x0000 (---------------) + I edu + 0x00275003, // n0x1b06 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1b07 c0x0000 (---------------) + I net + 0x00229a83, // n0x1b08 c0x0000 (---------------) + I org + 0x002d5303, // n0x1b09 c0x0000 (---------------) + I plo + 0x00230ec3, // n0x1b0a c0x0000 (---------------) + I sec + 0x000f5248, // n0x1b0b c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x1b0c c0x0000 (---------------) + I com + 0x002349c3, // n0x1b0d c0x0000 (---------------) + I edu + 0x00275003, // n0x1b0e c0x0000 (---------------) + I gov + 0x0026f683, // n0x1b0f c0x0000 (---------------) + I int + 0x0021d8c3, // n0x1b10 c0x0000 (---------------) + I net + 0x0023c4c4, // n0x1b11 c0x0000 (---------------) + I nome + 0x00229a83, // n0x1b12 c0x0000 (---------------) + I org + 0x0028ff44, // n0x1b13 c0x0000 (---------------) + I publ + 0x002cad85, // n0x1b14 c0x0000 (---------------) + I belau + 0x00208182, // n0x1b15 c0x0000 (---------------) + I co + 0x002003c2, // n0x1b16 c0x0000 (---------------) + I ed + 0x00208502, // n0x1b17 c0x0000 (---------------) + I go + 0x00203282, // n0x1b18 c0x0000 (---------------) + I ne + 0x00200282, // n0x1b19 c0x0000 (---------------) + I or + 0x0022edc3, // n0x1b1a c0x0000 (---------------) + I com + 0x00238284, // n0x1b1b c0x0000 (---------------) + I coop + 0x002349c3, // n0x1b1c c0x0000 (---------------) + I edu + 0x00275003, // n0x1b1d c0x0000 (---------------) + I gov + 0x00215b43, // n0x1b1e c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1b1f c0x0000 (---------------) + I net + 0x00229a83, // n0x1b20 c0x0000 (---------------) + I org + 0x000f5248, // n0x1b21 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x1b22 c0x0000 (---------------) + I com + 0x002349c3, // n0x1b23 c0x0000 (---------------) + I edu + 0x00275003, // n0x1b24 c0x0000 (---------------) + I gov + 0x00215b43, // n0x1b25 c0x0000 (---------------) + I mil + 0x0027ca84, // n0x1b26 c0x0000 (---------------) + I name + 0x0021d8c3, // n0x1b27 c0x0000 (---------------) + I net + 0x00229a83, // n0x1b28 c0x0000 (---------------) + I org + 0x00215d43, // n0x1b29 c0x0000 (---------------) + I sch + 0x002b1c44, // n0x1b2a c0x0000 (---------------) + I asso + 0x000f5248, // n0x1b2b c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x1b2c c0x0000 (---------------) + I com + 0x0020e543, // n0x1b2d c0x0000 (---------------) + I nom + 0x00243984, // n0x1b2e c0x0000 (---------------) + I arts + 0x000f5248, // n0x1b2f c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x1b30 c0x0000 (---------------) + I com + 0x00247a04, // n0x1b31 c0x0000 (---------------) + I firm + 0x0038a144, // n0x1b32 c0x0000 (---------------) + I info + 0x0020e543, // n0x1b33 c0x0000 (---------------) + I nom + 0x00202382, // n0x1b34 c0x0000 (---------------) + I nt + 0x00229a83, // n0x1b35 c0x0000 (---------------) + I org + 0x00226f03, // n0x1b36 c0x0000 (---------------) + I rec + 0x0038c985, // n0x1b37 c0x0000 (---------------) + I store + 0x00200142, // n0x1b38 c0x0000 (---------------) + I tm + 0x002f7083, // n0x1b39 c0x0000 (---------------) + I www + 0x00205882, // n0x1b3a c0x0000 (---------------) + I ac + 0x000f5248, // n0x1b3b c0x0000 (---------------) + blogspot + 0x00208182, // n0x1b3c c0x0000 (---------------) + I co + 0x002349c3, // n0x1b3d c0x0000 (---------------) + I edu + 0x00275003, // n0x1b3e c0x0000 (---------------) + I gov + 0x002020c2, // n0x1b3f c0x0000 (---------------) + I in + 0x00229a83, // n0x1b40 c0x0000 (---------------) + I org + 0x00205882, // n0x1b41 c0x0000 (---------------) + I ac + 0x003a3107, // n0x1b42 c0x0000 (---------------) + I adygeya + 0x002700c5, // n0x1b43 c0x0000 (---------------) + I altai + 0x00227844, // n0x1b44 c0x0000 (---------------) + I amur + 0x00377b46, // n0x1b45 c0x0000 (---------------) + I amursk + 0x00305d4b, // n0x1b46 c0x0000 (---------------) + I arkhangelsk + 0x002533c9, // n0x1b47 c0x0000 (---------------) + I astrakhan + 0x00393606, // n0x1b48 c0x0000 (---------------) + I baikal + 0x00321409, // n0x1b49 c0x0000 (---------------) + I bashkiria + 0x002b2848, // n0x1b4a c0x0000 (---------------) + I belgorod + 0x00204043, // n0x1b4b c0x0000 (---------------) + I bir + 0x000f5248, // n0x1b4c c0x0000 (---------------) + blogspot + 0x00223e07, // n0x1b4d c0x0000 (---------------) + I bryansk + 0x002ff348, // n0x1b4e c0x0000 (---------------) + I buryatia + 0x00226843, // n0x1b4f c0x0000 (---------------) + I cbg + 0x0025e404, // n0x1b50 c0x0000 (---------------) + I chel + 0x00265a4b, // n0x1b51 c0x0000 (---------------) + I chelyabinsk + 0x002a6585, // n0x1b52 c0x0000 (---------------) + I chita + 0x002b7388, // n0x1b53 c0x0000 (---------------) + I chukotka + 0x00333c89, // n0x1b54 c0x0000 (---------------) + I chuvashia + 0x00255883, // n0x1b55 c0x0000 (---------------) + I cmw + 0x0022edc3, // n0x1b56 c0x0000 (---------------) + I com + 0x00321848, // n0x1b57 c0x0000 (---------------) + I dagestan + 0x002e4187, // n0x1b58 c0x0000 (---------------) + I dudinka + 0x00363886, // n0x1b59 c0x0000 (---------------) + I e-burg + 0x002349c3, // n0x1b5a c0x0000 (---------------) + I edu + 0x00382647, // n0x1b5b c0x0000 (---------------) + I fareast + 0x00275003, // n0x1b5c c0x0000 (---------------) + I gov + 0x003318c6, // n0x1b5d c0x0000 (---------------) + I grozny + 0x0026f683, // n0x1b5e c0x0000 (---------------) + I int + 0x0022b3c7, // n0x1b5f c0x0000 (---------------) + I irkutsk + 0x00305647, // n0x1b60 c0x0000 (---------------) + I ivanovo + 0x00383b47, // n0x1b61 c0x0000 (---------------) + I izhevsk + 0x002e7105, // n0x1b62 c0x0000 (---------------) + I jamal + 0x00206703, // n0x1b63 c0x0000 (---------------) + I jar + 0x0020e7cb, // n0x1b64 c0x0000 (---------------) + I joshkar-ola + 0x00324a48, // n0x1b65 c0x0000 (---------------) + I k-uralsk + 0x0022a608, // n0x1b66 c0x0000 (---------------) + I kalmykia + 0x00394486, // n0x1b67 c0x0000 (---------------) + I kaluga + 0x003229c9, // n0x1b68 c0x0000 (---------------) + I kamchatka + 0x00374707, // n0x1b69 c0x0000 (---------------) + I karelia + 0x002f0ec5, // n0x1b6a c0x0000 (---------------) + I kazan + 0x002a6c04, // n0x1b6b c0x0000 (---------------) + I kchr + 0x002c3bc8, // n0x1b6c c0x0000 (---------------) + I kemerovo + 0x00325b0a, // n0x1b6d c0x0000 (---------------) + I khabarovsk + 0x00325d49, // n0x1b6e c0x0000 (---------------) + I khakassia + 0x0023cc43, // n0x1b6f c0x0000 (---------------) + I khv + 0x00276145, // n0x1b70 c0x0000 (---------------) + I kirov + 0x0026b543, // n0x1b71 c0x0000 (---------------) + I kms + 0x0029b106, // n0x1b72 c0x0000 (---------------) + I koenig + 0x002e25c4, // n0x1b73 c0x0000 (---------------) + I komi + 0x002f5b48, // n0x1b74 c0x0000 (---------------) + I kostroma + 0x0038de0b, // n0x1b75 c0x0000 (---------------) + I krasnoyarsk + 0x003343c5, // n0x1b76 c0x0000 (---------------) + I kuban + 0x002b25c6, // n0x1b77 c0x0000 (---------------) + I kurgan + 0x002b3f05, // n0x1b78 c0x0000 (---------------) + I kursk + 0x002b46c8, // n0x1b79 c0x0000 (---------------) + I kustanai + 0x002b5ac7, // n0x1b7a c0x0000 (---------------) + I kuzbass + 0x0020e207, // n0x1b7b c0x0000 (---------------) + I lipetsk + 0x0033dbc7, // n0x1b7c c0x0000 (---------------) + I magadan + 0x002c3fc8, // n0x1b7d c0x0000 (---------------) + I magnitka + 0x00219884, // n0x1b7e c0x0000 (---------------) + I mari + 0x0023a707, // n0x1b7f c0x0000 (---------------) + I mari-el + 0x00273886, // n0x1b80 c0x0000 (---------------) + I marine + 0x00215b43, // n0x1b81 c0x0000 (---------------) + I mil + 0x002c2588, // n0x1b82 c0x0000 (---------------) + I mordovia + 0x0024b7c3, // n0x1b83 c0x0000 (---------------) + I msk + 0x002ca948, // n0x1b84 c0x0000 (---------------) + I murmansk + 0x002ced45, // n0x1b85 c0x0000 (---------------) + I mytis + 0x00200988, // n0x1b86 c0x0000 (---------------) + I nakhodka + 0x00234bc7, // n0x1b87 c0x0000 (---------------) + I nalchik + 0x0021d8c3, // n0x1b88 c0x0000 (---------------) + I net + 0x0030a903, // n0x1b89 c0x0000 (---------------) + I nkz + 0x0039ee04, // n0x1b8a c0x0000 (---------------) + I nnov + 0x00371547, // n0x1b8b c0x0000 (---------------) + I norilsk + 0x002062c3, // n0x1b8c c0x0000 (---------------) + I nov + 0x0030570b, // n0x1b8d c0x0000 (---------------) + I novosibirsk + 0x00215403, // n0x1b8e c0x0000 (---------------) + I nsk + 0x0024b784, // n0x1b8f c0x0000 (---------------) + I omsk + 0x0038ca08, // n0x1b90 c0x0000 (---------------) + I orenburg + 0x00229a83, // n0x1b91 c0x0000 (---------------) + I org + 0x002d2805, // n0x1b92 c0x0000 (---------------) + I oryol + 0x0028de85, // n0x1b93 c0x0000 (---------------) + I oskol + 0x002a11c6, // n0x1b94 c0x0000 (---------------) + I palana + 0x00209a05, // n0x1b95 c0x0000 (---------------) + I penza + 0x002cf104, // n0x1b96 c0x0000 (---------------) + I perm + 0x002099c2, // n0x1b97 c0x0000 (---------------) + I pp + 0x002dee43, // n0x1b98 c0x0000 (---------------) + I ptz + 0x0036774a, // n0x1b99 c0x0000 (---------------) + I pyatigorsk + 0x0030b843, // n0x1b9a c0x0000 (---------------) + I rnd + 0x002a7f09, // n0x1b9b c0x0000 (---------------) + I rubtsovsk + 0x0023a406, // n0x1b9c c0x0000 (---------------) + I ryazan + 0x00218a08, // n0x1b9d c0x0000 (---------------) + I sakhalin + 0x00284706, // n0x1b9e c0x0000 (---------------) + I samara + 0x00220b87, // n0x1b9f c0x0000 (---------------) + I saratov + 0x002c1588, // n0x1ba0 c0x0000 (---------------) + I simbirsk + 0x002d5c88, // n0x1ba1 c0x0000 (---------------) + I smolensk + 0x002d1083, // n0x1ba2 c0x0000 (---------------) + I snz + 0x00263883, // n0x1ba3 c0x0000 (---------------) + I spb + 0x00220f49, // n0x1ba4 c0x0000 (---------------) + I stavropol + 0x00283a03, // n0x1ba5 c0x0000 (---------------) + I stv + 0x00340446, // n0x1ba6 c0x0000 (---------------) + I surgut + 0x0026fd46, // n0x1ba7 c0x0000 (---------------) + I syzran + 0x00314d86, // n0x1ba8 c0x0000 (---------------) + I tambov + 0x0036a389, // n0x1ba9 c0x0000 (---------------) + I tatarstan + 0x002f5084, // n0x1baa c0x0000 (---------------) + I test + 0x00210443, // n0x1bab c0x0000 (---------------) + I tom + 0x00324945, // n0x1bac c0x0000 (---------------) + I tomsk + 0x002eba09, // n0x1bad c0x0000 (---------------) + I tsaritsyn + 0x0020e303, // n0x1bae c0x0000 (---------------) + I tsk + 0x00357704, // n0x1baf c0x0000 (---------------) + I tula + 0x002e85c4, // n0x1bb0 c0x0000 (---------------) + I tuva + 0x00206fc4, // n0x1bb1 c0x0000 (---------------) + I tver + 0x00357246, // n0x1bb2 c0x0000 (---------------) + I tyumen + 0x00214103, // n0x1bb3 c0x0000 (---------------) + I udm + 0x00214108, // n0x1bb4 c0x0000 (---------------) + I udmurtia + 0x00253008, // n0x1bb5 c0x0000 (---------------) + I ulan-ude + 0x00356106, // n0x1bb6 c0x0000 (---------------) + I vdonsk + 0x002f0ccb, // n0x1bb7 c0x0000 (---------------) + I vladikavkaz + 0x002f1008, // n0x1bb8 c0x0000 (---------------) + I vladimir + 0x002f120b, // n0x1bb9 c0x0000 (---------------) + I vladivostok + 0x002f1849, // n0x1bba c0x0000 (---------------) + I volgograd + 0x002f2587, // n0x1bbb c0x0000 (---------------) + I vologda + 0x002f3348, // n0x1bbc c0x0000 (---------------) + I voronezh + 0x002f46c3, // n0x1bbd c0x0000 (---------------) + I vrn + 0x00394386, // n0x1bbe c0x0000 (---------------) + I vyatka + 0x00394787, // n0x1bbf c0x0000 (---------------) + I yakutia + 0x0028f985, // n0x1bc0 c0x0000 (---------------) + I yamal + 0x00343309, // n0x1bc1 c0x0000 (---------------) + I yaroslavl + 0x0030270d, // n0x1bc2 c0x0000 (---------------) + I yekaterinburg + 0x00218851, // n0x1bc3 c0x0000 (---------------) + I yuzhno-sakhalinsk + 0x0022a045, // n0x1bc4 c0x0000 (---------------) + I zgrad + 0x00205882, // n0x1bc5 c0x0000 (---------------) + I ac + 0x00208182, // n0x1bc6 c0x0000 (---------------) + I co + 0x0022edc3, // n0x1bc7 c0x0000 (---------------) + I com + 0x002349c3, // n0x1bc8 c0x0000 (---------------) + I edu + 0x002fa744, // n0x1bc9 c0x0000 (---------------) + I gouv + 0x00275003, // n0x1bca c0x0000 (---------------) + I gov + 0x0026f683, // n0x1bcb c0x0000 (---------------) + I int + 0x00215b43, // n0x1bcc c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1bcd c0x0000 (---------------) + I net + 0x0022edc3, // n0x1bce c0x0000 (---------------) + I com + 0x002349c3, // n0x1bcf c0x0000 (---------------) + I edu + 0x00275003, // n0x1bd0 c0x0000 (---------------) + I gov + 0x00211c43, // n0x1bd1 c0x0000 (---------------) + I med + 0x0021d8c3, // n0x1bd2 c0x0000 (---------------) + I net + 0x00229a83, // n0x1bd3 c0x0000 (---------------) + I org + 0x00287e83, // n0x1bd4 c0x0000 (---------------) + I pub + 0x00215d43, // n0x1bd5 c0x0000 (---------------) + I sch + 0x0022edc3, // n0x1bd6 c0x0000 (---------------) + I com + 0x002349c3, // n0x1bd7 c0x0000 (---------------) + I edu + 0x00275003, // n0x1bd8 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1bd9 c0x0000 (---------------) + I net + 0x00229a83, // n0x1bda c0x0000 (---------------) + I org + 0x0022edc3, // n0x1bdb c0x0000 (---------------) + I com + 0x002349c3, // n0x1bdc c0x0000 (---------------) + I edu + 0x00275003, // n0x1bdd c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1bde c0x0000 (---------------) + I net + 0x00229a83, // n0x1bdf c0x0000 (---------------) + I org + 0x0022edc3, // n0x1be0 c0x0000 (---------------) + I com + 0x002349c3, // n0x1be1 c0x0000 (---------------) + I edu + 0x00275003, // n0x1be2 c0x0000 (---------------) + I gov + 0x0038a144, // n0x1be3 c0x0000 (---------------) + I info + 0x00211c43, // n0x1be4 c0x0000 (---------------) + I med + 0x0021d8c3, // n0x1be5 c0x0000 (---------------) + I net + 0x00229a83, // n0x1be6 c0x0000 (---------------) + I org + 0x00206fc2, // n0x1be7 c0x0000 (---------------) + I tv + 0x00200101, // n0x1be8 c0x0000 (---------------) + I a + 0x00205882, // n0x1be9 c0x0000 (---------------) + I ac + 0x00200001, // n0x1bea c0x0000 (---------------) + I b + 0x00312842, // n0x1beb c0x0000 (---------------) + I bd + 0x000f5248, // n0x1bec c0x0000 (---------------) + blogspot + 0x0021b5c5, // n0x1bed c0x0000 (---------------) + I brand + 0x00200301, // n0x1bee c0x0000 (---------------) + I c + 0x0002edc3, // n0x1bef c0x0000 (---------------) + com + 0x00200401, // n0x1bf0 c0x0000 (---------------) + I d + 0x00200081, // n0x1bf1 c0x0000 (---------------) + I e + 0x00200381, // n0x1bf2 c0x0000 (---------------) + I f + 0x00325a42, // n0x1bf3 c0x0000 (---------------) + I fh + 0x00325a44, // n0x1bf4 c0x0000 (---------------) + I fhsk + 0x003603c3, // n0x1bf5 c0x0000 (---------------) + I fhv + 0x002006c1, // n0x1bf6 c0x0000 (---------------) + I g + 0x00200a41, // n0x1bf7 c0x0000 (---------------) + I h + 0x00200041, // n0x1bf8 c0x0000 (---------------) + I i + 0x00200a01, // n0x1bf9 c0x0000 (---------------) + I k + 0x002a09c7, // n0x1bfa c0x0000 (---------------) + I komforb + 0x002a44cf, // n0x1bfb c0x0000 (---------------) + I kommunalforbund + 0x002b4006, // n0x1bfc c0x0000 (---------------) + I komvux + 0x00200201, // n0x1bfd c0x0000 (---------------) + I l + 0x00262106, // n0x1bfe c0x0000 (---------------) + I lanbib + 0x00200181, // n0x1bff c0x0000 (---------------) + I m + 0x002005c1, // n0x1c00 c0x0000 (---------------) + I n + 0x0030fd8e, // n0x1c01 c0x0000 (---------------) + I naturbruksgymn + 0x00200281, // n0x1c02 c0x0000 (---------------) + I o + 0x00229a83, // n0x1c03 c0x0000 (---------------) + I org + 0x00200c41, // n0x1c04 c0x0000 (---------------) + I p + 0x0037e605, // n0x1c05 c0x0000 (---------------) + I parti + 0x002099c2, // n0x1c06 c0x0000 (---------------) + I pp + 0x00240d05, // n0x1c07 c0x0000 (---------------) + I press + 0x002002c1, // n0x1c08 c0x0000 (---------------) + I r + 0x00201a41, // n0x1c09 c0x0000 (---------------) + I s + 0x00200141, // n0x1c0a c0x0000 (---------------) + I t + 0x00200142, // n0x1c0b c0x0000 (---------------) + I tm + 0x002008c1, // n0x1c0c c0x0000 (---------------) + I u + 0x002010c1, // n0x1c0d c0x0000 (---------------) + I w + 0x0020d041, // n0x1c0e c0x0000 (---------------) + I x + 0x00201341, // n0x1c0f c0x0000 (---------------) + I y + 0x00202881, // n0x1c10 c0x0000 (---------------) + I z + 0x000f5248, // n0x1c11 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x1c12 c0x0000 (---------------) + I com + 0x002349c3, // n0x1c13 c0x0000 (---------------) + I edu + 0x00275003, // n0x1c14 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1c15 c0x0000 (---------------) + I net + 0x00229a83, // n0x1c16 c0x0000 (---------------) + I org + 0x0021ffc3, // n0x1c17 c0x0000 (---------------) + I per + 0x0022edc3, // n0x1c18 c0x0000 (---------------) + I com + 0x00275003, // n0x1c19 c0x0000 (---------------) + I gov + 0x00215b43, // n0x1c1a c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1c1b c0x0000 (---------------) + I net + 0x00229a83, // n0x1c1c c0x0000 (---------------) + I org + 0x014d3788, // n0x1c1d c0x0005 (---------------)* o platform + 0x000f5248, // n0x1c1e c0x0000 (---------------) + blogspot + 0x000f5248, // n0x1c1f c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x1c20 c0x0000 (---------------) + I com + 0x002349c3, // n0x1c21 c0x0000 (---------------) + I edu + 0x00275003, // n0x1c22 c0x0000 (---------------) + I gov + 0x0021d8c3, // n0x1c23 c0x0000 (---------------) + I net + 0x00229a83, // n0x1c24 c0x0000 (---------------) + I org + 0x002011c3, // n0x1c25 c0x0000 (---------------) + I art + 0x000f5248, // n0x1c26 c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x1c27 c0x0000 (---------------) + I com + 0x002349c3, // n0x1c28 c0x0000 (---------------) + I edu + 0x002fa744, // n0x1c29 c0x0000 (---------------) + I gouv + 0x00229a83, // n0x1c2a c0x0000 (---------------) + I org + 0x003372c5, // n0x1c2b c0x0000 (---------------) + I perso + 0x00281a04, // n0x1c2c c0x0000 (---------------) + I univ + 0x0022edc3, // n0x1c2d c0x0000 (---------------) + I com + 0x0021d8c3, // n0x1c2e c0x0000 (---------------) + I net + 0x00229a83, // n0x1c2f c0x0000 (---------------) + I org + 0x00208182, // n0x1c30 c0x0000 (---------------) + I co + 0x0022edc3, // n0x1c31 c0x0000 (---------------) + I com + 0x00232549, // n0x1c32 c0x0000 (---------------) + I consulado + 0x002349c3, // n0x1c33 c0x0000 (---------------) + I edu + 0x002373c9, // n0x1c34 c0x0000 (---------------) + I embaixada + 0x00275003, // n0x1c35 c0x0000 (---------------) + I gov + 0x00215b43, // n0x1c36 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1c37 c0x0000 (---------------) + I net + 0x00229a83, // n0x1c38 c0x0000 (---------------) + I org + 0x002db048, // n0x1c39 c0x0000 (---------------) + I principe + 0x00215087, // n0x1c3a c0x0000 (---------------) + I saotome + 0x0038c985, // n0x1c3b c0x0000 (---------------) + I store + 0x003a3107, // n0x1c3c c0x0000 (---------------) + I adygeya + 0x00305d4b, // n0x1c3d c0x0000 (---------------) + I arkhangelsk + 0x00205648, // n0x1c3e c0x0000 (---------------) + I balashov + 0x00321409, // n0x1c3f c0x0000 (---------------) + I bashkiria + 0x00223e07, // n0x1c40 c0x0000 (---------------) + I bryansk + 0x00321848, // n0x1c41 c0x0000 (---------------) + I dagestan + 0x003318c6, // n0x1c42 c0x0000 (---------------) + I grozny + 0x00305647, // n0x1c43 c0x0000 (---------------) + I ivanovo + 0x0022a608, // n0x1c44 c0x0000 (---------------) + I kalmykia + 0x00394486, // n0x1c45 c0x0000 (---------------) + I kaluga + 0x00374707, // n0x1c46 c0x0000 (---------------) + I karelia + 0x00325d49, // n0x1c47 c0x0000 (---------------) + I khakassia + 0x00383cc9, // n0x1c48 c0x0000 (---------------) + I krasnodar + 0x002b25c6, // n0x1c49 c0x0000 (---------------) + I kurgan + 0x002b3245, // n0x1c4a c0x0000 (---------------) + I lenug + 0x002c2588, // n0x1c4b c0x0000 (---------------) + I mordovia + 0x0024b7c3, // n0x1c4c c0x0000 (---------------) + I msk + 0x002ca948, // n0x1c4d c0x0000 (---------------) + I murmansk + 0x00234bc7, // n0x1c4e c0x0000 (---------------) + I nalchik + 0x002062c3, // n0x1c4f c0x0000 (---------------) + I nov + 0x00321d87, // n0x1c50 c0x0000 (---------------) + I obninsk + 0x00209a05, // n0x1c51 c0x0000 (---------------) + I penza + 0x002d7548, // n0x1c52 c0x0000 (---------------) + I pokrovsk + 0x0026d045, // n0x1c53 c0x0000 (---------------) + I sochi + 0x00263883, // n0x1c54 c0x0000 (---------------) + I spb + 0x0034ec49, // n0x1c55 c0x0000 (---------------) + I togliatti + 0x002a0847, // n0x1c56 c0x0000 (---------------) + I troitsk + 0x00357704, // n0x1c57 c0x0000 (---------------) + I tula + 0x002e85c4, // n0x1c58 c0x0000 (---------------) + I tuva + 0x002f0ccb, // n0x1c59 c0x0000 (---------------) + I vladikavkaz + 0x002f1008, // n0x1c5a c0x0000 (---------------) + I vladimir + 0x002f2587, // n0x1c5b c0x0000 (---------------) + I vologda + 0x0022edc3, // n0x1c5c c0x0000 (---------------) + I com + 0x002349c3, // n0x1c5d c0x0000 (---------------) + I edu + 0x00209f03, // n0x1c5e c0x0000 (---------------) + I gob + 0x00229a83, // n0x1c5f c0x0000 (---------------) + I org + 0x0023e143, // n0x1c60 c0x0000 (---------------) + I red + 0x00275003, // n0x1c61 c0x0000 (---------------) + I gov + 0x0022edc3, // n0x1c62 c0x0000 (---------------) + I com + 0x002349c3, // n0x1c63 c0x0000 (---------------) + I edu + 0x00275003, // n0x1c64 c0x0000 (---------------) + I gov + 0x00215b43, // n0x1c65 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1c66 c0x0000 (---------------) + I net + 0x00229a83, // n0x1c67 c0x0000 (---------------) + I org + 0x00205882, // n0x1c68 c0x0000 (---------------) + I ac + 0x00208182, // n0x1c69 c0x0000 (---------------) + I co + 0x00229a83, // n0x1c6a c0x0000 (---------------) + I org + 0x000f5248, // n0x1c6b c0x0000 (---------------) + blogspot + 0x00205882, // n0x1c6c c0x0000 (---------------) + I ac + 0x00208182, // n0x1c6d c0x0000 (---------------) + I co + 0x00208502, // n0x1c6e c0x0000 (---------------) + I go + 0x002020c2, // n0x1c6f c0x0000 (---------------) + I in + 0x0020e5c2, // n0x1c70 c0x0000 (---------------) + I mi + 0x0021d8c3, // n0x1c71 c0x0000 (---------------) + I net + 0x00200282, // n0x1c72 c0x0000 (---------------) + I or + 0x00205882, // n0x1c73 c0x0000 (---------------) + I ac + 0x0030a143, // n0x1c74 c0x0000 (---------------) + I biz + 0x00208182, // n0x1c75 c0x0000 (---------------) + I co + 0x0022edc3, // n0x1c76 c0x0000 (---------------) + I com + 0x002349c3, // n0x1c77 c0x0000 (---------------) + I edu + 0x00208502, // n0x1c78 c0x0000 (---------------) + I go + 0x00275003, // n0x1c79 c0x0000 (---------------) + I gov + 0x0026f683, // n0x1c7a c0x0000 (---------------) + I int + 0x00215b43, // n0x1c7b c0x0000 (---------------) + I mil + 0x0027ca84, // n0x1c7c c0x0000 (---------------) + I name + 0x0021d8c3, // n0x1c7d c0x0000 (---------------) + I net + 0x00217183, // n0x1c7e c0x0000 (---------------) + I nic + 0x00229a83, // n0x1c7f c0x0000 (---------------) + I org + 0x002f5084, // n0x1c80 c0x0000 (---------------) + I test + 0x0021fa83, // n0x1c81 c0x0000 (---------------) + I web + 0x00275003, // n0x1c82 c0x0000 (---------------) + I gov + 0x00208182, // n0x1c83 c0x0000 (---------------) + I co + 0x0022edc3, // n0x1c84 c0x0000 (---------------) + I com + 0x002349c3, // n0x1c85 c0x0000 (---------------) + I edu + 0x00275003, // n0x1c86 c0x0000 (---------------) + I gov + 0x00215b43, // n0x1c87 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1c88 c0x0000 (---------------) + I net + 0x0020e543, // n0x1c89 c0x0000 (---------------) + I nom + 0x00229a83, // n0x1c8a c0x0000 (---------------) + I org + 0x0030a6c7, // n0x1c8b c0x0000 (---------------) + I agrinet + 0x0022edc3, // n0x1c8c c0x0000 (---------------) + I com + 0x002215c7, // n0x1c8d c0x0000 (---------------) + I defense + 0x00358006, // n0x1c8e c0x0000 (---------------) + I edunet + 0x002153c3, // n0x1c8f c0x0000 (---------------) + I ens + 0x0020e003, // n0x1c90 c0x0000 (---------------) + I fin + 0x00275003, // n0x1c91 c0x0000 (---------------) + I gov + 0x00202603, // n0x1c92 c0x0000 (---------------) + I ind + 0x0038a144, // n0x1c93 c0x0000 (---------------) + I info + 0x0035c284, // n0x1c94 c0x0000 (---------------) + I intl + 0x002d2d06, // n0x1c95 c0x0000 (---------------) + I mincom + 0x0025cec3, // n0x1c96 c0x0000 (---------------) + I nat + 0x0021d8c3, // n0x1c97 c0x0000 (---------------) + I net + 0x00229a83, // n0x1c98 c0x0000 (---------------) + I org + 0x003372c5, // n0x1c99 c0x0000 (---------------) + I perso + 0x00389984, // n0x1c9a c0x0000 (---------------) + I rnrt + 0x002a9743, // n0x1c9b c0x0000 (---------------) + I rns + 0x002096c3, // n0x1c9c c0x0000 (---------------) + I rnu + 0x002ba087, // n0x1c9d c0x0000 (---------------) + I tourism + 0x002ce685, // n0x1c9e c0x0000 (---------------) + I turen + 0x0022edc3, // n0x1c9f c0x0000 (---------------) + I com + 0x002349c3, // n0x1ca0 c0x0000 (---------------) + I edu + 0x00275003, // n0x1ca1 c0x0000 (---------------) + I gov + 0x00215b43, // n0x1ca2 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1ca3 c0x0000 (---------------) + I net + 0x00229a83, // n0x1ca4 c0x0000 (---------------) + I org + 0x00200602, // n0x1ca5 c0x0000 (---------------) + I av + 0x002c9743, // n0x1ca6 c0x0000 (---------------) + I bbs + 0x002b2843, // n0x1ca7 c0x0000 (---------------) + I bel + 0x0030a143, // n0x1ca8 c0x0000 (---------------) + I biz + 0x5162edc3, // n0x1ca9 c0x0145 (n0x1cba-n0x1cbb) + I com + 0x00204d42, // n0x1caa c0x0000 (---------------) + I dr + 0x002349c3, // n0x1cab c0x0000 (---------------) + I edu + 0x00206243, // n0x1cac c0x0000 (---------------) + I gen + 0x00275003, // n0x1cad c0x0000 (---------------) + I gov + 0x0038a144, // n0x1cae c0x0000 (---------------) + I info + 0x00324c03, // n0x1caf c0x0000 (---------------) + I k12 + 0x00308603, // n0x1cb0 c0x0000 (---------------) + I kep + 0x00215b43, // n0x1cb1 c0x0000 (---------------) + I mil + 0x0027ca84, // n0x1cb2 c0x0000 (---------------) + I name + 0x51a03402, // n0x1cb3 c0x0146 (n0x1cbb-n0x1cbc) + I nc + 0x0021d8c3, // n0x1cb4 c0x0000 (---------------) + I net + 0x00229a83, // n0x1cb5 c0x0000 (---------------) + I org + 0x002210c3, // n0x1cb6 c0x0000 (---------------) + I pol + 0x0022fb43, // n0x1cb7 c0x0000 (---------------) + I tel + 0x00206fc2, // n0x1cb8 c0x0000 (---------------) + I tv + 0x0021fa83, // n0x1cb9 c0x0000 (---------------) + I web + 0x000f5248, // n0x1cba c0x0000 (---------------) + blogspot + 0x00275003, // n0x1cbb c0x0000 (---------------) + I gov + 0x002bcb84, // n0x1cbc c0x0000 (---------------) + I aero + 0x0030a143, // n0x1cbd c0x0000 (---------------) + I biz + 0x00208182, // n0x1cbe c0x0000 (---------------) + I co + 0x0022edc3, // n0x1cbf c0x0000 (---------------) + I com + 0x00238284, // n0x1cc0 c0x0000 (---------------) + I coop + 0x002349c3, // n0x1cc1 c0x0000 (---------------) + I edu + 0x00275003, // n0x1cc2 c0x0000 (---------------) + I gov + 0x0038a144, // n0x1cc3 c0x0000 (---------------) + I info + 0x0026f683, // n0x1cc4 c0x0000 (---------------) + I int + 0x002cd804, // n0x1cc5 c0x0000 (---------------) + I jobs + 0x00207804, // n0x1cc6 c0x0000 (---------------) + I mobi + 0x002cc746, // n0x1cc7 c0x0000 (---------------) + I museum + 0x0027ca84, // n0x1cc8 c0x0000 (---------------) + I name + 0x0021d8c3, // n0x1cc9 c0x0000 (---------------) + I net + 0x00229a83, // n0x1cca c0x0000 (---------------) + I org + 0x00220283, // n0x1ccb c0x0000 (---------------) + I pro + 0x00293486, // n0x1ccc c0x0000 (---------------) + I travel + 0x0004e18b, // n0x1ccd c0x0000 (---------------) + better-than + 0x00011a06, // n0x1cce c0x0000 (---------------) + dyndns + 0x0001f8ca, // n0x1ccf c0x0000 (---------------) + on-the-web + 0x000f478a, // n0x1cd0 c0x0000 (---------------) + worse-than + 0x000f5248, // n0x1cd1 c0x0000 (---------------) + blogspot + 0x00202504, // n0x1cd2 c0x0000 (---------------) + I club + 0x0022edc3, // n0x1cd3 c0x0000 (---------------) + I com + 0x0030a104, // n0x1cd4 c0x0000 (---------------) + I ebiz + 0x002349c3, // n0x1cd5 c0x0000 (---------------) + I edu + 0x0029f084, // n0x1cd6 c0x0000 (---------------) + I game + 0x00275003, // n0x1cd7 c0x0000 (---------------) + I gov + 0x00306f03, // n0x1cd8 c0x0000 (---------------) + I idv + 0x00215b43, // n0x1cd9 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1cda c0x0000 (---------------) + I net + 0x00229a83, // n0x1cdb c0x0000 (---------------) + I org + 0x0031f50b, // n0x1cdc c0x0000 (---------------) + I xn--czrw28b + 0x0038f90a, // n0x1cdd c0x0000 (---------------) + I xn--uc0atv + 0x003a20cc, // n0x1cde c0x0000 (---------------) + I xn--zf0ao64a + 0x00205882, // n0x1cdf c0x0000 (---------------) + I ac + 0x00208182, // n0x1ce0 c0x0000 (---------------) + I co + 0x00208502, // n0x1ce1 c0x0000 (---------------) + I go + 0x0022fac5, // n0x1ce2 c0x0000 (---------------) + I hotel + 0x0038a144, // n0x1ce3 c0x0000 (---------------) + I info + 0x00202302, // n0x1ce4 c0x0000 (---------------) + I me + 0x00215b43, // n0x1ce5 c0x0000 (---------------) + I mil + 0x00207804, // n0x1ce6 c0x0000 (---------------) + I mobi + 0x00203282, // n0x1ce7 c0x0000 (---------------) + I ne + 0x00200282, // n0x1ce8 c0x0000 (---------------) + I or + 0x002024c2, // n0x1ce9 c0x0000 (---------------) + I sc + 0x00206fc2, // n0x1cea c0x0000 (---------------) + I tv + 0x0010a143, // n0x1ceb c0x0000 (---------------) + biz + 0x002a3949, // n0x1cec c0x0000 (---------------) + I cherkassy + 0x0026fbc8, // n0x1ced c0x0000 (---------------) + I cherkasy + 0x00274e89, // n0x1cee c0x0000 (---------------) + I chernigov + 0x0036b189, // n0x1cef c0x0000 (---------------) + I chernihiv + 0x00296fca, // n0x1cf0 c0x0000 (---------------) + I chernivtsi + 0x0036658a, // n0x1cf1 c0x0000 (---------------) + I chernovtsy + 0x00208e82, // n0x1cf2 c0x0000 (---------------) + I ck + 0x0021a142, // n0x1cf3 c0x0000 (---------------) + I cn + 0x00008182, // n0x1cf4 c0x0000 (---------------) + co + 0x0022edc3, // n0x1cf5 c0x0000 (---------------) + I com + 0x00211e82, // n0x1cf6 c0x0000 (---------------) + I cr + 0x0023f186, // n0x1cf7 c0x0000 (---------------) + I crimea + 0x0034f802, // n0x1cf8 c0x0000 (---------------) + I cv + 0x002083c2, // n0x1cf9 c0x0000 (---------------) + I dn + 0x00377d8e, // n0x1cfa c0x0000 (---------------) + I dnepropetrovsk + 0x0026b20e, // n0x1cfb c0x0000 (---------------) + I dnipropetrovsk + 0x00274d07, // n0x1cfc c0x0000 (---------------) + I dominic + 0x00310607, // n0x1cfd c0x0000 (---------------) + I donetsk + 0x002da802, // n0x1cfe c0x0000 (---------------) + I dp + 0x002349c3, // n0x1cff c0x0000 (---------------) + I edu + 0x00275003, // n0x1d00 c0x0000 (---------------) + I gov + 0x00200f02, // n0x1d01 c0x0000 (---------------) + I if + 0x002020c2, // n0x1d02 c0x0000 (---------------) + I in + 0x0023890f, // n0x1d03 c0x0000 (---------------) + I ivano-frankivsk + 0x00200a02, // n0x1d04 c0x0000 (---------------) + I kh + 0x00338dc7, // n0x1d05 c0x0000 (---------------) + I kharkiv + 0x00376907, // n0x1d06 c0x0000 (---------------) + I kharkov + 0x0022ef87, // n0x1d07 c0x0000 (---------------) + I kherson + 0x00238c8c, // n0x1d08 c0x0000 (---------------) + I khmelnitskiy + 0x0023ac0c, // n0x1d09 c0x0000 (---------------) + I khmelnytskyi + 0x00203144, // n0x1d0a c0x0000 (---------------) + I kiev + 0x0027614a, // n0x1d0b c0x0000 (---------------) + I kirovograd + 0x0022ccc2, // n0x1d0c c0x0000 (---------------) + I km + 0x002076c2, // n0x1d0d c0x0000 (---------------) + I kr + 0x002ab884, // n0x1d0e c0x0000 (---------------) + I krym + 0x00229bc2, // n0x1d0f c0x0000 (---------------) + I ks + 0x002b6542, // n0x1d10 c0x0000 (---------------) + I kv + 0x0023ae44, // n0x1d11 c0x0000 (---------------) + I kyiv + 0x00217282, // n0x1d12 c0x0000 (---------------) + I lg + 0x00208bc2, // n0x1d13 c0x0000 (---------------) + I lt + 0x00394507, // n0x1d14 c0x0000 (---------------) + I lugansk + 0x00338cc5, // n0x1d15 c0x0000 (---------------) + I lutsk + 0x00207302, // n0x1d16 c0x0000 (---------------) + I lv + 0x00238884, // n0x1d17 c0x0000 (---------------) + I lviv + 0x00365542, // n0x1d18 c0x0000 (---------------) + I mk + 0x003054c8, // n0x1d19 c0x0000 (---------------) + I mykolaiv + 0x0021d8c3, // n0x1d1a c0x0000 (---------------) + I net + 0x0020aac8, // n0x1d1b c0x0000 (---------------) + I nikolaev + 0x00200a82, // n0x1d1c c0x0000 (---------------) + I od + 0x00236385, // n0x1d1d c0x0000 (---------------) + I odesa + 0x0036f106, // n0x1d1e c0x0000 (---------------) + I odessa + 0x00229a83, // n0x1d1f c0x0000 (---------------) + I org + 0x00206582, // n0x1d20 c0x0000 (---------------) + I pl + 0x002d7e07, // n0x1d21 c0x0000 (---------------) + I poltava + 0x000099c2, // n0x1d22 c0x0000 (---------------) + pp + 0x002db285, // n0x1d23 c0x0000 (---------------) + I rivne + 0x00200cc5, // n0x1d24 c0x0000 (---------------) + I rovno + 0x00206a42, // n0x1d25 c0x0000 (---------------) + I rv + 0x00229a02, // n0x1d26 c0x0000 (---------------) + I sb + 0x00300bca, // n0x1d27 c0x0000 (---------------) + I sebastopol + 0x0024a08a, // n0x1d28 c0x0000 (---------------) + I sevastopol + 0x00215b02, // n0x1d29 c0x0000 (---------------) + I sm + 0x002f2c84, // n0x1d2a c0x0000 (---------------) + I sumy + 0x002012c2, // n0x1d2b c0x0000 (---------------) + I te + 0x00208fc8, // n0x1d2c c0x0000 (---------------) + I ternopil + 0x00211f02, // n0x1d2d c0x0000 (---------------) + I uz + 0x00294588, // n0x1d2e c0x0000 (---------------) + I uzhgorod + 0x002ebc47, // n0x1d2f c0x0000 (---------------) + I vinnica + 0x002ec4c9, // n0x1d30 c0x0000 (---------------) + I vinnytsia + 0x00200d42, // n0x1d31 c0x0000 (---------------) + I vn + 0x002f3105, // n0x1d32 c0x0000 (---------------) + I volyn + 0x00270085, // n0x1d33 c0x0000 (---------------) + I yalta + 0x002c010b, // n0x1d34 c0x0000 (---------------) + I zaporizhzhe + 0x002c0b4c, // n0x1d35 c0x0000 (---------------) + I zaporizhzhia + 0x0022b248, // n0x1d36 c0x0000 (---------------) + I zhitomir + 0x002f34c8, // n0x1d37 c0x0000 (---------------) + I zhytomyr + 0x00252242, // n0x1d38 c0x0000 (---------------) + I zp + 0x0020a3c2, // n0x1d39 c0x0000 (---------------) + I zt + 0x00205882, // n0x1d3a c0x0000 (---------------) + I ac + 0x000f5248, // n0x1d3b c0x0000 (---------------) + blogspot + 0x00208182, // n0x1d3c c0x0000 (---------------) + I co + 0x0022edc3, // n0x1d3d c0x0000 (---------------) + I com + 0x00208502, // n0x1d3e c0x0000 (---------------) + I go + 0x00203282, // n0x1d3f c0x0000 (---------------) + I ne + 0x00200282, // n0x1d40 c0x0000 (---------------) + I or + 0x00229a83, // n0x1d41 c0x0000 (---------------) + I org + 0x002024c2, // n0x1d42 c0x0000 (---------------) + I sc + 0x00205882, // n0x1d43 c0x0000 (---------------) + I ac + 0x53a08182, // n0x1d44 c0x014e (n0x1d4e-n0x1d4f) + I co + 0x53e75003, // n0x1d45 c0x014f (n0x1d4f-n0x1d50) + I gov + 0x00342703, // n0x1d46 c0x0000 (---------------) + I ltd + 0x00202302, // n0x1d47 c0x0000 (---------------) + I me + 0x0021d8c3, // n0x1d48 c0x0000 (---------------) + I net + 0x00207e83, // n0x1d49 c0x0000 (---------------) + I nhs + 0x00229a83, // n0x1d4a c0x0000 (---------------) + I org + 0x002d4b03, // n0x1d4b c0x0000 (---------------) + I plc + 0x002210c6, // n0x1d4c c0x0000 (---------------) + I police + 0x01615d43, // n0x1d4d c0x0005 (---------------)* o I sch + 0x000f5248, // n0x1d4e c0x0000 (---------------) + blogspot + 0x000069c7, // n0x1d4f c0x0000 (---------------) + service + 0x546009c2, // n0x1d50 c0x0151 (n0x1d8f-n0x1d92) + I ak + 0x54a001c2, // n0x1d51 c0x0152 (n0x1d92-n0x1d95) + I al + 0x54e011c2, // n0x1d52 c0x0153 (n0x1d95-n0x1d98) + I ar + 0x55202002, // n0x1d53 c0x0154 (n0x1d98-n0x1d9b) + I as + 0x55612502, // n0x1d54 c0x0155 (n0x1d9b-n0x1d9e) + I az + 0x55a00302, // n0x1d55 c0x0156 (n0x1d9e-n0x1da1) + I ca + 0x55e08182, // n0x1d56 c0x0157 (n0x1da1-n0x1da4) + I co + 0x5621e002, // n0x1d57 c0x0158 (n0x1da4-n0x1da7) + I ct + 0x5661d602, // n0x1d58 c0x0159 (n0x1da7-n0x1daa) + I dc + 0x56a00402, // n0x1d59 c0x015a (n0x1daa-n0x1dad) + I de + 0x0026b203, // n0x1d5a c0x0000 (---------------) + I dni + 0x00200383, // n0x1d5b c0x0000 (---------------) + I fed + 0x56e03802, // n0x1d5c c0x015b (n0x1dad-n0x1db0) + I fl + 0x572006c2, // n0x1d5d c0x015c (n0x1db0-n0x1db3) + I ga + 0x57605a82, // n0x1d5e c0x015d (n0x1db3-n0x1db6) + I gu + 0x57a02082, // n0x1d5f c0x015e (n0x1db6-n0x1db8) + I hi + 0x57e0e182, // n0x1d60 c0x015f (n0x1db8-n0x1dbb) + I ia + 0x58205d82, // n0x1d61 c0x0160 (n0x1dbb-n0x1dbe) + I id + 0x58602f82, // n0x1d62 c0x0161 (n0x1dbe-n0x1dc1) + I il + 0x58a020c2, // n0x1d63 c0x0162 (n0x1dc1-n0x1dc4) + I in + 0x000aa745, // n0x1d64 c0x0000 (---------------) + is-by + 0x00222783, // n0x1d65 c0x0000 (---------------) + I isa + 0x00283944, // n0x1d66 c0x0000 (---------------) + I kids + 0x58e29bc2, // n0x1d67 c0x0163 (n0x1dc4-n0x1dc7) + I ks + 0x5923ae42, // n0x1d68 c0x0164 (n0x1dc7-n0x1dca) + I ky + 0x59603842, // n0x1d69 c0x0165 (n0x1dca-n0x1dcd) + I la + 0x0007b84b, // n0x1d6a c0x0000 (---------------) + land-4-sale + 0x59a00182, // n0x1d6b c0x0166 (n0x1dcd-n0x1dd0) + I ma + 0x5a247ac2, // n0x1d6c c0x0168 (n0x1dd3-n0x1dd6) + I md + 0x5a602302, // n0x1d6d c0x0169 (n0x1dd6-n0x1dd9) + I me + 0x5aa0e5c2, // n0x1d6e c0x016a (n0x1dd9-n0x1ddc) + I mi + 0x5ae1d882, // n0x1d6f c0x016b (n0x1ddc-n0x1ddf) + I mn + 0x5b203ec2, // n0x1d70 c0x016c (n0x1ddf-n0x1de2) + I mo + 0x5b602482, // n0x1d71 c0x016d (n0x1de2-n0x1de5) + I ms + 0x5ba35702, // n0x1d72 c0x016e (n0x1de5-n0x1de8) + I mt + 0x5be03402, // n0x1d73 c0x016f (n0x1de8-n0x1deb) + I nc + 0x5c202642, // n0x1d74 c0x0170 (n0x1deb-n0x1ded) + I nd + 0x5c603282, // n0x1d75 c0x0171 (n0x1ded-n0x1df0) + I ne + 0x5ca07e82, // n0x1d76 c0x0172 (n0x1df0-n0x1df3) + I nh + 0x5ce01802, // n0x1d77 c0x0173 (n0x1df3-n0x1df6) + I nj + 0x5d22dc02, // n0x1d78 c0x0174 (n0x1df6-n0x1df9) + I nm + 0x0035d983, // n0x1d79 c0x0000 (---------------) + I nsn + 0x5d6021c2, // n0x1d7a c0x0175 (n0x1df9-n0x1dfc) + I nv + 0x5da18f82, // n0x1d7b c0x0176 (n0x1dfc-n0x1dff) + I ny + 0x5de059c2, // n0x1d7c c0x0177 (n0x1dff-n0x1e02) + I oh + 0x5e20bbc2, // n0x1d7d c0x0178 (n0x1e02-n0x1e05) + I ok + 0x5e600282, // n0x1d7e c0x0179 (n0x1e05-n0x1e08) + I or + 0x5ea0ec42, // n0x1d7f c0x017a (n0x1e08-n0x1e0b) + I pa + 0x5ee04382, // n0x1d80 c0x017b (n0x1e0b-n0x1e0e) + I pr + 0x5f201702, // n0x1d81 c0x017c (n0x1e0e-n0x1e11) + I ri + 0x5f6024c2, // n0x1d82 c0x017d (n0x1e11-n0x1e14) + I sc + 0x5fa56ec2, // n0x1d83 c0x017e (n0x1e14-n0x1e16) + I sd + 0x000e160c, // n0x1d84 c0x0000 (---------------) + stuff-4-sale + 0x5fe00942, // n0x1d85 c0x017f (n0x1e16-n0x1e19) + I tn + 0x6026bb42, // n0x1d86 c0x0180 (n0x1e19-n0x1e1c) + I tx + 0x60601f82, // n0x1d87 c0x0181 (n0x1e1c-n0x1e1f) + I ut + 0x60a000c2, // n0x1d88 c0x0182 (n0x1e1f-n0x1e22) + I va + 0x60e00642, // n0x1d89 c0x0183 (n0x1e22-n0x1e25) + I vi + 0x61255c42, // n0x1d8a c0x0184 (n0x1e25-n0x1e28) + I vt + 0x616010c2, // n0x1d8b c0x0185 (n0x1e28-n0x1e2b) + I wa + 0x61a02e42, // n0x1d8c c0x0186 (n0x1e2b-n0x1e2e) + I wi + 0x61e6e502, // n0x1d8d c0x0187 (n0x1e2e-n0x1e2f) + I wv + 0x6225d682, // n0x1d8e c0x0188 (n0x1e2f-n0x1e32) + I wy + 0x0021db82, // n0x1d8f c0x0000 (---------------) + I cc + 0x00324c03, // n0x1d90 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1d91 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1d92 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1d93 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1d94 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1d95 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1d96 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1d97 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1d98 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1d99 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1d9a c0x0000 (---------------) + I lib + 0x0021db82, // n0x1d9b c0x0000 (---------------) + I cc + 0x00324c03, // n0x1d9c c0x0000 (---------------) + I k12 + 0x00265503, // n0x1d9d c0x0000 (---------------) + I lib + 0x0021db82, // n0x1d9e c0x0000 (---------------) + I cc + 0x00324c03, // n0x1d9f c0x0000 (---------------) + I k12 + 0x00265503, // n0x1da0 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1da1 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1da2 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1da3 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1da4 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1da5 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1da6 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1da7 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1da8 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1da9 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1daa c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dab c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dac c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dad c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dae c0x0000 (---------------) + I k12 + 0x00265503, // n0x1daf c0x0000 (---------------) + I lib + 0x0021db82, // n0x1db0 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1db1 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1db2 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1db3 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1db4 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1db5 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1db6 c0x0000 (---------------) + I cc + 0x00265503, // n0x1db7 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1db8 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1db9 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dba c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dbb c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dbc c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dbd c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dbe c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dbf c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dc0 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dc1 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dc2 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dc3 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dc4 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dc5 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dc6 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dc7 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dc8 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dc9 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dca c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dcb c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dcc c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dcd c0x0000 (---------------) + I cc + 0x59f24c03, // n0x1dce c0x0167 (n0x1dd0-n0x1dd3) + I k12 + 0x00265503, // n0x1dcf c0x0000 (---------------) + I lib + 0x003120c4, // n0x1dd0 c0x0000 (---------------) + I chtr + 0x0026fac6, // n0x1dd1 c0x0000 (---------------) + I paroch + 0x002def03, // n0x1dd2 c0x0000 (---------------) + I pvt + 0x0021db82, // n0x1dd3 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dd4 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dd5 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dd6 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dd7 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dd8 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dd9 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dda c0x0000 (---------------) + I k12 + 0x00265503, // n0x1ddb c0x0000 (---------------) + I lib + 0x0021db82, // n0x1ddc c0x0000 (---------------) + I cc + 0x00324c03, // n0x1ddd c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dde c0x0000 (---------------) + I lib + 0x0021db82, // n0x1ddf c0x0000 (---------------) + I cc + 0x00324c03, // n0x1de0 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1de1 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1de2 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1de3 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1de4 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1de5 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1de6 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1de7 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1de8 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1de9 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dea c0x0000 (---------------) + I lib + 0x0021db82, // n0x1deb c0x0000 (---------------) + I cc + 0x00265503, // n0x1dec c0x0000 (---------------) + I lib + 0x0021db82, // n0x1ded c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dee c0x0000 (---------------) + I k12 + 0x00265503, // n0x1def c0x0000 (---------------) + I lib + 0x0021db82, // n0x1df0 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1df1 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1df2 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1df3 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1df4 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1df5 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1df6 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1df7 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1df8 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1df9 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dfa c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dfb c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dfc c0x0000 (---------------) + I cc + 0x00324c03, // n0x1dfd c0x0000 (---------------) + I k12 + 0x00265503, // n0x1dfe c0x0000 (---------------) + I lib + 0x0021db82, // n0x1dff c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e00 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e01 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e02 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e03 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e04 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e05 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e06 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e07 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e08 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e09 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e0a c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e0b c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e0c c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e0d c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e0e c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e0f c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e10 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e11 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e12 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e13 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e14 c0x0000 (---------------) + I cc + 0x00265503, // n0x1e15 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e16 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e17 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e18 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e19 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e1a c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e1b c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e1c c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e1d c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e1e c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e1f c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e20 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e21 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e22 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e23 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e24 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e25 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e26 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e27 c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e28 c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e29 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e2a c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e2b c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e2c c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e2d c0x0000 (---------------) + I lib + 0x0021db82, // n0x1e2e c0x0000 (---------------) + I cc + 0x0021db82, // n0x1e2f c0x0000 (---------------) + I cc + 0x00324c03, // n0x1e30 c0x0000 (---------------) + I k12 + 0x00265503, // n0x1e31 c0x0000 (---------------) + I lib + 0x62a2edc3, // n0x1e32 c0x018a (n0x1e38-n0x1e39) + I com + 0x002349c3, // n0x1e33 c0x0000 (---------------) + I edu + 0x0024d643, // n0x1e34 c0x0000 (---------------) + I gub + 0x00215b43, // n0x1e35 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1e36 c0x0000 (---------------) + I net + 0x00229a83, // n0x1e37 c0x0000 (---------------) + I org + 0x000f5248, // n0x1e38 c0x0000 (---------------) + blogspot + 0x00208182, // n0x1e39 c0x0000 (---------------) + I co + 0x0022edc3, // n0x1e3a c0x0000 (---------------) + I com + 0x0021d8c3, // n0x1e3b c0x0000 (---------------) + I net + 0x00229a83, // n0x1e3c c0x0000 (---------------) + I org + 0x0022edc3, // n0x1e3d c0x0000 (---------------) + I com + 0x002349c3, // n0x1e3e c0x0000 (---------------) + I edu + 0x00275003, // n0x1e3f c0x0000 (---------------) + I gov + 0x00215b43, // n0x1e40 c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1e41 c0x0000 (---------------) + I net + 0x00229a83, // n0x1e42 c0x0000 (---------------) + I org + 0x00243984, // n0x1e43 c0x0000 (---------------) + I arts + 0x00208182, // n0x1e44 c0x0000 (---------------) + I co + 0x0022edc3, // n0x1e45 c0x0000 (---------------) + I com + 0x0022dec3, // n0x1e46 c0x0000 (---------------) + I e12 + 0x002349c3, // n0x1e47 c0x0000 (---------------) + I edu + 0x00247a04, // n0x1e48 c0x0000 (---------------) + I firm + 0x00209f03, // n0x1e49 c0x0000 (---------------) + I gob + 0x00275003, // n0x1e4a c0x0000 (---------------) + I gov + 0x0038a144, // n0x1e4b c0x0000 (---------------) + I info + 0x0026f683, // n0x1e4c c0x0000 (---------------) + I int + 0x00215b43, // n0x1e4d c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1e4e c0x0000 (---------------) + I net + 0x00229a83, // n0x1e4f c0x0000 (---------------) + I org + 0x00226f03, // n0x1e50 c0x0000 (---------------) + I rec + 0x0038c985, // n0x1e51 c0x0000 (---------------) + I store + 0x002a3c43, // n0x1e52 c0x0000 (---------------) + I tec + 0x0021fa83, // n0x1e53 c0x0000 (---------------) + I web + 0x00208182, // n0x1e54 c0x0000 (---------------) + I co + 0x0022edc3, // n0x1e55 c0x0000 (---------------) + I com + 0x00324c03, // n0x1e56 c0x0000 (---------------) + I k12 + 0x0021d8c3, // n0x1e57 c0x0000 (---------------) + I net + 0x00229a83, // n0x1e58 c0x0000 (---------------) + I org + 0x00205882, // n0x1e59 c0x0000 (---------------) + I ac + 0x0030a143, // n0x1e5a c0x0000 (---------------) + I biz + 0x000f5248, // n0x1e5b c0x0000 (---------------) + blogspot + 0x0022edc3, // n0x1e5c c0x0000 (---------------) + I com + 0x002349c3, // n0x1e5d c0x0000 (---------------) + I edu + 0x00275003, // n0x1e5e c0x0000 (---------------) + I gov + 0x002a51c6, // n0x1e5f c0x0000 (---------------) + I health + 0x0038a144, // n0x1e60 c0x0000 (---------------) + I info + 0x0026f683, // n0x1e61 c0x0000 (---------------) + I int + 0x0027ca84, // n0x1e62 c0x0000 (---------------) + I name + 0x0021d8c3, // n0x1e63 c0x0000 (---------------) + I net + 0x00229a83, // n0x1e64 c0x0000 (---------------) + I org + 0x00220283, // n0x1e65 c0x0000 (---------------) + I pro + 0x0022edc3, // n0x1e66 c0x0000 (---------------) + I com + 0x002349c3, // n0x1e67 c0x0000 (---------------) + I edu + 0x0021d8c3, // n0x1e68 c0x0000 (---------------) + I net + 0x00229a83, // n0x1e69 c0x0000 (---------------) + I org + 0x0022edc3, // n0x1e6a c0x0000 (---------------) + I com + 0x00011a06, // n0x1e6b c0x0000 (---------------) + dyndns + 0x002349c3, // n0x1e6c c0x0000 (---------------) + I edu + 0x00275003, // n0x1e6d c0x0000 (---------------) + I gov + 0x000f2d06, // n0x1e6e c0x0000 (---------------) + mypets + 0x0021d8c3, // n0x1e6f c0x0000 (---------------) + I net + 0x00229a83, // n0x1e70 c0x0000 (---------------) + I org + 0x00303f08, // n0x1e71 c0x0000 (---------------) + I xn--80au + 0x0030b909, // n0x1e72 c0x0000 (---------------) + I xn--90azh + 0x00318289, // n0x1e73 c0x0000 (---------------) + I xn--c1avg + 0x00325088, // n0x1e74 c0x0000 (---------------) + I xn--d1at + 0x003710c8, // n0x1e75 c0x0000 (---------------) + I xn--o1ac + 0x003710c9, // n0x1e76 c0x0000 (---------------) + I xn--o1ach + 0x00205882, // n0x1e77 c0x0000 (---------------) + I ac + 0x00379506, // n0x1e78 c0x0000 (---------------) + I agrica + 0x00209243, // n0x1e79 c0x0000 (---------------) + I alt + 0x65208182, // n0x1e7a c0x0194 (n0x1e88-n0x1e89) + I co + 0x002349c3, // n0x1e7b c0x0000 (---------------) + I edu + 0x00275003, // n0x1e7c c0x0000 (---------------) + I gov + 0x002a6f87, // n0x1e7d c0x0000 (---------------) + I grondar + 0x00209183, // n0x1e7e c0x0000 (---------------) + I law + 0x00215b43, // n0x1e7f c0x0000 (---------------) + I mil + 0x0021d8c3, // n0x1e80 c0x0000 (---------------) + I net + 0x002084c3, // n0x1e81 c0x0000 (---------------) + I ngo + 0x002123c3, // n0x1e82 c0x0000 (---------------) + I nis + 0x0020e543, // n0x1e83 c0x0000 (---------------) + I nom + 0x00229a83, // n0x1e84 c0x0000 (---------------) + I org + 0x00231d06, // n0x1e85 c0x0000 (---------------) + I school + 0x00200142, // n0x1e86 c0x0000 (---------------) + I tm + 0x0021fa83, // n0x1e87 c0x0000 (---------------) + I web + 0x000f5248, // n0x1e88 c0x0000 (---------------) + blogspot } // children is the list of nodes' children, the parent's wildcard bit and the @@ -8084,409 +8300,409 @@ var children = [...]uint32{ 0x40000000, // c0x0003 (---------------)* + 0x50000000, // c0x0004 (---------------)* ! 0x60000000, // c0x0005 (---------------)* o - 0x014fc539, // c0x0006 (n0x0539-n0x053f) + - 0x0150053f, // c0x0007 (n0x053f-n0x0540) + - 0x01520540, // c0x0008 (n0x0540-n0x0548) + - 0x01684548, // c0x0009 (n0x0548-n0x05a1) + - 0x016985a1, // c0x000a (n0x05a1-n0x05a6) + - 0x016ac5a6, // c0x000b (n0x05a6-n0x05ab) + - 0x016bc5ab, // c0x000c (n0x05ab-n0x05af) + - 0x016d85af, // c0x000d (n0x05af-n0x05b6) + - 0x016dc5b6, // c0x000e (n0x05b6-n0x05b7) + - 0x016ec5b7, // c0x000f (n0x05b7-n0x05bb) + - 0x017045bb, // c0x0010 (n0x05bb-n0x05c1) + - 0x017285c1, // c0x0011 (n0x05c1-n0x05ca) + - 0x0172c5ca, // c0x0012 (n0x05ca-n0x05cb) + - 0x017445cb, // c0x0013 (n0x05cb-n0x05d1) + - 0x017485d1, // c0x0014 (n0x05d1-n0x05d2) + - 0x017645d2, // c0x0015 (n0x05d2-n0x05d9) + - 0x017685d9, // c0x0016 (n0x05d9-n0x05da) + - 0x017b05da, // c0x0017 (n0x05da-n0x05ec) + - 0x017b45ec, // c0x0018 (n0x05ec-n0x05ed) + - 0x017d45ed, // c0x0019 (n0x05ed-n0x05f5) + - 0x017e85f5, // c0x001a (n0x05f5-n0x05fa) + - 0x017ec5fa, // c0x001b (n0x05fa-n0x05fb) + - 0x0181c5fb, // c0x001c (n0x05fb-n0x0607) + - 0x01848607, // c0x001d (n0x0607-n0x0612) + - 0x01870612, // c0x001e (n0x0612-n0x061c) + - 0x0187861c, // c0x001f (n0x061c-n0x061e) + - 0x0187c61e, // c0x0020 (n0x061e-n0x061f) + - 0x0191061f, // c0x0021 (n0x061f-n0x0644) + - 0x01924644, // c0x0022 (n0x0644-n0x0649) + - 0x01938649, // c0x0023 (n0x0649-n0x064e) + - 0x0195464e, // c0x0024 (n0x064e-n0x0655) + - 0x01964655, // c0x0025 (n0x0655-n0x0659) + - 0x01978659, // c0x0026 (n0x0659-n0x065e) + - 0x0199c65e, // c0x0027 (n0x065e-n0x0667) + - 0x01ab4667, // c0x0028 (n0x0667-n0x06ad) + - 0x01ab86ad, // c0x0029 (n0x06ad-n0x06ae) + - 0x01acc6ae, // c0x002a (n0x06ae-n0x06b3) + - 0x01ae06b3, // c0x002b (n0x06b3-n0x06b8) + - 0x01ae86b8, // c0x002c (n0x06b8-n0x06ba) + - 0x01af86ba, // c0x002d (n0x06ba-n0x06be) + - 0x01afc6be, // c0x002e (n0x06be-n0x06bf) + - 0x01b146bf, // c0x002f (n0x06bf-n0x06c5) + - 0x01b586c5, // c0x0030 (n0x06c5-n0x06d6) + - 0x01b686d6, // c0x0031 (n0x06d6-n0x06da) + - 0x01b6c6da, // c0x0032 (n0x06da-n0x06db) + - 0x01b706db, // c0x0033 (n0x06db-n0x06dc) + - 0x01b746dc, // c0x0034 (n0x06dc-n0x06dd) + - 0x01bb06dd, // c0x0035 (n0x06dd-n0x06ec) + - 0x61bb46ec, // c0x0036 (n0x06ec-n0x06ed)* o - 0x01bc86ed, // c0x0037 (n0x06ed-n0x06f2) + - 0x01bd86f2, // c0x0038 (n0x06f2-n0x06f6) + - 0x01c8c6f6, // c0x0039 (n0x06f6-n0x0723) + - 0x21c90723, // c0x003a (n0x0723-n0x0724) o - 0x01c94724, // c0x003b (n0x0724-n0x0725) + - 0x01c98725, // c0x003c (n0x0725-n0x0726) + - 0x21c9c726, // c0x003d (n0x0726-n0x0727) o - 0x21ca0727, // c0x003e (n0x0727-n0x0728) o - 0x01cd4728, // c0x003f (n0x0728-n0x0735) + - 0x01cd8735, // c0x0040 (n0x0735-n0x0736) + - 0x01ffc736, // c0x0041 (n0x0736-n0x07ff) + - 0x220447ff, // c0x0042 (n0x07ff-n0x0811) o - 0x02068811, // c0x0043 (n0x0811-n0x081a) + - 0x0207081a, // c0x0044 (n0x081a-n0x081c) + - 0x2207481c, // c0x0045 (n0x081c-n0x081d) o - 0x0209081d, // c0x0046 (n0x081d-n0x0824) + - 0x020a8824, // c0x0047 (n0x0824-n0x082a) + - 0x020ac82a, // c0x0048 (n0x082a-n0x082b) + - 0x020bc82b, // c0x0049 (n0x082b-n0x082f) + - 0x020c482f, // c0x004a (n0x082f-n0x0831) + - 0x220f8831, // c0x004b (n0x0831-n0x083e) o - 0x020fc83e, // c0x004c (n0x083e-n0x083f) + - 0x0210083f, // c0x004d (n0x083f-n0x0840) + - 0x02120840, // c0x004e (n0x0840-n0x0848) + - 0x02124848, // c0x004f (n0x0848-n0x0849) + - 0x02138849, // c0x0050 (n0x0849-n0x084e) + - 0x0216084e, // c0x0051 (n0x084e-n0x0858) + - 0x02180858, // c0x0052 (n0x0858-n0x0860) + - 0x021b0860, // c0x0053 (n0x0860-n0x086c) + - 0x021d886c, // c0x0054 (n0x086c-n0x0876) + - 0x021dc876, // c0x0055 (n0x0876-n0x0877) + - 0x02200877, // c0x0056 (n0x0877-n0x0880) + - 0x02204880, // c0x0057 (n0x0880-n0x0881) + - 0x02218881, // c0x0058 (n0x0881-n0x0886) + - 0x0221c886, // c0x0059 (n0x0886-n0x0887) + - 0x0223c887, // c0x005a (n0x0887-n0x088f) + - 0x0224888f, // c0x005b (n0x088f-n0x0892) + - 0x022a8892, // c0x005c (n0x0892-n0x08aa) + - 0x022c48aa, // c0x005d (n0x08aa-n0x08b1) + - 0x022d08b1, // c0x005e (n0x08b1-n0x08b4) + - 0x022e48b4, // c0x005f (n0x08b4-n0x08b9) + - 0x022fc8b9, // c0x0060 (n0x08b9-n0x08bf) + - 0x023108bf, // c0x0061 (n0x08bf-n0x08c4) + - 0x023288c4, // c0x0062 (n0x08c4-n0x08ca) + - 0x023408ca, // c0x0063 (n0x08ca-n0x08d0) + - 0x023588d0, // c0x0064 (n0x08d0-n0x08d6) + - 0x023748d6, // c0x0065 (n0x08d6-n0x08dd) + - 0x023808dd, // c0x0066 (n0x08dd-n0x08e0) + - 0x023e08e0, // c0x0067 (n0x08e0-n0x08f8) + - 0x023f88f8, // c0x0068 (n0x08f8-n0x08fe) + - 0x0240c8fe, // c0x0069 (n0x08fe-n0x0903) + - 0x02450903, // c0x006a (n0x0903-n0x0914) + - 0x024d0914, // c0x006b (n0x0914-n0x0934) + - 0x024fc934, // c0x006c (n0x0934-n0x093f) + - 0x0250093f, // c0x006d (n0x093f-n0x0940) + - 0x02508940, // c0x006e (n0x0940-n0x0942) + - 0x6250c942, // c0x006f (n0x0942-n0x0943)* o - 0x22510943, // c0x0070 (n0x0943-n0x0944) o - 0x0252c944, // c0x0071 (n0x0944-n0x094b) + - 0x0253494b, // c0x0072 (n0x094b-n0x094d) + - 0x0256894d, // c0x0073 (n0x094d-n0x095a) + - 0x0259095a, // c0x0074 (n0x095a-n0x0964) + - 0x02594964, // c0x0075 (n0x0964-n0x0965) + - 0x025a0965, // c0x0076 (n0x0965-n0x0968) + - 0x025b8968, // c0x0077 (n0x0968-n0x096e) + - 0x025dc96e, // c0x0078 (n0x096e-n0x0977) + - 0x025fc977, // c0x0079 (n0x0977-n0x097f) + - 0x02bc097f, // c0x007a (n0x097f-n0x0af0) + - 0x02bccaf0, // c0x007b (n0x0af0-n0x0af3) + - 0x02becaf3, // c0x007c (n0x0af3-n0x0afb) + - 0x02da8afb, // c0x007d (n0x0afb-n0x0b6a) + - 0x02e78b6a, // c0x007e (n0x0b6a-n0x0b9e) + - 0x02ee8b9e, // c0x007f (n0x0b9e-n0x0bba) + - 0x02f40bba, // c0x0080 (n0x0bba-n0x0bd0) + - 0x03028bd0, // c0x0081 (n0x0bd0-n0x0c0a) + - 0x03080c0a, // c0x0082 (n0x0c0a-n0x0c20) + - 0x030bcc20, // c0x0083 (n0x0c20-n0x0c2f) + - 0x031b8c2f, // c0x0084 (n0x0c2f-n0x0c6e) + - 0x03284c6e, // c0x0085 (n0x0c6e-n0x0ca1) + - 0x0331cca1, // c0x0086 (n0x0ca1-n0x0cc7) + - 0x033accc7, // c0x0087 (n0x0cc7-n0x0ceb) + - 0x03410ceb, // c0x0088 (n0x0ceb-n0x0d04) + - 0x03648d04, // c0x0089 (n0x0d04-n0x0d92) + - 0x03700d92, // c0x008a (n0x0d92-n0x0dc0) + - 0x037ccdc0, // c0x008b (n0x0dc0-n0x0df3) + - 0x03818df3, // c0x008c (n0x0df3-n0x0e06) + - 0x038a0e06, // c0x008d (n0x0e06-n0x0e28) + - 0x038dce28, // c0x008e (n0x0e28-n0x0e37) + - 0x0392ce37, // c0x008f (n0x0e37-n0x0e4b) + - 0x039a4e4b, // c0x0090 (n0x0e4b-n0x0e69) + - 0x639a8e69, // c0x0091 (n0x0e69-n0x0e6a)* o - 0x639ace6a, // c0x0092 (n0x0e6a-n0x0e6b)* o - 0x639b0e6b, // c0x0093 (n0x0e6b-n0x0e6c)* o - 0x03a2ce6c, // c0x0094 (n0x0e6c-n0x0e8b) + - 0x03a94e8b, // c0x0095 (n0x0e8b-n0x0ea5) + - 0x03b10ea5, // c0x0096 (n0x0ea5-n0x0ec4) + - 0x03b88ec4, // c0x0097 (n0x0ec4-n0x0ee2) + - 0x03c0cee2, // c0x0098 (n0x0ee2-n0x0f03) + - 0x03c78f03, // c0x0099 (n0x0f03-n0x0f1e) + - 0x03da4f1e, // c0x009a (n0x0f1e-n0x0f69) + - 0x03dfcf69, // c0x009b (n0x0f69-n0x0f7f) + - 0x63e00f7f, // c0x009c (n0x0f7f-n0x0f80)* o - 0x03e98f80, // c0x009d (n0x0f80-n0x0fa6) + - 0x03f20fa6, // c0x009e (n0x0fa6-n0x0fc8) + - 0x03f6cfc8, // c0x009f (n0x0fc8-n0x0fdb) + - 0x03fd4fdb, // c0x00a0 (n0x0fdb-n0x0ff5) + - 0x0407cff5, // c0x00a1 (n0x0ff5-n0x101f) + - 0x0414501f, // c0x00a2 (n0x101f-n0x1051) + - 0x041ad051, // c0x00a3 (n0x1051-n0x106b) + - 0x042c106b, // c0x00a4 (n0x106b-n0x10b0) + - 0x642c50b0, // c0x00a5 (n0x10b0-n0x10b1)* o - 0x642c90b1, // c0x00a6 (n0x10b1-n0x10b2)* o - 0x043250b2, // c0x00a7 (n0x10b2-n0x10c9) + - 0x043810c9, // c0x00a8 (n0x10c9-n0x10e0) + - 0x044110e0, // c0x00a9 (n0x10e0-n0x1104) + - 0x0448d104, // c0x00aa (n0x1104-n0x1123) + - 0x044d1123, // c0x00ab (n0x1123-n0x1134) + - 0x045b5134, // c0x00ac (n0x1134-n0x116d) + - 0x045e916d, // c0x00ad (n0x116d-n0x117a) + - 0x0464917a, // c0x00ae (n0x117a-n0x1192) + - 0x046bd192, // c0x00af (n0x1192-n0x11af) + - 0x047451af, // c0x00b0 (n0x11af-n0x11d1) + - 0x047851d1, // c0x00b1 (n0x11d1-n0x11e1) + - 0x047f51e1, // c0x00b2 (n0x11e1-n0x11fd) + - 0x647f91fd, // c0x00b3 (n0x11fd-n0x11fe)* o - 0x647fd1fe, // c0x00b4 (n0x11fe-n0x11ff)* o - 0x248011ff, // c0x00b5 (n0x11ff-n0x1200) o - 0x04819200, // c0x00b6 (n0x1200-n0x1206) + - 0x04835206, // c0x00b7 (n0x1206-n0x120d) + - 0x0487920d, // c0x00b8 (n0x120d-n0x121e) + - 0x0488921e, // c0x00b9 (n0x121e-n0x1222) + - 0x048a1222, // c0x00ba (n0x1222-n0x1228) + - 0x04919228, // c0x00bb (n0x1228-n0x1246) + - 0x0492d246, // c0x00bc (n0x1246-n0x124b) + - 0x0494524b, // c0x00bd (n0x124b-n0x1251) + - 0x04969251, // c0x00be (n0x1251-n0x125a) + - 0x0497d25a, // c0x00bf (n0x125a-n0x125f) + - 0x0499525f, // c0x00c0 (n0x125f-n0x1265) + - 0x04999265, // c0x00c1 (n0x1265-n0x1266) + - 0x049d5266, // c0x00c2 (n0x1266-n0x1275) + - 0x049e9275, // c0x00c3 (n0x1275-n0x127a) + - 0x049f127a, // c0x00c4 (n0x127a-n0x127c) + - 0x049f927c, // c0x00c5 (n0x127c-n0x127e) + - 0x049fd27e, // c0x00c6 (n0x127e-n0x127f) + - 0x04a2127f, // c0x00c7 (n0x127f-n0x1288) + - 0x04a45288, // c0x00c8 (n0x1288-n0x1291) + - 0x04a5d291, // c0x00c9 (n0x1291-n0x1297) + - 0x04a65297, // c0x00ca (n0x1297-n0x1299) + - 0x04a69299, // c0x00cb (n0x1299-n0x129a) + - 0x04a8929a, // c0x00cc (n0x129a-n0x12a2) + - 0x04aa92a2, // c0x00cd (n0x12a2-n0x12aa) + - 0x04ac92aa, // c0x00ce (n0x12aa-n0x12b2) + - 0x04ae52b2, // c0x00cf (n0x12b2-n0x12b9) + - 0x04af52b9, // c0x00d0 (n0x12b9-n0x12bd) + - 0x04b092bd, // c0x00d1 (n0x12bd-n0x12c2) + - 0x04b112c2, // c0x00d2 (n0x12c2-n0x12c4) + - 0x04b252c4, // c0x00d3 (n0x12c4-n0x12c9) + - 0x04b352c9, // c0x00d4 (n0x12c9-n0x12cd) + - 0x04b392cd, // c0x00d5 (n0x12cd-n0x12ce) + - 0x04b552ce, // c0x00d6 (n0x12ce-n0x12d5) + - 0x053e52d5, // c0x00d7 (n0x12d5-n0x14f9) + - 0x0541d4f9, // c0x00d8 (n0x14f9-n0x1507) + - 0x05449507, // c0x00d9 (n0x1507-n0x1512) + - 0x05461512, // c0x00da (n0x1512-n0x1518) + - 0x05481518, // c0x00db (n0x1518-n0x1520) + - 0x65485520, // c0x00dc (n0x1520-n0x1521)* o - 0x054c9521, // c0x00dd (n0x1521-n0x1532) + - 0x054d1532, // c0x00de (n0x1532-n0x1534) + - 0x254d5534, // c0x00df (n0x1534-n0x1535) o - 0x254d9535, // c0x00e0 (n0x1535-n0x1536) o - 0x054dd536, // c0x00e1 (n0x1536-n0x1537) + - 0x055a1537, // c0x00e2 (n0x1537-n0x1568) + - 0x255a5568, // c0x00e3 (n0x1568-n0x1569) o - 0x255ad569, // c0x00e4 (n0x1569-n0x156b) o - 0x255b556b, // c0x00e5 (n0x156b-n0x156d) o - 0x255c156d, // c0x00e6 (n0x156d-n0x1570) o - 0x055e9570, // c0x00e7 (n0x1570-n0x157a) + - 0x0560d57a, // c0x00e8 (n0x157a-n0x1583) + - 0x05611583, // c0x00e9 (n0x1583-n0x1584) + - 0x0561d584, // c0x00ea (n0x1584-n0x1587) + - 0x06175587, // c0x00eb (n0x1587-n0x185d) + - 0x0617985d, // c0x00ec (n0x185d-n0x185e) + - 0x0617d85e, // c0x00ed (n0x185e-n0x185f) + - 0x2618185f, // c0x00ee (n0x185f-n0x1860) o - 0x06185860, // c0x00ef (n0x1860-n0x1861) + - 0x26189861, // c0x00f0 (n0x1861-n0x1862) o - 0x0618d862, // c0x00f1 (n0x1862-n0x1863) + - 0x26199863, // c0x00f2 (n0x1863-n0x1866) o - 0x0619d866, // c0x00f3 (n0x1866-n0x1867) + - 0x061a1867, // c0x00f4 (n0x1867-n0x1868) + - 0x261a5868, // c0x00f5 (n0x1868-n0x1869) o - 0x061a9869, // c0x00f6 (n0x1869-n0x186a) + - 0x261b186a, // c0x00f7 (n0x186a-n0x186c) o - 0x061b586c, // c0x00f8 (n0x186c-n0x186d) + - 0x061b986d, // c0x00f9 (n0x186d-n0x186e) + - 0x261c986e, // c0x00fa (n0x186e-n0x1872) o - 0x061cd872, // c0x00fb (n0x1872-n0x1873) + - 0x061d1873, // c0x00fc (n0x1873-n0x1874) + - 0x061d5874, // c0x00fd (n0x1874-n0x1875) + - 0x061d9875, // c0x00fe (n0x1875-n0x1876) + - 0x261dd876, // c0x00ff (n0x1876-n0x1877) o - 0x061e1877, // c0x0100 (n0x1877-n0x1878) + - 0x061e5878, // c0x0101 (n0x1878-n0x1879) + - 0x061e9879, // c0x0102 (n0x1879-n0x187a) + - 0x061ed87a, // c0x0103 (n0x187a-n0x187b) + - 0x261f587b, // c0x0104 (n0x187b-n0x187d) o - 0x061f987d, // c0x0105 (n0x187d-n0x187e) + - 0x061fd87e, // c0x0106 (n0x187e-n0x187f) + - 0x0620187f, // c0x0107 (n0x187f-n0x1880) + - 0x26205880, // c0x0108 (n0x1880-n0x1881) o - 0x06209881, // c0x0109 (n0x1881-n0x1882) + - 0x26211882, // c0x010a (n0x1882-n0x1884) o - 0x26215884, // c0x010b (n0x1884-n0x1885) o - 0x06231885, // c0x010c (n0x1885-n0x188c) + - 0x0623d88c, // c0x010d (n0x188c-n0x188f) + - 0x0627d88f, // c0x010e (n0x188f-n0x189f) + - 0x0628189f, // c0x010f (n0x189f-n0x18a0) + - 0x062a58a0, // c0x0110 (n0x18a0-n0x18a9) + - 0x0638d8a9, // c0x0111 (n0x18a9-n0x18e3) + - 0x263958e3, // c0x0112 (n0x18e3-n0x18e5) o - 0x263998e5, // c0x0113 (n0x18e5-n0x18e6) o - 0x2639d8e6, // c0x0114 (n0x18e6-n0x18e7) o - 0x063a58e7, // c0x0115 (n0x18e7-n0x18e9) + - 0x064818e9, // c0x0116 (n0x18e9-n0x1920) + - 0x064ad920, // c0x0117 (n0x1920-n0x192b) + - 0x064cd92b, // c0x0118 (n0x192b-n0x1933) + - 0x064d9933, // c0x0119 (n0x1933-n0x1936) + - 0x064f9936, // c0x011a (n0x1936-n0x193e) + - 0x0653193e, // c0x011b (n0x193e-n0x194c) + - 0x067c594c, // c0x011c (n0x194c-n0x19f1) + - 0x068819f1, // c0x011d (n0x19f1-n0x1a20) + - 0x06895a20, // c0x011e (n0x1a20-n0x1a25) + - 0x068c9a25, // c0x011f (n0x1a25-n0x1a32) + - 0x068e5a32, // c0x0120 (n0x1a32-n0x1a39) + - 0x06901a39, // c0x0121 (n0x1a39-n0x1a40) + - 0x06925a40, // c0x0122 (n0x1a40-n0x1a49) + - 0x0693da49, // c0x0123 (n0x1a49-n0x1a4f) + - 0x06959a4f, // c0x0124 (n0x1a4f-n0x1a56) + - 0x0697da56, // c0x0125 (n0x1a56-n0x1a5f) + - 0x0698da5f, // c0x0126 (n0x1a5f-n0x1a63) + - 0x069bda63, // c0x0127 (n0x1a63-n0x1a6f) + - 0x069d9a6f, // c0x0128 (n0x1a6f-n0x1a76) + - 0x06be9a76, // c0x0129 (n0x1a76-n0x1afa) + - 0x06c0dafa, // c0x012a (n0x1afa-n0x1b03) + - 0x06c2db03, // c0x012b (n0x1b03-n0x1b0b) + - 0x06c41b0b, // c0x012c (n0x1b0b-n0x1b10) + - 0x06c55b10, // c0x012d (n0x1b10-n0x1b15) + - 0x06c75b15, // c0x012e (n0x1b15-n0x1b1d) + - 0x06d19b1d, // c0x012f (n0x1b1d-n0x1b46) + - 0x06d35b46, // c0x0130 (n0x1b46-n0x1b4d) + - 0x06d4db4d, // c0x0131 (n0x1b4d-n0x1b53) + - 0x06d51b53, // c0x0132 (n0x1b53-n0x1b54) + - 0x06d55b54, // c0x0133 (n0x1b54-n0x1b55) + - 0x06d69b55, // c0x0134 (n0x1b55-n0x1b5a) + - 0x06d89b5a, // c0x0135 (n0x1b5a-n0x1b62) + - 0x06d95b62, // c0x0136 (n0x1b62-n0x1b65) + - 0x06dc5b65, // c0x0137 (n0x1b65-n0x1b71) + - 0x06e45b71, // c0x0138 (n0x1b71-n0x1b91) + - 0x06e59b91, // c0x0139 (n0x1b91-n0x1b96) + - 0x06e5db96, // c0x013a (n0x1b96-n0x1b97) + - 0x06e75b97, // c0x013b (n0x1b97-n0x1b9d) + - 0x06e81b9d, // c0x013c (n0x1b9d-n0x1ba0) + - 0x06e85ba0, // c0x013d (n0x1ba0-n0x1ba1) + - 0x06ea1ba1, // c0x013e (n0x1ba1-n0x1ba8) + - 0x06eddba8, // c0x013f (n0x1ba8-n0x1bb7) + - 0x06ee1bb7, // c0x0140 (n0x1bb7-n0x1bb8) + - 0x06f01bb8, // c0x0141 (n0x1bb8-n0x1bc0) + - 0x06f51bc0, // c0x0142 (n0x1bc0-n0x1bd4) + - 0x06f69bd4, // c0x0143 (n0x1bd4-n0x1bda) + - 0x06fbdbda, // c0x0144 (n0x1bda-n0x1bef) + - 0x06fc1bef, // c0x0145 (n0x1bef-n0x1bf0) + - 0x06fc5bf0, // c0x0146 (n0x1bf0-n0x1bf1) + - 0x07009bf1, // c0x0147 (n0x1bf1-n0x1c02) + - 0x07019c02, // c0x0148 (n0x1c02-n0x1c06) + - 0x07051c06, // c0x0149 (n0x1c06-n0x1c14) + - 0x07081c14, // c0x014a (n0x1c14-n0x1c20) + - 0x071b9c20, // c0x014b (n0x1c20-n0x1c6e) + - 0x071ddc6e, // c0x014c (n0x1c6e-n0x1c77) + - 0x07209c77, // c0x014d (n0x1c77-n0x1c82) + - 0x0720dc82, // c0x014e (n0x1c82-n0x1c83) + - 0x07211c83, // c0x014f (n0x1c83-n0x1c84) + - 0x0730dc84, // c0x0150 (n0x1c84-n0x1cc3) + - 0x07319cc3, // c0x0151 (n0x1cc3-n0x1cc6) + - 0x07325cc6, // c0x0152 (n0x1cc6-n0x1cc9) + - 0x07331cc9, // c0x0153 (n0x1cc9-n0x1ccc) + - 0x0733dccc, // c0x0154 (n0x1ccc-n0x1ccf) + - 0x07349ccf, // c0x0155 (n0x1ccf-n0x1cd2) + - 0x07355cd2, // c0x0156 (n0x1cd2-n0x1cd5) + - 0x07361cd5, // c0x0157 (n0x1cd5-n0x1cd8) + - 0x0736dcd8, // c0x0158 (n0x1cd8-n0x1cdb) + - 0x07379cdb, // c0x0159 (n0x1cdb-n0x1cde) + - 0x07385cde, // c0x015a (n0x1cde-n0x1ce1) + - 0x07391ce1, // c0x015b (n0x1ce1-n0x1ce4) + - 0x0739dce4, // c0x015c (n0x1ce4-n0x1ce7) + - 0x073a9ce7, // c0x015d (n0x1ce7-n0x1cea) + - 0x073b1cea, // c0x015e (n0x1cea-n0x1cec) + - 0x073bdcec, // c0x015f (n0x1cec-n0x1cef) + - 0x073c9cef, // c0x0160 (n0x1cef-n0x1cf2) + - 0x073d5cf2, // c0x0161 (n0x1cf2-n0x1cf5) + - 0x073e1cf5, // c0x0162 (n0x1cf5-n0x1cf8) + - 0x073edcf8, // c0x0163 (n0x1cf8-n0x1cfb) + - 0x073f9cfb, // c0x0164 (n0x1cfb-n0x1cfe) + - 0x07405cfe, // c0x0165 (n0x1cfe-n0x1d01) + - 0x07411d01, // c0x0166 (n0x1d01-n0x1d04) + - 0x0741dd04, // c0x0167 (n0x1d04-n0x1d07) + - 0x07429d07, // c0x0168 (n0x1d07-n0x1d0a) + - 0x07435d0a, // c0x0169 (n0x1d0a-n0x1d0d) + - 0x07441d0d, // c0x016a (n0x1d0d-n0x1d10) + - 0x0744dd10, // c0x016b (n0x1d10-n0x1d13) + - 0x07459d13, // c0x016c (n0x1d13-n0x1d16) + - 0x07465d16, // c0x016d (n0x1d16-n0x1d19) + - 0x07471d19, // c0x016e (n0x1d19-n0x1d1c) + - 0x0747dd1c, // c0x016f (n0x1d1c-n0x1d1f) + - 0x07485d1f, // c0x0170 (n0x1d1f-n0x1d21) + - 0x07491d21, // c0x0171 (n0x1d21-n0x1d24) + - 0x0749dd24, // c0x0172 (n0x1d24-n0x1d27) + - 0x074a9d27, // c0x0173 (n0x1d27-n0x1d2a) + - 0x074b5d2a, // c0x0174 (n0x1d2a-n0x1d2d) + - 0x074c1d2d, // c0x0175 (n0x1d2d-n0x1d30) + - 0x074cdd30, // c0x0176 (n0x1d30-n0x1d33) + - 0x074d9d33, // c0x0177 (n0x1d33-n0x1d36) + - 0x074e5d36, // c0x0178 (n0x1d36-n0x1d39) + - 0x074f1d39, // c0x0179 (n0x1d39-n0x1d3c) + - 0x074fdd3c, // c0x017a (n0x1d3c-n0x1d3f) + - 0x07509d3f, // c0x017b (n0x1d3f-n0x1d42) + - 0x07515d42, // c0x017c (n0x1d42-n0x1d45) + - 0x07521d45, // c0x017d (n0x1d45-n0x1d48) + - 0x07529d48, // c0x017e (n0x1d48-n0x1d4a) + - 0x07535d4a, // c0x017f (n0x1d4a-n0x1d4d) + - 0x07541d4d, // c0x0180 (n0x1d4d-n0x1d50) + - 0x0754dd50, // c0x0181 (n0x1d50-n0x1d53) + - 0x07559d53, // c0x0182 (n0x1d53-n0x1d56) + - 0x07565d56, // c0x0183 (n0x1d56-n0x1d59) + - 0x07571d59, // c0x0184 (n0x1d59-n0x1d5c) + - 0x0757dd5c, // c0x0185 (n0x1d5c-n0x1d5f) + - 0x07589d5f, // c0x0186 (n0x1d5f-n0x1d62) + - 0x0758dd62, // c0x0187 (n0x1d62-n0x1d63) + - 0x07599d63, // c0x0188 (n0x1d63-n0x1d66) + - 0x075b1d66, // c0x0189 (n0x1d66-n0x1d6c) + - 0x075b5d6c, // c0x018a (n0x1d6c-n0x1d6d) + - 0x075c5d6d, // c0x018b (n0x1d6d-n0x1d71) + - 0x075ddd71, // c0x018c (n0x1d71-n0x1d77) + - 0x07621d77, // c0x018d (n0x1d77-n0x1d88) + - 0x07635d88, // c0x018e (n0x1d88-n0x1d8d) + - 0x07669d8d, // c0x018f (n0x1d8d-n0x1d9a) + - 0x07679d9a, // c0x0190 (n0x1d9a-n0x1d9e) + - 0x07695d9e, // c0x0191 (n0x1d9e-n0x1da5) + - 0x076adda5, // c0x0192 (n0x1da5-n0x1dab) + - 0x276f1dab, // c0x0193 (n0x1dab-n0x1dbc) o - 0x076f5dbc, // c0x0194 (n0x1dbc-n0x1dbd) + + 0x017f05f6, // c0x0006 (n0x05f6-n0x05fc) + + 0x017f45fc, // c0x0007 (n0x05fc-n0x05fd) + + 0x018145fd, // c0x0008 (n0x05fd-n0x0605) + + 0x01978605, // c0x0009 (n0x0605-n0x065e) + + 0x0198c65e, // c0x000a (n0x065e-n0x0663) + + 0x019a0663, // c0x000b (n0x0663-n0x0668) + + 0x019b0668, // c0x000c (n0x0668-n0x066c) + + 0x019cc66c, // c0x000d (n0x066c-n0x0673) + + 0x019d0673, // c0x000e (n0x0673-n0x0674) + + 0x019e0674, // c0x000f (n0x0674-n0x0678) + + 0x019f8678, // c0x0010 (n0x0678-n0x067e) + + 0x01a1c67e, // c0x0011 (n0x067e-n0x0687) + + 0x01a20687, // c0x0012 (n0x0687-n0x0688) + + 0x01a38688, // c0x0013 (n0x0688-n0x068e) + + 0x01a3c68e, // c0x0014 (n0x068e-n0x068f) + + 0x01a5868f, // c0x0015 (n0x068f-n0x0696) + + 0x01a5c696, // c0x0016 (n0x0696-n0x0697) + + 0x01aa4697, // c0x0017 (n0x0697-n0x06a9) + + 0x01aa86a9, // c0x0018 (n0x06a9-n0x06aa) + + 0x01ac86aa, // c0x0019 (n0x06aa-n0x06b2) + + 0x01adc6b2, // c0x001a (n0x06b2-n0x06b7) + + 0x01ae06b7, // c0x001b (n0x06b7-n0x06b8) + + 0x01b106b8, // c0x001c (n0x06b8-n0x06c4) + + 0x01b3c6c4, // c0x001d (n0x06c4-n0x06cf) + + 0x01b646cf, // c0x001e (n0x06cf-n0x06d9) + + 0x01b6c6d9, // c0x001f (n0x06d9-n0x06db) + + 0x01b706db, // c0x0020 (n0x06db-n0x06dc) + + 0x01c046dc, // c0x0021 (n0x06dc-n0x0701) + + 0x01c18701, // c0x0022 (n0x0701-n0x0706) + + 0x01c2c706, // c0x0023 (n0x0706-n0x070b) + + 0x01c4870b, // c0x0024 (n0x070b-n0x0712) + + 0x01c58712, // c0x0025 (n0x0712-n0x0716) + + 0x01c6c716, // c0x0026 (n0x0716-n0x071b) + + 0x01c9071b, // c0x0027 (n0x071b-n0x0724) + + 0x01da8724, // c0x0028 (n0x0724-n0x076a) + + 0x01dac76a, // c0x0029 (n0x076a-n0x076b) + + 0x01dc076b, // c0x002a (n0x076b-n0x0770) + + 0x01dd4770, // c0x002b (n0x0770-n0x0775) + + 0x01ddc775, // c0x002c (n0x0775-n0x0777) + + 0x01dec777, // c0x002d (n0x0777-n0x077b) + + 0x01df077b, // c0x002e (n0x077b-n0x077c) + + 0x01e0877c, // c0x002f (n0x077c-n0x0782) + + 0x01e4c782, // c0x0030 (n0x0782-n0x0793) + + 0x01e5c793, // c0x0031 (n0x0793-n0x0797) + + 0x01e60797, // c0x0032 (n0x0797-n0x0798) + + 0x01e64798, // c0x0033 (n0x0798-n0x0799) + + 0x01e68799, // c0x0034 (n0x0799-n0x079a) + + 0x01ea479a, // c0x0035 (n0x079a-n0x07a9) + + 0x61ea87a9, // c0x0036 (n0x07a9-n0x07aa)* o + 0x01ebc7aa, // c0x0037 (n0x07aa-n0x07af) + + 0x01ecc7af, // c0x0038 (n0x07af-n0x07b3) + + 0x01f807b3, // c0x0039 (n0x07b3-n0x07e0) + + 0x21f847e0, // c0x003a (n0x07e0-n0x07e1) o + 0x01f887e1, // c0x003b (n0x07e1-n0x07e2) + + 0x01f8c7e2, // c0x003c (n0x07e2-n0x07e3) + + 0x21f907e3, // c0x003d (n0x07e3-n0x07e4) o + 0x21f947e4, // c0x003e (n0x07e4-n0x07e5) o + 0x01fc87e5, // c0x003f (n0x07e5-n0x07f2) + + 0x01fcc7f2, // c0x0040 (n0x07f2-n0x07f3) + + 0x022fc7f3, // c0x0041 (n0x07f3-n0x08bf) + + 0x223448bf, // c0x0042 (n0x08bf-n0x08d1) o + 0x023688d1, // c0x0043 (n0x08d1-n0x08da) + + 0x023708da, // c0x0044 (n0x08da-n0x08dc) + + 0x223748dc, // c0x0045 (n0x08dc-n0x08dd) o + 0x023908dd, // c0x0046 (n0x08dd-n0x08e4) + + 0x023a88e4, // c0x0047 (n0x08e4-n0x08ea) + + 0x023ac8ea, // c0x0048 (n0x08ea-n0x08eb) + + 0x023bc8eb, // c0x0049 (n0x08eb-n0x08ef) + + 0x023c48ef, // c0x004a (n0x08ef-n0x08f1) + + 0x223f88f1, // c0x004b (n0x08f1-n0x08fe) o + 0x023fc8fe, // c0x004c (n0x08fe-n0x08ff) + + 0x024008ff, // c0x004d (n0x08ff-n0x0900) + + 0x02420900, // c0x004e (n0x0900-n0x0908) + + 0x02424908, // c0x004f (n0x0908-n0x0909) + + 0x02438909, // c0x0050 (n0x0909-n0x090e) + + 0x0246090e, // c0x0051 (n0x090e-n0x0918) + + 0x02480918, // c0x0052 (n0x0918-n0x0920) + + 0x024b0920, // c0x0053 (n0x0920-n0x092c) + + 0x024d892c, // c0x0054 (n0x092c-n0x0936) + + 0x024dc936, // c0x0055 (n0x0936-n0x0937) + + 0x02500937, // c0x0056 (n0x0937-n0x0940) + + 0x02504940, // c0x0057 (n0x0940-n0x0941) + + 0x02518941, // c0x0058 (n0x0941-n0x0946) + + 0x0251c946, // c0x0059 (n0x0946-n0x0947) + + 0x0253c947, // c0x005a (n0x0947-n0x094f) + + 0x0254894f, // c0x005b (n0x094f-n0x0952) + + 0x025a8952, // c0x005c (n0x0952-n0x096a) + + 0x025c496a, // c0x005d (n0x096a-n0x0971) + + 0x025d0971, // c0x005e (n0x0971-n0x0974) + + 0x025e4974, // c0x005f (n0x0974-n0x0979) + + 0x025fc979, // c0x0060 (n0x0979-n0x097f) + + 0x0261097f, // c0x0061 (n0x097f-n0x0984) + + 0x02628984, // c0x0062 (n0x0984-n0x098a) + + 0x0264098a, // c0x0063 (n0x098a-n0x0990) + + 0x02658990, // c0x0064 (n0x0990-n0x0996) + + 0x02674996, // c0x0065 (n0x0996-n0x099d) + + 0x0268099d, // c0x0066 (n0x099d-n0x09a0) + + 0x026e09a0, // c0x0067 (n0x09a0-n0x09b8) + + 0x026f89b8, // c0x0068 (n0x09b8-n0x09be) + + 0x0270c9be, // c0x0069 (n0x09be-n0x09c3) + + 0x027509c3, // c0x006a (n0x09c3-n0x09d4) + + 0x027d09d4, // c0x006b (n0x09d4-n0x09f4) + + 0x027fc9f4, // c0x006c (n0x09f4-n0x09ff) + + 0x028009ff, // c0x006d (n0x09ff-n0x0a00) + + 0x02808a00, // c0x006e (n0x0a00-n0x0a02) + + 0x02828a02, // c0x006f (n0x0a02-n0x0a0a) + + 0x0282ca0a, // c0x0070 (n0x0a0a-n0x0a0b) + + 0x02848a0b, // c0x0071 (n0x0a0b-n0x0a12) + + 0x02850a12, // c0x0072 (n0x0a12-n0x0a14) + + 0x02884a14, // c0x0073 (n0x0a14-n0x0a21) + + 0x028aca21, // c0x0074 (n0x0a21-n0x0a2b) + + 0x028b0a2b, // c0x0075 (n0x0a2b-n0x0a2c) + + 0x028c4a2c, // c0x0076 (n0x0a2c-n0x0a31) + + 0x028dca31, // c0x0077 (n0x0a31-n0x0a37) + + 0x02900a37, // c0x0078 (n0x0a37-n0x0a40) + + 0x02920a40, // c0x0079 (n0x0a40-n0x0a48) + + 0x02ee4a48, // c0x007a (n0x0a48-n0x0bb9) + + 0x02ef0bb9, // c0x007b (n0x0bb9-n0x0bbc) + + 0x02f10bbc, // c0x007c (n0x0bbc-n0x0bc4) + + 0x030ccbc4, // c0x007d (n0x0bc4-n0x0c33) + + 0x0319cc33, // c0x007e (n0x0c33-n0x0c67) + + 0x0320cc67, // c0x007f (n0x0c67-n0x0c83) + + 0x03264c83, // c0x0080 (n0x0c83-n0x0c99) + + 0x0334cc99, // c0x0081 (n0x0c99-n0x0cd3) + + 0x033a4cd3, // c0x0082 (n0x0cd3-n0x0ce9) + + 0x033e0ce9, // c0x0083 (n0x0ce9-n0x0cf8) + + 0x034dccf8, // c0x0084 (n0x0cf8-n0x0d37) + + 0x035a8d37, // c0x0085 (n0x0d37-n0x0d6a) + + 0x03640d6a, // c0x0086 (n0x0d6a-n0x0d90) + + 0x036d0d90, // c0x0087 (n0x0d90-n0x0db4) + + 0x03734db4, // c0x0088 (n0x0db4-n0x0dcd) + + 0x0396cdcd, // c0x0089 (n0x0dcd-n0x0e5b) + + 0x03a24e5b, // c0x008a (n0x0e5b-n0x0e89) + + 0x03af0e89, // c0x008b (n0x0e89-n0x0ebc) + + 0x03b3cebc, // c0x008c (n0x0ebc-n0x0ecf) + + 0x03bc4ecf, // c0x008d (n0x0ecf-n0x0ef1) + + 0x03c00ef1, // c0x008e (n0x0ef1-n0x0f00) + + 0x03c50f00, // c0x008f (n0x0f00-n0x0f14) + + 0x03cc8f14, // c0x0090 (n0x0f14-n0x0f32) + + 0x63cccf32, // c0x0091 (n0x0f32-n0x0f33)* o + 0x63cd0f33, // c0x0092 (n0x0f33-n0x0f34)* o + 0x63cd4f34, // c0x0093 (n0x0f34-n0x0f35)* o + 0x03d50f35, // c0x0094 (n0x0f35-n0x0f54) + + 0x03db8f54, // c0x0095 (n0x0f54-n0x0f6e) + + 0x03e34f6e, // c0x0096 (n0x0f6e-n0x0f8d) + + 0x03eacf8d, // c0x0097 (n0x0f8d-n0x0fab) + + 0x03f30fab, // c0x0098 (n0x0fab-n0x0fcc) + + 0x03f9cfcc, // c0x0099 (n0x0fcc-n0x0fe7) + + 0x040c8fe7, // c0x009a (n0x0fe7-n0x1032) + + 0x04121032, // c0x009b (n0x1032-n0x1048) + + 0x64125048, // c0x009c (n0x1048-n0x1049)* o + 0x041bd049, // c0x009d (n0x1049-n0x106f) + + 0x0424506f, // c0x009e (n0x106f-n0x1091) + + 0x04291091, // c0x009f (n0x1091-n0x10a4) + + 0x042f90a4, // c0x00a0 (n0x10a4-n0x10be) + + 0x043a10be, // c0x00a1 (n0x10be-n0x10e8) + + 0x044690e8, // c0x00a2 (n0x10e8-n0x111a) + + 0x044d111a, // c0x00a3 (n0x111a-n0x1134) + + 0x045e5134, // c0x00a4 (n0x1134-n0x1179) + + 0x645e9179, // c0x00a5 (n0x1179-n0x117a)* o + 0x645ed17a, // c0x00a6 (n0x117a-n0x117b)* o + 0x0464917b, // c0x00a7 (n0x117b-n0x1192) + + 0x046a5192, // c0x00a8 (n0x1192-n0x11a9) + + 0x047351a9, // c0x00a9 (n0x11a9-n0x11cd) + + 0x047b11cd, // c0x00aa (n0x11cd-n0x11ec) + + 0x047f51ec, // c0x00ab (n0x11ec-n0x11fd) + + 0x048d91fd, // c0x00ac (n0x11fd-n0x1236) + + 0x0490d236, // c0x00ad (n0x1236-n0x1243) + + 0x0496d243, // c0x00ae (n0x1243-n0x125b) + + 0x049e125b, // c0x00af (n0x125b-n0x1278) + + 0x04a69278, // c0x00b0 (n0x1278-n0x129a) + + 0x04aa929a, // c0x00b1 (n0x129a-n0x12aa) + + 0x04b192aa, // c0x00b2 (n0x12aa-n0x12c6) + + 0x64b1d2c6, // c0x00b3 (n0x12c6-n0x12c7)* o + 0x64b212c7, // c0x00b4 (n0x12c7-n0x12c8)* o + 0x24b252c8, // c0x00b5 (n0x12c8-n0x12c9) o + 0x04b3d2c9, // c0x00b6 (n0x12c9-n0x12cf) + + 0x04b592cf, // c0x00b7 (n0x12cf-n0x12d6) + + 0x04b9d2d6, // c0x00b8 (n0x12d6-n0x12e7) + + 0x04bad2e7, // c0x00b9 (n0x12e7-n0x12eb) + + 0x04bc52eb, // c0x00ba (n0x12eb-n0x12f1) + + 0x04c3d2f1, // c0x00bb (n0x12f1-n0x130f) + + 0x04c5130f, // c0x00bc (n0x130f-n0x1314) + + 0x04c69314, // c0x00bd (n0x1314-n0x131a) + + 0x04c8d31a, // c0x00be (n0x131a-n0x1323) + + 0x04ca1323, // c0x00bf (n0x1323-n0x1328) + + 0x04cb9328, // c0x00c0 (n0x1328-n0x132e) + + 0x04cbd32e, // c0x00c1 (n0x132e-n0x132f) + + 0x04cf932f, // c0x00c2 (n0x132f-n0x133e) + + 0x04d0d33e, // c0x00c3 (n0x133e-n0x1343) + + 0x04d15343, // c0x00c4 (n0x1343-n0x1345) + + 0x04d1d345, // c0x00c5 (n0x1345-n0x1347) + + 0x04d21347, // c0x00c6 (n0x1347-n0x1348) + + 0x04d45348, // c0x00c7 (n0x1348-n0x1351) + + 0x04d69351, // c0x00c8 (n0x1351-n0x135a) + + 0x04d8135a, // c0x00c9 (n0x135a-n0x1360) + + 0x04d89360, // c0x00ca (n0x1360-n0x1362) + + 0x04d8d362, // c0x00cb (n0x1362-n0x1363) + + 0x04dad363, // c0x00cc (n0x1363-n0x136b) + + 0x04dd136b, // c0x00cd (n0x136b-n0x1374) + + 0x04df1374, // c0x00ce (n0x1374-n0x137c) + + 0x04e0d37c, // c0x00cf (n0x137c-n0x1383) + + 0x04e1d383, // c0x00d0 (n0x1383-n0x1387) + + 0x04e31387, // c0x00d1 (n0x1387-n0x138c) + + 0x04e3938c, // c0x00d2 (n0x138c-n0x138e) + + 0x04e4d38e, // c0x00d3 (n0x138e-n0x1393) + + 0x04e5d393, // c0x00d4 (n0x1393-n0x1397) + + 0x04e61397, // c0x00d5 (n0x1397-n0x1398) + + 0x04e7d398, // c0x00d6 (n0x1398-n0x139f) + + 0x0570d39f, // c0x00d7 (n0x139f-n0x15c3) + + 0x057455c3, // c0x00d8 (n0x15c3-n0x15d1) + + 0x057715d1, // c0x00d9 (n0x15d1-n0x15dc) + + 0x057895dc, // c0x00da (n0x15dc-n0x15e2) + + 0x057a95e2, // c0x00db (n0x15e2-n0x15ea) + + 0x657ad5ea, // c0x00dc (n0x15ea-n0x15eb)* o + 0x057f15eb, // c0x00dd (n0x15eb-n0x15fc) + + 0x057f95fc, // c0x00de (n0x15fc-n0x15fe) + + 0x257fd5fe, // c0x00df (n0x15fe-n0x15ff) o + 0x258015ff, // c0x00e0 (n0x15ff-n0x1600) o + 0x05805600, // c0x00e1 (n0x1600-n0x1601) + + 0x058c9601, // c0x00e2 (n0x1601-n0x1632) + + 0x258cd632, // c0x00e3 (n0x1632-n0x1633) o + 0x258d5633, // c0x00e4 (n0x1633-n0x1635) o + 0x258dd635, // c0x00e5 (n0x1635-n0x1637) o + 0x258e9637, // c0x00e6 (n0x1637-n0x163a) o + 0x0591163a, // c0x00e7 (n0x163a-n0x1644) + + 0x05935644, // c0x00e8 (n0x1644-n0x164d) + + 0x0593964d, // c0x00e9 (n0x164d-n0x164e) + + 0x0594564e, // c0x00ea (n0x164e-n0x1651) + + 0x0649d651, // c0x00eb (n0x1651-n0x1927) + + 0x064a1927, // c0x00ec (n0x1927-n0x1928) + + 0x064a5928, // c0x00ed (n0x1928-n0x1929) + + 0x264a9929, // c0x00ee (n0x1929-n0x192a) o + 0x064ad92a, // c0x00ef (n0x192a-n0x192b) + + 0x264b192b, // c0x00f0 (n0x192b-n0x192c) o + 0x064b592c, // c0x00f1 (n0x192c-n0x192d) + + 0x264c192d, // c0x00f2 (n0x192d-n0x1930) o + 0x064c5930, // c0x00f3 (n0x1930-n0x1931) + + 0x064c9931, // c0x00f4 (n0x1931-n0x1932) + + 0x264cd932, // c0x00f5 (n0x1932-n0x1933) o + 0x064d1933, // c0x00f6 (n0x1933-n0x1934) + + 0x264d9934, // c0x00f7 (n0x1934-n0x1936) o + 0x064dd936, // c0x00f8 (n0x1936-n0x1937) + + 0x064e1937, // c0x00f9 (n0x1937-n0x1938) + + 0x264f1938, // c0x00fa (n0x1938-n0x193c) o + 0x064f593c, // c0x00fb (n0x193c-n0x193d) + + 0x064f993d, // c0x00fc (n0x193d-n0x193e) + + 0x064fd93e, // c0x00fd (n0x193e-n0x193f) + + 0x0650193f, // c0x00fe (n0x193f-n0x1940) + + 0x26505940, // c0x00ff (n0x1940-n0x1941) o + 0x06509941, // c0x0100 (n0x1941-n0x1942) + + 0x0650d942, // c0x0101 (n0x1942-n0x1943) + + 0x06511943, // c0x0102 (n0x1943-n0x1944) + + 0x06515944, // c0x0103 (n0x1944-n0x1945) + + 0x2651d945, // c0x0104 (n0x1945-n0x1947) o + 0x06521947, // c0x0105 (n0x1947-n0x1948) + + 0x06525948, // c0x0106 (n0x1948-n0x1949) + + 0x06529949, // c0x0107 (n0x1949-n0x194a) + + 0x2652d94a, // c0x0108 (n0x194a-n0x194b) o + 0x0653194b, // c0x0109 (n0x194b-n0x194c) + + 0x2653994c, // c0x010a (n0x194c-n0x194e) o + 0x2653d94e, // c0x010b (n0x194e-n0x194f) o + 0x0655994f, // c0x010c (n0x194f-n0x1956) + + 0x06565956, // c0x010d (n0x1956-n0x1959) + + 0x065a5959, // c0x010e (n0x1959-n0x1969) + + 0x065a9969, // c0x010f (n0x1969-n0x196a) + + 0x065cd96a, // c0x0110 (n0x196a-n0x1973) + + 0x066b9973, // c0x0111 (n0x1973-n0x19ae) + + 0x266c19ae, // c0x0112 (n0x19ae-n0x19b0) o + 0x266c59b0, // c0x0113 (n0x19b0-n0x19b1) o + 0x266c99b1, // c0x0114 (n0x19b1-n0x19b2) o + 0x066d19b2, // c0x0115 (n0x19b2-n0x19b4) + + 0x067ad9b4, // c0x0116 (n0x19b4-n0x19eb) + + 0x067d99eb, // c0x0117 (n0x19eb-n0x19f6) + + 0x067f99f6, // c0x0118 (n0x19f6-n0x19fe) + + 0x068059fe, // c0x0119 (n0x19fe-n0x1a01) + + 0x06825a01, // c0x011a (n0x1a01-n0x1a09) + + 0x0685da09, // c0x011b (n0x1a09-n0x1a17) + + 0x06af1a17, // c0x011c (n0x1a17-n0x1abc) + + 0x06badabc, // c0x011d (n0x1abc-n0x1aeb) + + 0x06bc1aeb, // c0x011e (n0x1aeb-n0x1af0) + + 0x06bf5af0, // c0x011f (n0x1af0-n0x1afd) + + 0x06c11afd, // c0x0120 (n0x1afd-n0x1b04) + + 0x06c2db04, // c0x0121 (n0x1b04-n0x1b0b) + + 0x06c51b0b, // c0x0122 (n0x1b0b-n0x1b14) + + 0x06c69b14, // c0x0123 (n0x1b14-n0x1b1a) + + 0x06c85b1a, // c0x0124 (n0x1b1a-n0x1b21) + + 0x06ca9b21, // c0x0125 (n0x1b21-n0x1b2a) + + 0x06cb9b2a, // c0x0126 (n0x1b2a-n0x1b2e) + + 0x06ce9b2e, // c0x0127 (n0x1b2e-n0x1b3a) + + 0x06d05b3a, // c0x0128 (n0x1b3a-n0x1b41) + + 0x06f15b41, // c0x0129 (n0x1b41-n0x1bc5) + + 0x06f39bc5, // c0x012a (n0x1bc5-n0x1bce) + + 0x06f59bce, // c0x012b (n0x1bce-n0x1bd6) + + 0x06f6dbd6, // c0x012c (n0x1bd6-n0x1bdb) + + 0x06f81bdb, // c0x012d (n0x1bdb-n0x1be0) + + 0x06fa1be0, // c0x012e (n0x1be0-n0x1be8) + + 0x07045be8, // c0x012f (n0x1be8-n0x1c11) + + 0x07061c11, // c0x0130 (n0x1c11-n0x1c18) + + 0x07079c18, // c0x0131 (n0x1c18-n0x1c1e) + + 0x0707dc1e, // c0x0132 (n0x1c1e-n0x1c1f) + + 0x07081c1f, // c0x0133 (n0x1c1f-n0x1c20) + + 0x07095c20, // c0x0134 (n0x1c20-n0x1c25) + + 0x070b5c25, // c0x0135 (n0x1c25-n0x1c2d) + + 0x070c1c2d, // c0x0136 (n0x1c2d-n0x1c30) + + 0x070f1c30, // c0x0137 (n0x1c30-n0x1c3c) + + 0x07171c3c, // c0x0138 (n0x1c3c-n0x1c5c) + + 0x07185c5c, // c0x0139 (n0x1c5c-n0x1c61) + + 0x07189c61, // c0x013a (n0x1c61-n0x1c62) + + 0x071a1c62, // c0x013b (n0x1c62-n0x1c68) + + 0x071adc68, // c0x013c (n0x1c68-n0x1c6b) + + 0x071b1c6b, // c0x013d (n0x1c6b-n0x1c6c) + + 0x071cdc6c, // c0x013e (n0x1c6c-n0x1c73) + + 0x07209c73, // c0x013f (n0x1c73-n0x1c82) + + 0x0720dc82, // c0x0140 (n0x1c82-n0x1c83) + + 0x0722dc83, // c0x0141 (n0x1c83-n0x1c8b) + + 0x0727dc8b, // c0x0142 (n0x1c8b-n0x1c9f) + + 0x07295c9f, // c0x0143 (n0x1c9f-n0x1ca5) + + 0x072e9ca5, // c0x0144 (n0x1ca5-n0x1cba) + + 0x072edcba, // c0x0145 (n0x1cba-n0x1cbb) + + 0x072f1cbb, // c0x0146 (n0x1cbb-n0x1cbc) + + 0x07335cbc, // c0x0147 (n0x1cbc-n0x1ccd) + + 0x07345ccd, // c0x0148 (n0x1ccd-n0x1cd1) + + 0x0737dcd1, // c0x0149 (n0x1cd1-n0x1cdf) + + 0x073adcdf, // c0x014a (n0x1cdf-n0x1ceb) + + 0x074e9ceb, // c0x014b (n0x1ceb-n0x1d3a) + + 0x0750dd3a, // c0x014c (n0x1d3a-n0x1d43) + + 0x07539d43, // c0x014d (n0x1d43-n0x1d4e) + + 0x0753dd4e, // c0x014e (n0x1d4e-n0x1d4f) + + 0x07541d4f, // c0x014f (n0x1d4f-n0x1d50) + + 0x0763dd50, // c0x0150 (n0x1d50-n0x1d8f) + + 0x07649d8f, // c0x0151 (n0x1d8f-n0x1d92) + + 0x07655d92, // c0x0152 (n0x1d92-n0x1d95) + + 0x07661d95, // c0x0153 (n0x1d95-n0x1d98) + + 0x0766dd98, // c0x0154 (n0x1d98-n0x1d9b) + + 0x07679d9b, // c0x0155 (n0x1d9b-n0x1d9e) + + 0x07685d9e, // c0x0156 (n0x1d9e-n0x1da1) + + 0x07691da1, // c0x0157 (n0x1da1-n0x1da4) + + 0x0769dda4, // c0x0158 (n0x1da4-n0x1da7) + + 0x076a9da7, // c0x0159 (n0x1da7-n0x1daa) + + 0x076b5daa, // c0x015a (n0x1daa-n0x1dad) + + 0x076c1dad, // c0x015b (n0x1dad-n0x1db0) + + 0x076cddb0, // c0x015c (n0x1db0-n0x1db3) + + 0x076d9db3, // c0x015d (n0x1db3-n0x1db6) + + 0x076e1db6, // c0x015e (n0x1db6-n0x1db8) + + 0x076eddb8, // c0x015f (n0x1db8-n0x1dbb) + + 0x076f9dbb, // c0x0160 (n0x1dbb-n0x1dbe) + + 0x07705dbe, // c0x0161 (n0x1dbe-n0x1dc1) + + 0x07711dc1, // c0x0162 (n0x1dc1-n0x1dc4) + + 0x0771ddc4, // c0x0163 (n0x1dc4-n0x1dc7) + + 0x07729dc7, // c0x0164 (n0x1dc7-n0x1dca) + + 0x07735dca, // c0x0165 (n0x1dca-n0x1dcd) + + 0x07741dcd, // c0x0166 (n0x1dcd-n0x1dd0) + + 0x0774ddd0, // c0x0167 (n0x1dd0-n0x1dd3) + + 0x07759dd3, // c0x0168 (n0x1dd3-n0x1dd6) + + 0x07765dd6, // c0x0169 (n0x1dd6-n0x1dd9) + + 0x07771dd9, // c0x016a (n0x1dd9-n0x1ddc) + + 0x0777dddc, // c0x016b (n0x1ddc-n0x1ddf) + + 0x07789ddf, // c0x016c (n0x1ddf-n0x1de2) + + 0x07795de2, // c0x016d (n0x1de2-n0x1de5) + + 0x077a1de5, // c0x016e (n0x1de5-n0x1de8) + + 0x077adde8, // c0x016f (n0x1de8-n0x1deb) + + 0x077b5deb, // c0x0170 (n0x1deb-n0x1ded) + + 0x077c1ded, // c0x0171 (n0x1ded-n0x1df0) + + 0x077cddf0, // c0x0172 (n0x1df0-n0x1df3) + + 0x077d9df3, // c0x0173 (n0x1df3-n0x1df6) + + 0x077e5df6, // c0x0174 (n0x1df6-n0x1df9) + + 0x077f1df9, // c0x0175 (n0x1df9-n0x1dfc) + + 0x077fddfc, // c0x0176 (n0x1dfc-n0x1dff) + + 0x07809dff, // c0x0177 (n0x1dff-n0x1e02) + + 0x07815e02, // c0x0178 (n0x1e02-n0x1e05) + + 0x07821e05, // c0x0179 (n0x1e05-n0x1e08) + + 0x0782de08, // c0x017a (n0x1e08-n0x1e0b) + + 0x07839e0b, // c0x017b (n0x1e0b-n0x1e0e) + + 0x07845e0e, // c0x017c (n0x1e0e-n0x1e11) + + 0x07851e11, // c0x017d (n0x1e11-n0x1e14) + + 0x07859e14, // c0x017e (n0x1e14-n0x1e16) + + 0x07865e16, // c0x017f (n0x1e16-n0x1e19) + + 0x07871e19, // c0x0180 (n0x1e19-n0x1e1c) + + 0x0787de1c, // c0x0181 (n0x1e1c-n0x1e1f) + + 0x07889e1f, // c0x0182 (n0x1e1f-n0x1e22) + + 0x07895e22, // c0x0183 (n0x1e22-n0x1e25) + + 0x078a1e25, // c0x0184 (n0x1e25-n0x1e28) + + 0x078ade28, // c0x0185 (n0x1e28-n0x1e2b) + + 0x078b9e2b, // c0x0186 (n0x1e2b-n0x1e2e) + + 0x078bde2e, // c0x0187 (n0x1e2e-n0x1e2f) + + 0x078c9e2f, // c0x0188 (n0x1e2f-n0x1e32) + + 0x078e1e32, // c0x0189 (n0x1e32-n0x1e38) + + 0x078e5e38, // c0x018a (n0x1e38-n0x1e39) + + 0x078f5e39, // c0x018b (n0x1e39-n0x1e3d) + + 0x0790de3d, // c0x018c (n0x1e3d-n0x1e43) + + 0x07951e43, // c0x018d (n0x1e43-n0x1e54) + + 0x07965e54, // c0x018e (n0x1e54-n0x1e59) + + 0x07999e59, // c0x018f (n0x1e59-n0x1e66) + + 0x079a9e66, // c0x0190 (n0x1e66-n0x1e6a) + + 0x079c5e6a, // c0x0191 (n0x1e6a-n0x1e71) + + 0x079dde71, // c0x0192 (n0x1e71-n0x1e77) + + 0x27a21e77, // c0x0193 (n0x1e77-n0x1e88) o + 0x07a25e88, // c0x0194 (n0x1e88-n0x1e89) + } // max children 404 (capacity 511) -// max text offset 26074 (capacity 32767) +// max text offset 26864 (capacity 32767) // max text length 36 (capacity 63) -// max hi 7613 (capacity 16383) -// max lo 7612 (capacity 16383) +// max hi 7817 (capacity 16383) +// max lo 7816 (capacity 16383) diff --git a/vendor/golang.org/x/net/publicsuffix/table_test.go b/vendor/golang.org/x/net/publicsuffix/table_test.go index ec14b2d0..4d2eb2ea 100644 --- a/vendor/golang.org/x/net/publicsuffix/table_test.go +++ b/vendor/golang.org/x/net/publicsuffix/table_test.go @@ -849,7 +849,15 @@ var rules = [...]string{ "web.id", "ie", "gov.ie", - "*.il", + "il", + "ac.il", + "co.il", + "gov.il", + "idf.il", + "k12.il", + "muni.il", + "net.il", + "org.il", "im", "ac.im", "co.im", @@ -3272,6 +3280,7 @@ var rules = [...]string{ "edu.mg", "mil.mg", "com.mg", + "co.mg", "mh", "mil", "mk", @@ -5630,8 +5639,6 @@ var rules = [...]string{ "zhytomyr.ua", "zp.ua", "zt.ua", - "co.ua", - "pp.ua", "ug", "co.ug", "or.ug", @@ -6032,10 +6039,14 @@ var rules = [...]string{ "*.zw", "aaa", "aarp", + "abarth", "abb", "abbott", + "abbvie", + "abc", "able", "abogado", + "abudhabi", "academy", "accenture", "accountant", @@ -6043,29 +6054,42 @@ var rules = [...]string{ "aco", "active", "actor", + "adac", "ads", "adult", "aeg", "aetna", + "afamilycompany", "afl", "africa", "africamagic", "agakhan", "agency", "aig", + "aigo", + "airbus", "airforce", "airtel", "akdn", + "alfaromeo", "alibaba", "alipay", "allfinanz", + "allstate", "ally", "alsace", + "alstom", + "americanexpress", + "americanfamily", + "amex", + "amfam", "amica", "amsterdam", "analytics", "android", "anquan", + "anz", + "aol", "apartments", "app", "apple", @@ -6074,12 +6098,15 @@ var rules = [...]string{ "archi", "army", "arte", + "asda", "associates", + "athleta", "attorney", "auction", "audi", "audible", "audio", + "auspost", "author", "auto", "autos", @@ -6089,6 +6116,8 @@ var rules = [...]string{ "azure", "baby", "baidu", + "banamex", + "bananarepublic", "band", "bank", "bar", @@ -6097,9 +6126,11 @@ var rules = [...]string{ "barclays", "barefoot", "bargains", + "basketball", "bauhaus", "bayern", "bbc", + "bbt", "bbva", "bcg", "bcn", @@ -6108,6 +6139,7 @@ var rules = [...]string{ "bentley", "berlin", "best", + "bestbuy", "bet", "bharti", "bible", @@ -6118,6 +6150,8 @@ var rules = [...]string{ "bio", "black", "blackfriday", + "blanco", + "blockbuster", "blog", "bloomberg", "blue", @@ -6126,9 +6160,13 @@ var rules = [...]string{ "bnl", "bnpparibas", "boats", + "boehringer", + "bofa", "bom", "bond", "boo", + "book", + "booking", "boots", "bosch", "bostik", @@ -6141,6 +6179,7 @@ var rules = [...]string{ "brother", "brussels", "budapest", + "bugatti", "build", "builders", "business", @@ -6151,12 +6190,14 @@ var rules = [...]string{ "cafe", "cal", "call", + "calvinklein", "camera", "camp", "cancerresearch", "canon", "capetown", "capital", + "capitalone", "car", "caravan", "cards", @@ -6166,12 +6207,15 @@ var rules = [...]string{ "cars", "cartier", "casa", + "case", + "caseih", "cash", "casino", "catering", "cba", "cbn", "cbre", + "cbs", "ceb", "center", "ceo", @@ -6187,10 +6231,13 @@ var rules = [...]string{ "chloe", "christmas", "chrome", + "chrysler", "church", "cipriani", "circle", "cisco", + "citadel", + "citi", "citic", "city", "cityeats", @@ -6198,6 +6245,7 @@ var rules = [...]string{ "cleaning", "click", "clinic", + "clinique", "clothing", "cloud", "club", @@ -6207,9 +6255,11 @@ var rules = [...]string{ "coffee", "college", "cologne", + "comcast", "commbank", "community", "company", + "compare", "computer", "comsec", "condos", @@ -6251,6 +6301,7 @@ var rules = [...]string{ "degree", "delivery", "dell", + "deloitte", "delta", "democrat", "dental", @@ -6258,14 +6309,18 @@ var rules = [...]string{ "desi", "design", "dev", + "dhl", "diamonds", "diet", "digital", "direct", "directory", "discount", + "discover", + "dish", "dnp", "docs", + "dodge", "dog", "doha", "domains", @@ -6276,25 +6331,33 @@ var rules = [...]string{ "dstv", "dtv", "dubai", + "duck", "dunlop", + "duns", "dupont", "durban", "dvag", + "dwg", "earth", "eat", "edeka", "education", "email", "emerck", + "emerson", "energy", "engineer", "engineering", "enterprises", + "epost", "epson", "equipment", + "ericsson", "erni", "esq", "estate", + "esurance", + "etisalat", "eurovision", "eus", "events", @@ -6312,10 +6375,16 @@ var rules = [...]string{ "fan", "fans", "farm", + "farmers", "fashion", "fast", + "fedex", "feedback", + "ferrari", "ferrero", + "fiat", + "fidelity", + "fido", "film", "final", "finance", @@ -6329,6 +6398,7 @@ var rules = [...]string{ "fitness", "flickr", "flights", + "flir", "florist", "flowers", "flsmidth", @@ -6341,10 +6411,15 @@ var rules = [...]string{ "forsale", "forum", "foundation", + "fox", + "fresenius", "frl", "frogans", "frontdoor", "frontier", + "ftr", + "fujitsu", + "fujixerox", "fund", "furniture", "futbol", @@ -6355,17 +6430,20 @@ var rules = [...]string{ "gallup", "game", "games", + "gap", "garden", "gbiz", "gdn", "gea", "gent", "genting", + "george", "ggee", "gift", "gifts", "gives", "giving", + "glade", "glass", "gle", "global", @@ -6373,10 +6451,12 @@ var rules = [...]string{ "gmail", "gmo", "gmx", + "godaddy", "gold", "goldpoint", "golf", "goo", + "goodhands", "goodyear", "goog", "google", @@ -6389,6 +6469,7 @@ var rules = [...]string{ "green", "gripe", "group", + "guardian", "gucci", "guge", "guide", @@ -6397,6 +6478,8 @@ var rules = [...]string{ "hamburg", "hangout", "haus", + "hbo", + "hdfc", "hdfcbank", "health", "healthcare", @@ -6406,6 +6489,7 @@ var rules = [...]string{ "hermes", "hgtv", "hiphop", + "hisamitsu", "hitachi", "hiv", "hkt", @@ -6413,23 +6497,33 @@ var rules = [...]string{ "holdings", "holiday", "homedepot", + "homegoods", "homes", + "homesense", "honda", + "honeywell", "horse", "host", "hosting", + "hot", "hoteles", "hotmail", "house", "how", "hsbc", "htc", + "hughes", + "hyatt", + "hyundai", "ibm", "icbc", "ice", "icu", + "ieee", "ifm", "iinet", + "ikano", + "imamat", "imdb", "immo", "immobilien", @@ -6440,19 +6534,25 @@ var rules = [...]string{ "institute", "insurance", "insure", + "intel", "international", + "intuit", "investments", "ipiranga", "irish", "iselect", + "ismaili", "ist", "istanbul", "itau", + "itv", + "iveco", "iwc", "jaguar", "java", "jcb", "jcp", + "jeep", "jetzt", "jewelry", "jio", @@ -6466,12 +6566,14 @@ var rules = [...]string{ "jpmorgan", "jprs", "juegos", + "juniper", "kaufen", "kddi", "kerryhotels", "kerrylogistics", "kerryproperties", "kfh", + "kia", "kim", "kinder", "kindle", @@ -6479,6 +6581,7 @@ var rules = [...]string{ "kiwi", "koeln", "komatsu", + "kosher", "kpmg", "kpn", "krd", @@ -6487,19 +6590,27 @@ var rules = [...]string{ "kyknet", "kyoto", "lacaixa", + "ladbrokes", "lamborghini", + "lamer", "lancaster", + "lancia", + "lancome", "land", "landrover", + "lanxess", "lasalle", "lat", + "latino", "latrobe", "law", "lawyer", "lds", "lease", "leclerc", + "lefrak", "legal", + "lego", "lexus", "lgbt", "liaison", @@ -6509,6 +6620,7 @@ var rules = [...]string{ "lifestyle", "lighting", "like", + "lilly", "limited", "limo", "lincoln", @@ -6516,21 +6628,27 @@ var rules = [...]string{ "link", "lipsy", "live", + "living", "lixil", "loan", "loans", "locker", "locus", + "loft", "lol", "london", "lotte", "lotto", "love", + "lpl", + "lplfinancial", "ltd", "ltda", + "lundbeck", "lupin", "luxe", "luxury", + "macys", "madrid", "maif", "maison", @@ -6542,7 +6660,14 @@ var rules = [...]string{ "marketing", "markets", "marriott", + "marshalls", + "maserati", + "mattel", "mba", + "mcd", + "mcdonalds", + "mckinsey", + "med", "media", "meet", "melbourne", @@ -6555,7 +6680,9 @@ var rules = [...]string{ "miami", "microsoft", "mini", + "mint", "mit", + "mitsubishi", "mlb", "mls", "mma", @@ -6567,7 +6694,9 @@ var rules = [...]string{ "mom", "monash", "money", + "monster", "montblanc", + "mopar", "mormon", "mortgage", "moscow", @@ -6576,6 +6705,7 @@ var rules = [...]string{ "mov", "movie", "movistar", + "msd", "mtn", "mtpc", "mtr", @@ -6583,24 +6713,30 @@ var rules = [...]string{ "mutual", "mutuelle", "mzansimagic", + "nab", "nadex", "nagoya", "naspers", + "nationwide", "natura", "navy", + "nba", "nec", "netbank", "netflix", "network", "neustar", "new", + "newholland", "news", "next", "nextdirect", "nexus", + "nfl", "ngo", "nhk", "nico", + "nike", "nikon", "ninja", "nissan", @@ -6616,27 +6752,33 @@ var rules = [...]string{ "nyc", "obi", "observer", + "off", "office", "okinawa", "olayan", "olayangroup", + "oldnavy", "ollo", "omega", "one", "ong", "onl", "online", + "onyourside", "ooo", + "open", "oracle", "orange", "organic", "orientexpress", + "origins", "osaka", "otsuka", "ott", "ovh", "page", "pamperedchef", + "panasonic", "panerai", "paris", "pars", @@ -6644,9 +6786,11 @@ var rules = [...]string{ "parts", "party", "passagens", + "pay", "payu", "pccw", "pet", + "pfizer", "pharmacy", "philips", "photo", @@ -6661,6 +6805,7 @@ var rules = [...]string{ "pin", "ping", "pink", + "pioneer", "pizza", "place", "play", @@ -6670,23 +6815,31 @@ var rules = [...]string{ "pnc", "pohl", "poker", + "politie", "porn", + "pramerica", "praxi", "press", "prime", "prod", "productions", "prof", + "progressive", "promo", "properties", "property", "protection", + "pru", + "prudential", "pub", "qpon", "quebec", "quest", + "qvc", "racing", + "raid", "read", + "realestate", "realtor", "realty", "recipes", @@ -6712,12 +6865,14 @@ var rules = [...]string{ "rich", "richardli", "ricoh", + "rightathome", "ril", "rio", "rip", "rocher", "rocks", "rodeo", + "rogers", "room", "rsvp", "ruhr", @@ -6730,6 +6885,7 @@ var rules = [...]string{ "sakura", "sale", "salon", + "samsclub", "samsung", "sandvik", "sandvikcoromant", @@ -6744,29 +6900,39 @@ var rules = [...]string{ "sbs", "sca", "scb", + "schaeffler", "schmidt", "scholarships", "school", "schule", "schwarz", "science", + "scjohnson", "scor", "scot", "seat", + "secure", "security", "seek", + "select", "sener", "services", + "ses", + "seven", "sew", "sex", "sexy", + "sfr", + "shangrila", "sharp", "shaw", + "shell", "shia", "shiksha", "shoes", "shouji", "show", + "showtime", "shriram", "silk", "sina", @@ -6776,6 +6942,8 @@ var rules = [...]string{ "skin", "sky", "skype", + "sling", + "smart", "smile", "sncf", "soccer", @@ -6793,10 +6961,13 @@ var rules = [...]string{ "spot", "spreadbetting", "srl", + "srt", "stada", + "staples", "star", "starhub", "statebank", + "statefarm", "statoil", "stc", "stcgroup", @@ -6815,6 +6986,7 @@ var rules = [...]string{ "surgery", "suzuki", "swatch", + "swiftcover", "swiss", "sydney", "symantec", @@ -6823,6 +6995,7 @@ var rules = [...]string{ "taipei", "talk", "taobao", + "target", "tatamotors", "tatar", "tattoo", @@ -6842,12 +7015,16 @@ var rules = [...]string{ "theater", "theatre", "theguardian", + "tiaa", "tickets", "tienda", "tiffany", "tips", "tires", "tirol", + "tjmaxx", + "tjx", + "tkmaxx", "tmall", "today", "tokyo", @@ -6855,6 +7032,7 @@ var rules = [...]string{ "top", "toray", "toshiba", + "total", "tours", "town", "toyota", @@ -6872,15 +7050,19 @@ var rules = [...]string{ "tunes", "tushu", "tvs", + "ubank", "ubs", + "uconnect", "university", "uno", "uol", "ups", "vacations", "vana", + "vanguard", "vegas", "ventures", + "verisign", "versicherung", "vet", "viajes", @@ -6891,10 +7073,12 @@ var rules = [...]string{ "vin", "vip", "virgin", + "visa", "vision", "vista", "vistaprint", "viva", + "vivo", "vlaanderen", "vodka", "volkswagen", @@ -6904,6 +7088,7 @@ var rules = [...]string{ "voyage", "vuelos", "wales", + "walmart", "walter", "wang", "wanggou", @@ -6926,14 +7111,19 @@ var rules = [...]string{ "win", "windows", "wine", + "winners", "wme", + "wolterskluwer", + "woodside", "work", "works", "world", + "wow", "wtc", "wtf", "xbox", "xerox", + "xfinity", "xihuan", "xin", "xn--11b4c3d", @@ -6947,8 +7137,10 @@ var rules = [...]string{ "xn--42c2d9a", "xn--45q11c", "xn--4gbrim", + "xn--4gq48lf9j", "xn--55qw42g", "xn--55qx5d", + "xn--5su34j936bgsg", "xn--5tzm5g", "xn--6frz82g", "xn--6qq986b3xl", @@ -6981,6 +7173,7 @@ var rules = [...]string{ "xn--fzys8d69uvgm", "xn--g2xx48c", "xn--gckr3f0f", + "xn--gk3at1e", "xn--hxt814e", "xn--i1b6b1a6a2e", "xn--imr513n", @@ -6993,8 +7186,10 @@ var rules = [...]string{ "xn--kput3i", "xn--mgba3a3ejt", "xn--mgba7c0bbn0a", + "xn--mgbaakc7dvf", "xn--mgbab2bd", "xn--mgbb9fbpob", + "xn--mgbca7dzdo", "xn--mgbt3dhd", "xn--mk1bu44c", "xn--mxtq1m", @@ -7019,6 +7214,7 @@ var rules = [...]string{ "xn--vhquv", "xn--vuq861b", "xn--w4r85el8fhu5dnra", + "xn--w4rs40l", "xn--xhq521b", "xn--zfr164b", "xperia", @@ -7549,6 +7745,7 @@ var rules = [...]string{ "googlecode.com", "pagespeedmobilizer.com", "withgoogle.com", + "withyoutube.com", "herokuapp.com", "herokussl.com", "iki.fi", @@ -7558,6 +7755,7 @@ var rules = [...]string{ "azurewebsites.net", "azure-mobile.net", "cloudapp.net", + "bmoattachments.org", "4u.com", "nfshost.com", "nyc.mn", @@ -7570,8 +7768,15 @@ var rules = [...]string{ "poznan.pl", "wroc.pl", "zakopane.pl", + "pantheon.io", + "gotpantheon.com", "priv.at", + "qa2.com", "rhcloud.com", + "sandcats.io", + "biz.ua", + "co.ua", + "pp.ua", "sinaapp.com", "vipsinaapp.com", "1kapp.com", @@ -7592,10 +7797,14 @@ var rules = [...]string{ var nodeLabels = [...]string{ "aaa", "aarp", + "abarth", "abb", "abbott", + "abbvie", + "abc", "able", "abogado", + "abudhabi", "ac", "academy", "accenture", @@ -7605,6 +7814,7 @@ var nodeLabels = [...]string{ "active", "actor", "ad", + "adac", "ads", "adult", "ae", @@ -7612,6 +7822,7 @@ var nodeLabels = [...]string{ "aero", "aetna", "af", + "afamilycompany", "afl", "africa", "africamagic", @@ -7620,23 +7831,34 @@ var nodeLabels = [...]string{ "agency", "ai", "aig", + "aigo", + "airbus", "airforce", "airtel", "akdn", "al", + "alfaromeo", "alibaba", "alipay", "allfinanz", + "allstate", "ally", "alsace", + "alstom", "am", + "americanexpress", + "americanfamily", + "amex", + "amfam", "amica", "amsterdam", "an", "analytics", "android", "anquan", + "anz", "ao", + "aol", "apartments", "app", "apple", @@ -7649,15 +7871,18 @@ var nodeLabels = [...]string{ "arpa", "arte", "as", + "asda", "asia", "associates", "at", + "athleta", "attorney", "au", "auction", "audi", "audible", "audio", + "auspost", "author", "auto", "autos", @@ -7671,6 +7896,8 @@ var nodeLabels = [...]string{ "ba", "baby", "baidu", + "banamex", + "bananarepublic", "band", "bank", "bar", @@ -7679,10 +7906,12 @@ var nodeLabels = [...]string{ "barclays", "barefoot", "bargains", + "basketball", "bauhaus", "bayern", "bb", "bbc", + "bbt", "bbva", "bcg", "bcn", @@ -7693,6 +7922,7 @@ var nodeLabels = [...]string{ "bentley", "berlin", "best", + "bestbuy", "bet", "bf", "bg", @@ -7709,6 +7939,8 @@ var nodeLabels = [...]string{ "bj", "black", "blackfriday", + "blanco", + "blockbuster", "blog", "bloomberg", "blue", @@ -7720,9 +7952,13 @@ var nodeLabels = [...]string{ "bnpparibas", "bo", "boats", + "boehringer", + "bofa", "bom", "bond", "boo", + "book", + "booking", "boots", "bosch", "bostik", @@ -7738,6 +7974,7 @@ var nodeLabels = [...]string{ "bs", "bt", "budapest", + "bugatti", "build", "builders", "business", @@ -7753,12 +7990,14 @@ var nodeLabels = [...]string{ "cafe", "cal", "call", + "calvinklein", "camera", "camp", "cancerresearch", "canon", "capetown", "capital", + "capitalone", "car", "caravan", "cards", @@ -7768,6 +8007,8 @@ var nodeLabels = [...]string{ "cars", "cartier", "casa", + "case", + "caseih", "cash", "casino", "cat", @@ -7775,6 +8016,7 @@ var nodeLabels = [...]string{ "cba", "cbn", "cbre", + "cbs", "cc", "cd", "ceb", @@ -7795,11 +8037,14 @@ var nodeLabels = [...]string{ "chloe", "christmas", "chrome", + "chrysler", "church", "ci", "cipriani", "circle", "cisco", + "citadel", + "citi", "citic", "city", "cityeats", @@ -7809,6 +8054,7 @@ var nodeLabels = [...]string{ "cleaning", "click", "clinic", + "clinique", "clothing", "cloud", "club", @@ -7822,9 +8068,11 @@ var nodeLabels = [...]string{ "college", "cologne", "com", + "comcast", "commbank", "community", "company", + "compare", "computer", "comsec", "condos", @@ -7875,6 +8123,7 @@ var nodeLabels = [...]string{ "degree", "delivery", "dell", + "deloitte", "delta", "democrat", "dental", @@ -7882,18 +8131,22 @@ var nodeLabels = [...]string{ "desi", "design", "dev", + "dhl", "diamonds", "diet", "digital", "direct", "directory", "discount", + "discover", + "dish", "dj", "dk", "dm", "dnp", "do", "docs", + "dodge", "dog", "doha", "domains", @@ -7904,10 +8157,13 @@ var nodeLabels = [...]string{ "dstv", "dtv", "dubai", + "duck", "dunlop", + "duns", "dupont", "durban", "dvag", + "dwg", "dz", "earth", "eat", @@ -7919,18 +8175,23 @@ var nodeLabels = [...]string{ "eg", "email", "emerck", + "emerson", "energy", "engineer", "engineering", "enterprises", + "epost", "epson", "equipment", "er", + "ericsson", "erni", "es", "esq", "estate", + "esurance", "et", + "etisalat", "eu", "eurovision", "eus", @@ -7949,11 +8210,17 @@ var nodeLabels = [...]string{ "fan", "fans", "farm", + "farmers", "fashion", "fast", + "fedex", "feedback", + "ferrari", "ferrero", "fi", + "fiat", + "fidelity", + "fido", "film", "final", "finance", @@ -7969,6 +8236,7 @@ var nodeLabels = [...]string{ "fk", "flickr", "flights", + "flir", "florist", "flowers", "flsmidth", @@ -7983,11 +8251,16 @@ var nodeLabels = [...]string{ "forsale", "forum", "foundation", + "fox", "fr", + "fresenius", "frl", "frogans", "frontdoor", "frontier", + "ftr", + "fujitsu", + "fujixerox", "fund", "furniture", "futbol", @@ -7999,6 +8272,7 @@ var nodeLabels = [...]string{ "gallup", "game", "games", + "gap", "garden", "gb", "gbiz", @@ -8008,6 +8282,7 @@ var nodeLabels = [...]string{ "gea", "gent", "genting", + "george", "gf", "gg", "ggee", @@ -8018,6 +8293,7 @@ var nodeLabels = [...]string{ "gives", "giving", "gl", + "glade", "glass", "gle", "global", @@ -8027,10 +8303,12 @@ var nodeLabels = [...]string{ "gmo", "gmx", "gn", + "godaddy", "gold", "goldpoint", "golf", "goo", + "goodhands", "goodyear", "goog", "google", @@ -8050,6 +8328,7 @@ var nodeLabels = [...]string{ "gs", "gt", "gu", + "guardian", "gucci", "guge", "guide", @@ -8060,6 +8339,8 @@ var nodeLabels = [...]string{ "hamburg", "hangout", "haus", + "hbo", + "hdfc", "hdfcbank", "health", "healthcare", @@ -8069,6 +8350,7 @@ var nodeLabels = [...]string{ "hermes", "hgtv", "hiphop", + "hisamitsu", "hitachi", "hiv", "hk", @@ -8079,11 +8361,15 @@ var nodeLabels = [...]string{ "holdings", "holiday", "homedepot", + "homegoods", "homes", + "homesense", "honda", + "honeywell", "horse", "host", "hosting", + "hot", "hoteles", "hotmail", "house", @@ -8093,16 +8379,22 @@ var nodeLabels = [...]string{ "ht", "htc", "hu", + "hughes", + "hyatt", + "hyundai", "ibm", "icbc", "ice", "icu", "id", "ie", + "ieee", "ifm", "iinet", + "ikano", "il", "im", + "imamat", "imdb", "immo", "immobilien", @@ -8116,7 +8408,9 @@ var nodeLabels = [...]string{ "insurance", "insure", "int", + "intel", "international", + "intuit", "investments", "io", "ipiranga", @@ -8125,16 +8419,20 @@ var nodeLabels = [...]string{ "irish", "is", "iselect", + "ismaili", "ist", "istanbul", "it", "itau", + "itv", + "iveco", "iwc", "jaguar", "java", "jcb", "jcp", "je", + "jeep", "jetzt", "jewelry", "jio", @@ -8152,6 +8450,7 @@ var nodeLabels = [...]string{ "jpmorgan", "jprs", "juegos", + "juniper", "kaufen", "kddi", "ke", @@ -8162,6 +8461,7 @@ var nodeLabels = [...]string{ "kg", "kh", "ki", + "kia", "kim", "kinder", "kindle", @@ -8171,6 +8471,7 @@ var nodeLabels = [...]string{ "kn", "koeln", "komatsu", + "kosher", "kp", "kpmg", "kpn", @@ -8185,12 +8486,18 @@ var nodeLabels = [...]string{ "kz", "la", "lacaixa", + "ladbrokes", "lamborghini", + "lamer", "lancaster", + "lancia", + "lancome", "land", "landrover", + "lanxess", "lasalle", "lat", + "latino", "latrobe", "law", "lawyer", @@ -8199,7 +8506,9 @@ var nodeLabels = [...]string{ "lds", "lease", "leclerc", + "lefrak", "legal", + "lego", "lexus", "lgbt", "li", @@ -8210,6 +8519,7 @@ var nodeLabels = [...]string{ "lifestyle", "lighting", "like", + "lilly", "limited", "limo", "lincoln", @@ -8217,29 +8527,35 @@ var nodeLabels = [...]string{ "link", "lipsy", "live", + "living", "lixil", "lk", "loan", "loans", "locker", "locus", + "loft", "lol", "london", "lotte", "lotto", "love", + "lpl", + "lplfinancial", "lr", "ls", "lt", "ltd", "ltda", "lu", + "lundbeck", "lupin", "luxe", "luxury", "lv", "ly", "ma", + "macys", "madrid", "maif", "maison", @@ -8251,10 +8567,17 @@ var nodeLabels = [...]string{ "marketing", "markets", "marriott", + "marshalls", + "maserati", + "mattel", "mba", "mc", + "mcd", + "mcdonalds", + "mckinsey", "md", "me", + "med", "media", "meet", "melbourne", @@ -8270,7 +8593,9 @@ var nodeLabels = [...]string{ "microsoft", "mil", "mini", + "mint", "mit", + "mitsubishi", "mk", "ml", "mlb", @@ -8288,7 +8613,9 @@ var nodeLabels = [...]string{ "mom", "monash", "money", + "monster", "montblanc", + "mopar", "mormon", "mortgage", "moscow", @@ -8301,6 +8628,7 @@ var nodeLabels = [...]string{ "mq", "mr", "ms", + "msd", "mt", "mtn", "mtpc", @@ -8317,12 +8645,15 @@ var nodeLabels = [...]string{ "mz", "mzansimagic", "na", + "nab", "nadex", "nagoya", "name", "naspers", + "nationwide", "natura", "navy", + "nba", "nc", "ne", "nec", @@ -8332,16 +8663,19 @@ var nodeLabels = [...]string{ "network", "neustar", "new", + "newholland", "news", "next", "nextdirect", "nexus", "nf", + "nfl", "ng", "ngo", "nhk", "ni", "nico", + "nike", "nikon", "ninja", "nissan", @@ -8363,10 +8697,12 @@ var nodeLabels = [...]string{ "nz", "obi", "observer", + "off", "office", "okinawa", "olayan", "olayangroup", + "oldnavy", "ollo", "om", "omega", @@ -8374,12 +8710,15 @@ var nodeLabels = [...]string{ "ong", "onl", "online", + "onyourside", "ooo", + "open", "oracle", "orange", "org", "organic", "orientexpress", + "origins", "osaka", "otsuka", "ott", @@ -8387,6 +8726,7 @@ var nodeLabels = [...]string{ "pa", "page", "pamperedchef", + "panasonic", "panerai", "paris", "pars", @@ -8394,11 +8734,13 @@ var nodeLabels = [...]string{ "parts", "party", "passagens", + "pay", "payu", "pccw", "pe", "pet", "pf", + "pfizer", "pg", "ph", "pharmacy", @@ -8415,6 +8757,7 @@ var nodeLabels = [...]string{ "pin", "ping", "pink", + "pioneer", "pizza", "pk", "pl", @@ -8428,9 +8771,11 @@ var nodeLabels = [...]string{ "pnc", "pohl", "poker", + "politie", "porn", "post", "pr", + "pramerica", "praxi", "press", "prime", @@ -8438,10 +8783,13 @@ var nodeLabels = [...]string{ "prod", "productions", "prof", + "progressive", "promo", "properties", "property", "protection", + "pru", + "prudential", "ps", "pt", "pub", @@ -8451,9 +8799,12 @@ var nodeLabels = [...]string{ "qpon", "quebec", "quest", + "qvc", "racing", + "raid", "re", "read", + "realestate", "realtor", "realty", "recipes", @@ -8479,6 +8830,7 @@ var nodeLabels = [...]string{ "rich", "richardli", "ricoh", + "rightathome", "ril", "rio", "rip", @@ -8486,6 +8838,7 @@ var nodeLabels = [...]string{ "rocher", "rocks", "rodeo", + "rogers", "room", "rs", "rsvp", @@ -8502,6 +8855,7 @@ var nodeLabels = [...]string{ "sakura", "sale", "salon", + "samsclub", "samsung", "sandvik", "sandvikcoromant", @@ -8518,33 +8872,43 @@ var nodeLabels = [...]string{ "sc", "sca", "scb", + "schaeffler", "schmidt", "scholarships", "school", "schule", "schwarz", "science", + "scjohnson", "scor", "scot", "sd", "se", "seat", + "secure", "security", "seek", + "select", "sener", "services", + "ses", + "seven", "sew", "sex", "sexy", + "sfr", "sg", "sh", + "shangrila", "sharp", "shaw", + "shell", "shia", "shiksha", "shoes", "shouji", "show", + "showtime", "shriram", "si", "silk", @@ -8558,7 +8922,9 @@ var nodeLabels = [...]string{ "sky", "skype", "sl", + "sling", "sm", + "smart", "smile", "sn", "sncf", @@ -8579,11 +8945,14 @@ var nodeLabels = [...]string{ "spreadbetting", "sr", "srl", + "srt", "st", "stada", + "staples", "star", "starhub", "statebank", + "statefarm", "statoil", "stc", "stcgroup", @@ -8604,6 +8973,7 @@ var nodeLabels = [...]string{ "suzuki", "sv", "swatch", + "swiftcover", "swiss", "sx", "sy", @@ -8615,6 +8985,7 @@ var nodeLabels = [...]string{ "taipei", "talk", "taobao", + "target", "tatamotors", "tatar", "tattoo", @@ -8640,6 +9011,7 @@ var nodeLabels = [...]string{ "theater", "theatre", "theguardian", + "tiaa", "tickets", "tienda", "tiffany", @@ -8647,7 +9019,10 @@ var nodeLabels = [...]string{ "tires", "tirol", "tj", + "tjmaxx", + "tjx", "tk", + "tkmaxx", "tl", "tm", "tmall", @@ -8659,6 +9034,7 @@ var nodeLabels = [...]string{ "top", "toray", "toshiba", + "total", "tours", "town", "toyota", @@ -8684,7 +9060,9 @@ var nodeLabels = [...]string{ "tw", "tz", "ua", + "ubank", "ubs", + "uconnect", "ug", "uk", "university", @@ -8697,10 +9075,12 @@ var nodeLabels = [...]string{ "va", "vacations", "vana", + "vanguard", "vc", "ve", "vegas", "ventures", + "verisign", "versicherung", "vet", "vg", @@ -8713,10 +9093,12 @@ var nodeLabels = [...]string{ "vin", "vip", "virgin", + "visa", "vision", "vista", "vistaprint", "viva", + "vivo", "vlaanderen", "vn", "vodka", @@ -8728,6 +9110,7 @@ var nodeLabels = [...]string{ "vu", "vuelos", "wales", + "walmart", "walter", "wang", "wanggou", @@ -8751,15 +9134,20 @@ var nodeLabels = [...]string{ "win", "windows", "wine", + "winners", "wme", + "wolterskluwer", + "woodside", "work", "works", "world", + "wow", "ws", "wtc", "wtf", "xbox", "xerox", + "xfinity", "xihuan", "xin", "xn--11b4c3d", @@ -8775,9 +9163,11 @@ var nodeLabels = [...]string{ "xn--45brj9c", "xn--45q11c", "xn--4gbrim", + "xn--4gq48lf9j", "xn--54b7fta0cc", "xn--55qw42g", "xn--55qx5d", + "xn--5su34j936bgsg", "xn--5tzm5g", "xn--6frz82g", "xn--6qq986b3xl", @@ -8820,6 +9210,7 @@ var nodeLabels = [...]string{ "xn--g2xx48c", "xn--gckr3f0f", "xn--gecrj9c", + "xn--gk3at1e", "xn--h2brj9c", "xn--hxt814e", "xn--i1b6b1a6a2e", @@ -8843,6 +9234,7 @@ var nodeLabels = [...]string{ "xn--mgba3a4f16a", "xn--mgba3a4fra", "xn--mgba7c0bbn0a", + "xn--mgbaakc7dvf", "xn--mgbaam7a8h", "xn--mgbab2bd", "xn--mgbai9a5eva00b", @@ -8851,6 +9243,7 @@ var nodeLabels = [...]string{ "xn--mgbb9fbpob", "xn--mgbbh1a71e", "xn--mgbc0a9azcg", + "xn--mgbca7dzdo", "xn--mgberp4a5d4a87g", "xn--mgberp4a5d4ar", "xn--mgbpl2fh", @@ -8893,6 +9286,7 @@ var nodeLabels = [...]string{ "xn--vhquv", "xn--vuq861b", "xn--w4r85el8fhu5dnra", + "xn--w4rs40l", "xn--wgbh1c", "xn--wgbl6a", "xn--xhq521b", @@ -9536,6 +9930,7 @@ var nodeLabels = [...]string{ "googleapis", "googlecode", "gotdns", + "gotpantheon", "gr", "herokuapp", "herokussl", @@ -9614,6 +10009,7 @@ var nodeLabels = [...]string{ "operaunite", "outsystemscloud", "pagespeedmobilizer", + "qa2", "qc", "rhcloud", "ro", @@ -9634,6 +10030,7 @@ var nodeLabels = [...]string{ "uy", "vipsinaapp", "withgoogle", + "withyoutube", "writesthisblog", "yolasite", "za", @@ -9960,7 +10357,14 @@ var nodeLabels = [...]string{ "blogspot", "blogspot", "gov", + "ac", "co", + "gov", + "idf", + "k12", + "muni", + "net", + "org", "blogspot", "ac", "co", @@ -9998,6 +10402,8 @@ var nodeLabels = [...]string{ "com", "github", "nid", + "pantheon", + "sandcats", "com", "edu", "gov", @@ -12360,6 +12766,7 @@ var nodeLabels = [...]string{ "net", "org", "priv", + "co", "com", "edu", "gov", @@ -13906,6 +14313,7 @@ var nodeLabels = [...]string{ "ae", "blogdns", "blogsite", + "bmoattachments", "boldlygoingnowhere", "cdn77", "cdn77-secure", @@ -14790,6 +15198,7 @@ var nodeLabels = [...]string{ "or", "sc", "tv", + "biz", "cherkassy", "cherkasy", "chernigov", diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 77c48048..785855f0 100755 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -12,11 +12,16 @@ export LC_ALL=C export LC_CTYPE=C if test -z "$GOARCH" -o -z "$GOOS"; then - echo 1>&2 "GOARCH or GOOS not defined in environment" - exit 1 + echo 1>&2 "GOARCH or GOOS not defined in environment" + exit 1 fi -CC=${CC:-gcc} +CC=${CC:-cc} + +if [[ "$GOOS" -eq "solaris" ]]; then + # Assumes GNU versions of utilities in PATH. + export PATH=/usr/gnu/bin:$PATH +fi uname=$(uname) @@ -200,6 +205,7 @@ includes_OpenBSD=' ' includes_SunOS=' +#include #include #include #include @@ -303,6 +309,9 @@ ccflags="$@" $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || $2 ~ /^SIOC/ || $2 ~ /^TIOC/ || + $2 ~ /^TCGET/ || + $2 ~ /^TCSET/ || + $2 ~ /^TC(FLSH|SBRK|XONC)$/ || $2 !~ "RTF_BITS" && $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || $2 ~ /^BIOC/ || diff --git a/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl b/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl index f17b6125..06bade76 100755 --- a/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl +++ b/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl @@ -110,9 +110,9 @@ while(<>) { $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. # Runtime import of function to allow cross-platform builds. - $dynimports .= "//go:cgo_import_dynamic ${modname}_${sysname} ${sysname} \"$modname.so\"\n"; + $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; # Link symbol to proc address variable. - $linknames .= "//go:linkname ${sysvarname} ${modname}_${sysname}\n"; + $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; # Library proc address variable. push @vars, $sysvarname; diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go index 6668bec7..70af5a72 100644 --- a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go +++ b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go @@ -77,10 +77,10 @@ func UnixRights(fds ...int) []byte { h.Level = SOL_SOCKET h.Type = SCM_RIGHTS h.SetLen(CmsgLen(datalen)) - data := uintptr(cmsgData(h)) + data := cmsgData(h) for _, fd := range fds { - *(*int32)(unsafe.Pointer(data)) = int32(fd) - data += 4 + *(*int32)(data) = int32(fd) + data = unsafe.Pointer(uintptr(data) + 4) } return b } diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 9679dec8..e9671764 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -450,16 +450,34 @@ func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err e //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL -func Sysctl(name string) (value string, err error) { +// sysctlmib translates name to mib number and appends any additional args. +func sysctlmib(name string, args ...int) ([]_C_int, error) { // Translate name to mib number. mib, err := nametomib(name) + if err != nil { + return nil, err + } + + for _, a := range args { + mib = append(mib, _C_int(a)) + } + + return mib, nil +} + +func Sysctl(name string) (string, error) { + return SysctlArgs(name) +} + +func SysctlArgs(name string, args ...int) (string, error) { + mib, err := sysctlmib(name, args...) if err != nil { return "", err } // Find size. n := uintptr(0) - if err = sysctl(mib, nil, &n, nil, 0); err != nil { + if err := sysctl(mib, nil, &n, nil, 0); err != nil { return "", err } if n == 0 { @@ -468,7 +486,7 @@ func Sysctl(name string) (value string, err error) { // Read into buffer of that size. buf := make([]byte, n) - if err = sysctl(mib, &buf[0], &n, nil, 0); err != nil { + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { return "", err } @@ -479,17 +497,19 @@ func Sysctl(name string) (value string, err error) { return string(buf[0:n]), nil } -func SysctlUint32(name string) (value uint32, err error) { - // Translate name to mib number. - mib, err := nametomib(name) +func SysctlUint32(name string) (uint32, error) { + return SysctlUint32Args(name) +} + +func SysctlUint32Args(name string, args ...int) (uint32, error) { + mib, err := sysctlmib(name, args...) if err != nil { return 0, err } - // Read into buffer of that size. n := uintptr(4) buf := make([]byte, 4) - if err = sysctl(mib, &buf[0], &n, nil, 0); err != nil { + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { return 0, err } if n != 4 { @@ -498,6 +518,49 @@ func SysctlUint32(name string) (value uint32, err error) { return *(*uint32)(unsafe.Pointer(&buf[0])), nil } +func SysctlUint64(name string, args ...int) (uint64, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(8) + buf := make([]byte, 8) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 8 { + return 0, EIO + } + return *(*uint64)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlRaw(name string, args ...int) ([]byte, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return nil, err + } + + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Read into buffer of that size. + buf := make([]byte, n) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return nil, err + } + + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n], nil +} + //sys utimes(path string, timeval *[2]Timeval) (err error) func Utimes(path string, tv []Timeval) error { diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd_test.go b/vendor/golang.org/x/sys/unix/syscall_bsd_test.go index 55d88430..0bcd741f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd_test.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd_test.go @@ -33,3 +33,10 @@ func TestGetfsstat(t *testing.T) { } } } + +func TestSysctlRaw(t *testing.T) { + _, err := unix.SysctlRaw("kern.proc.pid", unix.Getpid()) + if err != nil { + t.Fatal(err) + } +} diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go new file mode 100644 index 00000000..6171a017 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go @@ -0,0 +1,20 @@ +// Copyright 2014 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 freebsd + +package unix_test + +import ( + "testing" + + "golang.org/x/sys/unix" +) + +func TestSysctUint64(t *testing.T) { + _, err := unix.SysctlUint64("vm.max_kernel_address") + if err != nil { + t.Fatal(err) + } +} diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 9df71957..d3ee5d2c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -886,6 +886,7 @@ func Getpgrp() (pid int) { //sys Pause() (err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT //sysnb prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) = SYS_PRLIMIT64 +//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) @@ -1022,7 +1023,6 @@ func Munmap(b []byte) (err error) { // Personality // Poll // Ppoll -// Prctl // Pselect6 // Ptrace // Putpmsg diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index ab54718f..00837326 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -13,6 +13,7 @@ package unix import ( + "sync/atomic" "syscall" "unsafe" ) @@ -138,6 +139,8 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { return unsafe.Pointer(&sa.raw), sl, nil } +//sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname + func Getsockname(fd int) (sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny @@ -147,12 +150,23 @@ func Getsockname(fd int) (sa Sockaddr, err error) { return anyToSockaddr(&rsa) } -// The const provides a compile-time constant so clients -// can adjust to whether there is a working Getwd and avoid -// even linking this function into the binary. See ../os/getwd.go. -const ImplementsGetwd = false +const ImplementsGetwd = true -func Getwd() (string, error) { return "", ENOTSUP } +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + // Getcwd will return an error if it failed for any reason. + _, err = Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} /* * Wrapped @@ -163,21 +177,20 @@ func Getwd() (string, error) { return "", ENOTSUP } func Getgroups() (gids []int, err error) { n, err := getgroups(0, nil) - if err != nil { - return nil, err - } - if n == 0 { - return nil, nil - } - - // Sanity check group count. Max is 16 on BSD. - if n < 0 || n > 1000 { + // Check for error and sanity check group count. Newer versions of + // Solaris allow up to 1024 (NGROUPS_MAX). + if n < 0 || n > 1024 { + if err != nil { + return nil, err + } return nil, EINVAL + } else if n == 0 { + return nil, nil } a := make([]_Gid_t, n) n, err = getgroups(n, &a[0]) - if err != nil { + if n == -1 { return nil, err } gids = make([]int, n) @@ -276,19 +289,38 @@ func Gethostname() (name string, err error) { return name, err } +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) (err error) { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) + func UtimesNano(path string, ts []Timespec) error { if ts == nil { - return Utimes(path, nil) + return utimensat(AT_FDCWD, path, nil, 0) } if len(ts) != 2 { return EINVAL } - var tv [2]Timeval - for i := 0; i < 2; i++ { - tv[i].Sec = ts[i].Sec - tv[i].Usec = ts[i].Nsec / 1000 + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) } - return Utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) } //sys fcntl(fd int, cmd int, arg int) (val int, err error) @@ -302,6 +334,35 @@ func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { return nil } +//sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +// Solaris doesn't have an futimes function because it allows NULL to be +// specified as the path for futimesat. However, Go doesn't like +// NULL-style string interfaces, so this simple wrapper is provided. +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimesat(fd, nil, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_UNIX: @@ -350,7 +411,7 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny nfd, err = accept(fd, &rsa, &len) - if err != nil { + if nfd == -1 { return } sa, err = anyToSockaddr(&rsa) @@ -361,6 +422,8 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { return } +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.recvmsg + func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { var msg Msghdr var rsa RawSockaddrAny @@ -382,7 +445,7 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from } msg.Iov = &iov msg.Iovlen = 1 - if n, err = recvmsg(fd, &msg, flags); err != nil { + if n, err = recvmsg(fd, &msg, flags); n == -1 { return } oobn = int(msg.Accrightslen) @@ -437,6 +500,67 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) return n, nil } +//sys acct(path *byte) (err error) + +func Acct(path string) (err error) { + if len(path) == 0 { + // Assume caller wants to disable accounting. + return acct(nil) + } + + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + return acct(pathp) +} + +/* + * Expose the ioctl function + */ + +//sys ioctl(fd int, req int, arg uintptr) (err error) + +func IoctlSetInt(fd int, req int, value int) (err error) { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req int, value *Winsize) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req int, value *Termios) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermio(fd int, req int, value *Termio) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlGetInt(fd int, req int) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req int) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req int) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermio(fd int, req int) (*Termio, error) { + var value Termio + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + /* * Exposed directly */ @@ -447,21 +571,29 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) //sys Chown(path string, uid int, gid int) (err error) //sys Chroot(path string) (err error) //sys Close(fd int) (err error) +//sys Creat(path string, mode uint32) (fd int, err error) //sys Dup(fd int) (nfd int, err error) +//sys Dup2(oldfd int, newfd int) (err error) //sys Exit(code int) //sys Fchdir(fd int) (err error) //sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Fdatasync(fd int) (err error) //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) //sysnb Getgid() (gid int) //sysnb Getpid() (pid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgid int, err error) //sys Geteuid() (euid int) //sys Getegid() (egid int) //sys Getppid() (ppid int) //sys Getpriority(which int, who int) (n int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Gettimeofday(tv *Timeval) (err error) //sysnb Getuid() (uid int) //sys Kill(pid int, signum syscall.Signal) (err error) @@ -471,20 +603,33 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Madvise(b []byte, advice int) (err error) //sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mkfifoat(dirfd int, path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) //sys Pathconf(path string, name int) (val int, err error) +//sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek //sysnb Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) +//sys Sethostname(p []byte) (err error) //sysnb Setpgid(pid int, pgid int) (err error) //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) @@ -496,12 +641,17 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Symlink(path string, link string) (err error) //sys Sync() (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) //sys Truncate(path string, length int64) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) -//sys Umask(newmask int) (oldmask int) +//sys Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = libc.umount //sys Unlink(path string) (err error) -//sys Utimes(path string, times *[2]Timeval) (err error) +//sys Unlinkat(dirfd int, path string) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys Utime(path string, buf *Utimbuf) (err error) //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.bind //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.connect //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) @@ -512,10 +662,8 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) //sys write(fd int, p []byte) (n int, err error) //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.getsockopt //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername -//sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom -//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.recvmsg func readlen(fd int, buf *byte, nbuf int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) @@ -548,3 +696,18 @@ func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, e func Munmap(b []byte) (err error) { return mapper.Munmap(b) } + +//sys sysconf(name int) (n int64, err error) + +// pageSize caches the value of Getpagesize, since it can't change +// once the system is booted. +var pageSize int64 // accessed atomically + +func Getpagesize() int { + n := atomic.LoadInt64(&pageSize) + if n == 0 { + n, _ = sysconf(_SC_PAGESIZE) + atomic.StoreInt64(&pageSize, n) + } + return int(n) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go index 9c173cd5..2e44630c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -6,8 +6,6 @@ package unix -func Getpagesize() int { return 4096 } - func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } func NsecToTimespec(nsec int64) (ts Timespec) { diff --git a/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/golang.org/x/sys/unix/types_solaris.go index 753c7996..6ad50eab 100644 --- a/vendor/golang.org/x/sys/unix/types_solaris.go +++ b/vendor/golang.org/x/sys/unix/types_solaris.go @@ -15,10 +15,17 @@ package unix /* #define KERNEL +// These defines ensure that builds done on newer versions of Solaris are +// backwards-compatible with older versions of Solaris and +// OpenSolaris-based derivatives. +#define __USE_SUNOS_SOCKETS__ // msghdr +#define __USE_LEGACY_PROTOTYPES__ // iovec #include #include +#include #include #include +#include #include #include #include @@ -30,7 +37,9 @@ package unix #include #include #include +#include #include +#include #include #include #include @@ -40,6 +49,8 @@ package unix #include #include #include +#include +#include enum { sizeofPtr = sizeof(void*), @@ -69,6 +80,7 @@ const ( sizeofInt = C.sizeof_int sizeofLong = C.sizeof_long sizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX ) // Basic types @@ -88,6 +100,10 @@ type Timeval C.struct_timeval type Timeval32 C.struct_timeval32 +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + // Processes type Rusage C.struct_rusage @@ -175,6 +191,20 @@ const ( type FdSet C.fd_set +// Misc + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_EACCESS = C.AT_EACCESS +) + // Routing and interface messages const ( @@ -217,6 +247,14 @@ type BpfTimeval C.struct_bpf_timeval type BpfHdr C.struct_bpf_hdr +// sysconf information + +const _SC_PAGESIZE = C._SC_PAGESIZE + // Terminal handling type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go index 3c2a5bfc..7b95751c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -225,6 +225,20 @@ const ( BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go index 3b3f7a9d..e48e7799 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -225,6 +225,20 @@ const ( BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 CREAD = 0x800 CS5 = 0x0 CS6 = 0x100 diff --git a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go index afdf7c56..a08922b9 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -161,6 +161,14 @@ const ( BRKINT = 0x2 CFLUSH = 0xf CLOCAL = 0x800 + CLOCK_HIGHRES = 0x4 + CLOCK_LEVEL = 0xa + CLOCK_MONOTONIC = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x5 + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x3 + CLOCK_THREAD_CPUTIME_ID = 0x2 + CLOCK_VIRTUAL = 0x1 CREAD = 0x80 CS5 = 0x0 CS6 = 0x10 @@ -168,6 +176,7 @@ const ( CS8 = 0x30 CSIZE = 0x30 CSTART = 0x11 + CSTATUS = 0x14 CSTOP = 0x13 CSTOPB = 0x40 CSUSP = 0x1a @@ -757,9 +766,7 @@ const ( SIOCDARP = -0x7fdb96e0 SIOCDELMULTI = -0x7fdf96ce SIOCDELRT = -0x7fcf8df5 - SIOCDIPSECONFIG = -0x7ffb9669 SIOCDXARP = -0x7fff9658 - SIOCFIPSECONFIG = -0x7ffb966b SIOCGARP = -0x3fdb96e1 SIOCGDSTINFO = -0x3fff965c SIOCGENADDR = -0x3fdf96ab @@ -821,7 +828,6 @@ const ( SIOCLIFGETND = -0x3f879672 SIOCLIFREMOVEIF = -0x7f879692 SIOCLIFSETND = -0x7f879671 - SIOCLIPSECONFIG = -0x7ffb9668 SIOCLOWER = -0x7fdf96d7 SIOCSARP = -0x7fdb96e2 SIOCSCTPGOPT = -0x3fef9653 @@ -844,7 +850,6 @@ const ( SIOCSIFNETMASK = -0x7fdf96e6 SIOCSIP6ADDRPOLICY = -0x7fff965d SIOCSIPMSFILTER = -0x7ffb964b - SIOCSIPSECONFIG = -0x7ffb966a SIOCSLGETREQ = -0x3fdf96b9 SIOCSLIFADDR = -0x7f879690 SIOCSLIFBRDADDR = -0x7f879684 @@ -951,6 +956,8 @@ const ( SO_VRRP = 0x1017 SO_WROFF = 0x2 TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d TCIFLUSH = 0x0 TCIOFLUSH = 0x2 TCOFLUSH = 0x1 @@ -977,6 +984,14 @@ const ( TCP_RTO_MAX = 0x1b TCP_RTO_MIN = 0x1a TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETSF = 0x5410 + TCSETSW = 0x540f + TCXONC = 0x5406 TIOC = 0x5400 TIOCCBRK = 0x747a TIOCCDTR = 0x7478 @@ -1052,6 +1067,7 @@ const ( VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 + VSTATUS = 0x10 VSTOP = 0x9 VSUSP = 0xa VSWTCH = 0x7 @@ -1215,6 +1231,7 @@ const ( SIGFREEZE = syscall.Signal(0x22) SIGHUP = syscall.Signal(0x1) SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x29) SIGINT = syscall.Signal(0x2) SIGIO = syscall.Signal(0x16) SIGIOT = syscall.Signal(0x6) @@ -1415,4 +1432,5 @@ var signals = [...]string{ 38: "resource Control Exceeded", 39: "reserved for JVM 1", 40: "reserved for JVM 2", + 41: "information Request", } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index 81ae498a..ff6c39dc 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 2adb9284..c2438522 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index ca00ed3d..dd66c975 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index 8eafcebc..d0a6ed82 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 008a5263..f58a3ff2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index d91f763a..22fc7a45 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -788,6 +788,16 @@ func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func read(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index 95cb1f65..8d2a8365 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -10,11 +10,19 @@ import ( "unsafe" ) +//go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" //go:cgo_import_dynamic libc_getgroups getgroups "libc.so" //go:cgo_import_dynamic libc_setgroups setgroups "libc.so" +//go:cgo_import_dynamic libc_utimes utimes "libc.so" +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" //go:cgo_import_dynamic libc_fcntl fcntl "libc.so" -//go:cgo_import_dynamic libsocket_accept accept "libsocket.so" -//go:cgo_import_dynamic libsocket_sendmsg sendmsg "libsocket.so" +//go:cgo_import_dynamic libc_futimesat futimesat "libc.so" +//go:cgo_import_dynamic libc_accept accept "libsocket.so" +//go:cgo_import_dynamic libc_recvmsg recvmsg "libsocket.so" +//go:cgo_import_dynamic libc_sendmsg sendmsg "libsocket.so" +//go:cgo_import_dynamic libc_acct acct "libc.so" +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" //go:cgo_import_dynamic libc_access access "libc.so" //go:cgo_import_dynamic libc_adjtime adjtime "libc.so" //go:cgo_import_dynamic libc_chdir chdir "libc.so" @@ -22,44 +30,65 @@ import ( //go:cgo_import_dynamic libc_chown chown "libc.so" //go:cgo_import_dynamic libc_chroot chroot "libc.so" //go:cgo_import_dynamic libc_close close "libc.so" +//go:cgo_import_dynamic libc_creat creat "libc.so" //go:cgo_import_dynamic libc_dup dup "libc.so" +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" //go:cgo_import_dynamic libc_exit exit "libc.so" //go:cgo_import_dynamic libc_fchdir fchdir "libc.so" //go:cgo_import_dynamic libc_fchmod fchmod "libc.so" +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" //go:cgo_import_dynamic libc_fchown fchown "libc.so" +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" +//go:cgo_import_dynamic libc_fdatasync fdatasync "libc.so" //go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" //go:cgo_import_dynamic libc_fstat fstat "libc.so" //go:cgo_import_dynamic libc_getdents getdents "libc.so" //go:cgo_import_dynamic libc_getgid getgid "libc.so" //go:cgo_import_dynamic libc_getpid getpid "libc.so" +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" //go:cgo_import_dynamic libc_geteuid geteuid "libc.so" //go:cgo_import_dynamic libc_getegid getegid "libc.so" //go:cgo_import_dynamic libc_getppid getppid "libc.so" //go:cgo_import_dynamic libc_getpriority getpriority "libc.so" //go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" //go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" //go:cgo_import_dynamic libc_getuid getuid "libc.so" //go:cgo_import_dynamic libc_kill kill "libc.so" //go:cgo_import_dynamic libc_lchown lchown "libc.so" //go:cgo_import_dynamic libc_link link "libc.so" -//go:cgo_import_dynamic libsocket_listen listen "libsocket.so" +//go:cgo_import_dynamic libc_listen listen "libsocket.so" //go:cgo_import_dynamic libc_lstat lstat "libc.so" //go:cgo_import_dynamic libc_madvise madvise "libc.so" //go:cgo_import_dynamic libc_mkdir mkdir "libc.so" +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" //go:cgo_import_dynamic libc_mknod mknod "libc.so" +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" +//go:cgo_import_dynamic libc_mlock mlock "libc.so" +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" +//go:cgo_import_dynamic libc_munlock munlock "libc.so" +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" //go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" //go:cgo_import_dynamic libc_open open "libc.so" +//go:cgo_import_dynamic libc_openat openat "libc.so" //go:cgo_import_dynamic libc_pathconf pathconf "libc.so" +//go:cgo_import_dynamic libc_pause pause "libc.so" //go:cgo_import_dynamic libc_pread pread "libc.so" //go:cgo_import_dynamic libc_pwrite pwrite "libc.so" //go:cgo_import_dynamic libc_read read "libc.so" //go:cgo_import_dynamic libc_readlink readlink "libc.so" //go:cgo_import_dynamic libc_rename rename "libc.so" +//go:cgo_import_dynamic libc_renameat renameat "libc.so" //go:cgo_import_dynamic libc_rmdir rmdir "libc.so" //go:cgo_import_dynamic libc_lseek lseek "libc.so" //go:cgo_import_dynamic libc_setegid setegid "libc.so" //go:cgo_import_dynamic libc_seteuid seteuid "libc.so" //go:cgo_import_dynamic libc_setgid setgid "libc.so" +//go:cgo_import_dynamic libc_sethostname sethostname "libc.so" //go:cgo_import_dynamic libc_setpgid setpgid "libc.so" //go:cgo_import_dynamic libc_setpriority setpriority "libc.so" //go:cgo_import_dynamic libc_setregid setregid "libc.so" @@ -67,36 +96,48 @@ import ( //go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" //go:cgo_import_dynamic libc_setsid setsid "libc.so" //go:cgo_import_dynamic libc_setuid setuid "libc.so" -//go:cgo_import_dynamic libsocket_shutdown shutdown "libsocket.so" +//go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" //go:cgo_import_dynamic libc_stat stat "libc.so" //go:cgo_import_dynamic libc_symlink symlink "libc.so" //go:cgo_import_dynamic libc_sync sync "libc.so" +//go:cgo_import_dynamic libc_times times "libc.so" //go:cgo_import_dynamic libc_truncate truncate "libc.so" //go:cgo_import_dynamic libc_fsync fsync "libc.so" //go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" //go:cgo_import_dynamic libc_umask umask "libc.so" +//go:cgo_import_dynamic libc_uname uname "libc.so" +//go:cgo_import_dynamic libc_umount umount "libc.so" //go:cgo_import_dynamic libc_unlink unlink "libc.so" -//go:cgo_import_dynamic libc_utimes utimes "libc.so" -//go:cgo_import_dynamic libsocket_bind bind "libsocket.so" -//go:cgo_import_dynamic libsocket_connect connect "libsocket.so" +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" +//go:cgo_import_dynamic libc_ustat ustat "libc.so" +//go:cgo_import_dynamic libc_utime utime "libc.so" +//go:cgo_import_dynamic libc_bind bind "libsocket.so" +//go:cgo_import_dynamic libc_connect connect "libsocket.so" //go:cgo_import_dynamic libc_mmap mmap "libc.so" //go:cgo_import_dynamic libc_munmap munmap "libc.so" -//go:cgo_import_dynamic libsocket_sendto sendto "libsocket.so" -//go:cgo_import_dynamic libsocket_socket socket "libsocket.so" -//go:cgo_import_dynamic libsocket_socketpair socketpair "libsocket.so" +//go:cgo_import_dynamic libc_sendto sendto "libsocket.so" +//go:cgo_import_dynamic libc_socket socket "libsocket.so" +//go:cgo_import_dynamic libc_socketpair socketpair "libsocket.so" //go:cgo_import_dynamic libc_write write "libc.so" -//go:cgo_import_dynamic libsocket_getsockopt getsockopt "libsocket.so" -//go:cgo_import_dynamic libsocket_getpeername getpeername "libsocket.so" -//go:cgo_import_dynamic libsocket_getsockname getsockname "libsocket.so" -//go:cgo_import_dynamic libsocket_setsockopt setsockopt "libsocket.so" -//go:cgo_import_dynamic libsocket_recvfrom recvfrom "libsocket.so" -//go:cgo_import_dynamic libsocket_recvmsg recvmsg "libsocket.so" +//go:cgo_import_dynamic libc_getsockopt getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" +//go:cgo_import_dynamic libc_sysconf sysconf "libc.so" +//go:linkname procgetsockname libc_getsockname +//go:linkname procGetcwd libc_getcwd //go:linkname procgetgroups libc_getgroups //go:linkname procsetgroups libc_setgroups +//go:linkname procutimes libc_utimes +//go:linkname procutimensat libc_utimensat //go:linkname procfcntl libc_fcntl -//go:linkname procaccept libsocket_accept -//go:linkname procsendmsg libsocket_sendmsg +//go:linkname procfutimesat libc_futimesat +//go:linkname procaccept libc_accept +//go:linkname procrecvmsg libc_recvmsg +//go:linkname procsendmsg libc_sendmsg +//go:linkname procacct libc_acct +//go:linkname procioctl libc_ioctl //go:linkname procAccess libc_access //go:linkname procAdjtime libc_adjtime //go:linkname procChdir libc_chdir @@ -104,44 +145,65 @@ import ( //go:linkname procChown libc_chown //go:linkname procChroot libc_chroot //go:linkname procClose libc_close +//go:linkname procCreat libc_creat //go:linkname procDup libc_dup +//go:linkname procDup2 libc_dup2 //go:linkname procExit libc_exit //go:linkname procFchdir libc_fchdir //go:linkname procFchmod libc_fchmod +//go:linkname procFchmodat libc_fchmodat //go:linkname procFchown libc_fchown +//go:linkname procFchownat libc_fchownat +//go:linkname procFdatasync libc_fdatasync //go:linkname procFpathconf libc_fpathconf //go:linkname procFstat libc_fstat //go:linkname procGetdents libc_getdents //go:linkname procGetgid libc_getgid //go:linkname procGetpid libc_getpid +//go:linkname procGetpgid libc_getpgid +//go:linkname procGetpgrp libc_getpgrp //go:linkname procGeteuid libc_geteuid //go:linkname procGetegid libc_getegid //go:linkname procGetppid libc_getppid //go:linkname procGetpriority libc_getpriority //go:linkname procGetrlimit libc_getrlimit +//go:linkname procGetrusage libc_getrusage //go:linkname procGettimeofday libc_gettimeofday //go:linkname procGetuid libc_getuid //go:linkname procKill libc_kill //go:linkname procLchown libc_lchown //go:linkname procLink libc_link -//go:linkname proclisten libsocket_listen +//go:linkname proclisten libc_listen //go:linkname procLstat libc_lstat //go:linkname procMadvise libc_madvise //go:linkname procMkdir libc_mkdir +//go:linkname procMkdirat libc_mkdirat +//go:linkname procMkfifo libc_mkfifo +//go:linkname procMkfifoat libc_mkfifoat //go:linkname procMknod libc_mknod +//go:linkname procMknodat libc_mknodat +//go:linkname procMlock libc_mlock +//go:linkname procMlockall libc_mlockall +//go:linkname procMprotect libc_mprotect +//go:linkname procMunlock libc_munlock +//go:linkname procMunlockall libc_munlockall //go:linkname procNanosleep libc_nanosleep //go:linkname procOpen libc_open +//go:linkname procOpenat libc_openat //go:linkname procPathconf libc_pathconf +//go:linkname procPause libc_pause //go:linkname procPread libc_pread //go:linkname procPwrite libc_pwrite //go:linkname procread libc_read //go:linkname procReadlink libc_readlink //go:linkname procRename libc_rename +//go:linkname procRenameat libc_renameat //go:linkname procRmdir libc_rmdir //go:linkname proclseek libc_lseek //go:linkname procSetegid libc_setegid //go:linkname procSeteuid libc_seteuid //go:linkname procSetgid libc_setgid +//go:linkname procSethostname libc_sethostname //go:linkname procSetpgid libc_setpgid //go:linkname procSetpriority libc_setpriority //go:linkname procSetregid libc_setregid @@ -149,37 +211,49 @@ import ( //go:linkname procSetrlimit libc_setrlimit //go:linkname procSetsid libc_setsid //go:linkname procSetuid libc_setuid -//go:linkname procshutdown libsocket_shutdown +//go:linkname procshutdown libc_shutdown //go:linkname procStat libc_stat //go:linkname procSymlink libc_symlink //go:linkname procSync libc_sync +//go:linkname procTimes libc_times //go:linkname procTruncate libc_truncate //go:linkname procFsync libc_fsync //go:linkname procFtruncate libc_ftruncate //go:linkname procUmask libc_umask +//go:linkname procUname libc_uname +//go:linkname procumount libc_umount //go:linkname procUnlink libc_unlink -//go:linkname procUtimes libc_utimes -//go:linkname procbind libsocket_bind -//go:linkname procconnect libsocket_connect +//go:linkname procUnlinkat libc_unlinkat +//go:linkname procUstat libc_ustat +//go:linkname procUtime libc_utime +//go:linkname procbind libc_bind +//go:linkname procconnect libc_connect //go:linkname procmmap libc_mmap //go:linkname procmunmap libc_munmap -//go:linkname procsendto libsocket_sendto -//go:linkname procsocket libsocket_socket -//go:linkname procsocketpair libsocket_socketpair +//go:linkname procsendto libc_sendto +//go:linkname procsocket libc_socket +//go:linkname procsocketpair libc_socketpair //go:linkname procwrite libc_write -//go:linkname procgetsockopt libsocket_getsockopt -//go:linkname procgetpeername libsocket_getpeername -//go:linkname procgetsockname libsocket_getsockname -//go:linkname procsetsockopt libsocket_setsockopt -//go:linkname procrecvfrom libsocket_recvfrom -//go:linkname procrecvmsg libsocket_recvmsg +//go:linkname procgetsockopt libc_getsockopt +//go:linkname procgetpeername libc_getpeername +//go:linkname procsetsockopt libc_setsockopt +//go:linkname procrecvfrom libc_recvfrom +//go:linkname procsysconf libc_sysconf var ( + procgetsockname, + procGetcwd, procgetgroups, procsetgroups, + procutimes, + procutimensat, procfcntl, + procfutimesat, procaccept, + procrecvmsg, procsendmsg, + procacct, + procioctl, procAccess, procAdjtime, procChdir, @@ -187,21 +261,29 @@ var ( procChown, procChroot, procClose, + procCreat, procDup, + procDup2, procExit, procFchdir, procFchmod, + procFchmodat, procFchown, + procFchownat, + procFdatasync, procFpathconf, procFstat, procGetdents, procGetgid, procGetpid, + procGetpgid, + procGetpgrp, procGeteuid, procGetegid, procGetppid, procGetpriority, procGetrlimit, + procGetrusage, procGettimeofday, procGetuid, procKill, @@ -211,20 +293,33 @@ var ( procLstat, procMadvise, procMkdir, + procMkdirat, + procMkfifo, + procMkfifoat, procMknod, + procMknodat, + procMlock, + procMlockall, + procMprotect, + procMunlock, + procMunlockall, procNanosleep, procOpen, + procOpenat, procPathconf, + procPause, procPread, procPwrite, procread, procReadlink, procRename, + procRenameat, procRmdir, proclseek, procSetegid, procSeteuid, procSetgid, + procSethostname, procSetpgid, procSetpriority, procSetregid, @@ -236,12 +331,17 @@ var ( procStat, procSymlink, procSync, + procTimes, procTruncate, procFsync, procFtruncate, procUmask, + procUname, + procumount, procUnlink, - procUtimes, + procUnlinkat, + procUstat, + procUtime, procbind, procconnect, procmmap, @@ -252,12 +352,32 @@ var ( procwrite, procgetsockopt, procgetpeername, - procgetsockname, procsetsockopt, procrecvfrom, - procrecvmsg syscallFunc + procsysconf syscallFunc ) +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getcwd(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) n = int(r0) @@ -275,6 +395,34 @@ func setgroups(ngid int, gid *_Gid_t) (err error) { return } +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) val = int(r0) @@ -284,6 +432,14 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { return } +func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) fd = int(r0) @@ -293,6 +449,15 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) @@ -302,6 +467,22 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +func acct(path *byte) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func ioctl(fd int, req int, arg uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -388,6 +569,21 @@ func Close(fd int) (err error) { return } +func Creat(path string, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func Dup(fd int) (nfd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) nfd = int(r0) @@ -397,6 +593,14 @@ func Dup(fd int) (nfd int, err error) { return } +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Exit(code int) { sysvicall6(uintptr(unsafe.Pointer(&procExit)), 1, uintptr(code), 0, 0, 0, 0, 0) return @@ -418,6 +622,20 @@ func Fchmod(fd int, mode uint32) (err error) { return } +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { @@ -426,6 +644,28 @@ func Fchown(fd int, uid int, gid int) (err error) { return } +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Fdatasync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) val = int(r0) @@ -468,6 +708,24 @@ func Getpid() (pid int) { return } +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getpgrp() (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func Geteuid() (euid int) { r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGeteuid)), 0, 0, 0, 0, 0, 0, 0) euid = int(r0) @@ -503,6 +761,14 @@ func Getrlimit(which int, lim *Rlimit) (err error) { return } +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) if e1 != 0 { @@ -607,6 +873,48 @@ func Mkdir(path string, mode uint32) (err error) { return } +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + func Mknod(path string, mode uint32, dev int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -621,6 +929,72 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mlockall(flags int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mprotect(b []byte, prot int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlockall() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) if e1 != 0 { @@ -644,6 +1018,21 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + func Pathconf(path string, name int) (val int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -659,6 +1048,14 @@ func Pathconf(path string, name int) (val int, err error) { return } +func Pause() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Pread(fd int, p []byte, offset int64) (n int, err error) { var _p0 *byte if len(p) > 0 { @@ -737,6 +1134,26 @@ func Rename(from string, to string) (err error) { return } +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = e1 + } + return +} + func Rmdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -784,6 +1201,18 @@ func Setgid(gid int) (err error) { return } +func Sethostname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + func Setpgid(pid int, pgid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) if e1 != 0 { @@ -891,6 +1320,15 @@ func Sync() (err error) { return } +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + func Truncate(path string, length int64) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -921,12 +1359,34 @@ func Ftruncate(fd int, length int64) (err error) { return } -func Umask(newmask int) (oldmask int) { - r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(newmask), 0, 0, 0, 0, 0) +func Umask(mask int) (oldmask int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(mask), 0, 0, 0, 0, 0) oldmask = int(r0) return } +func Uname(buf *Utsname) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + func Unlink(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -941,13 +1401,35 @@ func Unlink(path string) (err error) { return } -func Utimes(path string, times *[2]Timeval) (err error) { +func Unlinkat(dirfd int, path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) if err != nil { return } - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 @@ -1046,14 +1528,6 @@ func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { return } -func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) - if e1 != 0 { - err = e1 - } - return -} - func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { @@ -1075,9 +1549,9 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } -func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) - n = int(r0) +func sysconf(name int) (n int64, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsysconf)), 1, uintptr(name), 0, 0, 0, 0, 0) + n = int64(r0) if e1 != 0 { err = e1 } diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 330c0e63..8cf30947 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -1,8 +1,7 @@ +// +build 386,freebsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs types_freebsd.go -// +build 386,freebsd - package unix const ( @@ -140,6 +139,15 @@ type Fsid struct { Val [2]int32 } +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + type RawSockaddrInet4 struct { Len uint8 Family uint8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index 93395924..e5feb207 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -1,8 +1,7 @@ +// +build amd64,freebsd // Created by cgo -godefs - DO NOT EDIT // cgo -godefs types_freebsd.go -// +build amd64,freebsd - package unix const ( @@ -140,6 +139,15 @@ type Fsid struct { Val [2]int32 } +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + type RawSockaddrInet4 struct { Len uint8 Family uint8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go index 45e9f422..b3b928a5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -1,8 +1,7 @@ +// +build amd64,solaris // Created by cgo -godefs - DO NOT EDIT // cgo -godefs types_solaris.go -// +build amd64,solaris - package unix const ( @@ -11,6 +10,7 @@ const ( sizeofInt = 0x4 sizeofLong = 0x8 sizeofLongLong = 0x8 + PathMax = 0x400 ) type ( @@ -35,6 +35,18 @@ type Timeval32 struct { Usec int32 } +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + type Rusage struct { Utime Timeval Stime Timeval @@ -230,6 +242,30 @@ type FdSet struct { Bits [1024]int64 } +type Utsname struct { + Sysname [257]int8 + Nodename [257]int8 + Release [257]int8 + Version [257]int8 + Machine [257]int8 +} + +type Ustat_t struct { + Tfree int64 + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_0 [4]byte +} + +const ( + AT_FDCWD = 0xffd19553 + AT_SYMLINK_NOFOLLOW = 0x1000 + AT_SYMLINK_FOLLOW = 0x2000 + AT_REMOVEDIR = 0x1 + AT_EACCESS = 0x4 +) + const ( SizeofIfMsghdr = 0x54 SizeofIfData = 0x44 @@ -357,6 +393,8 @@ type BpfHdr struct { Pad_cgo_0 [2]byte } +const _SC_PAGESIZE = 0xb + type Termios struct { Iflag uint32 Oflag uint32 @@ -365,3 +403,20 @@ type Termios struct { Cc [19]uint8 Pad_cgo_0 [1]byte } + +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line int8 + Cc [8]uint8 + Pad_cgo_0 [1]byte +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} diff --git a/vendor/gopkg.in/gcfg.v1/read.go b/vendor/gopkg.in/gcfg.v1/read.go index 7e3f7fd4..fdfb5f3a 100644 --- a/vendor/gopkg.in/gcfg.v1/read.go +++ b/vendor/gopkg.in/gcfg.v1/read.go @@ -100,6 +100,13 @@ func readInto(config interface{}, fset *token.FileSet, file *token.File, src []b if tok != token.EOL && tok != token.EOF && tok != token.COMMENT { return errfn("expected EOL, EOF, or comment") } + // If a section/subsection header was found, ensure a + // container object is created, even if there are no + // variables further down. + err := set(config, sect, sectsub, "", true, "") + if err != nil { + return err + } case token.IDENT: if sect == "" { return errfn("expected section header") diff --git a/vendor/gopkg.in/gcfg.v1/read_test.go b/vendor/gopkg.in/gcfg.v1/read_test.go index 4a7d8e19..11fab3a7 100644 --- a/vendor/gopkg.in/gcfg.v1/read_test.go +++ b/vendor/gopkg.in/gcfg.v1/read_test.go @@ -205,6 +205,8 @@ var readtests = []struct { //{"[xsection]\nname=value", &cBasic{XSection: cBasicS4{XName: "value"}}, false}, // name specified as struct tag {"[tag-name]\nname=value", &cBasic{TagName: cBasicS1{Name: "value"}}, true}, + // empty subsections + {"\n[sub \"A\"]\n[sub \"B\"]", &cSubs{map[string]*cSubsS1{"A": &cSubsS1{}, "B": &cSubsS1{}}}, true}, }}, {"multivalue", []readtest{ // unnamed slice type: treat as multi-value {"\n[m1]", &cMulti{M1: cMultiS1{}}, true}, diff --git a/vendor/gopkg.in/gcfg.v1/set.go b/vendor/gopkg.in/gcfg.v1/set.go index b12b3f49..6ca10514 100644 --- a/vendor/gopkg.in/gcfg.v1/set.go +++ b/vendor/gopkg.in/gcfg.v1/set.go @@ -225,6 +225,11 @@ func set(cfg interface{}, sect, sub, name string, blank bool, value string) erro return fmt.Errorf("invalid subsection: "+ "section %q subsection %q", sect, sub) } + // Empty name is a special value, meaning that only the + // section/subsection object is to be created, with no values set. + if name == "" { + return nil + } vVar, t := fieldFold(vSect, name) if !vVar.IsValid() { return fmt.Errorf("invalid variable: "+